Skip to content

Commit 221da9c

Browse files
committed
feat(indexes): include block level id
1 parent 67d8fd7 commit 221da9c

File tree

4 files changed

+88
-10
lines changed

4 files changed

+88
-10
lines changed

__tests__/fixtures/table.datamodel.ts

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { datamodelDbml } from './dbml.datamodel';
2-
import { datamodelOneToOneAndManyToOne } from './relations.datamodel';
31
export const datamodelSingleTable = /* Prisma */ `
42
model User {
53
id Int @id @default(autoincrement())
@@ -58,3 +56,27 @@ export const datamodelTableWithTwoCompositeUniqueIndex = /* Prisma */ `
5856
@@unique([e, c])
5957
}
6058
`;
59+
60+
export const datamodelTableWithBlockId = /* Prisma */ `
61+
model User {
62+
firstName String
63+
lastName String
64+
email String @unique
65+
isAdmin Boolean @default(false)
66+
67+
@@id([firstName, lastName])
68+
}
69+
`;
70+
71+
export const datamodelTableWithBlockIdAndCompositeUnqiue = /* Prisma */ `
72+
model User {
73+
firstName String
74+
lastName String
75+
email String
76+
role String
77+
isAdmin Boolean @default(false)
78+
79+
@@id([firstName, lastName])
80+
@@unique([email, role])
81+
}
82+
`;

__tests__/table.test.ts

+45
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import {
22
datamodelSingleTable,
3+
datamodelTableWithBlockId,
4+
datamodelTableWithBlockIdAndCompositeUnqiue,
35
datamodelTableWithOneCompositeUniqueIndex,
46
datamodelTableWithSingleCompositeUniqueIndex,
57
datamodelTableWithStringDefaults,
@@ -120,4 +122,47 @@ describe('Tables', () => {
120122
expect(enums.length).toEqual(1);
121123
expect(enums[0]).toMatch(expected);
122124
});
125+
126+
test('generate a table with block id', async () => {
127+
const dmmf = await generateDMMF(datamodelTableWithBlockId);
128+
129+
const expected = `Table User {
130+
firstName String [not null]
131+
lastName String [not null]
132+
email String [unique, not null]
133+
isAdmin Boolean [not null, default: false]
134+
135+
indexes {
136+
(firstName, lastName) [pk]
137+
}
138+
}`;
139+
140+
const enums = generateTables(dmmf.datamodel.models);
141+
142+
expect(enums.length).toEqual(1);
143+
expect(enums[0]).toMatch(expected);
144+
});
145+
test('generate a table with block id and composite unique index', async () => {
146+
const dmmf = await generateDMMF(
147+
datamodelTableWithBlockIdAndCompositeUnqiue
148+
);
149+
150+
const expected = `Table User {
151+
firstName String [not null]
152+
lastName String [not null]
153+
email String [not null]
154+
role String [not null]
155+
isAdmin Boolean [not null, default: false]
156+
157+
indexes {
158+
(firstName, lastName) [pk]
159+
(email, role) [unique]
160+
}
161+
}`;
162+
163+
const enums = generateTables(dmmf.datamodel.models);
164+
165+
expect(enums.length).toEqual(1);
166+
expect(enums[0]).toMatch(expected);
167+
});
123168
});

src/cli/dbml-generator.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export async function generate(options: GeneratorOptions) {
1717
try {
1818
await mkdir(outputDir, { recursive: true });
1919

20-
await writeFile('./test.json', JSON.stringify(options.dmmf.datamodel));
20+
// await writeFile('./test.json', JSON.stringify(options.dmmf.datamodel));
2121

2222
const dbmlSchema = generateDBMLSchema(options.dmmf, allowManyToMany);
2323

src/generator/table.ts

+18-7
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,27 @@ export function generateTables(models: DMMF.Model[]): string[] {
1313
}
1414

1515
const generateTableIndexes = (model: DMMF.Model): string => {
16-
const hasTableIndexes =
17-
model.idFields.length > 0 || model.uniqueFields.length > 0;
18-
return hasTableIndexes
19-
? `\n\n ${DBMLKeywords.Indexes} {\n${generateTableUniqueFields(
20-
model.uniqueFields
21-
)}\n }`
16+
const hasIdFields = model.idFields.length > 0;
17+
const hasCompositeUniqueIndex = model.uniqueFields.length > 0;
18+
return hasIdFields || hasCompositeUniqueIndex
19+
? `\n\n ${DBMLKeywords.Indexes} {\n${generateTableBlockId(
20+
model.idFields
21+
)}${
22+
hasIdFields && hasCompositeUniqueIndex ? '\n' : ''
23+
}${generateTableCompositeUniqueIndex(model.uniqueFields)}\n }`
2224
: '';
2325
};
2426

25-
const generateTableUniqueFields = (uniqueFields: string[][]): string => {
27+
const generateTableBlockId = (idFields: string[]): string => {
28+
if (idFields.length === 0) {
29+
return '';
30+
}
31+
return ` (${idFields.join(', ')}) [${DBMLKeywords.Pk}]`;
32+
};
33+
34+
const generateTableCompositeUniqueIndex = (
35+
uniqueFields: string[][]
36+
): string => {
2637
return uniqueFields
2738
.map(
2839
(composite) => ` (${composite.join(', ')}) [${DBMLKeywords.Unique}]`

0 commit comments

Comments
 (0)