prisma_dart_generator 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/index.d.ts +3 -0
- package/dist/bin/index.d.ts.map +1 -0
- package/dist/bin/index.js +48 -0
- package/dist/bin/index.js.map +1 -0
- package/dist/bin/parts/class.d.ts +18 -0
- package/dist/bin/parts/class.d.ts.map +1 -0
- package/dist/bin/parts/class.js +194 -0
- package/dist/bin/parts/class.js.map +1 -0
- package/dist/bin/parts/enum.d.ts +11 -0
- package/dist/bin/parts/enum.d.ts.map +1 -0
- package/dist/bin/parts/enum.js +45 -0
- package/dist/bin/parts/enum.js.map +1 -0
- package/dist/bin/parts/field.d.ts +7 -0
- package/dist/bin/parts/field.d.ts.map +1 -0
- package/dist/bin/parts/field.js +57 -0
- package/dist/bin/parts/field.js.map +1 -0
- package/dist/bin/parts/utils.d.ts +3 -0
- package/dist/bin/parts/utils.d.ts.map +1 -0
- package/dist/bin/parts/utils.js +10 -0
- package/dist/bin/parts/utils.js.map +1 -0
- package/package.json +6 -5
- package/.cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdc +0 -111
- package/README.md +0 -15
- package/bin/index.ts +0 -59
- package/bin/parts/class.ts +0 -236
- package/bin/parts/enum.ts +0 -51
- package/bin/parts/field.ts +0 -62
- package/bin/parts/utils.ts +0 -11
- package/index.ts +0 -1
- package/test/dart/data/models.dart +0 -622
- package/test/prisma/schema.prisma +0 -107
- package/test/prisma.config.ts +0 -16
- package/tsconfig.json +0 -29
package/bin/index.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import fs from "fs";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { getDMMF } from "@prisma/internals";
|
|
6
|
-
import Class from "./parts/class";
|
|
7
|
-
import Field from "./parts/field";
|
|
8
|
-
import Enum from "./parts/enum";
|
|
9
|
-
|
|
10
|
-
const [, , schemaPath, outputPath] = process.argv;
|
|
11
|
-
|
|
12
|
-
async function main() {
|
|
13
|
-
console.log("Starting the generator...");
|
|
14
|
-
if (!schemaPath || !fs.existsSync(schemaPath))
|
|
15
|
-
throw new Error("Prisma schema not found!");
|
|
16
|
-
|
|
17
|
-
if (!outputPath)
|
|
18
|
-
throw new Error("Output path is required as the second argument");
|
|
19
|
-
|
|
20
|
-
const schema = fs.readFileSync(schemaPath, "utf-8");
|
|
21
|
-
const dmmf = await getDMMF({ datamodel: schema });
|
|
22
|
-
const models = dmmf.datamodel.models;
|
|
23
|
-
const enums = dmmf.datamodel.enums;
|
|
24
|
-
|
|
25
|
-
let dartString = "";
|
|
26
|
-
|
|
27
|
-
for (const e of enums) {
|
|
28
|
-
console.log("Generating enum: ", e.name);
|
|
29
|
-
const dart = new Enum({
|
|
30
|
-
name: e.name,
|
|
31
|
-
values: e.values.map((value) => value.name),
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
dartString += dart.toString();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
for (const model of models) {
|
|
38
|
-
console.log("Generating model: ", model.name);
|
|
39
|
-
const dart = new Class({
|
|
40
|
-
name: model.name,
|
|
41
|
-
fields: model.fields.map((field) => {
|
|
42
|
-
return new Field(field);
|
|
43
|
-
}),
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
dartString += dart.toString();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const text = `
|
|
50
|
-
//*** AUTO-GENERATED FILE - DO NOT MODIFY ***//
|
|
51
|
-
|
|
52
|
-
${dartString}
|
|
53
|
-
`;
|
|
54
|
-
|
|
55
|
-
if (!fs.existsSync(outputPath)) fs.mkdirSync(outputPath, { recursive: true });
|
|
56
|
-
fs.writeFileSync(path.join(outputPath, "models.dart"), text, "utf-8");
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
main().catch(console.error);
|
package/bin/parts/class.ts
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { enumToDartName } from "./enum";
|
|
2
|
-
import type Field from "./field";
|
|
3
|
-
import { snakeToCamel } from "./utils";
|
|
4
|
-
|
|
5
|
-
export const modelNameToDartName = (name: string): string => {
|
|
6
|
-
const modelName = name
|
|
7
|
-
.split("_")
|
|
8
|
-
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
9
|
-
.join("");
|
|
10
|
-
|
|
11
|
-
return `${modelName}Model`;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export default class Class {
|
|
15
|
-
public name: string;
|
|
16
|
-
public fields: Field[];
|
|
17
|
-
|
|
18
|
-
constructor({ name, fields }: { name: string; fields: Field[] }) {
|
|
19
|
-
this.name = name;
|
|
20
|
-
this.fields = fields;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
toString(): string {
|
|
24
|
-
return `
|
|
25
|
-
class ${modelNameToDartName(this.name)} {
|
|
26
|
-
${this.getFields()}
|
|
27
|
-
|
|
28
|
-
${this.getConstructor()}
|
|
29
|
-
|
|
30
|
-
${this.getFromJson()}
|
|
31
|
-
|
|
32
|
-
${this.toJson()}
|
|
33
|
-
|
|
34
|
-
${this.copyWith()}
|
|
35
|
-
|
|
36
|
-
${this.toStr()}
|
|
37
|
-
}`;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private getFields(): string {
|
|
41
|
-
return " " + this.fields.map((field) => field.toString()).join("\n ");
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
private getConstructor(): string {
|
|
45
|
-
return `
|
|
46
|
-
${modelNameToDartName(this.name)}({
|
|
47
|
-
${this.fields
|
|
48
|
-
.map((field) => {
|
|
49
|
-
return ` this.${snakeToCamel(field.field.name)}`;
|
|
50
|
-
})
|
|
51
|
-
.join(",\n")}
|
|
52
|
-
});`;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
private getFromJson(): string {
|
|
56
|
-
function parseFromJson(field: Field): string {
|
|
57
|
-
const prismaField = field.field;
|
|
58
|
-
let valueExpr = "";
|
|
59
|
-
|
|
60
|
-
// Number types
|
|
61
|
-
if (prismaField.type === "Int" || prismaField.type === "Float")
|
|
62
|
-
valueExpr = `num.tryParse("\${json["${prismaField.name}"]}")`;
|
|
63
|
-
// DateTime
|
|
64
|
-
else if (prismaField.type === "DateTime")
|
|
65
|
-
valueExpr = `json["${prismaField.name}"] != null ? DateTime.parse(json["${prismaField.name}"]) : null`;
|
|
66
|
-
// scalar types
|
|
67
|
-
else if (prismaField.kind === "scalar")
|
|
68
|
-
valueExpr = `json["${prismaField.name}"]`;
|
|
69
|
-
// Enum
|
|
70
|
-
else if (prismaField.kind === "enum")
|
|
71
|
-
valueExpr = `json["${prismaField.name}"] != null ? ${enumToDartName(
|
|
72
|
-
prismaField.type.replace("[]", "")
|
|
73
|
-
)}.fromText(json["${prismaField.name}"]) : null`;
|
|
74
|
-
// Relation (another class, object or list of objects)
|
|
75
|
-
else if (prismaField.relationName !== null)
|
|
76
|
-
if (prismaField.isList)
|
|
77
|
-
valueExpr = `json["${prismaField.name}"] != null
|
|
78
|
-
? List.from(json["${
|
|
79
|
-
prismaField.name
|
|
80
|
-
}"]).map((d) => ${modelNameToDartName(
|
|
81
|
-
prismaField.type.replace("[]", "")
|
|
82
|
-
)}.fromJson(d)).toList()
|
|
83
|
-
: null`;
|
|
84
|
-
else
|
|
85
|
-
valueExpr = `json["${prismaField.name}"] != null
|
|
86
|
-
? ${modelNameToDartName(
|
|
87
|
-
prismaField.type.replace("[]", "")
|
|
88
|
-
)}.fromJson(json['${prismaField.name}'])
|
|
89
|
-
: null`;
|
|
90
|
-
// Fallback: Just assign and type-cast
|
|
91
|
-
else valueExpr = `json["${prismaField.name}"] as ${prismaField.type}`;
|
|
92
|
-
|
|
93
|
-
return valueExpr;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return `
|
|
97
|
-
factory ${modelNameToDartName(
|
|
98
|
-
this.name
|
|
99
|
-
)}.fromJson(Map<String, dynamic> json) => ${modelNameToDartName(this.name)}(
|
|
100
|
-
${this.fields
|
|
101
|
-
.map((field) => {
|
|
102
|
-
return `${snakeToCamel(field.field.name)}: ${parseFromJson(field)},`;
|
|
103
|
-
})
|
|
104
|
-
.join("\n ")}
|
|
105
|
-
);`;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
private toJson(): string {
|
|
109
|
-
return `
|
|
110
|
-
Map<String, dynamic> toJson() => {
|
|
111
|
-
${this.fields
|
|
112
|
-
.map((field) => {
|
|
113
|
-
const prismaField = field.field;
|
|
114
|
-
const name = snakeToCamel(prismaField.name);
|
|
115
|
-
let valueExpr = "";
|
|
116
|
-
|
|
117
|
-
// DateTime
|
|
118
|
-
if (prismaField.type === "DateTime")
|
|
119
|
-
valueExpr = `${name}?.toIso8601String()`;
|
|
120
|
-
// Scalar
|
|
121
|
-
else if (prismaField.kind === "scalar") valueExpr = `${name}`;
|
|
122
|
-
// Enum
|
|
123
|
-
else if (prismaField.kind === "enum") valueExpr = `${name}?.text`;
|
|
124
|
-
else if (prismaField.relationName !== null)
|
|
125
|
-
if (prismaField.isList)
|
|
126
|
-
valueExpr = `${snakeToCamel(
|
|
127
|
-
prismaField.name
|
|
128
|
-
)}?.map((d) => d.toJson()).toList()`;
|
|
129
|
-
else valueExpr = `${name}?.toJson()`;
|
|
130
|
-
// Fallback: Just assign and type-cast
|
|
131
|
-
else valueExpr = `${name}`;
|
|
132
|
-
|
|
133
|
-
return `if(${name} != null) '${prismaField.name}': ${valueExpr}`;
|
|
134
|
-
})
|
|
135
|
-
.join(",\n ")}
|
|
136
|
-
};`;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
private copyWith(): string {
|
|
140
|
-
function parseFromJson(field: Field): string {
|
|
141
|
-
const prismaField = field.field;
|
|
142
|
-
let valueExpr = "";
|
|
143
|
-
|
|
144
|
-
// Number types
|
|
145
|
-
if (prismaField.type === "Int" || prismaField.type === "Float")
|
|
146
|
-
valueExpr = `json["${
|
|
147
|
-
prismaField.name
|
|
148
|
-
}"] != null ? num.tryParse("\${json["${
|
|
149
|
-
prismaField.name
|
|
150
|
-
}"]}") : ${snakeToCamel(field.field.name)}`;
|
|
151
|
-
// JSON
|
|
152
|
-
else if (prismaField.type === "Json")
|
|
153
|
-
valueExpr = `json["${prismaField.name}"] != null ? Map<String, dynamic>.from(json["${prismaField.name}"]) : null`;
|
|
154
|
-
else if (prismaField.type === "Json?")
|
|
155
|
-
valueExpr = `json["${prismaField.name}"] != null ? Map<String, dynamic>.from(json["${prismaField.name}"]) : null`;
|
|
156
|
-
// DateTime
|
|
157
|
-
else if (prismaField.type === "DateTime")
|
|
158
|
-
valueExpr = `json["${prismaField.name}"] != null ? DateTime.parse(json["${prismaField.name}"]) : null`;
|
|
159
|
-
// scalar types
|
|
160
|
-
else if (prismaField.kind === "scalar")
|
|
161
|
-
valueExpr = `json["${prismaField.name}"] ?? ${snakeToCamel(
|
|
162
|
-
field.field.name
|
|
163
|
-
)}`;
|
|
164
|
-
// Enum
|
|
165
|
-
else if (prismaField.kind === "enum")
|
|
166
|
-
valueExpr = `json["${prismaField.name}"] != null ? ${enumToDartName(
|
|
167
|
-
prismaField.type.replace("[]", "")
|
|
168
|
-
)}.fromText(json["${prismaField.name}"]) : null`;
|
|
169
|
-
// Relation (another class, object or list of objects)
|
|
170
|
-
else if (prismaField.relationName !== null)
|
|
171
|
-
if (prismaField.isList)
|
|
172
|
-
valueExpr = `json["${prismaField.name}"] != null
|
|
173
|
-
? List.from(json["${
|
|
174
|
-
prismaField.name
|
|
175
|
-
}"]).map((d) => ${modelNameToDartName(
|
|
176
|
-
prismaField.type.replace("[]", "")
|
|
177
|
-
)}.fromJson(d)).toList()
|
|
178
|
-
: ${snakeToCamel(field.field.name)}`;
|
|
179
|
-
else
|
|
180
|
-
valueExpr = `json["${prismaField.name}"] != null
|
|
181
|
-
? ${modelNameToDartName(
|
|
182
|
-
prismaField.type.replace("[]", "")
|
|
183
|
-
)}.fromJson(json['${prismaField.name}'])
|
|
184
|
-
: ${snakeToCamel(field.field.name)}`;
|
|
185
|
-
// Fallback: Just assign and type-cast
|
|
186
|
-
else valueExpr = `json["${prismaField.name}"] as ${prismaField.type}`;
|
|
187
|
-
|
|
188
|
-
return valueExpr;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return `
|
|
192
|
-
${modelNameToDartName(
|
|
193
|
-
this.name
|
|
194
|
-
)} copyWith(Map<String, dynamic> json) => ${modelNameToDartName(this.name)}(
|
|
195
|
-
${this.fields
|
|
196
|
-
.map((field) => {
|
|
197
|
-
return `${snakeToCamel(field.field.name)}: ${parseFromJson(field)}`;
|
|
198
|
-
})
|
|
199
|
-
.join(",\n ")}
|
|
200
|
-
);`;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
private toStr(): string {
|
|
204
|
-
return `
|
|
205
|
-
@override
|
|
206
|
-
String toString() => """
|
|
207
|
-
${modelNameToDartName(this.name)}(
|
|
208
|
-
${this.fields
|
|
209
|
-
.map((field) => {
|
|
210
|
-
const prismaField = field.field;
|
|
211
|
-
const name = snakeToCamel(prismaField.name);
|
|
212
|
-
let valueExpr = "";
|
|
213
|
-
|
|
214
|
-
// DateTime
|
|
215
|
-
if (prismaField.type === "DateTime")
|
|
216
|
-
valueExpr = `${name}?.toIso8601String()`;
|
|
217
|
-
// Scalar
|
|
218
|
-
else if (prismaField.kind === "scalar") valueExpr = `${name}`;
|
|
219
|
-
// Enum
|
|
220
|
-
else if (prismaField.kind === "enum")
|
|
221
|
-
valueExpr = `${name}?.text`;
|
|
222
|
-
else if (prismaField.relationName !== null)
|
|
223
|
-
if (prismaField.isList)
|
|
224
|
-
valueExpr = `${snakeToCamel(
|
|
225
|
-
prismaField.name
|
|
226
|
-
)}?.map((d) => d.toJson()).toList()`;
|
|
227
|
-
else valueExpr = `${name}?.toJson()`;
|
|
228
|
-
// Fallback: Just assign and type-cast
|
|
229
|
-
else valueExpr = `${name}`;
|
|
230
|
-
|
|
231
|
-
return `'${prismaField.name}': \${${valueExpr}}`;
|
|
232
|
-
})
|
|
233
|
-
.join(",\n ")}
|
|
234
|
-
) """;`;
|
|
235
|
-
}
|
|
236
|
-
}
|
package/bin/parts/enum.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { snakeToCamel } from "./utils";
|
|
2
|
-
|
|
3
|
-
export const enumToDartName = (name: string): string => {
|
|
4
|
-
const modelName = name
|
|
5
|
-
.split("_")
|
|
6
|
-
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
7
|
-
.join("");
|
|
8
|
-
|
|
9
|
-
return `${modelName}Enum`;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export default class Enum {
|
|
13
|
-
public name: string;
|
|
14
|
-
public values: string[];
|
|
15
|
-
|
|
16
|
-
constructor({ name, values }: { name: string; values: string[] }) {
|
|
17
|
-
this.name = name;
|
|
18
|
-
this.values = values;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
toString(): string {
|
|
22
|
-
return `
|
|
23
|
-
enum ${enumToDartName(this.name)} {
|
|
24
|
-
|
|
25
|
-
${this.values
|
|
26
|
-
.map((value) => ` ${snakeToCamel(value)}("${value}")`)
|
|
27
|
-
.join(",\n")};
|
|
28
|
-
|
|
29
|
-
final String _text;
|
|
30
|
-
|
|
31
|
-
const ${enumToDartName(this.name)}(String text):_text = text;
|
|
32
|
-
|
|
33
|
-
static ${enumToDartName(this.name)}? fromText(String? value) {
|
|
34
|
-
if(value == null) return null;
|
|
35
|
-
try {
|
|
36
|
-
return ${enumToDartName(
|
|
37
|
-
this.name
|
|
38
|
-
)}.values.firstWhere((v) => v._text == value);
|
|
39
|
-
} catch (e) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
String get text => _text;
|
|
45
|
-
|
|
46
|
-
@override
|
|
47
|
-
String toString() => _text;
|
|
48
|
-
}
|
|
49
|
-
`;
|
|
50
|
-
}
|
|
51
|
-
}
|
package/bin/parts/field.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { Field as PrismaField } from "@prisma/dmmf";
|
|
2
|
-
|
|
3
|
-
import { modelNameToDartName } from "./class";
|
|
4
|
-
import { enumToDartName } from "./enum";
|
|
5
|
-
import { snakeToCamel } from "./utils";
|
|
6
|
-
|
|
7
|
-
export default class Field {
|
|
8
|
-
field: PrismaField;
|
|
9
|
-
|
|
10
|
-
constructor(field: PrismaField) {
|
|
11
|
-
this.field = field;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
toString(): string {
|
|
15
|
-
const type = getDartTypeFromPrismaType(this.field.type);
|
|
16
|
-
const name = snakeToCamel(this.field.name);
|
|
17
|
-
|
|
18
|
-
if (this.field.kind === "scalar") return `final ${type}? ${name};`;
|
|
19
|
-
else if (this.field.isList)
|
|
20
|
-
if (this.field.relationName !== null)
|
|
21
|
-
return `final List<${modelNameToDartName(
|
|
22
|
-
type.replace("[]", "")
|
|
23
|
-
)}>? ${name};`;
|
|
24
|
-
else return `final List<${type.replace("[]", "")}>? ${name};`;
|
|
25
|
-
else if (this.field.kind === "enum")
|
|
26
|
-
return `final ${enumToDartName(type.replace("[]", ""))}? ${name};`;
|
|
27
|
-
else if (this.field.relationName !== null)
|
|
28
|
-
return `final ${modelNameToDartName(type.replace("[]", ""))}? ${name};`;
|
|
29
|
-
else return `final ${type}? ${name};`;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const getDartTypeFromPrismaType = (type: string): string => {
|
|
34
|
-
switch (type) {
|
|
35
|
-
case "String":
|
|
36
|
-
return "String";
|
|
37
|
-
case "String?":
|
|
38
|
-
return "String?";
|
|
39
|
-
case "Int":
|
|
40
|
-
return "num";
|
|
41
|
-
case "Int?":
|
|
42
|
-
return "num?";
|
|
43
|
-
case "Float":
|
|
44
|
-
return "num";
|
|
45
|
-
case "Float?":
|
|
46
|
-
return "num?";
|
|
47
|
-
case "Boolean":
|
|
48
|
-
return "bool";
|
|
49
|
-
case "Boolean?":
|
|
50
|
-
return "bool?";
|
|
51
|
-
case "DateTime":
|
|
52
|
-
return "DateTime";
|
|
53
|
-
case "DateTime?":
|
|
54
|
-
return "DateTime?";
|
|
55
|
-
case "Json":
|
|
56
|
-
return "Map<String, dynamic>";
|
|
57
|
-
case "Json?":
|
|
58
|
-
return "Map<String, dynamic>?";
|
|
59
|
-
default:
|
|
60
|
-
return type;
|
|
61
|
-
}
|
|
62
|
-
};
|
package/bin/parts/utils.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export const capitalize = (text: string) =>
|
|
2
|
-
text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
|
|
3
|
-
|
|
4
|
-
export const snakeToCamel = (text: string) => {
|
|
5
|
-
if (!text.includes("_")) return text.toLowerCase();
|
|
6
|
-
|
|
7
|
-
return text
|
|
8
|
-
.split("_")
|
|
9
|
-
.map((t, i) => (i == 0 ? t.toLowerCase() : capitalize(t)))
|
|
10
|
-
.join("");
|
|
11
|
-
};
|
package/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
console.log("Hello via Bun!");
|