Skip to content

Commit

Permalink
feat: generate info object for clients to pass as the DBDataSource ty…
Browse files Browse the repository at this point in the history
…pe parameter
  • Loading branch information
sirctseb committed Jan 26, 2023
1 parent fbee605 commit 57e05d2
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/generator/Generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { CaseFunction, Transformations } from './types'
import UtilityTypesBuilder from './builders/UtilityTypesBuilder'
import ZodSchemaBuilder from './builders/ZodSchemaBuilder'
import SingleNamedImportBuilder from './builders/SingleNamedImportBuilder'
import InfoBuilder from './builders/InfoBuilder'
import UpdateSchemaBuilder from './builders/UpdateSchemaBuilder'

export interface GeneratorOptions {
Expand All @@ -33,6 +34,7 @@ export interface GeneratorOptions {
genInsertSchemas?: boolean
genUpdateSchemas?: boolean
genTableMetadata?: boolean
genInfos?: boolean
disableEslint?: boolean
/** @deprecated */
genEnums?: boolean
Expand Down Expand Up @@ -61,6 +63,7 @@ export default class Generator {
insertSchemas: boolean
updateSchemas: boolean
tableMetadata: boolean
infos: boolean
disableEslint: boolean
/** @deprecated */
enums: boolean
Expand All @@ -82,6 +85,7 @@ export default class Generator {
genInsertSchemas: insertSchemas = true,
genUpdateSchemas: updateSchemas = true,
genTableMetadata: tableMetadata = true,
genInfos: infos = true,
disableEslint = true,
genEnums = false,
genInsertTypes = false,
Expand All @@ -92,6 +96,17 @@ export default class Generator {
transformEnumMembers = 'pascal',
transformTypeNames = 'pascal',
}: GeneratorOptions) {
if (
infos &&
(!selectSchemas || !insertSchemas || !updateSchemas || !tableMetadata)
) {
const message =
'Cannot generate Info without insert, select, and update schemas \
and table metadata'
console.error(message)
throw new Error(message)
}

this.printer = createPrinter({
newLine: NewLineKind.LineFeed,
removeComments: false,
Expand All @@ -105,6 +120,7 @@ export default class Generator {
insertSchemas,
updateSchemas,
tableMetadata,
infos,
disableEslint,
enums: genEnums,
insertTypes: genInsertTypes,
Expand Down Expand Up @@ -245,6 +261,19 @@ export default class Generator {
builders.push(builder)
}

if (this.generate.infos) {
const builder = new InfoBuilder(
tableInfo,
this.types,
this.transform,
new InsertSchemaBuilder(tableInfo, this.types, this.transform),
new SelectSchemaBuilder(tableInfo, this.types, this.transform),
new UpdateSchemaBuilder(tableInfo, this.types, this.transform),
new TableMetadataBuilder(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')
Expand Down
6 changes: 6 additions & 0 deletions src/generator/__tests__/Generator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ describe(Generator, () => {
genSelectSchemas: false,
genInsertSchemas: false,
genUpdateSchemas: false,
genInfos: false,
genEnums: false,
genInsertTypes: false,
genTables: false,
Expand All @@ -63,6 +64,7 @@ describe(Generator, () => {
genSelectSchemas: false,
genInsertSchemas: false,
genUpdateSchemas: false,
genInfos: false,
genEnums: false,
genInsertTypes: false,
genTables: true,
Expand All @@ -83,6 +85,7 @@ describe(Generator, () => {
genSelectSchemas: false,
genInsertSchemas: false,
genUpdateSchemas: false,
genInfos: false,
genEnums: true,
genInsertTypes: false,
genTables: false,
Expand All @@ -102,6 +105,7 @@ describe(Generator, () => {
genSelectSchemas: false,
genInsertSchemas: false,
genUpdateSchemas: false,
genInfos: false,
genEnums: false,
genInsertTypes: true,
genTables: false,
Expand All @@ -122,6 +126,7 @@ describe(Generator, () => {
genSelectSchemas: false,
genInsertSchemas: false,
genUpdateSchemas: false,
genInfos: false,
genEnums: false,
genInsertTypes: false,
genTables: false,
Expand All @@ -142,6 +147,7 @@ describe(Generator, () => {
genSelectSchemas: false,
genInsertSchemas: false,
genUpdateSchemas: false,
genInfos: false,
genEnums: false,
genInsertTypes: false,
genTables: false,
Expand Down
1 change: 1 addition & 0 deletions src/generator/__tests__/integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ beforeEach(() => {
genInsertSchemas: true,
genSelectSchemas: true,
genUpdateSchemas: true,
genInfos: true,
genTableMetadata: true,
genEnums: true,
genInsertTypes: true,
Expand Down
82 changes: 82 additions & 0 deletions src/generator/builders/InfoBuilder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import {
factory,
VariableStatement,
NodeFlags,
ObjectLiteralExpression,
} from 'typescript'
import { z } from 'zod'
import { TableInfoWithColumns, TypeRegistry } from '../database'
import { Transformations } from '../types'
import InsertSchemaBuilder from './InsertSchemaBuilder'
import { ExportKeyword } from './NodeBuilder'
import SelectSchemaBuilder from './SelectSchemaBuilder'
import TableMetadataBuilder from './TableMetadataBuilder'

import TypeBuilder from './TypeBuilder'
import UpdateSchemaBuilder from './UpdateSchemaBuilder'

export default class InfoBuilder extends TypeBuilder<VariableStatement> {
constructor(
options: z.infer<typeof TableInfoWithColumns>,
protected types: TypeRegistry,
transform: Transformations,
private readonly insertSchemaBuilder: InsertSchemaBuilder,
private readonly selectSchemaBuilder: SelectSchemaBuilder,
private readonly updateSchemaBuilder: UpdateSchemaBuilder,
private readonly tableMetadataBuilder: TableMetadataBuilder
) {
super(options.name, types, transform)
}

public buildNode(): VariableStatement {
const declaration = factory.createVariableDeclaration(
`${this.typename().text}Info`,
undefined,
undefined,
this.buildInfoDefinition()
)

const declarationList = factory.createVariableDeclarationList(
[declaration],
NodeFlags.Const
)

return factory.createVariableStatement([ExportKeyword], declarationList)
}

protected buildInfoDefinition(): ObjectLiteralExpression {
return factory.createObjectLiteralExpression(
[
factory.createPropertyAssignment(
this.createIdentifier('metadata'),
this.tableMetadataBuilder.typename()
),
factory.createPropertyAssignment(
factory.createIdentifier('name'),
factory.createStringLiteral(this.name)
),
factory.createPropertyAssignment(
factory.createIdentifier('schemas'),
factory.createObjectLiteralExpression(
[
factory.createPropertyAssignment(
this.createIdentifier('insert'),
this.insertSchemaBuilder.typename()
),
factory.createPropertyAssignment(
this.createIdentifier('select'),
this.selectSchemaBuilder.typename()
),
factory.createPropertyAssignment(
this.createIdentifier('update'),
this.updateSchemaBuilder.typename()
),
],
true
)
),
],
true
)
}
}

0 comments on commit 57e05d2

Please sign in to comment.