Skip to content

Commit 17309f5

Browse files
committed
Improved performance and reliability.
1 parent a76843e commit 17309f5

File tree

3 files changed

+16
-49
lines changed

3 files changed

+16
-49
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"cSpell.words": ["datamodel", "Ofir", "Stiber", "Voronzov"]
2+
"cSpell.words": ["datamodel", "dmmf", "Ofir", "Stiber", "Voronzov"]
33
}

prisma/schema.prisma

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ enum Numbers {
1919
TWO
2020
}
2121

22-
enum Colors {RED
22+
enum Colors {
23+
RED
2324
BLUE
2425
GREEN
2526
}

src/generate.ts

Lines changed: 13 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,15 @@
1-
import { GeneratorOptions } from '@prisma/generator-helper';
2-
import path from 'path';
1+
import { DMMF, GeneratorOptions } from '@prisma/generator-helper';
32
import fs from 'fs';
4-
import * as child_process from 'child_process';
5-
import os from 'os';
63

7-
type SchemaEnum = {
8-
name: string;
9-
values: string[];
10-
};
11-
12-
const enumRegex = /enum [\s\S]*?\}/g;
13-
const modelRegex = /model [\s\S]*?\}/g;
14-
const curlyBracesRegex = /\{([^{}]+)\}/g;
15-
16-
function parseEnums(dataModel: string) {
17-
const enumStrings = dataModel.match(enumRegex);
18-
const modelStrings = dataModel.match(modelRegex);
19-
20-
const enums: string[] =
21-
enumStrings?.map((enumString) => {
22-
const name = enumString.split(' ')[1];
23-
24-
// const valueString = enumString.substring(enumString.indexOf('{')).replace('{', '').replace('}', '').trim();
25-
// const values = valueString.split(/\s/).filter(Boolean);
26-
27-
return name;
28-
}) ?? [];
4+
function extractEnums(dataModel: DMMF.Datamodel): string[] {
5+
const enums = dataModel.enums.map((e) => e.name);
296

30-
const enumUsage: any = {};
7+
const enumUsage: Record<string, number> = {};
318
enums.forEach((e) => (enumUsage[e] = 0));
329

33-
const ignoreTokens = ['@@', '//'];
34-
35-
for (const modelString of modelStrings ?? []) {
36-
const fieldsString = modelString.substring(modelString.indexOf('{')).replace('{', '').replace('}', '').trim();
37-
const fields = fieldsString
38-
.split('\n')
39-
.map((f) => f.trim())
40-
.filter((f) => f && !ignoreTokens.some((it) => f.startsWith(it)));
41-
for (const field of fields) {
42-
const tokens = field.split(/\s/).filter(Boolean);
43-
44-
const fieldType = tokens[1] ?? null;
45-
46-
if (!fieldType) continue;
47-
48-
if (enums.includes(fieldType)) {
49-
enumUsage[fieldType]++;
50-
}
10+
for (const model of dataModel.models) {
11+
for (const field of model.fields) {
12+
if (enums.includes(field.type)) enumUsage[field.type]++;
5113
}
5214
}
5315

@@ -84,9 +46,13 @@ export default async (options: GeneratorOptions) => {
8446

8547
const isTs = !!config.useTs ? config.useTs === 'true' : true;
8648

87-
const output = options.generator.output?.value || `./prisma/enum-validators.${isTs ? 'ts' : 'js'}`;
88-
const enums = parseEnums(options.datamodel);
49+
let output = options.generator.output?.value || `./prisma/enum-validators.${isTs ? 'ts' : 'js'}`;
50+
51+
if (!isTs && !output.endsWith('.js')) {
52+
output = `${output.substring(0, output.lastIndexOf('.'))}.js`;
53+
}
8954

55+
const enums = extractEnums(options.dmmf.datamodel);
9056
const fileContent = generateFileContent(enums, isTs);
9157

9258
fs.writeFileSync(output, fileContent);

0 commit comments

Comments
 (0)