prisma_dart_generator 1.0.2 → 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/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);
@@ -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
- }
@@ -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
- };
@@ -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!");