Skip to content

Commit

Permalink
feat: add new experimental option unstable_ignoreMimeParameters
Browse files Browse the repository at this point in the history
  • Loading branch information
RomanHotsiy committed May 29, 2018
1 parent 720c304 commit d162bab
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 3 deletions.
7 changes: 7 additions & 0 deletions src/services/RedocNormalizedOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ export interface RedocRawOptions {
untrustedSpec?: boolean | string;
hideLoading?: boolean | string;
hideDownloadButton?: boolean | string;

unstable_ignoreMimeParameters?: boolean;
}

function argValueToBoolean(val?: string | boolean): boolean {
Expand Down Expand Up @@ -92,6 +94,9 @@ export class RedocNormalizedOptions {
untrustedSpec: boolean;
hideDownloadButton: boolean;

/* tslint:disable-next-line */
unstable_ignoreMimeParameters: boolean;

constructor(raw: RedocRawOptions) {
this.theme = resolveTheme(mergeObjects({} as any, defaultTheme, raw.theme || {}));
this.scrollYOffset = RedocNormalizedOptions.normalizeScrollYOffset(raw.scrollYOffset);
Expand All @@ -103,5 +108,7 @@ export class RedocNormalizedOptions {
this.pathInMiddlePanel = argValueToBoolean(raw.pathInMiddlePanel);
this.untrustedSpec = argValueToBoolean(raw.untrustedSpec);
this.hideDownloadButton = argValueToBoolean(raw.hideDownloadButton);

this.unstable_ignoreMimeParameters = argValueToBoolean(raw.unstable_ignoreMimeParameters);
}
}
8 changes: 6 additions & 2 deletions src/services/models/MediaContent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ import { action, computed, observable } from 'mobx';
import { OpenAPIMediaType } from '../../types';
import { MediaTypeModel } from './MediaType';

import { mergeSimilarMediaTypes } from '../../utils';
import { OpenAPIParser } from '../OpenAPIParser';
import { RedocNormalizedOptions } from '../RedocNormalizedOptions';

/**
* MediaContent model ready to be sued by React components
* Contains multiple MediaTypes and keeps track of the currently active on
* Contains multiple MediaTypes and keeps track of the currently active one
*/
export class MediaContentModel {
mediaTypes: MediaTypeModel[];
Expand All @@ -20,10 +21,13 @@ export class MediaContentModel {
*/
constructor(
public parser: OpenAPIParser,
info: { [mime: string]: OpenAPIMediaType },
info: Dict<OpenAPIMediaType>,
public isRequestType: boolean,
options: RedocNormalizedOptions,
) {
if (options.unstable_ignoreMimeParameters) {
info = mergeSimilarMediaTypes(info);
}
this.mediaTypes = Object.keys(info).map(name => {
const mime = info[name];
// reset deref cache just in case something is left there
Expand Down
24 changes: 23 additions & 1 deletion src/utils/openapi.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { OpenAPIParser } from '../services/OpenAPIParser';
import { OpenAPIOperation, OpenAPIParameter, OpenAPISchema, Referenced } from '../types';
import {
OpenAPIMediaType,
OpenAPIOperation,
OpenAPIParameter,
OpenAPISchema,
Referenced,
} from '../types';

export function getStatusCodeType(statusCode: string | number, defaultAsError = false): string {
if (statusCode === 'default') {
Expand Down Expand Up @@ -199,4 +205,20 @@ export function mergeParams(
return pathParams.concat(operationParams);
}

export function mergeSimilarMediaTypes(types: Dict<OpenAPIMediaType>): Dict<OpenAPIMediaType> {
const mergedTypes = {};
Object.keys(types).forEach(name => {
const mime = types[name];
// ignore content type parameters (e.g. charset) and merge
const normalizedMimeName = name.split(';')[0].trim();
if (!mergedTypes[normalizedMimeName]) {
mergedTypes[normalizedMimeName] = mime;
return;
}
mergedTypes[normalizedMimeName] = { ...mergedTypes[normalizedMimeName], ...mime };
});

return mergedTypes;
}

export const SECURITY_SCHEMES_SECTION = 'section/Authentication/';

0 comments on commit d162bab

Please sign in to comment.