zod-to-x
Version:
Multi language types generation from Zod schemas.
67 lines (66 loc) • 2.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Zod2XModel = void 0;
const core_1 = require("../core");
const zod_helpers_1 = require("../lib/zod_helpers");
/**
* 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 (zod_helpers_1.ZodHelpers.isZodType(this[prop])) {
objectProps.set(prop, this[prop]);
}
});
this.astNodes = new core_1.Zod2Ast(Object.assign(Object.assign({}, opt), { layer: this.getLayerMetadata() })).build(zod_helpers_1.ZodHelpers.createZodObject(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;