@mintlify/validation
Version:
Validates mint.json files
90 lines (89 loc) • 4.05 kB
JavaScript
import { BaseConverter } from './BaseConverter.js';
import { InvalidSchemaError } from './errors.js';
import { copyKeyIfDefined } from './utils.js';
export class SecurityConverter extends BaseConverter {
constructor(securityRequirements, securitySchemes, safeParse = false) {
super(safeParse);
this.securityRequirements = securityRequirements;
this.securitySchemes = securitySchemes;
this.safeParse = safeParse;
}
convert() {
if (this.securityRequirements === undefined || this.securityRequirements.length === 0) {
return [];
}
if (this.securitySchemes === undefined) {
this.handleNewError(InvalidSchemaError, ['#', 'components'], 'securitySchemes not defined');
return [];
}
// TODO(ronan): make this work for camel-case as well
return this.securityRequirements.map((security) => {
const title = Object.keys(security)
.map((securityName) => securityName.replace(/[_-]/g, ' '))
.join(' & ');
const parameterSections = {
query: {},
header: {},
cookie: {},
};
Object.keys(security).forEach((securityName) => {
var _a;
const securityScheme = (_a = this.securitySchemes) === null || _a === void 0 ? void 0 : _a[securityName];
if (securityScheme === undefined) {
this.handleNewError(InvalidSchemaError, ['#', 'components', 'securitySchemes'], `security scheme not defined: '${securityName}'`);
return;
}
this.addSecurityParameters(securityName, securityScheme, parameterSections);
});
return {
title,
parameters: parameterSections,
};
});
}
addSecurityParameters(securityName, securityScheme, parameterSections) {
switch (securityScheme.type) {
case 'apiKey': {
if (!['header', 'query', 'cookie'].includes(securityScheme.in)) {
this.handleNewError(InvalidSchemaError, ['#', 'components', 'securitySchemes', securityName], `invalid security scheme location provided: '${securityScheme.in}'`);
return;
}
const paramGroup = securityScheme.in;
const schema = { type: 'apiKey' };
copyKeyIfDefined('description', securityScheme, schema);
copyKeyIfDefined('x-default', securityScheme, schema);
parameterSections[paramGroup][securityScheme.name] = schema;
return;
}
case 'http': {
const scheme = securityScheme.scheme;
if (scheme === 'basic' || scheme === 'bearer') {
const schema = {
type: 'http',
scheme,
};
copyKeyIfDefined('description', securityScheme, schema);
copyKeyIfDefined('x-default', securityScheme, schema);
parameterSections.header['Authorization'] = schema;
}
else {
this.handleNewError(InvalidSchemaError, ['#', 'components', 'securitySchemes', securityName], `encountered unknown HTTP security scheme: '${securityScheme.scheme}'`);
return;
}
return;
}
case 'oauth2': {
const schema = { type: 'oauth2' };
copyKeyIfDefined('description', securityScheme, schema);
parameterSections.header['Authorization'] = schema;
return;
}
case 'openIdConnect': {
return;
}
}
}
static convert(securityRequirements, securitySchemes, safeParse) {
return new SecurityConverter(securityRequirements, securitySchemes, safeParse).convert();
}
}