@gadmin2n/prisma-react-generator 0.0.35

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.
Files changed (37) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +1 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +4 -0
  5. package/dist/generator/field-classifiers.d.ts +13 -0
  6. package/dist/generator/field-classifiers.js +45 -0
  7. package/dist/generator/generate-config-props.d.ts +21 -0
  8. package/dist/generator/generate-config-props.js +198 -0
  9. package/dist/generator/generate-create-page.d.ts +13 -0
  10. package/dist/generator/generate-create-page.js +129 -0
  11. package/dist/generator/generate-edit-page.d.ts +13 -0
  12. package/dist/generator/generate-edit-page.js +138 -0
  13. package/dist/generator/generate-index-page.d.ts +13 -0
  14. package/dist/generator/generate-index-page.js +16 -0
  15. package/dist/generator/generate-list-page.d.ts +13 -0
  16. package/dist/generator/generate-list-page.js +262 -0
  17. package/dist/generator/generate-model-props.d.ts +14 -0
  18. package/dist/generator/generate-model-props.js +78 -0
  19. package/dist/generator/generate-models-index.d.ts +9 -0
  20. package/dist/generator/generate-models-index.js +19 -0
  21. package/dist/generator/generate-resources.d.ts +8 -0
  22. package/dist/generator/generate-resources.js +33 -0
  23. package/dist/generator/generate-show-page.d.ts +13 -0
  24. package/dist/generator/generate-show-page.js +71 -0
  25. package/dist/generator/generate-ui-config.d.ts +2 -0
  26. package/dist/generator/generate-ui-config.js +354 -0
  27. package/dist/generator/helpers.d.ts +55 -0
  28. package/dist/generator/helpers.js +356 -0
  29. package/dist/generator/index.d.ts +9 -0
  30. package/dist/generator/index.js +131 -0
  31. package/dist/generator/template-helpers.d.ts +27 -0
  32. package/dist/generator/template-helpers.js +78 -0
  33. package/dist/generator/types.d.ts +27 -0
  34. package/dist/generator/types.js +2 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.js +53 -0
  37. package/package.json +79 -0
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDocumentation = exports.getModelsEnum = exports.isEnumField = exports.getModelsFieldsTypeMap = exports.globToFieldList = exports.structFilteredByGlob = exports.getPrismaReadStruct = exports.zipImportStatementParams = exports.mergeImportStatements = exports.getRelationScalars = exports.mapDMMFToParsedField = exports.makeImportsFromPrismaClient = exports.flattenObj = exports.isObject = exports.pick = exports.omit = exports.isGameAngle = exports.concatIntoArray = exports.uniq = void 0;
4
+ const template_helpers_1 = require("./template-helpers");
5
+ const notation_1 = require("notation");
6
+ const { readFileSync } = require('fs');
7
+ const uniq = (input) => Array.from(new Set(input));
8
+ exports.uniq = uniq;
9
+ const concatIntoArray = (source, target) => source.forEach((item) => target.push(item));
10
+ exports.concatIntoArray = concatIntoArray;
11
+ function isGameAngle(model) {
12
+ return (model.fields.find((field) => field.name === 'gameId') &&
13
+ JSON.parse(readFileSync('./gadmin-cli.json', 'utf8')).template ===
14
+ 'gadmin2-game-angle-demo');
15
+ }
16
+ exports.isGameAngle = isGameAngle;
17
+ function omit(obj, fields) {
18
+ const shallowCopy = Object.assign({}, obj);
19
+ for (let i = 0; i < fields.length; i += 1) {
20
+ const key = fields[i];
21
+ delete shallowCopy[key];
22
+ }
23
+ return shallowCopy;
24
+ }
25
+ exports.omit = omit;
26
+ function pick(obj, fields) {
27
+ const shallowCopy = {};
28
+ for (let i = 0; i < fields.length; i += 1) {
29
+ const key = fields[i];
30
+ shallowCopy[key] = obj[key];
31
+ }
32
+ return shallowCopy;
33
+ }
34
+ exports.pick = pick;
35
+ function isObject(item) {
36
+ return item && typeof item === 'object' && !Array.isArray(item);
37
+ }
38
+ exports.isObject = isObject;
39
+ function _flattenObj(obj, target, parent) {
40
+ Object.entries(obj).forEach(([key, value]) => {
41
+ let newKey;
42
+ if (parent === undefined) {
43
+ newKey = key;
44
+ }
45
+ else {
46
+ newKey = `${parent}.${key}`;
47
+ }
48
+ if (isObject(value)) {
49
+ _flattenObj(value, target, newKey);
50
+ }
51
+ else if (Array.isArray(value) && value.length > 0) {
52
+ if (isObject(value[0])) {
53
+ Object.getOwnPropertyNames(value[0]).forEach((subKey) => {
54
+ target[`${newKey}.${subKey}`] = value
55
+ .map((item) => item[subKey])
56
+ .join('; ');
57
+ });
58
+ }
59
+ }
60
+ else {
61
+ target[newKey] = value;
62
+ }
63
+ });
64
+ }
65
+ function flattenObj(obj) {
66
+ const flattenedObject = {};
67
+ _flattenObj(obj, flattenedObject);
68
+ return flattenedObject;
69
+ }
70
+ exports.flattenObj = flattenObj;
71
+ const makeImportsFromPrismaClient = (fields) => {
72
+ const enumsToImport = (0, exports.uniq)(fields.filter(({ kind }) => kind === 'enum').map(({ type }) => type));
73
+ const importPrisma = fields
74
+ .filter(({ kind }) => kind === 'scalar')
75
+ .some(({ type }) => (0, template_helpers_1.scalarToTS)(type).includes('Prisma'));
76
+ if (!(enumsToImport.length || importPrisma)) {
77
+ return null;
78
+ }
79
+ return {
80
+ from: '@prisma/client',
81
+ destruct: importPrisma ? ['Prisma', ...enumsToImport] : enumsToImport,
82
+ };
83
+ };
84
+ exports.makeImportsFromPrismaClient = makeImportsFromPrismaClient;
85
+ const mapDMMFToParsedField = (field, overrides = {}) => ({
86
+ ...field,
87
+ ...overrides,
88
+ });
89
+ exports.mapDMMFToParsedField = mapDMMFToParsedField;
90
+ const getRelationScalars = (fields) => {
91
+ const scalars = fields.flatMap(({ relationFromFields = [] }) => relationFromFields);
92
+ return scalars.reduce((result, scalar) => ({
93
+ ...result,
94
+ [scalar]: fields
95
+ .filter(({ relationFromFields = [] }) => relationFromFields.includes(scalar))
96
+ .map(({ name }) => name),
97
+ }), {});
98
+ };
99
+ exports.getRelationScalars = getRelationScalars;
100
+ const mergeImportStatements = (first, second) => {
101
+ if (first.from !== second.from) {
102
+ throw new Error(`Can not merge import statements; 'from' parameter is different`);
103
+ }
104
+ if (first.default && second.default) {
105
+ throw new Error(`Can not merge import statements; both statements have set the 'default' preoperty`);
106
+ }
107
+ const firstDestruct = first.destruct || [];
108
+ const secondDestruct = second.destruct || [];
109
+ const destructStrings = (0, exports.uniq)([...firstDestruct, ...secondDestruct].filter((destructItem) => typeof destructItem === 'string'));
110
+ const destructObject = [...firstDestruct, ...secondDestruct].reduce((result, destructItem) => {
111
+ if (typeof destructItem === 'string')
112
+ return result;
113
+ return { ...result, ...destructItem };
114
+ }, {});
115
+ return {
116
+ ...first,
117
+ ...second,
118
+ destruct: [...destructStrings, destructObject],
119
+ };
120
+ };
121
+ exports.mergeImportStatements = mergeImportStatements;
122
+ const zipImportStatementParams = (items) => {
123
+ const itemsByFrom = items.reduce((result, item) => {
124
+ const { from } = item;
125
+ const { [from]: existingItem } = result;
126
+ if (!existingItem) {
127
+ return { ...result, [from]: item };
128
+ }
129
+ return { ...result, [from]: (0, exports.mergeImportStatements)(existingItem, item) };
130
+ }, {});
131
+ return Object.values(itemsByFrom);
132
+ };
133
+ exports.zipImportStatementParams = zipImportStatementParams;
134
+ function getPrismaReadStruct(allModels) {
135
+ const models = {};
136
+ const relationFromFields = {};
137
+ for (const model of allModels.values()) {
138
+ const obj = {};
139
+ model.fields.forEach((field) => {
140
+ if (field.kind === 'scalar' || field.kind === 'enum') {
141
+ obj[field.name] = true;
142
+ }
143
+ else if (field.kind === 'object') {
144
+ obj[field.name] = field.type;
145
+ if (typeof obj['__DUMMY'] === 'object') {
146
+ obj['__DUMMY'][field.name] = true;
147
+ }
148
+ else {
149
+ obj['__DUMMY'] = { [field.name]: true };
150
+ }
151
+ if (field.isList) {
152
+ if (typeof obj['_count'] === 'object') {
153
+ obj['_count'][field.name] = true;
154
+ }
155
+ else {
156
+ obj['_count'] = { [field.name]: true };
157
+ }
158
+ }
159
+ else {
160
+ relationFromFields[model.name] = [
161
+ ...(field.relationFromFields || []),
162
+ ...(relationFromFields[model.name] || []),
163
+ ];
164
+ }
165
+ }
166
+ });
167
+ models[model.name] = obj;
168
+ }
169
+ for (const [name, model] of Object.entries(models)) {
170
+ for (const [k, v] of Object.entries(model)) {
171
+ if ((relationFromFields[name] || []).includes(k)) {
172
+ delete model[k];
173
+ }
174
+ if (k !== '_count' && k !== '__DUMMY' && v !== true) {
175
+ const obj = {};
176
+ Object.entries(models[v]).forEach(([key, value]) => {
177
+ if (value === true) {
178
+ obj[key] = true;
179
+ }
180
+ });
181
+ model[k] = obj;
182
+ }
183
+ }
184
+ }
185
+ return models;
186
+ }
187
+ exports.getPrismaReadStruct = getPrismaReadStruct;
188
+ function getObjectKeysOrder(obj) {
189
+ const res = {};
190
+ Object.getOwnPropertyNames(obj).forEach((k1, index1) => {
191
+ res[k1] = index1 * 100000;
192
+ if (isObject(obj[k1])) {
193
+ Object.getOwnPropertyNames(obj).forEach((k2, index2) => {
194
+ res[`${k1}.${k2}`] = res[k1] + index2 + 1;
195
+ });
196
+ }
197
+ });
198
+ return res;
199
+ }
200
+ function getArrayKeysOrder(arr) {
201
+ const res = {};
202
+ arr.forEach((k, index) => {
203
+ res[k] = index;
204
+ });
205
+ return res;
206
+ }
207
+ function structFilteredByGlob(dmmf, modelName, notationGlob, type = 'read') {
208
+ var _a, _b;
209
+ let struct = getPrismaReadStruct(dmmf);
210
+ if (type === 'write') {
211
+ for (const model of Object.values(struct)) {
212
+ Object.entries(model).forEach(([k, v]) => {
213
+ if (k.startsWith('_count')) {
214
+ delete model[k];
215
+ }
216
+ else if (k.startsWith('__DUMMY')) {
217
+ delete model[k];
218
+ }
219
+ else if (typeof v === 'object') {
220
+ delete model[k];
221
+ model[k] = { connect: true };
222
+ }
223
+ });
224
+ }
225
+ }
226
+ const filteredGlob = notationGlob
227
+ .filter((item) => item)
228
+ .filter((item) => item.trim());
229
+ const filtered = notation_1.Notation.create(struct[modelName]).filter(filteredGlob).value;
230
+ if (!((_b = (_a = notationGlob[0]) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, '*'))) {
231
+ const obj = {};
232
+ Object.getOwnPropertyNames(struct[modelName]).forEach((k1) => {
233
+ if (filtered[k1]) {
234
+ obj[k1] = filtered[k1];
235
+ if (isObject(filtered[k1])) {
236
+ if (isObject(struct[modelName][k1])) {
237
+ obj[k1] = {};
238
+ }
239
+ Object.getOwnPropertyNames(struct[modelName][k1]).forEach((k2) => {
240
+ if (filtered[k1][k2]) {
241
+ obj[k1][k2] = filtered[k1][k2];
242
+ }
243
+ });
244
+ }
245
+ }
246
+ });
247
+ return obj;
248
+ }
249
+ return filtered;
250
+ }
251
+ exports.structFilteredByGlob = structFilteredByGlob;
252
+ function globToFieldList(dmmf, modelName, glob = ['*'], type = 'read') {
253
+ const filteredSelect = structFilteredByGlob(dmmf, modelName, glob, type);
254
+ return Object.getOwnPropertyNames(flattenObj(filteredSelect || {}));
255
+ }
256
+ exports.globToFieldList = globToFieldList;
257
+ function getModelsFieldsTypeMap(models) {
258
+ return models.reduce((acc, curModel) => {
259
+ acc[curModel.name] = curModel.fields.reduce((acc2, curField) => {
260
+ acc2[curField.name] = curField;
261
+ return acc2;
262
+ }, {});
263
+ return acc;
264
+ }, {});
265
+ }
266
+ exports.getModelsFieldsTypeMap = getModelsFieldsTypeMap;
267
+ function isEnumField(field) {
268
+ const { formItem: { type }, } = parseDocumentation(field.documentation || '', field);
269
+ return (field.kind === 'enum' || ['CheckBox', 'Radio', 'Select'].includes(type));
270
+ }
271
+ exports.isEnumField = isEnumField;
272
+ function getModelsEnum(enumTypesModel) {
273
+ return enumTypesModel.reduce((acc, cur) => {
274
+ acc[cur.name] = cur.values.reduce((acc2, value) => {
275
+ acc2[value] = value;
276
+ return acc2;
277
+ }, {});
278
+ return acc;
279
+ }, {});
280
+ }
281
+ exports.getModelsEnum = getModelsEnum;
282
+ function parseDocumentation(documentation, field) {
283
+ var _a;
284
+ const formFieldRe = /@FormItem\(([^\)]+)\)/gi;
285
+ const matches = formFieldRe.exec(documentation);
286
+ let fieldType = 'String';
287
+ let args = [];
288
+ if (matches) {
289
+ [fieldType, ...args] = matches[1].split(',').map((arg) => arg.trim());
290
+ args = args.map(arg => arg.trim());
291
+ }
292
+ else {
293
+ if ([
294
+ 'String',
295
+ 'Boolean',
296
+ 'Int',
297
+ 'BigInt',
298
+ 'Float',
299
+ 'Decimal',
300
+ 'DateTime',
301
+ ].includes(field.type)) {
302
+ fieldType = field.type;
303
+ }
304
+ else {
305
+ fieldType = 'Other';
306
+ }
307
+ }
308
+ if (fieldType === 'File' || fieldType === 'Image') {
309
+ return {
310
+ formItem: {
311
+ type: fieldType,
312
+ args: {
313
+ accept: ((_a = args[0]) === null || _a === void 0 ? void 0 : _a.split('|').map((arg) => arg.trim()).join(', ')) || '*',
314
+ maxCount: Number(args[1] || '1'),
315
+ sizeLimit: Number(args[2]) || 1024 * 1024 * 10,
316
+ },
317
+ },
318
+ };
319
+ }
320
+ else if (fieldType === 'Text') {
321
+ return {
322
+ formItem: {
323
+ type: fieldType,
324
+ args: { rows: Number(args[0] || '5') },
325
+ },
326
+ };
327
+ }
328
+ else if (['CheckBox', 'Radio'].includes(fieldType)) {
329
+ return {
330
+ formItem: {
331
+ type: fieldType,
332
+ args: { options: (args[0] || '').split('|').map((arg) => arg.trim()) },
333
+ },
334
+ };
335
+ }
336
+ else if (fieldType === 'Select') {
337
+ return {
338
+ formItem: {
339
+ type: fieldType,
340
+ args: {
341
+ options: (args[0] || '').split('|').map((arg) => arg.trim()),
342
+ mode: args[1],
343
+ },
344
+ },
345
+ };
346
+ }
347
+ else {
348
+ return {
349
+ formItem: {
350
+ type: fieldType,
351
+ args: {},
352
+ },
353
+ };
354
+ }
355
+ }
356
+ exports.parseDocumentation = parseDocumentation;
@@ -0,0 +1,9 @@
1
+ import type { DMMF } from '@prisma/generator-helper';
2
+ import { NamingStyle, WriteableFileSpecs } from './types';
3
+ interface RunParam {
4
+ output: string;
5
+ dmmf: DMMF.Document;
6
+ fileNamingStyle: NamingStyle;
7
+ }
8
+ export declare const run: ({ output, dmmf, ...options }: RunParam) => WriteableFileSpecs[];
9
+ export {};
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.run = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const case_1 = require("case");
9
+ const sdk_1 = require("@prisma/sdk");
10
+ const template_helpers_1 = require("./template-helpers");
11
+ const field_classifiers_1 = require("./field-classifiers");
12
+ const generate_resources_1 = require("./generate-resources");
13
+ const generate_config_props_1 = require("./generate-config-props");
14
+ const generate_model_props_1 = require("./generate-model-props");
15
+ const generate_create_page_1 = require("./generate-create-page");
16
+ const generate_edit_page_1 = require("./generate-edit-page");
17
+ const generate_index_page_1 = require("./generate-index-page");
18
+ const generate_list_page_1 = require("./generate-list-page");
19
+ const generate_show_page_1 = require("./generate-show-page");
20
+ const generate_ui_config_1 = require("./generate-ui-config");
21
+ const generate_models_index_1 = require("./generate-models-index");
22
+ const IGNORE_REACT_CODE = /@IgnoreReactCode/;
23
+ const run = ({ output, dmmf, ...options }) => {
24
+ const { fileNamingStyle = 'camel', ...preAndSuffixes } = options;
25
+ const transformers = {
26
+ camel: case_1.camel,
27
+ kebab: case_1.kebab,
28
+ pascal: case_1.pascal,
29
+ snake: case_1.snake,
30
+ };
31
+ const transformFileNameCase = transformers[fileNamingStyle];
32
+ const templateHelpers = (0, template_helpers_1.makeHelpers)({
33
+ ...preAndSuffixes,
34
+ });
35
+ const allModels = dmmf.datamodel.models.filter((model) => !(0, field_classifiers_1.isAnnotatedWith)(model, IGNORE_REACT_CODE));
36
+ const resourcesFile = {
37
+ fileName: node_path_1.default.join(output, 'resources.tsx'),
38
+ content: (0, generate_resources_1.generateResources)({
39
+ models: allModels,
40
+ templateHelpers,
41
+ }),
42
+ };
43
+ const modelsIndexFile = {
44
+ fileName: node_path_1.default.join(output, 'models.index.tsx'),
45
+ content: (0, generate_models_index_1.generateModelsIndex)({
46
+ models: allModels,
47
+ enums: dmmf.schema.enumTypes.model || [],
48
+ templateHelpers,
49
+ }),
50
+ };
51
+ const enums = dmmf.schema.enumTypes.model;
52
+ const uiConfig = (0, generate_ui_config_1.addNewModelsConfig)(allModels, enums);
53
+ const modelUIFiles = allModels.map((model) => {
54
+ sdk_1.logger.info(`Processing Model ${model.name}`);
55
+ const configFile = {
56
+ fileName: node_path_1.default.join(output, 'props', transformFileNameCase(model.name), `config.ts`),
57
+ content: (0, generate_config_props_1.generateConfigProps)({
58
+ model,
59
+ templateHelpers,
60
+ uiConfig,
61
+ allModels,
62
+ }),
63
+ };
64
+ const modelFile = {
65
+ fileName: node_path_1.default.join(output, 'props', transformFileNameCase(model.name), `model.ts`),
66
+ content: (0, generate_model_props_1.generateModelProps)({
67
+ dmmf,
68
+ model,
69
+ templateHelpers,
70
+ uiConfig,
71
+ allModels,
72
+ }),
73
+ };
74
+ const createPageFile = {
75
+ fileName: node_path_1.default.join(output, 'pages', transformFileNameCase(model.name), `create.tsx`),
76
+ content: (0, generate_create_page_1.generateCreatePage)({
77
+ model,
78
+ templateHelpers,
79
+ uiConfig,
80
+ allModels,
81
+ }),
82
+ };
83
+ const editPageFile = {
84
+ fileName: node_path_1.default.join(output, 'pages', transformFileNameCase(model.name), `edit.tsx`),
85
+ content: (0, generate_edit_page_1.generateEditPage)({
86
+ model,
87
+ templateHelpers,
88
+ uiConfig,
89
+ allModels,
90
+ }),
91
+ };
92
+ const indexPageFile = {
93
+ fileName: node_path_1.default.join(output, 'pages', transformFileNameCase(model.name), `index.tsx`),
94
+ content: (0, generate_index_page_1.generateIndexPage)({
95
+ model,
96
+ templateHelpers,
97
+ uiConfig,
98
+ allModels,
99
+ }),
100
+ };
101
+ const listPageFile = {
102
+ fileName: node_path_1.default.join(output, 'pages', transformFileNameCase(model.name), `list.tsx`),
103
+ content: (0, generate_list_page_1.generateListPage)({
104
+ model,
105
+ templateHelpers,
106
+ uiConfig,
107
+ allModels,
108
+ }),
109
+ };
110
+ const showPageFile = {
111
+ fileName: node_path_1.default.join(output, 'pages', transformFileNameCase(model.name), `show.tsx`),
112
+ content: (0, generate_show_page_1.generatePageShow)({
113
+ model,
114
+ templateHelpers,
115
+ uiConfig,
116
+ allModels,
117
+ }),
118
+ };
119
+ return [
120
+ configFile,
121
+ modelFile,
122
+ createPageFile,
123
+ editPageFile,
124
+ indexPageFile,
125
+ listPageFile,
126
+ showPageFile,
127
+ ];
128
+ });
129
+ return [[resourcesFile, modelsIndexFile], ...modelUIFiles].flat();
130
+ };
131
+ exports.run = run;
@@ -0,0 +1,27 @@
1
+ import { ImportStatementParams } from './types';
2
+ export declare const scalarToTS: (scalar: string, useInputTypes?: boolean) => string;
3
+ export declare const echo: (input: string) => string;
4
+ export declare const when: (condition: any, thenTemplate: string, elseTemplate?: string) => string;
5
+ export declare const unless: (condition: any, thenTemplate: string, elseTemplate?: string) => string;
6
+ export declare const each: <T = any>(arr: T[], fn: (item: T) => string, joinWith?: string) => string;
7
+ export declare const importStatement: (input: ImportStatementParams) => string;
8
+ export declare const importStatements: (items: ImportStatementParams[]) => string;
9
+ interface MakeHelpersParam {
10
+ transformClassNameCase?: (item: string) => string;
11
+ transformFileNameCase?: (item: string) => string;
12
+ }
13
+ export declare const makeHelpers: ({ transformClassNameCase, transformFileNameCase, }: MakeHelpersParam) => {
14
+ config: {};
15
+ each: <T = any>(arr: T[], fn: (item: T) => string, joinWith?: string) => string;
16
+ echo: (input: string) => string;
17
+ for: <T = any>(arr: T[], fn: (item: T) => string, joinWith?: string) => string;
18
+ if: (condition: any, thenTemplate: string, elseTemplate?: string) => string;
19
+ importStatement: (input: ImportStatementParams) => string;
20
+ importStatements: (items: ImportStatementParams[]) => string;
21
+ transformClassNameCase: (item: string) => string;
22
+ transformFileNameCase: (item: string) => string;
23
+ unless: (condition: any, thenTemplate: string, elseTemplate?: string) => string;
24
+ when: (condition: any, thenTemplate: string, elseTemplate?: string) => string;
25
+ };
26
+ export declare type TemplateHelpers = ReturnType<typeof makeHelpers>;
27
+ export {};
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeHelpers = exports.importStatements = exports.importStatement = exports.each = exports.unless = exports.when = exports.echo = exports.scalarToTS = void 0;
4
+ const PrismaScalarToTypeScript = {
5
+ String: 'string',
6
+ Boolean: 'boolean',
7
+ Int: 'number',
8
+ BigInt: 'number',
9
+ Float: 'number',
10
+ Decimal: 'number',
11
+ DateTime: 'Date',
12
+ Json: 'Prisma.JsonValue',
13
+ Bytes: 'Buffer',
14
+ };
15
+ const knownPrismaScalarTypes = Object.keys(PrismaScalarToTypeScript);
16
+ const scalarToTS = (scalar, useInputTypes = false) => {
17
+ if (!knownPrismaScalarTypes.includes(scalar)) {
18
+ return 'string';
19
+ }
20
+ if (useInputTypes && scalar === 'Json') {
21
+ return 'Prisma.InputJsonValue';
22
+ }
23
+ return PrismaScalarToTypeScript[scalar];
24
+ };
25
+ exports.scalarToTS = scalarToTS;
26
+ const echo = (input) => input;
27
+ exports.echo = echo;
28
+ const when = (condition, thenTemplate, elseTemplate = '') => condition ? thenTemplate : elseTemplate;
29
+ exports.when = when;
30
+ const unless = (condition, thenTemplate, elseTemplate = '') => (!condition ? thenTemplate : elseTemplate);
31
+ exports.unless = unless;
32
+ const each = (arr, fn, joinWith = '') => arr.map(fn).join(joinWith);
33
+ exports.each = each;
34
+ const importStatement = (input) => {
35
+ const { from, destruct = [], default: defaultExport } = input;
36
+ const fragments = ['import'];
37
+ if (defaultExport) {
38
+ if (typeof defaultExport === 'string') {
39
+ fragments.push(defaultExport);
40
+ }
41
+ else {
42
+ fragments.push(`* as ${defaultExport['*']}`);
43
+ }
44
+ }
45
+ if (destruct.length) {
46
+ if (defaultExport) {
47
+ fragments.push(',');
48
+ }
49
+ fragments.push(`{${destruct.flatMap((item) => {
50
+ if (typeof item === 'string')
51
+ return item;
52
+ return Object.entries(item).map(([key, value]) => `${key} as ${value}`);
53
+ })}}`);
54
+ }
55
+ fragments.push(`from '${from}'`);
56
+ return fragments.join(' ');
57
+ };
58
+ exports.importStatement = importStatement;
59
+ const importStatements = (items) => `${(0, exports.each)(items, exports.importStatement, '\n')}`;
60
+ exports.importStatements = importStatements;
61
+ const makeHelpers = ({ transformClassNameCase = exports.echo, transformFileNameCase = exports.echo, }) => {
62
+ const className = (name, prefix = '', suffix = '') => `${prefix}${transformClassNameCase(name)}${suffix}`;
63
+ const fileName = (name, prefix = '', suffix = '', withExtension = false) => `${prefix}${transformFileNameCase(name)}${suffix}${(0, exports.when)(withExtension, '.ts')}`;
64
+ return {
65
+ config: {},
66
+ each: exports.each,
67
+ echo: exports.echo,
68
+ for: exports.each,
69
+ if: exports.when,
70
+ importStatement: exports.importStatement,
71
+ importStatements: exports.importStatements,
72
+ transformClassNameCase,
73
+ transformFileNameCase,
74
+ unless: exports.unless,
75
+ when: exports.when,
76
+ };
77
+ };
78
+ exports.makeHelpers = makeHelpers;
@@ -0,0 +1,27 @@
1
+ import { DMMF } from '@prisma/generator-helper';
2
+ export interface ParsedField {
3
+ kind: DMMF.FieldKind | 'relation-input';
4
+ name: string;
5
+ type: string;
6
+ documentation?: string;
7
+ isRequired: boolean;
8
+ isList: boolean;
9
+ isNullable?: boolean;
10
+ }
11
+ export interface ExtraModel {
12
+ originalName: string;
13
+ preAndPostfixedName: string;
14
+ isLocal?: boolean;
15
+ }
16
+ export interface ImportStatementParams {
17
+ from: string;
18
+ default?: string | {
19
+ '*': string;
20
+ };
21
+ destruct?: (string | Record<string, string>)[];
22
+ }
23
+ export declare type WriteableFileSpecs = {
24
+ fileName: string;
25
+ content: string;
26
+ };
27
+ export declare type NamingStyle = 'snake' | 'camel' | 'pascal' | 'kebab';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ import type { GeneratorOptions } from '@prisma/generator-helper';
2
+ export declare const stringToBoolean: (input: string, defaultValue?: boolean) => boolean;
3
+ export declare const generate: (options: GeneratorOptions) => Promise<void[]>;