From e32b2d65fb4263e7df3f72b4f5d7321a2e73dbde Mon Sep 17 00:00:00 2001 From: Christopher Best Date: Wed, 25 Jan 2023 21:58:26 -0500 Subject: [PATCH] feat: generate update schemas derived from the insert schemas --- src/generator/Generator.ts | 14 ++++++ src/generator/__tests__/Generator.test.ts | 6 +++ src/generator/__tests__/integration.test.ts | 1 + src/generator/builders/InsertSchemaBuilder.ts | 2 +- src/generator/builders/UpdateSchemaBuilder.ts | 49 +++++++++++++++++++ 5 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/generator/builders/UpdateSchemaBuilder.ts diff --git a/src/generator/Generator.ts b/src/generator/Generator.ts index 870aefb..bf7b431 100644 --- a/src/generator/Generator.ts +++ b/src/generator/Generator.ts @@ -25,11 +25,13 @@ import { CaseFunction, Transformations } from './types' import UtilityTypesBuilder from './builders/UtilityTypesBuilder' import ZodSchemaBuilder from './builders/ZodSchemaBuilder' import SingleNamedImportBuilder from './builders/SingleNamedImportBuilder' +import UpdateSchemaBuilder from './builders/UpdateSchemaBuilder' export interface GeneratorOptions { schema: SchemaInfo genSelectSchemas?: boolean genInsertSchemas?: boolean + genUpdateSchemas?: boolean genTableMetadata?: boolean disableEslint?: boolean /** @deprecated */ @@ -57,6 +59,7 @@ export default class Generator { public readonly generate: { selectSchemas: boolean insertSchemas: boolean + updateSchemas: boolean tableMetadata: boolean disableEslint: boolean /** @deprecated */ @@ -77,6 +80,7 @@ export default class Generator { schema, genSelectSchemas: selectSchemas = true, genInsertSchemas: insertSchemas = true, + genUpdateSchemas: updateSchemas = true, genTableMetadata: tableMetadata = true, disableEslint = true, genEnums = false, @@ -99,6 +103,7 @@ export default class Generator { this.generate = Object.freeze({ selectSchemas, insertSchemas, + updateSchemas, tableMetadata, disableEslint, enums: genEnums, @@ -231,6 +236,15 @@ export default class Generator { builders.push(builder) } + if (this.generate.updateSchemas) { + const builder = new UpdateSchemaBuilder( + tableInfo, + this.types, + this.transform + ) + builders.push(builder) + } + if (this.generate.tables) { const builder = new TableBuilder(tableInfo, this.types, this.transform) this.types.add(builder.name, builder.typename().text, 'table') diff --git a/src/generator/__tests__/Generator.test.ts b/src/generator/__tests__/Generator.test.ts index 601b397..375c317 100644 --- a/src/generator/__tests__/Generator.test.ts +++ b/src/generator/__tests__/Generator.test.ts @@ -43,6 +43,7 @@ describe(Generator, () => { genTableMetadata: false, genSelectSchemas: false, genInsertSchemas: false, + genUpdateSchemas: false, genEnums: false, genInsertTypes: false, genTables: false, @@ -61,6 +62,7 @@ describe(Generator, () => { genTableMetadata: false, genSelectSchemas: false, genInsertSchemas: false, + genUpdateSchemas: false, genEnums: false, genInsertTypes: false, genTables: true, @@ -80,6 +82,7 @@ describe(Generator, () => { genTableMetadata: false, genSelectSchemas: false, genInsertSchemas: false, + genUpdateSchemas: false, genEnums: true, genInsertTypes: false, genTables: false, @@ -98,6 +101,7 @@ describe(Generator, () => { genTableMetadata: false, genSelectSchemas: false, genInsertSchemas: false, + genUpdateSchemas: false, genEnums: false, genInsertTypes: true, genTables: false, @@ -117,6 +121,7 @@ describe(Generator, () => { genTableMetadata: false, genSelectSchemas: false, genInsertSchemas: false, + genUpdateSchemas: false, genEnums: false, genInsertTypes: false, genTables: false, @@ -136,6 +141,7 @@ describe(Generator, () => { genTableMetadata: false, genSelectSchemas: false, genInsertSchemas: false, + genUpdateSchemas: false, genEnums: false, genInsertTypes: false, genTables: false, diff --git a/src/generator/__tests__/integration.test.ts b/src/generator/__tests__/integration.test.ts index 19394e1..70a8c71 100644 --- a/src/generator/__tests__/integration.test.ts +++ b/src/generator/__tests__/integration.test.ts @@ -76,6 +76,7 @@ beforeEach(() => { schema: new SchemaInfo(pool, SCHEMA), genInsertSchemas: true, genSelectSchemas: true, + genUpdateSchemas: true, genTableMetadata: true, genEnums: true, genInsertTypes: true, diff --git a/src/generator/builders/InsertSchemaBuilder.ts b/src/generator/builders/InsertSchemaBuilder.ts index 53bbc35..d9a18ba 100644 --- a/src/generator/builders/InsertSchemaBuilder.ts +++ b/src/generator/builders/InsertSchemaBuilder.ts @@ -3,7 +3,7 @@ import { factory, Identifier, Expression, CallExpression } from 'typescript' import SelectSchemaBuilder from './SelectSchemaBuilder' export default class InsertSchemaBuilder extends SelectSchemaBuilder { - protected override readonly suffix = '$InsertSchema' + protected override readonly suffix: string = '$InsertSchema' protected override buildSinglePropertyEntry( columnInfo: typeof this.columns[0] diff --git a/src/generator/builders/UpdateSchemaBuilder.ts b/src/generator/builders/UpdateSchemaBuilder.ts new file mode 100644 index 0000000..7e465b5 --- /dev/null +++ b/src/generator/builders/UpdateSchemaBuilder.ts @@ -0,0 +1,49 @@ +import { factory, VariableStatement, NodeFlags } from 'typescript' +import { z } from 'zod' + +import InsertSchemaBuilder from './InsertSchemaBuilder' +import SelectSchemaBuilder from './SelectSchemaBuilder' +import { ExportKeyword } from './NodeBuilder' +import { TableInfoWithColumns, TypeRegistry } from '../database' +import { Transformations } from '../types' + +export default class UpdateSchemaBuilder extends SelectSchemaBuilder { + protected override readonly suffix: string = '$UpdateSchema' + insertSchemabuilder: InsertSchemaBuilder + + constructor( + options: z.infer, + protected types: TypeRegistry, + transform: Transformations + ) { + super(options, types, transform) + this.insertSchemabuilder = new InsertSchemaBuilder( + options, + types, + transform + ) + } + + public buildNode(): VariableStatement { + const declaration = factory.createVariableDeclaration( + this.typename(), + undefined, + undefined, + factory.createCallExpression( + factory.createPropertyAccessExpression( + this.insertSchemabuilder.typename(), + factory.createIdentifier('partial') + ), + undefined, + [] + ) + ) + + const declarationList = factory.createVariableDeclarationList( + [declaration], + NodeFlags.Const + ) + + return factory.createVariableStatement([ExportKeyword], declarationList) + } +}