@nestia/sdk
Version:
Nestia SDK and Swagger generator
178 lines • 7.09 kB
JavaScript
;
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