UNPKG

hey-api-builders

Version:

A custom plugin for @hey-api/openapi-ts that generates mock data builders with a lightweight custom runtime, Zod integration, or static mock generation.

141 lines 5.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateEnumBuilder = generateEnumBuilder; exports.generateObjectBuilder = generateObjectBuilder; const zod_schema_generator_1 = require("./zod-schema-generator"); const static_mock_generator_1 = require("./static-mock-generator"); const code_generator_1 = require("../core/code-generator"); /** * Generates a builder class for an enum schema */ function generateEnumBuilder(meta, options) { const { typeName, schema } = meta; const { mockStrategy } = options; let code = `export class ${typeName}Builder {\n`; code += ` private options: BuilderOptions = {}\n`; code += ` setOptions(o: BuilderOptions): this { this.options = o || {}; return this }\n\n`; if (mockStrategy === 'static') { code += generateStaticEnumBuild(typeName, schema); } else if (mockStrategy === 'zod') { code += generateZodEnumBuild(typeName, schema); } else { code += generateCustomEnumBuild(typeName, meta.constName); } code += `}\n\n`; return code; } /** * Generates a builder class for an object schema */ function generateObjectBuilder(meta, options) { const { typeName, schema, constName } = meta; const { mockStrategy } = options; let code = `export class ${typeName}Builder {\n`; code += ` private overrides: Partial<types.${typeName}> = {}\n`; code += ` private options: BuilderOptions = {}\n`; code += ` setOptions(o: BuilderOptions): this { this.options = o || {}; return this }\n`; const withMethods = (0, code_generator_1.generateWithMethods)(schema, typeName); if (withMethods) { code += withMethods + '\n'; } code += '\n'; if (mockStrategy === 'static') { code += generateStaticObjectBuild(typeName, schema); } else if (mockStrategy === 'zod') { code += generateZodObjectBuild(typeName, schema); } else { code += generateCustomObjectBuild(typeName, constName); } code += `}\n\n`; return code; } /** * Static mock build method for enums */ function generateStaticEnumBuild(typeName, schema) { const staticMock = (0, static_mock_generator_1.generateStaticMockCode)(schema, typeName); return ` build(): types.${typeName} {\n return ${staticMock} as types.${typeName};\n }\n`; } /** * Zod mock build method for enums */ function generateZodEnumBuild(typeName, schema) { const zodSchemaString = (0, zod_schema_generator_1.generateZodSchema)(schema); return (` build(): types.${typeName} {\n` + ` const zodSchemaString = \`${zodSchemaString}\`;\n` + ` return generateMockFromZodSchema(zodSchemaString, {}, {\n` + ` useDefault: this.options.useDefault,\n` + ` useExamples: this.options.useExamples,\n` + ` alwaysIncludeOptionals: this.options.alwaysIncludeOptionals,\n` + ` optionalsProbability: this.options.optionalsProbability,\n` + ` omitNulls: this.options.omitNulls\n` + ` }) as types.${typeName};\n` + ` }\n`); } /** * Custom runtime build method for enums */ function generateCustomEnumBuild(typeName, constName) { return (` build(): types.${typeName} {\n` + ` return generateMock<types.${typeName}>(schemas.${constName}, {\n` + ` useDefault: this.options.useDefault,\n` + ` useExamples: this.options.useExamples,\n` + ` alwaysIncludeOptionals: this.options.alwaysIncludeOptionals,\n` + ` optionalsProbability: this.options.optionalsProbability,\n` + ` omitNulls: this.options.omitNulls\n` + ` })\n` + ` }\n`); } /** * Static mock build method for objects */ function generateStaticObjectBuild(typeName, schema) { const staticMock = (0, static_mock_generator_1.generateStaticMockCode)(schema, typeName); return (` build(): types.${typeName} {\n` + ` const baseMock = ${staticMock};\n` + ` return { ...baseMock, ...this.overrides } as types.${typeName};\n` + ` }\n`); } /** * Zod mock build method for objects */ function generateZodObjectBuild(typeName, schema) { const zodSchemaString = (0, zod_schema_generator_1.generateZodSchema)(schema); return (` build(): types.${typeName} {\n` + ` const zodSchemaString = \`${zodSchemaString}\`;\n` + ` return generateMockFromZodSchema(zodSchemaString, this.overrides, {\n` + ` useDefault: this.options.useDefault,\n` + ` useExamples: this.options.useExamples,\n` + ` alwaysIncludeOptionals: this.options.alwaysIncludeOptionals,\n` + ` optionalsProbability: this.options.optionalsProbability,\n` + ` omitNulls: this.options.omitNulls\n` + ` }) as types.${typeName};\n` + ` }\n`); } /** * Custom runtime build method for objects */ function generateCustomObjectBuild(typeName, constName) { return (` build(): types.${typeName} {\n` + ` const mock = generateMock<types.${typeName}>(schemas.${constName}, {\n` + ` useDefault: this.options.useDefault,\n` + ` useExamples: this.options.useExamples,\n` + ` alwaysIncludeOptionals: this.options.alwaysIncludeOptionals,\n` + ` optionalsProbability: this.options.optionalsProbability,\n` + ` omitNulls: this.options.omitNulls\n` + ` })\n` + ` for (const k in this.overrides) {\n` + ` if (Object.prototype.hasOwnProperty.call(this.overrides, k)) {\n` + ` const typedMock = mock as Record<string, unknown>;\n` + ` const typedOverrides = this.overrides as Record<string, unknown>;\n` + ` typedMock[k] = typedOverrides[k];\n` + ` }\n` + ` }\n` + ` return mock\n` + ` }\n`); } //# sourceMappingURL=builder-generator.js.map