json-schema-typescript-generator
Version:
Generate typescript types from json schemas
57 lines • 2.25 kB
JavaScript
import { isAbsolute, isRelative, isLocal, isAbsoluteSchemaId, } from '../ids';
export const referenceGenerator = (locatedSchema, gatheredInfo, inputInfo) => {
const schema = locatedSchema.schema;
const id = schema.$id;
const ref = schema.$ref;
if (!ref) {
return;
}
if (isLocal(ref)) {
return ref.fragment;
}
const references = gatheredInfo.references;
const idFileLocations = inputInfo.idFileLocations;
if (isAbsolute(ref)) {
return createFromAbsoluteRef(references, idFileLocations, ref);
}
if (isRelative(ref)) {
if (id && isAbsoluteSchemaId(id)) {
const absoluteRef = { authority: id.authority, ...ref };
return createFromAbsoluteRef(references, idFileLocations, absoluteRef);
}
else {
return createFromRelativeRef(references, idFileLocations, ref);
}
}
return;
};
const createFromAbsoluteRef = (references, idFileLocations, ref) => {
const fileLocation = idFileLocations.get(ref);
if (fileLocation) {
return addExternalReference(references, fileLocation, ref.fragment);
}
return createFromRelativeRef(references, idFileLocations, ref);
};
const createFromRelativeRef = (references, idFileLocations, ref) => {
const foundFileLocations = Array.from(idFileLocations.entries())
.filter(([schemaId, _]) => !isAbsoluteSchemaId(schemaId) ||
!isAbsolute(ref) ||
schemaId.authority === ref.authority)
.filter(([schemaId, _]) => schemaId.folder === ref.folder)
.filter(([schemaId, _]) => schemaId.name === ref.name)
.map(([_, fileLocation]) => fileLocation);
return foundFileLocations && foundFileLocations.length === 1
? addExternalReference(references, foundFileLocations[0], ref.fragment)
: undefined;
};
const addExternalReference = (references, fileLocation, importName) => {
let importNames = references.schema.get(fileLocation);
if (!importNames) {
importNames = new Set();
references.schema.set(fileLocation, importNames);
}
const name = importName || fileLocation.fileName;
importNames.add(name);
return name;
};
//# sourceMappingURL=reference-generator.js.map