UNPKG

typedconverter

Version:

Convert object into classes match with TypeScript type annotation

62 lines (61 loc) 2.32 kB
"use strict"; 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;