blob: 8b20085de5eb10eeda92db2eea4207ab294eaadb [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var JsonPointer = tslib_1.__importStar(require("../jsonPointer"));
var schemaId_1 = tslib_1.__importDefault(require("./schemaId"));
var typeNameConvertor_1 = require("./typeNameConvertor");
function parseSchema(content, url) {
var _a = selectSchemaType(content), type = _a.type, openApiVersion = _a.openApiVersion;
if (url != null) {
setId(type, content, url);
}
var id = getId(type, content);
return {
type: type,
openApiVersion: openApiVersion,
id: id ? new schemaId_1.default(id) : schemaId_1.default.empty,
content: content,
};
}
exports.parseSchema = parseSchema;
function getSubSchema(rootSchema, pointer, id) {
var content = JsonPointer.get(rootSchema.content, JsonPointer.parse(pointer));
if (id == null) {
var subId = getId(rootSchema.type, content);
var getParentIds_1 = function (s, result) {
result.push(s.id.getAbsoluteId());
return s.rootSchema == null ? result : getParentIds_1(s.rootSchema, result);
};
if (subId) {
id = new schemaId_1.default(subId, getParentIds_1(rootSchema, []));
}
else {
id = new schemaId_1.default(pointer, getParentIds_1(rootSchema, []));
}
}
return {
type: rootSchema.type,
id: id,
content: content,
rootSchema: rootSchema,
};
}
exports.getSubSchema = getSubSchema;
function getId(type, content) {
return content[getIdPropertyName(type)];
}
exports.getId = getId;
function setId(type, content, id) {
var key = getIdPropertyName(type);
if (content[key] == null) {
content[key] = id;
}
}
function getIdPropertyName(type) {
switch (type) {
case 'Draft04': return 'id';
case 'Draft07': return '$id';
}
}
function searchAllSubSchema(schema, onFoundSchema, onFoundReference) {
var walkArray = function (array, paths, parentIds) {
if (array == null) {
return;
}
array.forEach(function (item, index) {
walk(item, paths.concat(index.toString()), parentIds);
});
};
var walkObject = function (obj, paths, parentIds) {
if (obj == null) {
return;
}
Object.keys(obj).forEach(function (key) {
var sub = obj[key];
if (sub != null) {
walk(sub, paths.concat(key), parentIds);
}
});
};
var walkMaybeArray = function (item, paths, parentIds) {
if (Array.isArray(item)) {
walkArray(item, paths, parentIds);
}
else {
walk(item, paths, parentIds);
}
};
var walk = function (s, paths, parentIds) {
if (s == null || typeof s !== 'object') {
return;
}
var id = getId(schema.type, s);
if (id && typeof id === 'string') {
var schemaId = new schemaId_1.default(id, parentIds);
var subSchema = {
type: schema.type,
id: schemaId,
content: s,
rootSchema: schema,
};
onFoundSchema(subSchema);
parentIds = parentIds.concat([schemaId.getAbsoluteId()]);
}
if (typeof s.$ref === 'string') {
var schemaId = new schemaId_1.default(s.$ref, parentIds);
s.$ref = schemaId.getAbsoluteId();
onFoundReference(schemaId);
}
walkArray(s.allOf, paths.concat('allOf'), parentIds);
walkArray(s.anyOf, paths.concat('anyOf'), parentIds);
walkArray(s.oneOf, paths.concat('oneOf'), parentIds);
walk(s.not, paths.concat('not'), parentIds);
walkMaybeArray(s.items, paths.concat('items'), parentIds);
walk(s.additionalItems, paths.concat('additionalItems'), parentIds);
walk(s.additionalProperties, paths.concat('additionalProperties'), parentIds);
walkObject(s.definitions, paths.concat('definitions'), parentIds);
walkObject(s.properties, paths.concat('properties'), parentIds);
walkObject(s.patternProperties, paths.concat('patternProperties'), parentIds);
walkMaybeArray(s.dependencies, paths.concat('dependencies'), parentIds);
if (schema.type === 'Draft07') {
if ('propertyNames' in s) {
walk(s.propertyNames, paths.concat('propertyNames'), parentIds);
walk(s.contains, paths.concat('contains'), parentIds);
walk(s.if, paths.concat('if'), parentIds);
walk(s.then, paths.concat('then'), parentIds);
walk(s.else, paths.concat('else'), parentIds);
}
}
};
function searchOpenApiSubSchema(openApi) {
function createId(paths) {
return '#/' + paths.join('/');
}
function convertKeyToTypeName(key) {
key = key.replace(/\/(.)/g, function (_match, p1) {
return p1.toUpperCase();
});
return typeNameConvertor_1.normalizeTypeName(key.replace(/}/g, '').replace(/{/, '$'));
}
function setSubIdToAnyObject(f, obj, keys) {
if (obj == null) {
return;
}
Object.keys(obj).forEach(function (key) {
var item = obj[key];
f(item, keys.concat(convertKeyToTypeName(key)));
});
}
var setSubIdToParameterObject = function (obj, keys) { return setSubIdToAnyObject(setSubIdToParameter, obj, keys); };
function setSubIdToParameter(param, keys) {
if ('schema' in param) {
setSubId(param.schema, keys.concat(param.name));
}
}
function setSubIdToParameters(array, keys) {
if (array == null) {
return;
}
var map = new Map();
array.forEach(function (item) {
if ('schema' in item) {
setSubIdToParameter(item, keys);
var work = map.get(item.in);
if (work == null) {
work = [];
map.set(item.in, work);
}
work.push(item);
}
});
addParameterSchema(map, keys);
}
function addParameterSchema(input, keys) {
var e_1, _a;
try {
for (var input_1 = tslib_1.__values(input), input_1_1 = input_1.next(); !input_1_1.done; input_1_1 = input_1.next()) {
var _b = tslib_1.__read(input_1_1.value, 2), key = _b[0], params = _b[1];
var _c = tslib_1.__read(buildParameterSchema(key, params, keys), 2), paths = _c[0], obj = _c[1];
setSubId(obj, paths);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (input_1_1 && !input_1_1.done && (_a = input_1.return)) _a.call(input_1);
}
finally { if (e_1) throw e_1.error; }
}
}
function buildParameterSchema(inType, params, keys) {
var paths = keys.slice(0, keys.length - 1).concat(inType + 'Parameters');
var properties = {};
params.forEach(function (item) {
properties[item.name] = { $ref: createId(keys.concat(item.name)) };
});
return [paths, {
id: createId(paths),
type: 'object',
properties: properties,
required: params.filter(function (item) { return item.required === true; }).map(function (item) { return item.name; }),
}];
}
var setSubIdToResponsesV2 = function (responses, keys) { return setSubIdToAnyObject(setSubIdToResponseV2, responses, keys); };
function setSubIdToResponseV2(response, keys) {
if (response == null) {
return;
}
if ('schema' in response) {
var s = response.schema;
if (s != null && s.type === 'file') {
return;
}
setSubId(s, keys);
}
}
function setSubIdToOperationV2(ops, keys) {
if (ops == null) {
return;
}
var operationId = ops.operationId;
if (operationId) {
keys = [keys[0], convertKeyToTypeName(operationId)];
}
setSubIdToParameters(ops.parameters, keys.concat('parameters'));
setSubIdToResponsesV2(ops.responses, keys.concat('responses'));
}
var setSubIdToPathsV2 = function (paths, keys) { return setSubIdToAnyObject(setSubIdToPathItemV2, paths, keys); };
function setSubIdToPathItemV2(pathItem, keys) {
setSubIdToParameters(pathItem.parameters, keys.concat('parameters'));
setSubIdToOperationV2(pathItem.get, keys.concat('get'));
setSubIdToOperationV2(pathItem.put, keys.concat('put'));
setSubIdToOperationV2(pathItem.post, keys.concat('post'));
setSubIdToOperationV2(pathItem.delete, keys.concat('delete'));
setSubIdToOperationV2(pathItem.options, keys.concat('options'));
setSubIdToOperationV2(pathItem.head, keys.concat('head'));
setSubIdToOperationV2(pathItem.patch, keys.concat('patch'));
}
function setSubIdToMediaTypes(types, keys) {
if (types == null) {
return;
}
var mime = 'application/json';
var mt = types[mime];
if (mt != null) {
setSubId(mt.schema, keys);
}
}
var setSubIdToRequestBodies = function (bodys, keys) { return setSubIdToAnyObject(setSubIdToRequestBody, bodys, keys); };
function setSubIdToRequestBody(body, keys) {
if (body == null) {
return;
}
if ('content' in body) {
setSubIdToMediaTypes(body.content, keys);
}
if ('$ref' in body) {
setSubId(body, keys);
}
}
var setSubIdToResponsesV3 = function (responses, keys) { return setSubIdToAnyObject(setSubIdToResponseV3, responses, keys); };
function setSubIdToResponseV3(response, keys) {
if (response == null) {
return;
}
if ('content' in response) {
setSubIdToMediaTypes(response.content, keys);
}
if ('$ref' in response) {
setSubId(response, keys);
}
}
function setSubIdToOperationV3(ops, keys) {
if (ops == null) {
return;
}
var operationId = ops.operationId;
if (operationId) {
keys = [keys[0], convertKeyToTypeName(operationId)];
}
setSubIdToParameters(ops.parameters, keys.concat('parameters'));
setSubIdToRequestBody(ops.requestBody, keys.concat('requestBody'));
setSubIdToResponsesV3(ops.responses, keys.concat('responses'));
}
var setSubIdToPathsV3 = function (paths, keys) { return setSubIdToAnyObject(setSubIdToPathItemV3, paths, keys); };
function setSubIdToPathItemV3(pathItem, keys) {
setSubIdToParameters(pathItem.parameters, keys.concat('parameters'));
setSubIdToOperationV3(pathItem.get, keys.concat('get'));
setSubIdToOperationV3(pathItem.put, keys.concat('put'));
setSubIdToOperationV3(pathItem.post, keys.concat('post'));
setSubIdToOperationV3(pathItem.delete, keys.concat('delete'));
setSubIdToOperationV3(pathItem.options, keys.concat('options'));
setSubIdToOperationV3(pathItem.head, keys.concat('head'));
setSubIdToOperationV3(pathItem.patch, keys.concat('patch'));
setSubIdToOperationV3(pathItem.trace, keys.concat('trace'));
}
function setSubIdToObject(obj, paths) {
if (obj == null) {
return;
}
Object.keys(obj).forEach(function (key) {
var sub = obj[key];
setSubId(sub, paths.concat(key));
});
}
function setSubId(s, paths) {
if (typeof s !== 'object') {
return;
}
if (typeof s.$ref === 'string') {
var schemaId = new schemaId_1.default(s.$ref);
s.$ref = schemaId.getAbsoluteId();
onFoundReference(schemaId);
}
var id = createId(paths);
setId(schema.type, s, id);
walk(s, paths, []);
}
if ('swagger' in openApi) {
setSubIdToObject(openApi.definitions, ['definitions']);
setSubIdToParameterObject(openApi.parameters, ['parameters']);
setSubIdToResponsesV2(openApi.responses, ['responses']);
setSubIdToPathsV2(openApi.paths, ['paths']);
}
else {
if (openApi.components) {
var components = openApi.components;
setSubIdToObject(components.schemas, ['components', 'schemas']);
setSubIdToResponsesV3(components.responses, ['components', 'responses']);
setSubIdToParameterObject(components.parameters, ['components', 'parameters']);
setSubIdToRequestBodies(components.requestBodies, ['components', 'requestBodies']);
}
if (openApi.paths) {
setSubIdToPathsV3(openApi.paths, ['paths']);
}
}
}
if (schema.openApiVersion != null) {
var obj = schema.content;
searchOpenApiSubSchema(obj);
return;
}
walk(schema.content, ['#'], []);
}
exports.searchAllSubSchema = searchAllSubSchema;
function selectSchemaType(content) {
if (content.$schema) {
var schema = content.$schema;
var match = schema.match(/http\:\/\/json-schema\.org\/draft-(\d+)\/schema#?/);
if (match) {
var version = Number(match[1]);
if (version <= 4) {
return { type: 'Draft04' };
}
else {
return { type: 'Draft07' };
}
}
}
if (content.swagger === '2.0') {
return {
type: 'Draft04',
openApiVersion: 2,
};
}
if (content.openapi) {
var openapi = content.openapi;
if (/^3\.\d+\.\d+$/.test(openapi)) {
return {
type: 'Draft07',
openApiVersion: 3,
};
}
}
return { type: 'Draft04' };
}
//# sourceMappingURL=jsonSchema.js.map