@postxl/generator 0.74.2 → 1.0.3

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 (189) hide show
  1. package/LICENSE +50 -0
  2. package/README.md +79 -1
  3. package/dist/generator-manager.class.d.ts +59 -0
  4. package/dist/generator-manager.class.js +221 -0
  5. package/dist/generator.class.d.ts +90 -0
  6. package/dist/generator.class.js +32 -0
  7. package/dist/generator.context.d.ts +174 -0
  8. package/dist/generator.context.js +125 -0
  9. package/dist/helpers/branded.types.d.ts +149 -0
  10. package/dist/helpers/branded.types.js +111 -0
  11. package/dist/helpers/config-builder.class.d.ts +27 -0
  12. package/dist/helpers/config-builder.class.js +54 -0
  13. package/dist/helpers/import-generator.class.d.ts +70 -0
  14. package/dist/helpers/import-generator.class.js +166 -0
  15. package/dist/helpers/importable.types.d.ts +52 -0
  16. package/dist/helpers/importable.types.js +15 -0
  17. package/dist/helpers/index-generator.class.d.ts +10 -0
  18. package/dist/helpers/index-generator.class.js +46 -0
  19. package/dist/helpers/index.d.ts +8 -0
  20. package/dist/helpers/index.js +24 -0
  21. package/dist/helpers/package-json.generator.d.ts +56 -0
  22. package/dist/helpers/package-json.generator.js +36 -0
  23. package/dist/helpers/tsconfig.generator.d.ts +1 -0
  24. package/dist/helpers/tsconfig.generator.js +14 -0
  25. package/dist/helpers/verify-context.d.ts +4 -0
  26. package/dist/helpers/verify-context.js +23 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.js +21 -0
  29. package/dist/utils/checksum.d.ts +10 -0
  30. package/dist/utils/checksum.js +132 -0
  31. package/dist/utils/fs-utils.d.ts +34 -0
  32. package/dist/utils/fs-utils.js +126 -0
  33. package/dist/utils/index.d.ts +10 -0
  34. package/dist/utils/index.js +26 -0
  35. package/dist/utils/jsdoc.d.ts +12 -0
  36. package/dist/utils/jsdoc.js +37 -0
  37. package/dist/utils/lint.d.ts +46 -0
  38. package/dist/utils/lint.js +154 -0
  39. package/dist/utils/lockfile.d.ts +7 -0
  40. package/dist/utils/lockfile.js +80 -0
  41. package/dist/utils/logger.class.d.ts +25 -0
  42. package/dist/utils/logger.class.js +55 -0
  43. package/dist/utils/merge-conflict.d.ts +55 -0
  44. package/dist/utils/merge-conflict.js +264 -0
  45. package/dist/utils/path.d.ts +52 -0
  46. package/dist/utils/path.js +183 -0
  47. package/dist/utils/prettier-config.d.ts +2 -0
  48. package/dist/utils/prettier-config.js +13 -0
  49. package/dist/utils/prettier.d.ts +5 -0
  50. package/dist/utils/prettier.js +67 -0
  51. package/dist/utils/prettier.skiptest.d.ts +1 -0
  52. package/dist/utils/prettier.skiptest.js +22 -0
  53. package/dist/utils/promise.d.ts +2 -0
  54. package/dist/utils/promise.js +10 -0
  55. package/dist/utils/string-functions.d.ts +9 -0
  56. package/dist/utils/string-functions.js +23 -0
  57. package/dist/utils/sync-log-result.d.ts +9 -0
  58. package/dist/utils/sync-log-result.js +90 -0
  59. package/dist/utils/sync.d.ts +143 -0
  60. package/dist/utils/sync.js +325 -0
  61. package/dist/utils/template.d.ts +66 -0
  62. package/dist/utils/template.js +159 -0
  63. package/dist/utils/vfs.class.d.ts +115 -0
  64. package/dist/utils/vfs.class.js +239 -0
  65. package/dist/utils/zip.d.ts +13 -0
  66. package/dist/utils/zip.js +40 -0
  67. package/package.json +53 -31
  68. package/dist/generator.d.ts +0 -13
  69. package/dist/generator.js +0 -455
  70. package/dist/generators/enums/react.generator.d.ts +0 -10
  71. package/dist/generators/enums/react.generator.js +0 -110
  72. package/dist/generators/enums/types.generator.d.ts +0 -10
  73. package/dist/generators/enums/types.generator.js +0 -39
  74. package/dist/generators/indices/data/module.generator.d.ts +0 -9
  75. package/dist/generators/indices/data/module.generator.js +0 -60
  76. package/dist/generators/indices/data/service.generator.d.ts +0 -9
  77. package/dist/generators/indices/data/service.generator.js +0 -249
  78. package/dist/generators/indices/data/types.generator.d.ts +0 -9
  79. package/dist/generators/indices/data/types.generator.js +0 -49
  80. package/dist/generators/indices/dispatcher-service.generator.d.ts +0 -9
  81. package/dist/generators/indices/dispatcher-service.generator.js +0 -107
  82. package/dist/generators/indices/export/class.generator.d.ts +0 -9
  83. package/dist/generators/indices/export/class.generator.js +0 -140
  84. package/dist/generators/indices/export/encoder.generator.d.ts +0 -9
  85. package/dist/generators/indices/export/encoder.generator.js +0 -50
  86. package/dist/generators/indices/import/convert-functions.generator.d.ts +0 -9
  87. package/dist/generators/indices/import/convert-functions.generator.js +0 -509
  88. package/dist/generators/indices/import/decoder.generator.d.ts +0 -9
  89. package/dist/generators/indices/import/decoder.generator.js +0 -40
  90. package/dist/generators/indices/import/service.generator.d.ts +0 -9
  91. package/dist/generators/indices/import/service.generator.js +0 -573
  92. package/dist/generators/indices/import/types.generator.d.ts +0 -9
  93. package/dist/generators/indices/import/types.generator.js +0 -242
  94. package/dist/generators/indices/repositories.generator.d.ts +0 -9
  95. package/dist/generators/indices/repositories.generator.js +0 -25
  96. package/dist/generators/indices/routes.generator.d.ts +0 -9
  97. package/dist/generators/indices/routes.generator.js +0 -29
  98. package/dist/generators/indices/seed-migration.generator.d.ts +0 -9
  99. package/dist/generators/indices/seed-migration.generator.js +0 -36
  100. package/dist/generators/indices/seed-template.generator.d.ts +0 -9
  101. package/dist/generators/indices/seed-template.generator.js +0 -80
  102. package/dist/generators/indices/testids.generator.d.ts +0 -7
  103. package/dist/generators/indices/testids.generator.js +0 -71
  104. package/dist/generators/indices/types.generator.d.ts +0 -10
  105. package/dist/generators/indices/types.generator.js +0 -35
  106. package/dist/generators/indices/update/actiontypes.generator.d.ts +0 -9
  107. package/dist/generators/indices/update/actiontypes.generator.js +0 -49
  108. package/dist/generators/indices/update/module.generator.d.ts +0 -9
  109. package/dist/generators/indices/update/module.generator.js +0 -41
  110. package/dist/generators/indices/update/service.generator.d.ts +0 -9
  111. package/dist/generators/indices/update/service.generator.js +0 -34
  112. package/dist/generators/indices/view/module.generator.d.ts +0 -9
  113. package/dist/generators/indices/view/module.generator.js +0 -39
  114. package/dist/generators/indices/view/service.generator.d.ts +0 -9
  115. package/dist/generators/indices/view/service.generator.js +0 -34
  116. package/dist/generators/models/admin.page.generator.d.ts +0 -7
  117. package/dist/generators/models/admin.page.generator.js +0 -74
  118. package/dist/generators/models/export/encoder.generator.d.ts +0 -9
  119. package/dist/generators/models/export/encoder.generator.js +0 -51
  120. package/dist/generators/models/import/decoder.generator.d.ts +0 -9
  121. package/dist/generators/models/import/decoder.generator.js +0 -148
  122. package/dist/generators/models/react/context.generator.d.ts +0 -9
  123. package/dist/generators/models/react/context.generator.js +0 -71
  124. package/dist/generators/models/react/index.d.ts +0 -10
  125. package/dist/generators/models/react/index.js +0 -31
  126. package/dist/generators/models/react/library.generator.d.ts +0 -10
  127. package/dist/generators/models/react/library.generator.js +0 -94
  128. package/dist/generators/models/react/lookup.generator.d.ts +0 -9
  129. package/dist/generators/models/react/lookup.generator.js +0 -175
  130. package/dist/generators/models/react/modals.generator.d.ts +0 -23
  131. package/dist/generators/models/react/modals.generator.js +0 -710
  132. package/dist/generators/models/repository.generator.d.ts +0 -9
  133. package/dist/generators/models/repository.generator.js +0 -955
  134. package/dist/generators/models/route.generator.d.ts +0 -9
  135. package/dist/generators/models/route.generator.js +0 -92
  136. package/dist/generators/models/seed.generator.d.ts +0 -21
  137. package/dist/generators/models/seed.generator.js +0 -285
  138. package/dist/generators/models/stub.generator.d.ts +0 -9
  139. package/dist/generators/models/stub.generator.js +0 -92
  140. package/dist/generators/models/types.generator.d.ts +0 -9
  141. package/dist/generators/models/types.generator.js +0 -125
  142. package/dist/generators/models/update/service.generator.d.ts +0 -10
  143. package/dist/generators/models/update/service.generator.js +0 -302
  144. package/dist/generators/models/view/service.generator.d.ts +0 -10
  145. package/dist/generators/models/view/service.generator.js +0 -239
  146. package/dist/lib/attributes.d.ts +0 -114
  147. package/dist/lib/attributes.js +0 -2
  148. package/dist/lib/exports.d.ts +0 -45
  149. package/dist/lib/exports.js +0 -90
  150. package/dist/lib/imports.d.ts +0 -65
  151. package/dist/lib/imports.js +0 -114
  152. package/dist/lib/meta.d.ts +0 -1191
  153. package/dist/lib/meta.js +0 -434
  154. package/dist/lib/schema/fields.d.ts +0 -46
  155. package/dist/lib/schema/fields.js +0 -62
  156. package/dist/lib/schema/schema.d.ts +0 -466
  157. package/dist/lib/schema/schema.js +0 -18
  158. package/dist/lib/schema/types.d.ts +0 -201
  159. package/dist/lib/schema/types.js +0 -112
  160. package/dist/lib/serializer.d.ts +0 -15
  161. package/dist/lib/serializer.js +0 -24
  162. package/dist/lib/test-id-collector.d.ts +0 -42
  163. package/dist/lib/test-id-collector.js +0 -53
  164. package/dist/lib/types.d.ts +0 -7
  165. package/dist/lib/types.js +0 -13
  166. package/dist/lib/typescript.d.ts +0 -5
  167. package/dist/lib/typescript.js +0 -22
  168. package/dist/lib/utils/ast.d.ts +0 -29
  169. package/dist/lib/utils/ast.js +0 -23
  170. package/dist/lib/utils/error.d.ts +0 -17
  171. package/dist/lib/utils/error.js +0 -52
  172. package/dist/lib/utils/file.d.ts +0 -10
  173. package/dist/lib/utils/file.js +0 -56
  174. package/dist/lib/utils/jsdoc.d.ts +0 -9
  175. package/dist/lib/utils/jsdoc.js +0 -37
  176. package/dist/lib/utils/logger.d.ts +0 -17
  177. package/dist/lib/utils/logger.js +0 -12
  178. package/dist/lib/utils/string.d.ts +0 -40
  179. package/dist/lib/utils/string.js +0 -187
  180. package/dist/lib/utils/types.d.ts +0 -12
  181. package/dist/lib/utils/types.js +0 -2
  182. package/dist/lib/zod.d.ts +0 -8
  183. package/dist/lib/zod.js +0 -60
  184. package/dist/prisma/attributes.d.ts +0 -21
  185. package/dist/prisma/attributes.js +0 -175
  186. package/dist/prisma/client-path.d.ts +0 -7
  187. package/dist/prisma/client-path.js +0 -29
  188. package/dist/prisma/parse.d.ts +0 -12
  189. package/dist/prisma/parse.js +0 -452
@@ -1,9 +0,0 @@
1
- import { ModelMetaData } from '../../lib/meta';
2
- import { Model } from '../../lib/schema/schema';
3
- /**
4
- * Generates TRPC route for a given model.
5
- */
6
- export declare function generateRoute({ model, meta }: {
7
- model: Model;
8
- meta: ModelMetaData;
9
- }): string;
@@ -1,92 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateRoute = void 0;
4
- const imports_1 = require("../../lib/imports");
5
- const types_1 = require("../../lib/schema/types");
6
- /**
7
- * Generates TRPC route for a given model.
8
- */
9
- function generateRoute({ model, meta }) {
10
- const { idField, defaultField } = model;
11
- const { scopeName } = meta.update;
12
- const defaultValueMethod = `
13
- getDefault: procedure.query(({ ctx }) => ctx.view.${meta.data.dataServiceName}.data.defaultValue),
14
- `;
15
- const imports = imports_1.ImportsGenerator.from(meta.trpc.routerFilePath).addImports({
16
- [meta.types.importPath]: [
17
- (0, types_1.toAnnotatedTypeName)(model.typeName),
18
- meta.types.toBrandedIdTypeFnName,
19
- meta.types.zodDecoderFnNames.id,
20
- ],
21
- [meta.update.serviceClassLocation.import]: [
22
- meta.update.createInputDecoder,
23
- meta.update.updateInputDecoder,
24
- meta.update.upsertInputDecoder,
25
- ],
26
- [meta.view.serviceLocation.import]: [meta.view.filterOperatorDecoder, meta.view.cursorDecoder],
27
- });
28
- return /* ts */ `
29
- import { z } from 'zod'
30
- import { authMiddleware, procedure, router } from '../trpc'
31
-
32
- ${imports.generate()}
33
-
34
- export const ${meta.trpc.routerName} = router({
35
- ${defaultField ? defaultValueMethod : ''}
36
-
37
- get: procedure
38
- .use(authMiddleware)
39
- .input(z.${idField.unbrandedTypeName}().transform(${meta.types.toBrandedIdTypeFnName}))
40
- .query(({ input, ctx }) => ctx.view.${meta.data.dataServiceName}.get({ id: input, user: ctx.user})),
41
- getMap: procedure
42
- .use(authMiddleware)
43
- .query(({ ctx }) => ctx.view.${meta.data.dataServiceName}.getAll(ctx.user)),
44
- getList: procedure
45
- .use(authMiddleware)
46
- .input(z.object({
47
- cursor: ${meta.view.cursorDecoder}.optional(),
48
- sort: z.object({
49
- field: z.enum([
50
- ${model.fields.map((f) => `'${f.name}'`).join(',\n')}
51
- ])
52
- .transform((v): keyof ${model.typeName} => v),
53
- ascending: z.boolean(),
54
- })
55
- .optional(),
56
- filter: z.object({
57
- field: z.enum([
58
- ${model.fields.map((f) => `'${f.name}'`).join(',\n')}
59
- ])
60
- .transform((v): keyof ${model.typeName} => v),
61
- operator: ${meta.view.filterOperatorDecoder},
62
- value: z.union([z.string(), z.number()]),
63
- })
64
- .optional(),
65
- }))
66
- .query(({ input, ctx }) => {
67
- return ctx.view.${meta.data.dataServiceName}.getList({...input, user: ctx.user })
68
- }),
69
-
70
- create: procedure
71
- .use(authMiddleware)
72
- .input(${meta.update.createInputDecoder})
73
- .mutation(({ input, ctx }) => ctx.dispatch({scope: "${scopeName}", type: "create", payload: input})),
74
-
75
- update: procedure
76
- .use(authMiddleware)
77
- .input(${meta.update.updateInputDecoder})
78
- .mutation(({ input, ctx }) => ctx.dispatch({scope: "${scopeName}", type: "update", payload: input})),
79
-
80
- upsert: procedure
81
- .use(authMiddleware)
82
- .input(${meta.update.upsertInputDecoder})
83
- .mutation(({ input, ctx }) => ctx.dispatch({scope: "${scopeName}", type: "upsert", payload: input})),
84
-
85
- delete: procedure
86
- .use(authMiddleware)
87
- .input(${meta.types.zodDecoderFnNames.id})
88
- .mutation(({ input, ctx }) => ctx.dispatch({scope: "${scopeName}", type: "delete", payload: input})),
89
- })
90
- `;
91
- }
92
- exports.generateRoute = generateRoute;
@@ -1,21 +0,0 @@
1
- import { ModelMetaData } from '../../lib/meta';
2
- import { Model, SchemaConfig } from '../../lib/schema/schema';
3
- /**
4
- * Creates a seed file for a given model.
5
- */
6
- export declare function generateSeedModel({ model, itemCount, meta, models, }: {
7
- model: Model;
8
- itemCount: number;
9
- meta: ModelMetaData;
10
- models: Model[];
11
- }): string;
12
- /**
13
- * Creates the seed file that exposes all seed data as single object.
14
- */
15
- export declare function generateSeeds({ models, config, }: {
16
- models: {
17
- model: Model;
18
- meta: ModelMetaData;
19
- }[];
20
- config: SchemaConfig;
21
- }): string;
@@ -1,285 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateSeeds = exports.generateSeedModel = void 0;
4
- const faker_1 = require("@faker-js/faker");
5
- const imports_1 = require("../../lib/imports");
6
- const meta_1 = require("../../lib/meta");
7
- const fields_1 = require("../../lib/schema/fields");
8
- const types_1 = require("../../lib/schema/types");
9
- const serializer_1 = require("../../lib/serializer");
10
- const types_2 = require("../../lib/types");
11
- const string_1 = require("../../lib/utils/string");
12
- /**
13
- * Creates a seed file for a given model.
14
- */
15
- function generateSeedModel({ model, itemCount, meta, models, }) {
16
- var _a;
17
- // NOTE: We seed `faker` independently for each model.
18
- // This way changes to another model or to the ordering of models in the schema doesn't impact the generated values.
19
- faker_1.faker.seed((_a = model.attributes.randomSeed) !== null && _a !== void 0 ? _a : 0);
20
- const modelMap = new Map();
21
- for (const model of models) {
22
- modelMap.set(model.name, model);
23
- }
24
- const imports = imports_1.ImportsGenerator.from(meta.seed.location.path).addImport({
25
- items: [(0, types_1.toAnnotatedTypeName)(model.typeName), meta.types.toBrandedIdTypeFnName],
26
- from: meta.types.importPath,
27
- });
28
- for (const relation of (0, fields_1.getRelationFields)(model)) {
29
- const depMeta = (0, meta_1.getModelMetadata)({ model: relation.relationToModel });
30
- if (relation.isRequired) {
31
- imports.addImport({
32
- items: [depMeta.types.toBrandedIdTypeFnName],
33
- from: depMeta.types.importPath,
34
- });
35
- }
36
- }
37
- const mode = getExampleMode({ model, maxItemCount: itemCount });
38
- const examples = [];
39
- for (let i = 1; i <= mode.itemCount; i++) {
40
- examples.push(generateExample({ model, index: i, mode, models: modelMap }));
41
- }
42
- return `
43
- ${imports.generate()}
44
-
45
- export const ${meta.seed.constantName}: ${model.typeName}[] = [
46
- ${examples.join(',\n')}
47
- ]
48
- `;
49
- }
50
- exports.generateSeedModel = generateSeedModel;
51
- /**
52
- * Returns the mode of examples and the number of examples per field for a given model.
53
- */
54
- function getExampleMode({ model, maxItemCount }) {
55
- let numberOfExamplesPerField = undefined;
56
- let sameNumberOfExamplesPerField = true;
57
- let numberOfAllPossiblePermutations = 0;
58
- for (const field of model.fields) {
59
- if ((field.kind === 'scalar' || field.kind === 'relation' || field.kind == 'id') &&
60
- field.attributes.examples &&
61
- field.attributes.examples.length > 0) {
62
- if (numberOfExamplesPerField === undefined) {
63
- numberOfExamplesPerField = field.attributes.examples.length;
64
- numberOfAllPossiblePermutations = field.attributes.examples.length;
65
- }
66
- else if (numberOfExamplesPerField !== field.attributes.examples.length) {
67
- sameNumberOfExamplesPerField = false;
68
- }
69
- numberOfAllPossiblePermutations *= field.attributes.examples.length;
70
- }
71
- }
72
- if (numberOfExamplesPerField === undefined) {
73
- return { kind: 'Random', itemCount: maxItemCount };
74
- }
75
- if (sameNumberOfExamplesPerField) {
76
- return { kind: 'Tuples', itemCount: numberOfExamplesPerField };
77
- }
78
- return { kind: 'Permutations', itemCount: Math.min(numberOfAllPossiblePermutations, maxItemCount) };
79
- }
80
- function generateExample({ model, index, mode, models, }) {
81
- const data = new serializer_1.Serializer();
82
- data.append('{');
83
- for (const field of model.fields.values()) {
84
- data.append(`${field.name}: ${generateFieldData({ field, model, index, mode, models })},`);
85
- }
86
- data.append('}');
87
- return data.print();
88
- }
89
- function generateFieldData({ field, model, index, mode, models, }) {
90
- switch (field.kind) {
91
- case 'id':
92
- return generateIdFieldExample({ field, model, index, mode });
93
- case 'scalar':
94
- return generateScalarFieldExample({ field, model, index, mode });
95
- case 'relation':
96
- return generateRelationFieldExample({ field, model, index, mode, models });
97
- case 'enum':
98
- return generateEnumFieldExample({ field, mode, index });
99
- default:
100
- throw new types_2.ExhaustiveSwitchCheck(field);
101
- }
102
- }
103
- function generateIdFieldExample({ field, model, index, mode, }) {
104
- const idModelMeta = (0, meta_1.getModelMetadata)({ model: field.model });
105
- const { hasExample, example } = generateFieldExample({ field, model, index, mode });
106
- if (field.unbrandedTypeName === 'string') {
107
- if (hasExample && typeof example === 'string' && index <= mode.itemCount) {
108
- return `${idModelMeta.types.toBrandedIdTypeFnName}('${quoteSingleQuote(example)}')`;
109
- }
110
- return `${idModelMeta.types.toBrandedIdTypeFnName}('${index}')`;
111
- }
112
- else if (field.unbrandedTypeName === 'number') {
113
- if (hasExample && typeof example === 'number') {
114
- return `${idModelMeta.types.toBrandedIdTypeFnName}(${example})`;
115
- }
116
- return `${idModelMeta.types.toBrandedIdTypeFnName}(${index})`;
117
- }
118
- else {
119
- throw new Error(`Unsupported id type for ${model.name}.${field.name}: ${field.unbrandedTypeName}`);
120
- }
121
- }
122
- function quoteSingleQuote(str) {
123
- return str.replace(/'/g, "\\'");
124
- }
125
- function generateScalarFieldExample({ field, model, index, mode, }) {
126
- var _a;
127
- const { hasExample, example } = generateFieldExample({ field, model, index, mode });
128
- switch (field.tsTypeName) {
129
- case 'string': {
130
- if (hasExample && typeof example === 'string') {
131
- return `'${quoteSingleQuote(example)}'`;
132
- }
133
- const result = generateMockString({ field, model, index });
134
- if (result === null) {
135
- return 'null';
136
- }
137
- if (result === undefined) {
138
- return 'undefined';
139
- }
140
- return `'${result.replace(/'/g, "\\'")}'`;
141
- }
142
- case 'number': {
143
- if (hasExample) {
144
- return `${example}`;
145
- }
146
- switch (field.schemaType) {
147
- case 'BigInt':
148
- case 'Int':
149
- return generateMockInteger();
150
- default:
151
- return generateMockNumber();
152
- }
153
- }
154
- case 'boolean': {
155
- if (hasExample) {
156
- return `${example}`;
157
- }
158
- //in case the field is configured with `IsDefaultField` attribute, the first item should be true, all other false
159
- if (((_a = model.defaultField) === null || _a === void 0 ? void 0 : _a.name) === field.name) {
160
- return index === 0 ? 'true' : 'false';
161
- }
162
- return generateMockBoolean();
163
- }
164
- case 'Date': {
165
- if (hasExample) {
166
- // TODO: Maybe we should parse the date example to correct format?
167
- return `${example}`;
168
- }
169
- return generateMockDate();
170
- }
171
- default: {
172
- console.warn(`Unknown scalar type: ${field.tsTypeName}`);
173
- return '';
174
- }
175
- }
176
- }
177
- function generateFieldExample({ field, index, mode, }) {
178
- if (mode.kind === 'Random') {
179
- return { hasExample: false };
180
- }
181
- if (!field.attributes.examples || field.attributes.examples.length === 0) {
182
- return { hasExample: false };
183
- }
184
- switch (mode.kind) {
185
- case 'Permutations': {
186
- const example = faker_1.faker.helpers.arrayElement(field.attributes.examples);
187
- return { hasExample: true, example };
188
- }
189
- case 'Tuples': {
190
- const example = field.attributes.examples[(index - 1) % field.attributes.examples.length];
191
- return { hasExample: true, example };
192
- }
193
- default: {
194
- throw new types_2.ExhaustiveSwitchCheck(mode);
195
- }
196
- }
197
- }
198
- function generateMockString({ field, model, index }) {
199
- if (field.name === 'name') {
200
- return `${(0, string_1.toPascalCase)(model.name)} ${index}`;
201
- }
202
- if (field.name === 'email') {
203
- return faker_1.faker.internet.email();
204
- }
205
- return faker_1.faker.lorem.words(3);
206
- }
207
- function generateMockInteger() {
208
- return faker_1.faker.datatype.number({ precision: 1, min: 1, max: 1000 }).toString();
209
- }
210
- function generateMockNumber() {
211
- return faker_1.faker.datatype.float({ precision: 0.1, min: 0, max: 1 }).toString();
212
- }
213
- function generateMockBoolean() {
214
- return faker_1.faker.datatype.boolean().toString();
215
- }
216
- function generateMockDate() {
217
- const d = faker_1.faker.date.past(3, '2023-04-01T00:00:00.000Z');
218
- //set time to midnight UTC
219
- d.setUTCHours(0, 0, 0, 0);
220
- return `new Date('${d.toISOString()}')`;
221
- }
222
- function generateRelationFieldExample({ field, index, model, mode, models, }) {
223
- if (!field.isRequired) {
224
- return 'null';
225
- }
226
- const refModel = models.get(field.relationToModel.name);
227
- if (!refModel) {
228
- throw new Error(`Could not find model ${field.relationToModel.name}`);
229
- }
230
- const refModelMeta = (0, meta_1.getModelMetadata)({ model: refModel });
231
- const refModelExampleMode = getExampleMode({ model: refModel, maxItemCount: mode.itemCount });
232
- const referenceId = faker_1.faker.datatype.number({ min: 1, max: refModelExampleMode.itemCount });
233
- const brandingFn = refModelMeta.types.toBrandedIdTypeFnName;
234
- const { hasExample, example } = generateFieldExample({
235
- field: refModel.idField,
236
- model: refModel,
237
- index,
238
- mode: refModelExampleMode,
239
- });
240
- if (field.unbrandedTypeName === 'string') {
241
- if (hasExample && typeof example === 'string') {
242
- return `${brandingFn}('${quoteSingleQuote(example)}')`;
243
- }
244
- return `${brandingFn}('${referenceId}')`;
245
- }
246
- if (field.unbrandedTypeName === 'number') {
247
- if (hasExample && typeof example === 'number') {
248
- return `${brandingFn}(${example})`;
249
- }
250
- return `${brandingFn}(${referenceId})`;
251
- }
252
- throw new Error(`Unsupported relation id type for ${model.name}.${field.name}: ${field.unbrandedTypeName}`);
253
- }
254
- function generateEnumFieldExample({ field, mode, index, }) {
255
- if (mode.kind === 'Tuples') {
256
- if (field.attributes.examples) {
257
- const example = field.attributes.examples[(index - 1) % field.attributes.examples.length];
258
- return `'${example}'`;
259
- }
260
- }
261
- return `'${faker_1.faker.helpers.arrayElement(field.enumerator.values)}'`;
262
- }
263
- /**
264
- * Creates the seed file that exposes all seed data as single object.
265
- */
266
- function generateSeeds({ models, config, }) {
267
- const imports = imports_1.ImportsGenerator.from(config.paths.seedLibPath);
268
- for (const { meta } of models) {
269
- imports.addImport({
270
- items: [meta.seed.constantName],
271
- from: meta.seed.location.path,
272
- });
273
- }
274
- const seeds = models.map(({ meta }) => `${meta.seed.constantName}`).join(',\n');
275
- return `
276
- import { MockData } from '${config.paths.seedLibPath}'
277
-
278
- ${imports.generate()}
279
-
280
- export const seed: MockData = {
281
- ${seeds}
282
- }
283
- `;
284
- }
285
- exports.generateSeeds = generateSeeds;
@@ -1,9 +0,0 @@
1
- import { ModelMetaData } from '../../lib/meta';
2
- import { Model } from '../../lib/schema/schema';
3
- /**
4
- * Generates a stub definition file for a given model.
5
- */
6
- export declare function generateStub({ model, meta }: {
7
- model: Model;
8
- meta: ModelMetaData;
9
- }): string;
@@ -1,92 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateStub = void 0;
4
- const imports_1 = require("../../lib/imports");
5
- const meta_1 = require("../../lib/meta");
6
- const fields_1 = require("../../lib/schema/fields");
7
- const types_1 = require("../../lib/types");
8
- /**
9
- * Generates a stub definition file for a given model.
10
- */
11
- function generateStub({ model, meta }) {
12
- const { fields, idField } = model;
13
- const imports = imports_1.ImportsGenerator.from(meta.data.stubLocation.path)
14
- .addImport({
15
- items: [meta.types.toBrandedIdTypeFnName],
16
- from: meta.types.importPath,
17
- })
18
- .addTypeImport({
19
- items: [model.typeName],
20
- from: meta.types.importPath,
21
- });
22
- const assignments = getAssignmentStatementModel({
23
- fields,
24
- nameField: model.nameField,
25
- modelName: model.name,
26
- imports,
27
- });
28
- return /* ts */ `
29
- ${imports.generate()}
30
-
31
- /**
32
- * Utility object containing default values for all fields in a model.
33
- */
34
- export const ${meta.data.defaultStubConstantName}: ${model.typeName} = {
35
- ${assignments}
36
- }
37
-
38
- /**
39
- * Utility function that creates a new ${meta.userFriendlyName} object from a partial object of values.
40
- */
41
- export const ${meta.data.stubGenerationFnName} = (
42
- item: Partial<Omit<${model.typeName}, '${idField.name}'> & { ${idField.name}: ${idField.unbrandedTypeName}}>
43
- ): ${model.typeName} => ({
44
- ...${meta.data.defaultStubConstantName},
45
- ...item,
46
- ${idField.name}: item.${idField.name} ? ${meta.types.toBrandedIdTypeFnName}(item.${idField.name}) : ${meta.data.defaultStubConstantName}.id,
47
- })
48
- `;
49
- }
50
- exports.generateStub = generateStub;
51
- /**
52
- * Return an assignment statement for a model where each field is assigned null or its type's default value.
53
- */
54
- function getAssignmentStatementModel({ fields, nameField, modelName, imports, }) {
55
- return fields
56
- .map((f) => {
57
- if (!f.isRequired) {
58
- return `${f.name}: null`;
59
- }
60
- switch (f.kind) {
61
- case 'scalar': {
62
- if ((nameField === null || nameField === void 0 ? void 0 : nameField.name) === f.name) {
63
- return `${f.name}: '${modelName}'`;
64
- }
65
- return `${f.name}: ${(0, fields_1.getDefaultValueForType)(f.tsTypeName)}`;
66
- }
67
- case 'id': {
68
- const idRefMeta = (0, meta_1.getModelMetadata)({ model: f.model });
69
- imports.addImport({
70
- items: [idRefMeta.types.toBrandedIdTypeFnName],
71
- from: idRefMeta.types.importPath,
72
- });
73
- return `${f.name}: ${idRefMeta.types.toBrandedIdTypeFnName}(${(0, fields_1.getDefaultValueForType)(f.unbrandedTypeName)})`;
74
- }
75
- case 'relation': {
76
- const refModelMeta = (0, meta_1.getModelMetadata)({ model: f.relationToModel });
77
- imports.addImport({
78
- items: [refModelMeta.types.toBrandedIdTypeFnName],
79
- from: refModelMeta.types.importPath,
80
- });
81
- return `${f.name}: ${refModelMeta.types.toBrandedIdTypeFnName}(${(0, fields_1.getDefaultValueForType)(f.unbrandedTypeName)})`;
82
- }
83
- case 'enum': {
84
- return `${f.name}: "${f.enumerator.values[0]}"`;
85
- }
86
- default: {
87
- throw new types_1.ExhaustiveSwitchCheck(f);
88
- }
89
- }
90
- })
91
- .join(',\n');
92
- }
@@ -1,9 +0,0 @@
1
- import { ModelMetaData } from '../../lib/meta';
2
- import { Model } from '../../lib/schema/schema';
3
- /**
4
- * Generates types for a given model.
5
- */
6
- export declare function generateModelTypes({ model, meta }: {
7
- model: Model;
8
- meta: ModelMetaData;
9
- }): string;
@@ -1,125 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateModelTypes = void 0;
4
- const imports_1 = require("../../lib/imports");
5
- const meta_1 = require("../../lib/meta");
6
- const fields_1 = require("../../lib/schema/fields");
7
- const typescript_1 = require("../../lib/typescript");
8
- const jsdoc_1 = require("../../lib/utils/jsdoc");
9
- const zod_1 = require("../../lib/zod");
10
- /**
11
- * Generates types for a given model.
12
- */
13
- function generateModelTypes({ model, meta }) {
14
- var _a;
15
- const idField = model.idField;
16
- const imports = imports_1.ImportsGenerator.from(meta.types.filePath);
17
- for (const f of (0, fields_1.getEnumFields)(model)) {
18
- const refEnumMeta = (0, meta_1.getEnumMetadata)({ enumerator: f.enumerator });
19
- imports.addTypeImport({
20
- items: [f.enumerator.tsTypeName],
21
- from: refEnumMeta.types.filePath,
22
- });
23
- }
24
- const schemaMeta = (0, meta_1.getSchemaMetadata)({ config: model.schemaConfig });
25
- imports.addTypeImport({
26
- items: [schemaMeta.types.dto.create, schemaMeta.types.dto.update, schemaMeta.types.dto.upsert],
27
- from: schemaMeta.types.dto.path,
28
- });
29
- const decoderNames = meta.types.zodDecoderFnNames;
30
- for (const relation of (0, fields_1.getRelationFields)(model)) {
31
- if (relation.relationToModel.typeName === model.typeName) {
32
- // NOTE: All type definitions are already present in this file for this model.
33
- continue;
34
- }
35
- const refMeta = (0, meta_1.getModelMetadata)({ model: relation.relationToModel });
36
- imports.addImport({ from: refMeta.types.filePath, items: [refMeta.types.toBrandedIdTypeFnName] });
37
- imports.addTypeImport({ from: refMeta.types.filePath, items: [relation.relationToModel.brandedIdType] });
38
- }
39
- return /* ts */ `
40
- import { z } from 'zod'
41
-
42
- ${imports.generate()}
43
-
44
- ${(0, jsdoc_1.toJsDocComment)((_a = model.description) === null || _a === void 0 ? void 0 : _a.split('\n'))}
45
- export type ${meta.types.typeName} = {
46
- ${model.fields
47
- .map((f) => {
48
- return `
49
- ${(0, jsdoc_1.getFieldComment)(f)}
50
- ${f.name}: ${(0, typescript_1.getFieldType)(f)}${f.isRequired ? '' : ' | null'}
51
- `;
52
- })
53
- .join('\n')}
54
- }
55
-
56
- /**
57
- * Branded Id type that should be used to identify an instance of a ${meta.userFriendlyName}.
58
- */
59
- export type ${model.brandedIdType} = ${idField.unbrandedTypeName} & {
60
- readonly ___type: '${model.typeName}'
61
- }
62
-
63
- /**
64
- * Converts a given scalar to a branded id type.
65
- */
66
- export function ${meta.types.toBrandedIdTypeFnName}(id: ${idField.unbrandedTypeName}): ${model.brandedIdType} {
67
- return id as ${model.brandedIdType}
68
- }
69
-
70
- /**
71
- * Zod decoder for validating a ${meta.userFriendlyName} id.
72
- */
73
- export const ${decoderNames.id} = z.${(0, zod_1.getZodDecoderDefinition)({ field: idField })}
74
-
75
- /**
76
- * Zod decoder for validating a ${meta.userFriendlyName} from the database.
77
- */
78
- export const ${decoderNames.fromDatabase} = z.object({
79
- ${model.fields.map((field) => `${field.name}: z.${(0, zod_1.getZodDecoderDefinition)({ field })}`).join(',')}
80
- })
81
-
82
- /**
83
- * Data transfer object for creating a new ${meta.userFriendlyName} instance.
84
- */
85
- export type ${meta.types.dto.create} = ${schemaMeta.types.dto.create}<${meta.types.typeName}, ${model.brandedIdType}>
86
-
87
- /**
88
- * Data transfer object for updating an existing ${meta.userFriendlyName} instance.
89
- */
90
- export type ${meta.types.dto.update} = ${schemaMeta.types.dto.update}<${meta.types.typeName}, ${model.brandedIdType}>
91
-
92
- /**
93
- * Data transfer object for upserting a new or existing ${meta.userFriendlyName} instance.
94
- */
95
- export type ${meta.types.dto.upsert} = ${schemaMeta.types.dto.upsert}<${meta.types.typeName}, ${model.brandedIdType}>
96
-
97
- /**
98
- * Data transfer object for cloning a new ${meta.userFriendlyName} instance.
99
- */
100
- export type ${meta.types.dto.clone} = {
101
- ${model.fields
102
- .map((f) => {
103
- const type = (0, typescript_1.getFieldType)(f);
104
- // NOTE: ID field is always required to resolve the source.
105
- if (f.kind === 'id') {
106
- return `${f.name}: ${type}`;
107
- }
108
- if (f.isUnique) {
109
- // NOTE: `unique` fields require a new value.
110
- if (f.isRequired) {
111
- return `${f.name}: ${type}`;
112
- }
113
- return `${f.name}: ${type} | null`;
114
- }
115
- // NOTE: Non-unique fields can be copied from the source.
116
- if (f.isRequired) {
117
- return `${f.name}?: ${type}`;
118
- }
119
- return `${f.name}?: ${type} | null`;
120
- })
121
- .join(', ')}
122
- }
123
- `;
124
- }
125
- exports.generateModelTypes = generateModelTypes;
@@ -1,10 +0,0 @@
1
- import { ModelMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates update business logic for a given model.
5
- * The update logic handles all Create/Update/Delete/Upsert operations. See template's readme for more info.
6
- */
7
- export declare function generateModelBusinessLogicUpdate({ model, meta }: {
8
- model: Model;
9
- meta: ModelMetaData;
10
- }): string;