Skip to content

Commit 5fd28f4

Browse files
committed
More support and tests
1 parent 9cab0f2 commit 5fd28f4

File tree

14 files changed

+885
-442
lines changed

14 files changed

+885
-442
lines changed

packages/prisma-client-types-generator/.changeset/tricky-badgers-brush.md

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Ignore build output and dependencies
2+
/dist/
3+
/node_modules/

packages/prisma-client-types-generator/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# prisma-client-types-generator
22

3+
## 1.1.0
4+
5+
### Minor Changes
6+
7+
- more support
8+
39
## 1.0.0
410

511
### Major Changes
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
module.exports = {
2-
root: true,
3-
extends: ["eslint-config-custom"],
4-
};
1+
import custom from "eslint-config-custom";
2+
3+
export default [
4+
custom,
5+
{
6+
ignores: ["dist/**", "node_modules/**"], // Add ignores here instead of .eslintignore
7+
rules: {
8+
"no-fallthrough": "error",
9+
},
10+
},
11+
];

packages/prisma-client-types-generator/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "prisma-client-types-generator",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44
"description": "Generate safe types for the browser and other uses",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { DMMF } from "@prisma/generator-helper";
2+
3+
export const formatList = (field: DMMF.Field) => {
4+
return `${field.isList ? "[]" : ""}`;
5+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { DMMF } from "@prisma/generator-helper";
2+
3+
export const formatNull = (field: DMMF.Field) => {
4+
return !field.isRequired ? " | null" : "";
5+
};

packages/prisma-client-types-generator/src/generateModel.ts

Lines changed: 73 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,16 @@ import { DMMF } from "@prisma/generator-helper";
22
import { formatEntityName } from "./formatEntityName";
33
import { prismaTypeMap } from "./prismaTypeMap";
44
import { InternalGeneratorOptions } from "./onGenerate";
5+
import { formatList } from "./formatList";
6+
import { formatNull } from "./formatNull";
7+
import { isValueField } from "./isValueField";
58

6-
const formatNull = (field: DMMF.Field) => {
7-
return !field.isRequired ? " | null" : "";
8-
};
9-
10-
const isBaseField = (field: DMMF.Field, foreignKeysMap: Record<string, 1>) => {
11-
return !(
12-
field.isId ||
13-
field.isUnique ||
14-
field.kind === "object" ||
15-
foreignKeysMap[field.name]
16-
);
17-
};
9+
const EXTENDED = "Extended";
10+
const RELATIONS = "Relations";
11+
const VALUES = "Values";
12+
const FOREIGN_KEYS = "ForeignKeys";
13+
const UNIQUE_KEYS = "UniqueKeys";
14+
const KEYS = "Keys";
1815

1916
export const generateModel = (
2017
model: DMMF.Model,
@@ -24,8 +21,6 @@ export const generateModel = (
2421

2522
const modelTypeName = formatEntityName(model.name, config); // TODO: use also model.dbName with alias?
2623

27-
// console.log(model.fields);
28-
2924
// Example of foreignKeysMap:
3025
// { categoryId: 1, userId: 1 }
3126
const foreignKeysMap = model.fields
@@ -37,81 +32,118 @@ export const generateModel = (
3732
return acc;
3833
}, {} as Record<string, 1>);
3934

40-
// Create Keys type
41-
out += `export type ${modelTypeName}Keys = {\n`;
35+
if (model.name === "Label") console.log(foreignKeysMap);
36+
37+
// Create UniqueKeys type
38+
out += `export type ${modelTypeName}${UNIQUE_KEYS} = {\n`;
4239

4340
for (const field of model.fields) {
44-
if (isBaseField(field, foreignKeysMap)) {
41+
if (
42+
foreignKeysMap[field.name] || // goes in next block
43+
(!field.isUnique && !field.isId) // must be unique
44+
) {
4545
continue;
4646
}
47+
4748
switch (field.kind) {
48-
case "scalar":
49-
out += ` ${field.name}: ${prismaTypeMap.get(field.type)}${
50-
field.isList ? "[]" : ""
51-
}${formatNull(field)};\n`;
49+
case "scalar": {
50+
out += ` ${field.name}: ${prismaTypeMap.get(field.type)}${formatList(
51+
field
52+
)}${formatNull(field)};\n`;
5253
break;
54+
}
55+
case "enum": {
56+
out += ` ${field.name}: ${formatEntityName(
57+
field.type,
58+
config
59+
)}${formatList(field)}${formatNull(field)};\n`;
60+
break;
61+
}
5362
default:
5463
break;
5564
}
5665
}
5766

58-
out += `};\n`;
59-
out += "\n";
67+
out += `};\n\n`;
68+
69+
// Create ForeignKeys type
70+
out += `export type ${modelTypeName}${FOREIGN_KEYS} = {\n`;
71+
72+
for (const field of model.fields) {
73+
if (!foreignKeysMap[field.name]) {
74+
continue;
75+
}
76+
switch (field.kind) {
77+
case "scalar": {
78+
out += ` ${field.name}: ${prismaTypeMap.get(field.type)}${formatList(
79+
field
80+
)}${formatNull(field)};\n`;
81+
break;
82+
}
83+
default:
84+
break;
85+
}
86+
}
87+
88+
out += `};\n\n`;
89+
90+
// Create Keys type
91+
out += `export type ${modelTypeName}${KEYS} = ${modelTypeName}${FOREIGN_KEYS} & ${modelTypeName}${UNIQUE_KEYS}\n\n`;
6092

6193
// Create Values type
62-
out += `export type ${modelTypeName}Values = {\n`;
94+
out += `export type ${modelTypeName}${VALUES} = {\n`;
6395

6496
for (const field of model.fields) {
65-
if (!isBaseField(field, foreignKeysMap)) {
97+
if (!isValueField(field, foreignKeysMap)) {
6698
continue;
6799
}
68100
switch (field.kind) {
69-
case "enum":
101+
case "enum": {
70102
out += ` ${field.name}: ${formatEntityName(
71103
field.type,
72104
config
73-
)}${formatNull(field)};\n`;
105+
)}${formatList(field)}${formatNull(field)};\n`;
74106
break;
107+
}
75108
case "scalar":
76-
case "unsupported": // Untested
77-
out += ` ${field.name}: ${prismaTypeMap.get(field.type)}${
78-
field.isList ? "[]" : ""
79-
}${formatNull(field)};\n`;
109+
case "unsupported": {
110+
// Untested
111+
out += ` ${field.name}: ${prismaTypeMap.get(field.type)}${formatList(
112+
field
113+
)}${formatNull(field)};\n`;
80114
break;
115+
}
81116
default:
82117
break;
83118
}
84119
}
85120

86-
out += `};\n`;
87-
out += "\n";
121+
out += `};\n\n`;
88122

89123
// Create Relations type
90124
out += `export type ${modelTypeName}${RELATIONS} = {\n`;
91125

92126
for (const field of model.fields) {
93127
switch (field.kind) {
94-
case "object":
128+
case "object": {
95129
out += ` ${field.name}: ${formatEntityName(
96130
field.type,
97131
config
98-
)}${EXTENDED}${field.isList ? "[]" : ""}${formatNull(field)};\n`;
132+
)}${EXTENDED}${formatList(field)}${formatNull(field)};\n`;
99133
break;
134+
}
100135
default:
101136
break;
102137
}
103138
}
104139

105-
out += `};\n`;
106-
out += "\n";
140+
out += `};\n\n`;
107141

108142
// Create DB type
109-
out += `export type ${modelTypeName} = ${modelTypeName}Keys & ${modelTypeName}Values;\n`;
110-
out += "\n";
143+
out += `export type ${modelTypeName} = ${modelTypeName}${KEYS} & ${modelTypeName}${VALUES};\n\n`;
111144

112145
// Create Extended type
113-
out += `export type ${modelTypeName}${EXTENDED} = ${modelTypeName} & ${modelTypeName}${RELATIONS};\n`;
114-
out += "\n";
146+
out += `export type ${modelTypeName}${EXTENDED} = ${modelTypeName} & ${modelTypeName}${RELATIONS};\n\n`;
115147

116148
return out;
117149
};
@@ -135,6 +167,3 @@ export const generateModel = (
135167
// isGenerated: false,
136168
// isUpdatedAt: false
137169
// }
138-
139-
const EXTENDED = "Extended";
140-
const RELATIONS = "Relations";
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { DMMF } from "@prisma/generator-helper";
2+
3+
export const isValueField = (
4+
field: DMMF.Field,
5+
foreignKeysMap: Record<string, 1>
6+
) => {
7+
return !(
8+
field.isId ||
9+
field.isUnique ||
10+
field.kind === "object" ||
11+
foreignKeysMap[field.name]
12+
);
13+
};

packages/prisma-client-types-generator/src/onManifest.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import type { GeneratorManifest } from "@prisma/generator-helper";
22

33
const { version } = require("../package.json");
44

5-
/** Generates simple metadata for this generator. */
65
export function onManifest(): GeneratorManifest {
76
return {
87
version,

0 commit comments

Comments
 (0)