json-schema-typescript-generator
Version:
Generate typescript types from json schemas
82 lines • 4.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.collectionGenerator = void 0;
const TypeGenerator_1 = require("./TypeGenerator");
const type_generator_1 = require("./type-generator");
const util_1 = require("../util");
const collectionGenerator = (locatedSchema, gatheredInfo, inputInfo) => {
const schema = locatedSchema.schema;
if (!schema.type || !schema.type.has('array') || !schema.collection) {
return;
}
const collection = schema.collection;
const collectionItems = collection.items;
if (Array.isArray(collectionItems)) {
return tupleGenerator(collectionItems, collection.additionalItems, locatedSchema, gatheredInfo, inputInfo);
}
else {
if (collection.uniqueItems) {
const collectionProperties = collectionItems.object?.properties;
const key = collectionProperties?.get('key');
const value = collectionProperties?.get('value');
if (isMap(collection) && key && value) {
return mapGenerator(key, value, locatedSchema, gatheredInfo, inputInfo);
}
else {
return setGenerator(collectionItems, locatedSchema, gatheredInfo, inputInfo);
}
}
else {
return arrayGenerator(collectionItems, locatedSchema, gatheredInfo, inputInfo);
}
}
};
exports.collectionGenerator = collectionGenerator;
const isMap = (collection) => {
if (!collection.uniqueItems || Array.isArray(collection.items) || collection.additionalItems) {
return false;
}
const element = collection.items;
if (!element.object || element.const || element.$ref || element.enum || element.collection || element.allOf || element.anyOf || element.oneOf) {
return false;
}
const object = element.object;
return (object.properties.size === 2)
&& (object.properties.has('key'))
&& (object.properties.has('value'))
&& (object.additionalProperties === undefined)
&& (object.required.size === 2)
&& (object.required.has('key'))
&& (object.required.has('value'));
};
const arrayGenerator = (items, locatedSchema, gatheredInfo, inputInfo) => {
const itemsLocatedSchema = (0, TypeGenerator_1.located)(items, locatedSchema);
const itemsType = (0, type_generator_1.typeGenerator)(itemsLocatedSchema, gatheredInfo, inputInfo);
return `${itemsType}[]`;
};
const setGenerator = (items, locatedSchema, gatheredInfo, inputInfo) => {
const itemsLocatedSchema = (0, TypeGenerator_1.located)(items, locatedSchema);
const itemsType = (0, type_generator_1.typeGenerator)(itemsLocatedSchema, gatheredInfo, inputInfo);
return `Set<${itemsType}>`;
};
const mapGenerator = (key, value, locatedSchema, gatheredInfo, inputInfo) => {
const keyLocatedSchema = (0, TypeGenerator_1.located)(key, locatedSchema);
const valueLocatedSchema = (0, TypeGenerator_1.located)(value, locatedSchema);
const keyType = (0, type_generator_1.typeGenerator)(keyLocatedSchema, gatheredInfo, inputInfo);
const valueType = (0, type_generator_1.typeGenerator)(valueLocatedSchema, gatheredInfo, inputInfo);
return `Map<${keyType}, ${valueType}>`;
};
const tupleGenerator = (items, additionalItems, locatedSchema, gatheredInfo, inputInfo) => {
const itemTypes = items
.map((item) => (0, TypeGenerator_1.located)(item, locatedSchema))
.map((itemLocatedSchema) => (0, type_generator_1.typeGenerator)(itemLocatedSchema, gatheredInfo, inputInfo));
const additionalType = (additionalItems)
? (0, type_generator_1.typeGenerator)((0, TypeGenerator_1.located)(additionalItems, locatedSchema), gatheredInfo, inputInfo)
: undefined;
const itemsCsv = (0, util_1.filteredJoin)(itemTypes, ', ');
const combinedItemsCsv = additionalType
? `${itemsCsv}, ...${additionalType}[]`
: `${itemsCsv}`;
return `[${combinedItemsCsv}]`;
};
//# sourceMappingURL=collection-generator.js.map