UNPKG

zod-to-x

Version:

Multi language types generation from Zod schemas.

67 lines (66 loc) 2.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Zod2XModel = void 0; const zod_1 = require("zod"); const core_1 = require("../core"); /** * Class that provides the foundational structure for defining layered models, managing metadata, * and exposing transpile method for all supported languages. * It is intended to be extended by specific model implementations. * * @remarks * - Children classes require the `@Domain` or other layer decorators to define the layer metadata. * - It automatically collects properties of the model that are instances of `ZodType` and processes * them into AST nodes. * * @example * ```typescript * @Domain({ name: 'User', file: 'user.ts' }) * class UserModel extends Zod2XModel { * username = z.string(); * age = z.number(); * } * * const userModel = new UserModel({ modelName: 'User' }); * const userModelTypescript = userModel.transpile(Transpilers.Zod2Ts); * ``` */ class Zod2XModel { constructor() { this.astNodes = null; } getModelName() { const modelName = this["modelName"]; if (!modelName) { throw new core_1.BadLayerDefinitionError("Model name is not defined." + "Did you forget to add the @Domain or other layer decorator?"); } return modelName; } getLayerMetadata() { const layerMetadata = this["layerMetadata"]; if (!layerMetadata) { throw new core_1.BadLayerDefinitionError("Layer metadata is not defined." + "Did you forget to add the @Domain or other layer decorator?"); } return layerMetadata; } getAstNode(opt = {}) { if (this.astNodes) { return this.astNodes; } const objectProps = new Map(); Object.getOwnPropertyNames(this).forEach((prop) => { if (this[prop] instanceof zod_1.ZodType) { objectProps.set(prop, this[prop]); } }); this.astNodes = new core_1.Zod2Ast(Object.assign(Object.assign({}, opt), { layer: this.getLayerMetadata() })).build(zod_1.z.object(Object.fromEntries(objectProps)).zod2x(this.getModelName())); return this.astNodes; } transpile(target, opt = {}, astOpt) { const transpilerInstance = new target(Object.assign(Object.assign({}, opt), { namespace: this.getLayerMetadata().namespace })); return transpilerInstance.transpile(this.getAstNode(astOpt)); } } exports.Zod2XModel = Zod2XModel;