UNPKG

14.7 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var JsonPointer = tslib_1.__importStar(require("../jsonPointer"));
5var schemaId_1 = tslib_1.__importDefault(require("./schemaId"));
6var typeNameConvertor_1 = require("./typeNameConvertor");
7function parseSchema(content, url) {
8 var _a = selectSchemaType(content), type = _a.type, openApiVersion = _a.openApiVersion;
9 if (url != null) {
10 setId(type, content, url);
11 }
12 var id = getId(type, content);
13 return {
14 type: type,
15 openApiVersion: openApiVersion,
16 id: id ? new schemaId_1.default(id) : schemaId_1.default.empty,
17 content: content,
18 };
19}
20exports.parseSchema = parseSchema;
21function getSubSchema(rootSchema, pointer, id) {
22 var content = JsonPointer.get(rootSchema.content, JsonPointer.parse(pointer));
23 if (id == null) {
24 var subId = getId(rootSchema.type, content);
25 var getParentIds_1 = function (s, result) {
26 result.push(s.id.getAbsoluteId());
27 return s.rootSchema == null ? result : getParentIds_1(s.rootSchema, result);
28 };
29 if (subId) {
30 id = new schemaId_1.default(subId, getParentIds_1(rootSchema, []));
31 }
32 else {
33 id = new schemaId_1.default(pointer, getParentIds_1(rootSchema, []));
34 }
35 }
36 return {
37 type: rootSchema.type,
38 id: id,
39 content: content,
40 rootSchema: rootSchema,
41 };
42}
43exports.getSubSchema = getSubSchema;
44function getId(type, content) {
45 return content[getIdPropertyName(type)];
46}
47exports.getId = getId;
48function setId(type, content, id) {
49 var key = getIdPropertyName(type);
50 if (content[key] == null) {
51 content[key] = id;
52 }
53}
54function getIdPropertyName(type) {
55 switch (type) {
56 case 'Draft04': return 'id';
57 case 'Draft07': return '$id';
58 }
59}
60function searchAllSubSchema(schema, onFoundSchema, onFoundReference) {
61 var walkArray = function (array, paths, parentIds) {
62 if (array == null) {
63 return;
64 }
65 array.forEach(function (item, index) {
66 walk(item, paths.concat(index.toString()), parentIds);
67 });
68 };
69 var walkObject = function (obj, paths, parentIds) {
70 if (obj == null) {
71 return;
72 }
73 Object.keys(obj).forEach(function (key) {
74 var sub = obj[key];
75 if (sub != null) {
76 walk(sub, paths.concat(key), parentIds);
77 }
78 });
79 };
80 var walkMaybeArray = function (item, paths, parentIds) {
81 if (Array.isArray(item)) {
82 walkArray(item, paths, parentIds);
83 }
84 else {
85 walk(item, paths, parentIds);
86 }
87 };
88 var walk = function (s, paths, parentIds) {
89 if (s == null || typeof s !== 'object') {
90 return;
91 }
92 var id = getId(schema.type, s);
93 if (id && typeof id === 'string') {
94 var schemaId = new schemaId_1.default(id, parentIds);
95 var subSchema = {
96 type: schema.type,
97 id: schemaId,
98 content: s,
99 rootSchema: schema,
100 };
101 onFoundSchema(subSchema);
102 parentIds = parentIds.concat([schemaId.getAbsoluteId()]);
103 }
104 if (typeof s.$ref === 'string') {
105 var schemaId = new schemaId_1.default(s.$ref, parentIds);
106 s.$ref = schemaId.getAbsoluteId();
107 onFoundReference(schemaId);
108 }
109 walkArray(s.allOf, paths.concat('allOf'), parentIds);
110 walkArray(s.anyOf, paths.concat('anyOf'), parentIds);
111 walkArray(s.oneOf, paths.concat('oneOf'), parentIds);
112 walk(s.not, paths.concat('not'), parentIds);
113 walkMaybeArray(s.items, paths.concat('items'), parentIds);
114 walk(s.additionalItems, paths.concat('additionalItems'), parentIds);
115 walk(s.additionalProperties, paths.concat('additionalProperties'), parentIds);
116 walkObject(s.definitions, paths.concat('definitions'), parentIds);
117 walkObject(s.properties, paths.concat('properties'), parentIds);
118 walkObject(s.patternProperties, paths.concat('patternProperties'), parentIds);
119 walkMaybeArray(s.dependencies, paths.concat('dependencies'), parentIds);
120 if (schema.type === 'Draft07') {
121 if ('propertyNames' in s) {
122 walk(s.propertyNames, paths.concat('propertyNames'), parentIds);
123 walk(s.contains, paths.concat('contains'), parentIds);
124 walk(s.if, paths.concat('if'), parentIds);
125 walk(s.then, paths.concat('then'), parentIds);
126 walk(s.else, paths.concat('else'), parentIds);
127 }
128 }
129 };
130 function searchOpenApiSubSchema(openApi) {
131 function createId(paths) {
132 return '#/' + paths.join('/');
133 }
134 function convertKeyToTypeName(key) {
135 return typeNameConvertor_1.normalizeTypeName(key.replace(/[\/}]/g, '').replace(/{/, '$'));
136 }
137 function setSubIdToAnyObject(f, obj, keys) {
138 if (obj == null) {
139 return;
140 }
141 Object.keys(obj).forEach(function (key) {
142 var item = obj[key];
143 f(item, keys.concat(convertKeyToTypeName(key)));
144 });
145 }
146 var setSubIdToParameterObject = function (obj, keys) { return setSubIdToAnyObject(setSubIdToParameter, obj, keys); };
147 function setSubIdToParameter(param, keys) {
148 if ('schema' in param) {
149 setSubId(param.schema, keys.concat(param.name));
150 }
151 }
152 function setSubIdToParameters(array, keys) {
153 if (array == null) {
154 return;
155 }
156 var map = new Map();
157 array.forEach(function (item) {
158 if ('schema' in item) {
159 setSubIdToParameter(item, keys);
160 var work = map.get(item.in);
161 if (work == null) {
162 work = [];
163 map.set(item.in, work);
164 }
165 work.push(item);
166 }
167 });
168 addParameterSchema(map, keys);
169 }
170 function addParameterSchema(input, keys) {
171 var e_1, _a;
172 try {
173 for (var input_1 = tslib_1.__values(input), input_1_1 = input_1.next(); !input_1_1.done; input_1_1 = input_1.next()) {
174 var _b = tslib_1.__read(input_1_1.value, 2), key = _b[0], params = _b[1];
175 var _c = tslib_1.__read(buildParameterSchema(key, params, keys), 2), paths = _c[0], obj = _c[1];
176 setSubId(obj, paths);
177 }
178 }
179 catch (e_1_1) { e_1 = { error: e_1_1 }; }
180 finally {
181 try {
182 if (input_1_1 && !input_1_1.done && (_a = input_1.return)) _a.call(input_1);
183 }
184 finally { if (e_1) throw e_1.error; }
185 }
186 }
187 function buildParameterSchema(inType, params, keys) {
188 var paths = keys.slice(0, keys.length - 1).concat(inType + 'Parameters');
189 var properties = {};
190 params.forEach(function (item) {
191 properties[item.name] = { $ref: createId(keys.concat(item.name)) };
192 });
193 return [paths, {
194 id: createId(paths),
195 type: 'object',
196 properties: properties,
197 required: params.filter(function (item) { return item.required === true; }).map(function (item) { return item.name; }),
198 }];
199 }
200 var setSubIdToResponsesV2 = function (responses, keys) { return setSubIdToAnyObject(setSubIdToResponseV2, responses, keys); };
201 function setSubIdToResponseV2(response, keys) {
202 if (response == null) {
203 return;
204 }
205 if ('schema' in response) {
206 var s = response.schema;
207 if (s != null && s.type === 'file') {
208 return;
209 }
210 setSubId(s, keys);
211 }
212 }
213 function setSubIdToOperationV2(ops, keys) {
214 if (ops == null) {
215 return;
216 }
217 var operationId = ops.operationId;
218 if (operationId) {
219 keys = [keys[0], convertKeyToTypeName(operationId)];
220 }
221 setSubIdToParameters(ops.parameters, keys.concat('parameters'));
222 setSubIdToResponsesV2(ops.responses, keys.concat('responses'));
223 }
224 var setSubIdToPathsV2 = function (paths, keys) { return setSubIdToAnyObject(setSubIdToPathItemV2, paths, keys); };
225 function setSubIdToPathItemV2(pathItem, keys) {
226 setSubIdToParameters(pathItem.parameters, keys.concat('parameters'));
227 setSubIdToOperationV2(pathItem.get, keys.concat('get'));
228 setSubIdToOperationV2(pathItem.put, keys.concat('put'));
229 setSubIdToOperationV2(pathItem.post, keys.concat('post'));
230 setSubIdToOperationV2(pathItem.delete, keys.concat('delete'));
231 setSubIdToOperationV2(pathItem.options, keys.concat('options'));
232 setSubIdToOperationV2(pathItem.head, keys.concat('head'));
233 setSubIdToOperationV2(pathItem.patch, keys.concat('patch'));
234 }
235 function setSubIdToMediaTypes(types, keys) {
236 if (types == null) {
237 return;
238 }
239 var mime = 'application/json';
240 var mt = types[mime];
241 if (mt != null) {
242 setSubId(mt.schema, keys);
243 }
244 }
245 var setSubIdToRequestBodies = function (bodys, keys) { return setSubIdToAnyObject(setSubIdToRequestBody, bodys, keys); };
246 function setSubIdToRequestBody(body, keys) {
247 if (body == null) {
248 return;
249 }
250 if ('content' in body) {
251 setSubIdToMediaTypes(body.content, keys);
252 }
253 }
254 var setSubIdToResponsesV3 = function (responses, keys) { return setSubIdToAnyObject(setSubIdToResponseV3, responses, keys); };
255 function setSubIdToResponseV3(response, keys) {
256 if (response == null) {
257 return;
258 }
259 if ('content' in response) {
260 setSubIdToMediaTypes(response.content, keys);
261 }
262 }
263 function setSubIdToOperationV3(ops, keys) {
264 if (ops == null) {
265 return;
266 }
267 var operationId = ops.operationId;
268 if (operationId) {
269 keys = [keys[0], convertKeyToTypeName(operationId)];
270 }
271 setSubIdToParameters(ops.parameters, keys.concat('parameters'));
272 setSubIdToRequestBody(ops.requestBody, keys.concat('requestBody'));
273 setSubIdToResponsesV3(ops.responses, keys.concat('responses'));
274 }
275 var setSubIdToPathsV3 = function (paths, keys) { return setSubIdToAnyObject(setSubIdToPathItemV3, paths, keys); };
276 function setSubIdToPathItemV3(pathItem, keys) {
277 setSubIdToParameters(pathItem.parameters, keys.concat('parameters'));
278 setSubIdToOperationV3(pathItem.get, keys.concat('get'));
279 setSubIdToOperationV3(pathItem.put, keys.concat('put'));
280 setSubIdToOperationV3(pathItem.post, keys.concat('post'));
281 setSubIdToOperationV3(pathItem.delete, keys.concat('delete'));
282 setSubIdToOperationV3(pathItem.options, keys.concat('options'));
283 setSubIdToOperationV3(pathItem.head, keys.concat('head'));
284 setSubIdToOperationV3(pathItem.patch, keys.concat('patch'));
285 setSubIdToOperationV3(pathItem.trace, keys.concat('trace'));
286 }
287 function setSubIdToObject(obj, paths) {
288 if (obj == null) {
289 return;
290 }
291 Object.keys(obj).forEach(function (key) {
292 var sub = obj[key];
293 setSubId(sub, paths.concat(key));
294 });
295 }
296 function setSubId(s, paths) {
297 if (typeof s !== 'object') {
298 return;
299 }
300 if (typeof s.$ref === 'string') {
301 var schemaId = new schemaId_1.default(s.$ref);
302 s.$ref = schemaId.getAbsoluteId();
303 onFoundReference(schemaId);
304 }
305 var id = createId(paths);
306 setId(schema.type, s, id);
307 walk(s, paths, []);
308 }
309 if ('swagger' in openApi) {
310 setSubIdToObject(openApi.definitions, ['definitions']);
311 setSubIdToParameterObject(openApi.parameters, ['parameters']);
312 setSubIdToResponsesV2(openApi.responses, ['responses']);
313 setSubIdToPathsV2(openApi.paths, ['paths']);
314 }
315 else {
316 if (openApi.components) {
317 var components = openApi.components;
318 setSubIdToObject(components.schemas, ['components', 'schemas']);
319 setSubIdToResponsesV3(components.responses, ['components', 'responses']);
320 setSubIdToParameterObject(components.parameters, ['components', 'parameters']);
321 setSubIdToRequestBodies(components.requestBodies, ['components', 'requestBodies']);
322 }
323 if (openApi.paths) {
324 setSubIdToPathsV3(openApi.paths, ['paths']);
325 }
326 }
327 }
328 if (schema.openApiVersion != null) {
329 var obj = schema.content;
330 searchOpenApiSubSchema(obj);
331 return;
332 }
333 walk(schema.content, ['#'], []);
334}
335exports.searchAllSubSchema = searchAllSubSchema;
336function selectSchemaType(content) {
337 if (content.$schema) {
338 var schema = content.$schema;
339 var match = schema.match(/http\:\/\/json-schema\.org\/draft-(\d+)\/schema#?/);
340 if (match) {
341 var version = Number(match[1]);
342 if (version <= 4) {
343 return { type: 'Draft04' };
344 }
345 else {
346 return { type: 'Draft07' };
347 }
348 }
349 }
350 if (content.swagger === '2.0') {
351 return {
352 type: 'Draft04',
353 openApiVersion: 2,
354 };
355 }
356 if (content.openapi) {
357 var openapi = content.openapi;
358 if (/^3\.\d+\.\d+$/.test(openapi)) {
359 return {
360 type: 'Draft07',
361 openApiVersion: 3,
362 };
363 }
364 }
365 return { type: 'Draft04' };
366}
367//# sourceMappingURL=jsonSchema.js.map
\No newline at end of file