From 67bd3aeaf90e74d951fa563ef0f596b15d99ea06 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 30 Jun 2025 09:16:06 +0200 Subject: [PATCH 1/2] fix: several issues with ts schema generation --- packages/sdk/src/ts-schema-generator.ts | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/sdk/src/ts-schema-generator.ts b/packages/sdk/src/ts-schema-generator.ts index c6e22a2e..a9899c86 100644 --- a/packages/sdk/src/ts-schema-generator.ts +++ b/packages/sdk/src/ts-schema-generator.ts @@ -618,10 +618,7 @@ export class TsSchemaGenerator { ts.factory.createPropertyAssignment( field.name, ts.factory.createObjectLiteralExpression([ - ts.factory.createPropertyAssignment( - 'type', - ts.factory.createStringLiteral(field.type.type!), - ), + ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(field)), ]), ), ); @@ -629,6 +626,10 @@ export class TsSchemaGenerator { } // model-level id and unique + + // it's possible to have the same set of fields in both `@@id` and `@@unique` + // so we need to deduplicate them + const seenKeys = new Set(); for (const attr of dm.attributes) { if (attr.decl.$refText === '@@id' || attr.decl.$refText === '@@unique') { const fieldNames = this.getReferenceNames(attr.args[0]!.value); @@ -643,15 +644,17 @@ export class TsSchemaGenerator { ts.factory.createPropertyAssignment( fieldNames[0]!, ts.factory.createObjectLiteralExpression([ - ts.factory.createPropertyAssignment( - 'type', - ts.factory.createStringLiteral(fieldDef.type.type!), - ), + ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(fieldDef)), ]), ), ); } else { // multi-field unique + const key = fieldNames.join('_'); + if (seenKeys.has(key)) { + continue; + } + seenKeys.add(key); properties.push( ts.factory.createPropertyAssignment( fieldNames.join('_'), @@ -663,7 +666,7 @@ export class TsSchemaGenerator { ts.factory.createObjectLiteralExpression([ ts.factory.createPropertyAssignment( 'type', - ts.factory.createStringLiteral(fieldDef.type.type!), + this.generateFieldTypeLiteral(fieldDef), ), ]), ); @@ -678,6 +681,10 @@ export class TsSchemaGenerator { return ts.factory.createObjectLiteralExpression(properties, true); } + private generateFieldTypeLiteral(field: DataModelField): ts.Expression { + return ts.factory.createStringLiteral(field.type.type ?? field.type.reference!.$refText); + } + private createEnumObject(e: Enum) { return ts.factory.createObjectLiteralExpression( e.fields.map((field) => From e747edfd340a4deab2e1a2c656422b6e805af78a Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 30 Jun 2025 09:20:48 +0200 Subject: [PATCH 2/2] addressing review comments --- packages/sdk/src/ts-schema-generator.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sdk/src/ts-schema-generator.ts b/packages/sdk/src/ts-schema-generator.ts index a9899c86..55111bd1 100644 --- a/packages/sdk/src/ts-schema-generator.ts +++ b/packages/sdk/src/ts-schema-generator.ts @@ -682,6 +682,7 @@ export class TsSchemaGenerator { } private generateFieldTypeLiteral(field: DataModelField): ts.Expression { + invariant(field.type.type || field.type.reference, 'Field type must be a primitive or reference'); return ts.factory.createStringLiteral(field.type.type ?? field.type.reference!.$refText); }