UNPKG

@nestia/sdk

Version:

Nestia SDK and Swagger generator

178 lines 7.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SwaggerReadonlyArrayEmender = void 0; var SwaggerReadonlyArrayEmender; (function (SwaggerReadonlyArrayEmender) { SwaggerReadonlyArrayEmender.emend = (props) => { const visited = { aliases: new WeakSet(), arrays: new WeakSet(), objects: new WeakSet(), schemas: new WeakSet(), tuples: new WeakSet(), }; visitMetadata({ components: props.components, schema: props.schema, metadata: props.metadata, visited, }); }; })(SwaggerReadonlyArrayEmender || (exports.SwaggerReadonlyArrayEmender = SwaggerReadonlyArrayEmender = {})); const visitMetadata = (props) => { if (props.schema !== undefined && isReadonlyArrayLike(props.metadata)) setReadonlyArray(props.schema); if (props.visited.schemas.has(props.metadata)) return; props.visited.schemas.add(props.metadata); for (const array of props.metadata.arrays) { const type = array.type; if (type !== undefined) visitArrayType({ components: props.components, schema: arraySchema(props.schema), type, visited: props.visited, }); } for (const tuple of props.metadata.tuples) { const type = tuple.type; if (type !== undefined) visitTupleType({ components: props.components, schema: props.schema, type, visited: props.visited, }); } for (const alias of props.metadata.aliases) { const type = alias.type; if (type !== undefined) visitAliasType({ components: props.components, schema: componentSchema(props.components, type.name), type, visited: props.visited, }); } for (const object of props.metadata.objects) { const type = object.type; if (type !== undefined) visitObjectType({ components: props.components, type, visited: props.visited, }); } }; const visitAliasType = (props) => { if (props.visited.aliases.has(props.type)) return; props.visited.aliases.add(props.type); if (props.schema !== undefined && isReadonlyArrayLike(props.type.value)) setReadonlyArray(props.schema); visitMetadata({ components: props.components, schema: props.schema, metadata: props.type.value, visited: props.visited, }); }; const visitArrayType = (props) => { var _a; if (props.visited.arrays.has(props.type)) return; props.visited.arrays.add(props.type); const component = componentSchema(props.components, props.type.name); if (component !== undefined && isReadonlyArrayName(props.type.name)) setReadonlyArray(component); visitMetadata({ components: props.components, schema: arraySchema((_a = props.schema) !== null && _a !== void 0 ? _a : component), metadata: props.type.value, visited: props.visited, }); }; const visitTupleType = (props) => { var _a; if (props.visited.tuples.has(props.type)) return; props.visited.tuples.add(props.type); const component = componentSchema(props.components, props.type.name); if (component !== undefined && isReadonlyArrayName(props.type.name)) setReadonlyArray(component); const schema = objectSchema((_a = props.schema) !== null && _a !== void 0 ? _a : component); props.type.elements.forEach((metadata, index) => visitMetadata({ components: props.components, schema: Array.isArray(schema === null || schema === void 0 ? void 0 : schema.prefixItems) ? schema.prefixItems[index] : undefined, metadata, visited: props.visited, })); }; const visitObjectType = (props) => { if (props.visited.objects.has(props.type)) return; props.visited.objects.add(props.type); const schema = objectSchema(componentSchema(props.components, props.type.name)); const properties = schema === null || schema === void 0 ? void 0 : schema.properties; for (const property of props.type.properties) { const key = propertyKey(property.key); const child = key === undefined ? undefined : properties === null || properties === void 0 ? void 0 : properties[key]; visitMetadata({ components: props.components, schema: child, metadata: property.value, visited: props.visited, }); } }; const isReadonlyArrayLike = (metadata, visited = new WeakSet()) => { if (visited.has(metadata)) return false; visited.add(metadata); const name = metadata.name; return ((typeof name === "string" && isReadonlyArrayName(name)) || metadata.arrays.some((array) => isReadonlyArrayName(array.name)) || metadata.tuples.some((tuple) => isReadonlyArrayName(tuple.name)) || metadata.aliases.some((alias) => { const type = alias.type; return type !== undefined && isReadonlyArrayLike(type.value, visited); })); }; const isReadonlyArrayName = (name) => { const compact = name.replace(/\s+/g, ""); // Metadata identity names pass through the generator's name replacer, which // strips TypeScript punctuation for schema-key safety — depending on the // compiler shim, `ReadonlyArray<string>` arrives here as "ReadonlyArray", // "ReadonlyArray<string>", or the stripped "ReadonlyArraystring", and // `readonly string[]` as "readonly string[]" or "readonlystring". Match on // the prefixes that survive every form; this predicate only ever sees names // of array/tuple metadata entries, whose spelling the generator controls // ("readonly" is case-sensitive, so PascalCase user types cannot collide). return compact.startsWith("ReadonlyArray") || compact.startsWith("readonly"); }; const componentSchema = (components, name) => { var _a; return ((_a = components.schemas) !== null && _a !== void 0 ? _a : {})[name]; }; const arraySchema = (schema) => { const obj = objectSchema(schema); return obj === null || obj === void 0 ? void 0 : obj.items; }; const objectSchema = (schema) => typeof schema === "object" && schema !== null ? schema : undefined; const propertyKey = (metadata) => { var _a, _b; const value = (_b = (_a = metadata.constants[0]) === null || _a === void 0 ? void 0 : _a.values[0]) === null || _b === void 0 ? void 0 : _b.value; return typeof value === "string" ? value : typeof value === "number" ? String(value) : undefined; }; const setReadonlyArray = (schema) => { const obj = objectSchema(schema); if (obj !== undefined) obj["x-readonly-array"] = true; }; //# sourceMappingURL=SwaggerReadonlyArrayEmender.js.map