1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var tslib_1 = require("tslib");
|
4 | var JsonPointer = tslib_1.__importStar(require("../jsonPointer"));
|
5 | var schemaId_1 = tslib_1.__importDefault(require("./schemaId"));
|
6 | var typeNameConvertor_1 = require("./typeNameConvertor");
|
7 | function 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 | }
|
20 | exports.parseSchema = parseSchema;
|
21 | function 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 | }
|
43 | exports.getSubSchema = getSubSchema;
|
44 | function getId(type, content) {
|
45 | return content[getIdPropertyName(type)];
|
46 | }
|
47 | exports.getId = getId;
|
48 | function setId(type, content, id) {
|
49 | var key = getIdPropertyName(type);
|
50 | if (content[key] == null) {
|
51 | content[key] = id;
|
52 | }
|
53 | }
|
54 | function getIdPropertyName(type) {
|
55 | switch (type) {
|
56 | case 'Draft04': return 'id';
|
57 | case 'Draft07': return '$id';
|
58 | }
|
59 | }
|
60 | function 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 | }
|
335 | exports.searchAllSubSchema = searchAllSubSchema;
|
336 | function 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 |
|
\ | No newline at end of file |