typedconverter
Version:
Convert object into classes match with TypeScript type annotation
62 lines (61 loc) • 2.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transform = void 0;
const tslib_1 = require("tslib");
const tinspector_1 = tslib_1.__importStar(require("tinspector"));
const converter_1 = require("./converter");
// --------------------------------------------------------------------- //
// -------------------------------- AST -------------------------------- //
// --------------------------------------------------------------------- //
function primitiveNode(type) {
return {
kind: "Primitive", type,
converter: converter_1.defaultConverters.get(type)
};
}
function arrayNode(type) {
let defer;
return {
kind: "Array", type: type[0],
get element() {
return defer || (defer = transform(type[0]));
}
};
}
function objectNode(type) {
let defer;
return {
kind: "Object", type,
get properties() {
if (defer)
return defer;
else {
const meta = tinspector_1.default(type);
return defer = new Map(meta.properties.map(x => [x.name, transformer(x.type)]));
}
}
};
}
// --------------------------------------------------------------------- //
// ---------------------------- TRANSFORMER ---------------------------- //
// --------------------------------------------------------------------- //
function transformer(type) {
if (type === Boolean || type === Number || type === Date || type === String)
return primitiveNode(type);
else if (Array.isArray(type))
return arrayNode(type);
else
return objectNode(type);
}
// --------------------------------------------------------------------- //
// ------------------------------- CACHE ------------------------------- //
// --------------------------------------------------------------------- //
const astCache = new Map();
const arrayAstCache = new Map();
const transformArray = tinspector_1.useCache(arrayAstCache, transformer, (type) => type[0]);
const transformAll = tinspector_1.useCache(astCache, transformer, (type) => type);
function transform(type) {
const cachedTransformer = Array.isArray(type) ? transformArray : transformAll;
return cachedTransformer(type);
}
exports.transform = transform;