Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions packages/cli/test/prisma-schema-gen.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { loadSchema } from '@zenstackhq/testtools';
import { describe, expect, it } from 'vitest';
import { PrismaSchemaGenerator } from '@zenstackhq/sdk';

describe('Prisma schema generation tests', () => {
it('strips format args from id functions', async () => {
const model = await loadSchema(`
model User {
id Int @id @default(autoincrement())

cuid String @default(cuid())
cuid1 String @default(cuid(1, 'cuid1_%s'))
cuid2 String @default(cuid(2, 'cuid2_%s'))

uuid String @default(uuid())
uuid4 String @default(uuid(4, 'uuid4_%s'))
uuid7 String @default(uuid(7, 'uuid7_%s'))

ulid String @default(ulid())
ulid1 String @default(ulid('ulid_%s'))

nanoid String @default(nanoid())
nanoid12 String @default(nanoid(12, 'nanoid12_%s'))
}
`);

const generator = new PrismaSchemaGenerator(model);
const prismaSchemaText = await generator.generate();

expect(prismaSchemaText.includes('cuid()')).toBe(true);
expect(prismaSchemaText.includes('cuid(1)')).toBe(true);
expect(prismaSchemaText.includes('cuid(2)')).toBe(true);
expect(prismaSchemaText.includes('cuid1_%s')).toBe(false);
expect(prismaSchemaText.includes('cuid2_%s')).toBe(false);

expect(prismaSchemaText.includes('uuid()')).toBe(true);
expect(prismaSchemaText.includes('uuid(4)')).toBe(true);
expect(prismaSchemaText.includes('uuid(7)')).toBe(true);
Comment thread
sanny-io marked this conversation as resolved.
expect(prismaSchemaText.includes('uuid4_%s')).toBe(false);
expect(prismaSchemaText.includes('uuid7_%s')).toBe(false);

expect(prismaSchemaText.match(/ulid\(\)/g)).toHaveLength(2);
expect(prismaSchemaText.includes('ulid_%s')).toBe(false);

expect(prismaSchemaText.includes('nanoid()')).toBe(true);
expect(prismaSchemaText.includes('nanoid(12)')).toBe(true);
expect(prismaSchemaText.includes('nanoid12_%s')).toBe(false);
});
});
7 changes: 6 additions & 1 deletion packages/sdk/src/prisma/prisma-schema-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ const IDENTIFIER_NAME_MAX_LENGTH = 50 - DELEGATE_AUX_RELATION_PREFIX.length;

// Datasource fields that only exist in ZModel but not in Prisma schema
const NON_PRISMA_DATASOURCE_FIELDS = ['defaultSchema'];
const ID_FUNCTIONS = ['uuid', 'ulid', 'cuid', 'nanoid'];

/**
* Generates Prisma schema file
Expand Down Expand Up @@ -383,7 +384,11 @@ export class PrismaSchemaGenerator {
makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {
return new PrismaFunctionCall(
node.function.ref!.name,
node.args.map((arg) => {

// strip format args from id functions
node.args.filter((_, i) => (
!(ID_FUNCTIONS.includes(node.function.ref!.name) && (node.function.ref!.name === 'ulid' && i === 0 || i === 1))
)).map((arg) => {
const val = match(arg.value)
.when(isStringLiteral, (v) => `"${v.value}"`)
.when(isLiteralExpr, (v) => v.value.toString())
Expand Down
Loading