@postxl/generator 0.74.1 → 1.0.1

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 +57 -34
  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
package/dist/generator.js DELETED
@@ -1,455 +0,0 @@
1
- #! /usr/bin/env node
2
- "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || function (mod) {
20
- if (mod && mod.__esModule) return mod;
21
- var result = {};
22
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
- __setModuleDefault(result, mod);
24
- return result;
25
- };
26
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
27
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
28
- return new (P || (P = Promise))(function (resolve, reject) {
29
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
30
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
31
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
32
- step((generator = generator.apply(thisArg, _arguments || [])).next());
33
- });
34
- };
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.generate = void 0;
40
- const assert_1 = __importDefault(require("assert"));
41
- const generator_helper_1 = require("@prisma/generator-helper");
42
- const internals_1 = require("@prisma/internals");
43
- const zod_1 = require("zod");
44
- const lock_1 = require("@postxl/lock");
45
- const prettier = __importStar(require("@postxl/prettier"));
46
- const runtime_1 = require("@postxl/runtime");
47
- const react_generator_1 = require("./generators/enums/react.generator");
48
- const types_generator_1 = require("./generators/enums/types.generator");
49
- const module_generator_1 = require("./generators/indices/data/module.generator");
50
- const service_generator_1 = require("./generators/indices/data/service.generator");
51
- const types_generator_2 = require("./generators/indices/data/types.generator");
52
- const dispatcher_service_generator_1 = require("./generators/indices/dispatcher-service.generator");
53
- const class_generator_1 = require("./generators/indices/export/class.generator");
54
- const encoder_generator_1 = require("./generators/indices/export/encoder.generator");
55
- const convert_functions_generator_1 = require("./generators/indices/import/convert-functions.generator");
56
- const decoder_generator_1 = require("./generators/indices/import/decoder.generator");
57
- const service_generator_2 = require("./generators/indices/import/service.generator");
58
- const types_generator_3 = require("./generators/indices/import/types.generator");
59
- const repositories_generator_1 = require("./generators/indices/repositories.generator");
60
- const routes_generator_1 = require("./generators/indices/routes.generator");
61
- const seed_migration_generator_1 = require("./generators/indices/seed-migration.generator");
62
- const seed_template_generator_1 = require("./generators/indices/seed-template.generator");
63
- const testids_generator_1 = require("./generators/indices/testids.generator");
64
- const types_generator_4 = require("./generators/indices/types.generator");
65
- const actiontypes_generator_1 = require("./generators/indices/update/actiontypes.generator");
66
- const module_generator_2 = require("./generators/indices/update/module.generator");
67
- const service_generator_3 = require("./generators/indices/update/service.generator");
68
- const module_generator_3 = require("./generators/indices/view/module.generator");
69
- const service_generator_4 = require("./generators/indices/view/service.generator");
70
- const admin_page_generator_1 = require("./generators/models/admin.page.generator");
71
- const encoder_generator_2 = require("./generators/models/export/encoder.generator");
72
- const decoder_generator_2 = require("./generators/models/import/decoder.generator");
73
- const react_1 = require("./generators/models/react");
74
- const repository_generator_1 = require("./generators/models/repository.generator");
75
- const route_generator_1 = require("./generators/models/route.generator");
76
- const seed_generator_1 = require("./generators/models/seed.generator");
77
- const stub_generator_1 = require("./generators/models/stub.generator");
78
- const types_generator_5 = require("./generators/models/types.generator");
79
- const service_generator_5 = require("./generators/models/update/service.generator");
80
- const service_generator_6 = require("./generators/models/view/service.generator");
81
- const meta_1 = require("./lib/meta");
82
- const types_1 = require("./lib/schema/types");
83
- const types_2 = require("./lib/types");
84
- const client_path_1 = require("./prisma/client-path");
85
- const parse_1 = require("./prisma/parse");
86
- // NOTE: This needs to match the constant used in the manager package.
87
- const GENERATOR_NAMESPACE = 'dynamic';
88
- const CONFIG_SCHEMA = zod_1.z
89
- .object({
90
- pathToDataLib: zod_1.z.string().optional(),
91
- pathToDbLib: zod_1.z.string().optional(),
92
- pathToPlaywright: zod_1.z.string().optional(),
93
- pathToE2ELib: zod_1.z.string().optional(),
94
- pathToImport: zod_1.z.string().optional(),
95
- pathToExport: zod_1.z.string().optional(),
96
- pathToActions: zod_1.z.string().optional(),
97
- pathToBusinessViewLogic: zod_1.z.string().optional(),
98
- pathToBusinessUpdateLogic: zod_1.z.string().optional(),
99
- pathToSeedData: zod_1.z.string().optional(),
100
- pathToSeedLib: zod_1.z.string().optional(),
101
- pathToTypes: zod_1.z.string().optional(),
102
- trpcRoutesFolder: zod_1.z.string().optional(),
103
- reactFolderOutput: zod_1.z.string().optional(),
104
- prismaMigrationsFolder: zod_1.z.string().optional(),
105
- pathToAdminPages: zod_1.z.string().optional(),
106
- randomSeed: zod_1.z
107
- .string()
108
- .optional()
109
- .transform((v) => (v === undefined ? 1 : parseInt(v))),
110
- force: zod_1.z
111
- .string()
112
- .optional()
113
- .transform((v) => (v === undefined ? false : v === 'true')),
114
- })
115
- .transform((s) => {
116
- return {
117
- paths: {
118
- dataLibPath: (0, types_1.toPath)(s.pathToDataLib || './backend/libs/data/src/'),
119
- playwrightPath: (0, types_1.toPath)(s.pathToPlaywright || './e2e/'),
120
- dbLibPath: (0, types_1.toPath)(s.pathToDbLib || './backend/libs/db/src/'),
121
- e2eLibPath: (0, types_1.toPath)(s.pathToE2ELib || './backend/libs/e2e/src/'),
122
- importPath: (0, types_1.toPath)(s.pathToImport || './backend/libs/import/src/'),
123
- exportPath: (0, types_1.toPath)(s.pathToExport || './backend/libs/export/src/'),
124
- actionsPath: (0, types_1.toPath)(s.pathToActions || './backend/libs/actions/src/'),
125
- businessViewLogicPath: (0, types_1.toPath)(s.pathToBusinessViewLogic || './backend/libs/view/src/'),
126
- businessUpdateLogicPath: (0, types_1.toPath)(s.pathToBusinessUpdateLogic || './backend/libs/update/src/'),
127
- prismaMigrationsFolderPath: (0, types_1.toPath)(s.prismaMigrationsFolder || './migrations'),
128
- modelTypeDefinitionsPath: (0, types_1.toPath)(s.pathToTypes || './backend/libs/types/src/'),
129
- reactFolderPath: (0, types_1.toPath)(s.reactFolderOutput || './web/src/components/'),
130
- seedDataPath: (0, types_1.toPath)(s.pathToSeedData || './backend/libs/seed-data/src/'),
131
- seedLibPath: (0, types_1.toPath)(s.pathToSeedLib || './backend/libs/seed/src/'),
132
- trpcRoutesFolderPath: (0, types_1.toPath)(s.trpcRoutesFolder || './backend/libs/trpc/src/routes/'),
133
- adminPagesFolderPath: (0, types_1.toPath)(s.pathToAdminPages || './web/src/pages/admin/'),
134
- },
135
- randomSeed: s.randomSeed,
136
- force: s.force,
137
- userType: (0, types_1.toTypeName)(`User`),
138
- };
139
- });
140
- (0, generator_helper_1.generatorHandler)({
141
- onManifest() {
142
- internals_1.logger.info(`PXL Registered`);
143
- return {
144
- version: '1.0.0',
145
- defaultOutput: '../generated',
146
- prettyName: `PXL`,
147
- };
148
- },
149
- onGenerate: (_a) => __awaiter(void 0, [_a], void 0, function* ({ generator, otherGenerators, dmmf }) {
150
- internals_1.logger.info(`PXL started generating code...`);
151
- const prismaClientPath = (0, client_path_1.getClientImportPath)(otherGenerators);
152
- const decodedConfig = CONFIG_SCHEMA.safeParse(generator.config);
153
- if (!decodedConfig.success) {
154
- console.error(`Invalid generator config: ${decodedConfig.error.message}`);
155
- process.exit(1);
156
- }
157
- const config = decodedConfig.data;
158
- internals_1.logger.log(`Parsing DMMF...`);
159
- const { models, enums } = (0, parse_1.parsePrismaSchema)({ datamodel: dmmf.datamodel, config });
160
- internals_1.logger.log(`Generating...`);
161
- yield generate({ models, enums, config, prismaClientPath, logger: internals_1.logger });
162
- internals_1.logger.info(`PXL finished!`);
163
- }),
164
- });
165
- /**
166
- * Generates PXL files and flushes them to disk.
167
- */
168
- function generate(_a) {
169
- return __awaiter(this, arguments, void 0, function* ({ models, enums, config, prismaClientPath, logger, }) {
170
- const perfStart = performance.now();
171
- const root = yield lock_1.LockFile.findProjectRoot();
172
- if (root == undefined) {
173
- throw new Error(`Could not find lock file. Make sure you are running the generator in a project folder.`);
174
- }
175
- const generated = new prettier.ExtendedVirtualFS();
176
- // Generate Models
177
- for (const model of models) {
178
- const meta = (0, meta_1.getModelMetadata)({ model });
179
- // Types
180
- generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_5.generateModelTypes)({ model, meta }));
181
- // Seed
182
- generated.write(`/${meta.seed.location.path}.ts`, (0, seed_generator_1.generateSeedModel)({ model, itemCount: 5, meta, models }));
183
- // Data
184
- generated.write(`/${meta.data.stubLocation.path}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
185
- generated.write(`/${meta.data.repository.location.path}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
186
- // Import
187
- generated.write(`/${meta.import.decoder.location.path}.ts`, (0, decoder_generator_2.generateModelImportDecoder)({ model, meta }));
188
- // Export
189
- generated.write(`/${meta.export.encoder.location.path}.ts`, (0, encoder_generator_2.generateModelExportEncoder)({ model, meta }));
190
- // Business Logic
191
- generated.write(`/${meta.view.serviceLocation.path}.ts`, (0, service_generator_6.generateModelBusinessLogicView)({ model, meta }));
192
- generated.write(`/${meta.update.serviceClassLocation.path}.ts`, (0, service_generator_5.generateModelBusinessLogicUpdate)({ model, meta }));
193
- // Routes
194
- generated.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
195
- // React
196
- yield generated.copy((0, react_1.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
197
- // Admin
198
- generated.write(`/${meta.admin.filePath}.tsx`, (0, admin_page_generator_1.generateAdminPage)({ meta }));
199
- logger.log(`- ${model.name} processed`);
200
- }
201
- // Generate Enums
202
- for (const enumerator of enums.values()) {
203
- const meta = (0, meta_1.getEnumMetadata)({ enumerator });
204
- generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateEnumType)({ enumerator, prismaClientPath, meta }));
205
- yield generated.copy((0, react_generator_1.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
206
- }
207
- // Generate Index Files and Services
208
- const meta = (0, meta_1.getSchemaMetadata)({ config });
209
- // Data
210
- generated.write(`/${meta.data.moduleLocation.path}.ts`, (0, module_generator_1.generateDataModule)({ models, meta }));
211
- generated.write(`/${meta.data.dataService.location.path}.ts`, (0, service_generator_1.generateDataService)({ models, meta }));
212
- generated.write(`/${meta.data.repository.constFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
213
- generated.write(`/${meta.data.types.location.path}.ts`, (0, types_generator_2.generateDataTypes)({ models, meta }));
214
- generated.write(`/${meta.e2e.testIdsFilePath}.ts`, (0, testids_generator_1.generateTestIds)());
215
- // Import
216
- generated.write(`/${meta.import.types.location.path}.ts`, (0, types_generator_3.generateImportTypes)({ models, meta }));
217
- generated.write(`/${meta.import.importService.location.path}.ts`, (0, service_generator_2.generateImportService)({ models, meta }));
218
- generated.write(`/${meta.import.decoder.location.path}.ts`, (0, decoder_generator_1.generateImportDecoder)({ models, meta }));
219
- generated.write(`/${meta.import.converterFunctions.location.path}.ts`, (0, convert_functions_generator_1.generateConvertImportFunctions)({ models, meta }));
220
- // Export
221
- generated.write(`/${meta.export.encoder.location.path}.ts`, (0, encoder_generator_1.generateExportEncoder)({ models, meta }));
222
- generated.write(`/${meta.export.exporterClass.location.path}.ts`, (0, class_generator_1.generateExporterClass)({ models, meta }));
223
- // Actions
224
- generated.write(`/${meta.actions.dispatcher.classLocation.path}.ts`, (0, dispatcher_service_generator_1.generateActionsDispatcherService)({ models, meta }));
225
- // View
226
- generated.write(`/${meta.view.moduleLocation.path}.ts`, (0, module_generator_3.generateBusinessLogicViewModule)({ models, meta }));
227
- generated.write(`/${meta.view.serviceLocation.path}.ts`, (0, service_generator_4.generateBusinessLogicViewService)({ models, meta }));
228
- // Update
229
- generated.write(`/${meta.update.moduleLocation.path}.ts`, (0, module_generator_2.generateBusinessLogicUpdateModule)({ models, meta }));
230
- generated.write(`/${meta.update.serviceLocation.path}.ts`, (0, service_generator_3.generateBusinessLogicUpdateService)({ models, meta }));
231
- generated.write(`/${meta.update.actionTypesFilePath}.ts`, (0, actiontypes_generator_1.generateBusinessLogicActionTypes)({ models, meta }));
232
- // Seed
233
- generated.write(`/${meta.seedData.initialMigrationLocation.path}.ts`, (0, seed_migration_generator_1.generateSeedMigration)({ models, meta }));
234
- generated.write(`/${meta.seedData.templateExcelFilePath}`, yield (0, seed_template_generator_1.generateSeedExcelTemplate)({ models }));
235
- // Routes
236
- generated.write(`/${meta.trpc.routesFilePath}.ts`, (0, routes_generator_1.generateRoutesIndex)({ models, meta }));
237
- // Types
238
- generated.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_4.generateTypesIndex)({ models, enums, meta }));
239
- // -------------------------------------------------------------------------
240
- // Add disclaimer and format.
241
- yield generated.transformUTF8Files((path, content) => `${lock_1.GENERATED_FILE_DISCLAIMER}\n${content}`);
242
- // NOTE: the eslint config provided here must match the .eslintrc files in the template!!!
243
- const lintResult = yield generated.lintUTF8Files({
244
- fix: true,
245
- allowInlineConfig: true,
246
- extensions: ['.ts', '.tsx', '.js', '.jsx'],
247
- overrideConfig: {
248
- parser: '@typescript-eslint/parser',
249
- extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
250
- plugins: ['@typescript-eslint', 'simple-import-sort'],
251
- parserOptions: {
252
- sourceType: 'module',
253
- ecmaVersion: 'latest',
254
- },
255
- env: {
256
- es2022: true,
257
- node: true,
258
- },
259
- rules: {
260
- // The "curly" rule ensures that all if, else if, else, for, while, or do blocks are followed by a block in braces, even if it is only a single line.
261
- // This will flag `if(condition) return x` and expect it to be written as `if (condition) { return x }`
262
- curly: ['error', 'all'],
263
- // NOTE: Make sure this matches the definition in the template root .eslintrc.cjs file!
264
- 'simple-import-sort/imports': [
265
- 'error',
266
- {
267
- groups: [
268
- // Node.js builtins. You could also generate this regex if you use a `.js` config
269
- // (e.g. `^(${require("module").builtinModules.join("|")})(/|$)`)
270
- [
271
- '^(assert|buffer|child_process|cluster|console|constants|crypto|dgram|dns|domain|events|fs|http|https|module|net|os|path|punycode|querystring|readline|repl|stream|string_decoder|sys|timers|tls|tty|url|util|vm|zlib|freelist|v8|process|async_hooks|http2|perf_hooks)(/.*|$)',
272
- ],
273
- // Side effect imports.
274
- ['^\\u0000'],
275
- // Any packages that starts with an @ but not libraries we defined in tsconfig.json:
276
- ['^@(?!(postxl|assets|backend|hooks|components|i18n|lib))'],
277
- // Any other package.
278
- ['^'],
279
- // Internal PXL packages.
280
- ['^(@postxl|@assets|@backend|@hooks|@components|@i18n|@lib)(/.*|$)'],
281
- // Parent imports. Put `..` last.
282
- ['^\\.\\.(?!/?$)', '^\\.\\./?$'],
283
- // Other relative imports. Put same-folder imports and `.` last.
284
- ['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'],
285
- ],
286
- },
287
- ],
288
- },
289
- },
290
- });
291
- const unFixableErrorCount = lintResult.totalErrorCount - lintResult.totalFixableErrorCount;
292
- if (unFixableErrorCount > 0) {
293
- console.log(`LINT: ${unFixableErrorCount} non-fixable errors! Please open an issue with your schema!`);
294
- }
295
- const unfixedWarningCount = lintResult.totalWarningCount - lintResult.totalFixableWarningCount;
296
- if (unfixedWarningCount > 0) {
297
- console.log(`LINT: ${unfixedWarningCount} unfixed warnings! Please open an issue with your schema!`);
298
- }
299
- for (const [, result] of lintResult.results) {
300
- if (result.errorCount > 0 || result.warningCount > 0) {
301
- console.log(result.message);
302
- }
303
- }
304
- if (unfixedWarningCount === 0 && unFixableErrorCount === 0) {
305
- console.log(`LINT: All files linted successfully without warnings and errors!`);
306
- }
307
- yield generated.formatUTF8Files(prettier.config);
308
- // -------------------------------------------------------------------------
309
- const gitignore = lock_1.GitIgnoreUtils.getGitignore(root);
310
- const lock = yield lock_1.LockFile.fromProjectRoot({ root, namespace: GENERATOR_NAMESPACE });
311
- const vfs = yield lock_1.VirtualFS.fromDirectory(root, {
312
- // NOTE: We start with a clean slate every time we generate so we can detect
313
- // which files were not generated in the last run.
314
- clean: true,
315
- // NOTE: We only load files that may be impacted by the generator.
316
- include: lock.listManagedFiles(),
317
- ignore: [lock_1.LockFile.LOCKFILE_PATH],
318
- });
319
- // Merge with existing files.
320
- yield vfs.copy(generated, './');
321
- // Flush to disk.
322
- // NOTE: We use a special "internal" variable to force regeneration of all files so that
323
- // the template files are always up to date.
324
- const FORCE_ENV = process.env.POSTXL_FORCE_REWRITE === 'true';
325
- if (FORCE_ENV) {
326
- console.debug('Forcing regeneration of all files due to POSTXL_FORCE_REWRITE=true!');
327
- }
328
- const isForceMode = FORCE_ENV || config.force;
329
- const results = yield vfs.flush(root, (_b) => __awaiter(this, [_b], void 0, function* ({ path, disk, file }) {
330
- const fileLockEntry = lock.get(path);
331
- switch (fileLockEntry.status) {
332
- case 'unauthorized':
333
- // NOTE: We never override files that are not managed by the generator namespace!
334
- return 'skip';
335
- case 'managed': {
336
- // NOTE: File is detached because developer changed the contents or deleted the file.
337
- if (
338
- // NOTE: User deleted the file!
339
- disk === undefined) {
340
- // NOTE: Unless the file is deleted because of gitignore or we are in force mode, we skip it.
341
- if ((gitignore === null || gitignore === void 0 ? void 0 : gitignore.entries.has(path)) || isForceMode) {
342
- return 'write';
343
- }
344
- return 'skip';
345
- }
346
- // NOTE: The file exists in the lock so we check whether it's managed or detached.
347
- const diskFileChecksum = yield lock_1.MiniGit.calculateFileChecksum({ path, content: disk.content });
348
- if (
349
- // NOTE: File is detached because developer changed the contents of the file.
350
- fileLockEntry.checksum !== diskFileChecksum) {
351
- // NOTE: We only skip detached files when we are not in force mode.
352
- if (isForceMode) {
353
- return 'write';
354
- }
355
- return 'skip';
356
- }
357
- // NOTE: File is managed!
358
- (0, assert_1.default)(fileLockEntry.checksum === diskFileChecksum && disk !== undefined);
359
- if (file) {
360
- const newFileChecksum = yield lock_1.MiniGit.calculateFileChecksum({
361
- path,
362
- content: file.kind === 'UTF8-FILE' ? file.utf8Content : file.binaryContent,
363
- });
364
- // NOTE: We defensively don't override files with matching checksums unless in force mode
365
- // because checksum is by design not an injection.
366
- if (newFileChecksum === fileLockEntry.checksum && !isForceMode) {
367
- return 'skip';
368
- }
369
- return 'write';
370
- }
371
- // NOTE: File has been deleted.
372
- return 'write';
373
- }
374
- case 'enoent': {
375
- // NOTE: File has no lockfile entry.
376
- const is3rdPartFile = disk !== undefined;
377
- if (is3rdPartFile && !isForceMode) {
378
- return 'skip';
379
- }
380
- return 'write';
381
- }
382
- default:
383
- throw new types_2.ExhaustiveSwitchCheck(fileLockEntry);
384
- }
385
- }), { dryRun: false });
386
- // NOTE: Lastly we update the lockfile with all changes we've flushed.
387
- for (const change of results) {
388
- switch (change.status) {
389
- case 'write': {
390
- // NOTE: We update the lockfile entries of the files that were changed.
391
- if (change.disk === undefined) {
392
- lock.remove(change.path);
393
- }
394
- else {
395
- const r = yield lock.add({ path: change.path, content: change.disk.content });
396
- // NOTE: Adding a managed file should never fail.
397
- (0, assert_1.default)(r != null);
398
- }
399
- break;
400
- }
401
- case 'skip':
402
- break;
403
- default:
404
- throw new types_2.ExhaustiveSwitchCheck(change);
405
- }
406
- }
407
- yield lock.writeToProjectRoot(root, { dryRun: false });
408
- // NOTE: Detached mode tells whether any of the UTF-8 files were detached.
409
- // We use this in CI template tests.
410
- const isNoDetachedMode = process.env.POSTXL_NO_DETACHED_MODE === 'true';
411
- if (isNoDetachedMode) {
412
- console.log(`No detached mode enabled. Checking that all files are managed!`);
413
- return;
414
- }
415
- if (isNoDetachedMode) {
416
- const detachedFiles = results.filter((result) => { var _a; return result.status === 'skip' && !Buffer.isBuffer((_a = result.disk) === null || _a === void 0 ? void 0 : _a.content); });
417
- if (detachedFiles.length > 0) {
418
- console.log(`Detached files found: ${detachedFiles.map((f) => f.path).join(', ')}`);
419
- }
420
- process.exit(1);
421
- }
422
- // NOTE: Lastly we generate the log of the changes.
423
- const log = lock_1.ConsoleUtils.getFilesChangelog(results.map((result) => {
424
- switch (result.status) {
425
- case 'write': {
426
- if (result.prevDisk === undefined) {
427
- return { path: result.path, status: 'new' };
428
- }
429
- if (result.disk === undefined) {
430
- return { path: result.path, status: 'deleted' };
431
- }
432
- if (runtime_1.BufferUtils.equals(result.prevDisk.content, result.disk.content) &&
433
- result.prevDisk.mode === result.disk.mode) {
434
- return { path: result.path, status: 'unchanged' };
435
- }
436
- return { path: result.path, status: 'changed' };
437
- }
438
- case 'skip':
439
- if (result.prevDisk &&
440
- result.disk &&
441
- runtime_1.BufferUtils.equals(result.prevDisk.content, result.disk.content) &&
442
- result.prevDisk.mode === result.disk.mode) {
443
- return { path: result.path, status: 'unchanged' };
444
- }
445
- return { path: result.path, status: 'skipped' };
446
- default:
447
- throw new types_2.ExhaustiveSwitchCheck(result);
448
- }
449
- }));
450
- console.info(log);
451
- const perfEnd = performance.now();
452
- console.info(`[generator] perf: ${(perfEnd - perfStart).toFixed(2)}s`);
453
- });
454
- }
455
- exports.generate = generate;
@@ -1,10 +0,0 @@
1
- import { VirtualFS } from '@postxl/lock';
2
- import { EnumMetaData } from '../../lib/meta';
3
- import { Enum } from '../../lib/schema/schema';
4
- /**
5
- * Generates React components for a given enumerator.
6
- */
7
- export declare function generateEnumReactComponents({ enumerator, meta }: {
8
- enumerator: Enum;
9
- meta: EnumMetaData;
10
- }): VirtualFS;
@@ -1,110 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateEnumReactComponents = void 0;
4
- const lock_1 = require("@postxl/lock");
5
- const imports_1 = require("../../lib/imports");
6
- /**
7
- * Generates React components for a given enumerator.
8
- */
9
- function generateEnumReactComponents({ enumerator, meta }) {
10
- const vfs = new lock_1.VirtualFS({
11
- 'index.ts': `
12
- export * from './Select'
13
- `,
14
- });
15
- vfs.write('/Select.tsx', generateEnumSelect({ enumerator, meta }));
16
- return vfs;
17
- }
18
- exports.generateEnumReactComponents = generateEnumReactComponents;
19
- /**
20
- * Utility function that generates the select component for a given enumerator.
21
- */
22
- function generateEnumSelect({ enumerator, meta }) {
23
- const imports = imports_1.ImportsGenerator.from(meta.react.folderPath).addTypeImport({
24
- items: [enumerator.tsTypeName],
25
- from: meta.types.importPath,
26
- });
27
- let description = '';
28
- if (enumerator.description) {
29
- description = `
30
- /**
31
- * ${enumerator.description}
32
- */`;
33
- }
34
- return `
35
- /* eslint-disable @typescript-eslint/no-unused-vars */
36
- import { useField } from 'formik'
37
- import React from 'react'
38
-
39
- import { ButtonSwitcher } from '@components/atoms/ButtonSwitcher'
40
- import { MenuSelectInput, MenuSelectField } from '@components/atoms/MenuSelect'
41
- import { SelectInput, SelectField } from '@components/atoms/SelectInput'
42
- import { UnionOmit } from '@lib/types'
43
-
44
- ${imports.generate()}
45
-
46
- type Option = {
47
- id: ${enumerator.tsTypeName}
48
- label: string
49
- }
50
-
51
- const OPTIONS: Option[] = [
52
- ${enumerator.values.map((v) => `{ id: '${v}', label: '${v}' },`).join('\n')}
53
- ]
54
-
55
- // Switcher
56
-
57
- ${description}
58
- export const ${meta.react.switcherInputName} = ({ ...delegated }: UnionOmit<
59
- React.ComponentPropsWithoutRef<typeof ButtonSwitcher<${enumerator.tsTypeName}>>,
60
- 'options'
61
- >) => (
62
- <ButtonSwitcher options={OPTIONS} {...delegated} />
63
- )
64
-
65
- ${description}
66
- export const ${meta.react.switcherFieldName} = ({
67
- name,
68
- ...delegated
69
- }: { name: string } & UnionOmit<
70
- React.ComponentPropsWithoutRef<typeof ${meta.react.switcherInputName}>,
71
- 'value' | 'onChange'
72
- >) => {
73
- const [field, , helpers] = useField<${enumerator.name}>({ name })
74
-
75
- return <${meta.react.switcherInputName} value={field.value} onChange={helpers.setValue} {...delegated} />
76
- }
77
-
78
- // Select
79
-
80
- ${description}
81
- export const ${meta.react.selectInputName} = ({
82
- ...delegated
83
- }: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectInput<Option>>, 'label' | 'options'>) => {
84
- return <SelectInput<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
85
- }
86
-
87
- ${description}
88
- export const ${meta.react.selectFieldName} = ({
89
- ...delegated
90
- }: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectField<Option>>, 'label' | 'options'>) => {
91
- return <SelectField<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
92
- }
93
-
94
- // Menu
95
-
96
- ${description}
97
- export const ${meta.react.menuInputName} = ({
98
- ...delegated
99
- }: UnionOmit<React.ComponentPropsWithoutRef<typeof MenuSelectInput<Option>>, 'label' | 'options'>) => {
100
- return <MenuSelectInput<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
101
- }
102
-
103
- ${description}
104
- export const ${meta.react.menuFieldName} = ({
105
- ...delegated
106
- }: UnionOmit<React.ComponentPropsWithoutRef<typeof MenuSelectField<Option>>, 'label' | 'options'>) => {
107
- return <MenuSelectField<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
108
- }
109
- `;
110
- }
@@ -1,10 +0,0 @@
1
- import { EnumMetaData } from '../../lib/meta';
2
- import { Enum } from '../../lib/schema/schema';
3
- /**
4
- * Generator that generates type definitions for all enumerators.
5
- */
6
- export declare function generateEnumType({ enumerator, meta, prismaClientPath, }: {
7
- enumerator: Enum;
8
- meta: EnumMetaData;
9
- prismaClientPath: string;
10
- }): string;
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateEnumType = void 0;
4
- /**
5
- * Generator that generates type definitions for all enumerators.
6
- */
7
- function generateEnumType({ enumerator, meta, prismaClientPath, }) {
8
- let description = '';
9
- if (enumerator.description) {
10
- description = `
11
- /**
12
- * ${enumerator.description.split('\n').join('\n * ')}
13
- */`;
14
- }
15
- const cases = enumerator.values.map((v) => {
16
- var _a;
17
- const description = (_a = enumerator.attributes.valueDescription) === null || _a === void 0 ? void 0 : _a[v];
18
- if (description) {
19
- return `
20
- /** ${description} */
21
- '${v}'
22
- `;
23
- }
24
- return `'${v}'`;
25
- });
26
- return /* ts */ `
27
- /* eslint-disable @typescript-eslint/no-unused-vars */
28
- import * as Prisma from '${prismaClientPath}'
29
-
30
- export type ${enumerator.tsTypeName} = Prisma.${enumerator.sourceName}
31
- export const ${enumerator.tsTypeName} = Prisma.${enumerator.sourceName}
32
-
33
- ${description}
34
- export const ${meta.types.membersList}: ${enumerator.tsTypeName}[] = [
35
- ${cases.join(', ')}
36
- ]
37
- `;
38
- }
39
- exports.generateEnumType = generateEnumType;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates a data module class.
5
- */
6
- export declare function generateDataModule({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;