@postxl/generator 0.34.0 → 0.35.0

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 (58) hide show
  1. package/dist/generator.js +40 -22
  2. package/dist/generators/indices/businesslogic-actiontypes.generator.d.ts +9 -0
  3. package/dist/generators/indices/businesslogic-actiontypes.generator.js +39 -0
  4. package/dist/generators/indices/businesslogic-update-index.generator.d.ts +9 -0
  5. package/dist/generators/indices/businesslogic-update-index.generator.js +20 -0
  6. package/dist/generators/indices/businesslogic-update-module.generator.d.ts +9 -0
  7. package/dist/generators/indices/businesslogic-update-module.generator.js +69 -0
  8. package/dist/generators/indices/businesslogic-update-service.generator.d.ts +9 -0
  9. package/dist/generators/indices/businesslogic-update-service.generator.js +34 -0
  10. package/dist/generators/indices/businesslogic-view-index.generator.d.ts +9 -0
  11. package/dist/generators/indices/businesslogic-view-index.generator.js +19 -0
  12. package/dist/generators/indices/{businesslogicindex.generator.d.ts → businesslogic-view-module.generator.d.ts} +2 -2
  13. package/dist/generators/indices/{businesslogicmodule.generator.js → businesslogic-view-module.generator.js} +22 -26
  14. package/dist/generators/indices/{businesslogicservice.generator.d.ts → businesslogic-view-service.generator.d.ts} +1 -1
  15. package/dist/generators/indices/{businesslogicservice.generator.js → businesslogic-view-service.generator.js} +9 -10
  16. package/dist/generators/indices/{datamockmodule.generator.js → datamock-module.generator.js} +8 -16
  17. package/dist/generators/indices/datamocker.generator.js +3 -7
  18. package/dist/generators/indices/datamodule.generator.js +7 -13
  19. package/dist/generators/indices/{businesslogicmodule.generator.d.ts → dispatcher-service.generator.d.ts} +2 -2
  20. package/dist/generators/indices/dispatcher-service.generator.js +81 -0
  21. package/dist/generators/indices/seed-migration.generator.d.ts +9 -0
  22. package/dist/generators/indices/seed-migration.generator.js +35 -0
  23. package/dist/generators/indices/seed-service.generator.d.ts +1 -1
  24. package/dist/generators/indices/seed-service.generator.js +327 -123
  25. package/dist/generators/indices/seed-template-decoder.generator.js +22 -6
  26. package/dist/generators/indices/{seed.generator.d.ts → seeddata-type.generator.d.ts} +2 -2
  27. package/dist/generators/indices/seeddata-type.generator.js +42 -0
  28. package/dist/generators/indices/types.generator.d.ts +1 -1
  29. package/dist/generators/indices/types.generator.js +8 -6
  30. package/dist/generators/models/businesslogic-update.generator.d.ts +10 -0
  31. package/dist/generators/models/businesslogic-update.generator.js +243 -0
  32. package/dist/generators/models/businesslogic-view.generator.d.ts +10 -0
  33. package/dist/generators/models/{businesslogic.generator.js → businesslogic-view.generator.js} +23 -72
  34. package/dist/generators/models/react.generator/modals.generator.js +2 -2
  35. package/dist/generators/models/repository.generator.d.ts +9 -0
  36. package/dist/generators/models/repository.generator.js +420 -131
  37. package/dist/generators/models/route.generator.js +45 -55
  38. package/dist/generators/models/seed.generator.js +6 -2
  39. package/dist/generators/models/types.generator.js +60 -13
  40. package/dist/lib/attributes.d.ts +5 -0
  41. package/dist/lib/imports.d.ts +23 -2
  42. package/dist/lib/imports.js +19 -1
  43. package/dist/lib/meta.d.ts +287 -34
  44. package/dist/lib/meta.js +87 -16
  45. package/dist/lib/schema/schema.d.ts +24 -6
  46. package/dist/lib/schema/types.d.ts +4 -0
  47. package/dist/lib/utils/jsdoc.d.ts +1 -1
  48. package/dist/lib/utils/jsdoc.js +8 -6
  49. package/dist/lib/utils/string.js +2 -1
  50. package/dist/prisma/attributes.js +7 -3
  51. package/dist/prisma/parse.js +25 -5
  52. package/package.json +1 -1
  53. package/dist/generators/indices/businesslogicindex.generator.js +0 -19
  54. package/dist/generators/indices/seed.generator.js +0 -17
  55. package/dist/generators/indices/testdataservice.generator.d.ts +0 -9
  56. package/dist/generators/indices/testdataservice.generator.js +0 -78
  57. package/dist/generators/models/businesslogic.generator.d.ts +0 -9
  58. /package/dist/generators/indices/{datamockmodule.generator.d.ts → datamock-module.generator.d.ts} +0 -0
@@ -1,14 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.jsDocComment = void 0;
3
+ exports.toJsDocComment = void 0;
4
4
  /**
5
5
  * Returns a string of JSDoc comments from an array of lines.
6
6
  */
7
- function jsDocComment(lines) {
8
- const _lines = lines
7
+ function toJsDocComment(comments) {
8
+ if (!comments || comments.length === 0) {
9
+ return '';
10
+ }
11
+ return `/**${comments
9
12
  .filter((c) => c !== '')
10
13
  .map((c) => `\n * ${c}`)
11
- .join('');
12
- return `/**${_lines}\n */`;
14
+ .join('')} \n */`;
13
15
  }
14
- exports.jsDocComment = jsDocComment;
16
+ exports.toJsDocComment = toJsDocComment;
@@ -70,8 +70,9 @@ const irregularPlurals = {
70
70
  * Returns a pluralized version of the given string based on the count.
71
71
  */
72
72
  const pluralize = (s, count = 2) => {
73
- if (count === 1)
73
+ if (count === 1) {
74
74
  return s;
75
+ }
75
76
  if (s.endsWith('y') &&
76
77
  !s.endsWith('ay') &&
77
78
  !s.endsWith('ey') &&
@@ -11,16 +11,18 @@ const string_1 = require("../lib/utils/string");
11
11
  */
12
12
  function parseAttributesFromDocumentation({ documentation }) {
13
13
  const prefix = '@@';
14
- if (!documentation)
14
+ if (!documentation) {
15
15
  return {};
16
+ }
16
17
  return documentation
17
18
  .split('\n')
18
19
  .filter((d) => d.startsWith(prefix))
19
20
  .map((d) => d.replace(prefix, ''))
20
21
  .reduce((acc, line) => {
21
22
  const pattern = /(\w+)\((.*?)\)$/;
22
- if (!pattern.test(line))
23
+ if (!pattern.test(line)) {
23
24
  return acc;
25
+ }
24
26
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
25
27
  const [attribute, arg] = line.match(pattern).slice(1);
26
28
  acc[(0, string_1.toCamelCase)(attribute)] = parseArgumentToStringOrStringArray(arg);
@@ -71,6 +73,7 @@ function getModelAttributes(model) {
71
73
  description: zod_1.default.string().optional(),
72
74
  schema: zod_1.default.string().optional(),
73
75
  index: zod_1.default.array(zod_1.default.string()).optional(),
76
+ seed: zod_1.default.string().optional(),
74
77
  })
75
78
  .transform((obj) => ({
76
79
  ignore: obj.ignore,
@@ -78,6 +81,7 @@ function getModelAttributes(model) {
78
81
  description: obj.description,
79
82
  databaseSchema: obj.schema,
80
83
  index: obj.index,
84
+ randomSeed: obj.seed !== undefined ? parseInt(obj.seed, 10) : undefined,
81
85
  }));
82
86
  const result = decoder.safeParse(attributes);
83
87
  if (!result.success) {
@@ -144,7 +148,7 @@ function getFieldAttributes(field) {
144
148
  isLabel: obj.label,
145
149
  examples: obj.examples || obj.example,
146
150
  maxLength: obj.maxLength,
147
- isReadonly: obj.readonly || field.isGenerated || field.isUpdatedAt || field.name === 'createdAt',
151
+ isReadonly: obj.readonly || field.isGenerated || field.isUpdatedAt || field.name === 'createdAt' || field.isId,
148
152
  isUpdatedAt: (_a = field.isUpdatedAt) !== null && _a !== void 0 ? _a : false,
149
153
  isCreatedAt: field.name === 'createdAt',
150
154
  });
@@ -28,19 +28,34 @@ const Types = __importStar(require("../lib/schema/types"));
28
28
  const error_1 = require("../lib/utils/error");
29
29
  const string_1 = require("../lib/utils/string");
30
30
  const attributes_1 = require("./attributes");
31
+ /**
32
+ * These models are required for the generators/backend to work.
33
+ */
34
+ const REQUIRED_MODELS = ['User', 'Config', 'File', 'Action', 'Mutation'];
31
35
  /**
32
36
  * Converts a Prisma schema (DMMF) document to a Schema that's passed around generators.
33
37
  */
34
38
  function parsePrismaSchema({ datamodel: { enums: enumsRaw, models: modelsRaw }, config, }) {
39
+ ensureRequiredModelsExists(modelsRaw);
35
40
  // NOTE: We preprocess models and enums so that we can populate relationships.
36
41
  const models = modelsRaw.map((dmmfModel) => parseModelCore({ dmmfModel, config }));
37
42
  const enums = enumsRaw.map((dmmfEnum) => parseEnum({ dmmfEnum, config }));
38
43
  const modelsWithFields = modelsRaw
39
44
  .map((dmmfModel) => parseModel({ dmmfModel, models, enums, config }))
40
- .filter((model) => !model.attributes.ignore);
45
+ .filter(isModelNotIgnored);
41
46
  return { models: modelsWithFields, enums };
42
47
  }
43
48
  exports.parsePrismaSchema = parsePrismaSchema;
49
+ function ensureRequiredModelsExists(models) {
50
+ for (const requiredModel of REQUIRED_MODELS) {
51
+ if (!models.find((m) => m.name === requiredModel)) {
52
+ (0, error_1.throwError)(`Required model ${requiredModel} not found in schema!`);
53
+ }
54
+ }
55
+ }
56
+ function isModelNotIgnored(model) {
57
+ return model !== undefined && !model.attributes.ignore;
58
+ }
44
59
  /**
45
60
  * Parses the core properties of a model without fields.
46
61
  */
@@ -63,6 +78,10 @@ function parseModelCore({ dmmfModel, config, }) {
63
78
  */
64
79
  function parseModel({ dmmfModel, enums, models, config, }) {
65
80
  const core = parseModelCore({ dmmfModel, config });
81
+ // NOTE: We ignore models which are marked as ignored.
82
+ if (core.attributes.ignore) {
83
+ return undefined;
84
+ }
66
85
  // NOTE: We assume that each relation may only reference one field. Because of this,
67
86
  // we can "relate" a given relation to a scalar field used in the relation.
68
87
  // Since Prisma doesn't mark those fields as relations, we need to preprocess
@@ -287,13 +306,14 @@ function getTsTypeForScalar(field) {
287
306
  case 'Float':
288
307
  case 'Int':
289
308
  return Types.toTypeName('number');
290
- case 'JSON':
309
+ case 'Json':
291
310
  case 'Bytes':
292
311
  (0, error_1.throwError)('Not implemented yet');
293
- break;
312
+ // While TypeScript understands that throwError never returns, eslint doesn't and complains.
313
+ // Hence we ignore the fallthrough error.
314
+ // eslint-disable-next-line no-fallthrough
294
315
  default:
295
- // return field.type
296
- (0, error_1.throwError)(`Investigate: 'default' case in getTypescriptType for field ${field.name} of type ${field.type}`);
316
+ (0, error_1.throwError)(`Investigate: 'default' case in getTsTypeForScalar for field ${field.name} of type ${field.type}`);
297
317
  }
298
318
  }
299
319
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@postxl/generator",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "main": "./dist/generator.js",
5
5
  "typings": "./dist/generator.d.ts",
6
6
  "bin": {
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateBusinessLogicIndex = void 0;
4
- const exports_1 = require("../../lib/exports");
5
- const meta_1 = require("../../lib/meta");
6
- /**
7
- * Generates index file for all businessLogic files.
8
- */
9
- function generateBusinessLogicIndex({ models, meta }) {
10
- const exports = exports_1.ExportsGenerator.from(meta.businessLogic.indexFilePath);
11
- exports.exportEverythingFromPath(meta.businessLogic.serviceFilePath);
12
- exports.exportEverythingFromPath(meta.businessLogic.moduleFilePath);
13
- for (const model of models) {
14
- const meta = (0, meta_1.getModelMetadata)({ model });
15
- exports.exportEverythingFromPath(meta.businessLogic.serviceFilePath);
16
- }
17
- return exports.generate();
18
- }
19
- exports.generateBusinessLogicIndex = generateBusinessLogicIndex;
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateSeedIndex = void 0;
4
- const exports_1 = require("../../lib/exports");
5
- const meta_1 = require("../../lib/meta");
6
- /**
7
- * Generates index file for all seed files.
8
- */
9
- function generateSeedIndex({ models, meta }) {
10
- const exports = exports_1.ExportsGenerator.from(meta.seed.indexFilePath);
11
- for (const model of models) {
12
- const meta = (0, meta_1.getModelMetadata)({ model });
13
- exports.exportEverythingFromPath(meta.seed.filePath);
14
- }
15
- return exports.generate();
16
- }
17
- exports.generateSeedIndex = generateSeedIndex;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../lib/meta';
2
- import { Model } from '../../lib/schema/schema';
3
- /**
4
- * Generates a generic data service object that may be used on the server to access database.
5
- */
6
- export declare function generateTestDataService({ meta, models }: {
7
- meta: SchemaMetaData;
8
- models: Model[];
9
- }): string;
@@ -1,78 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.generateTestDataService = void 0;
27
- const meta_1 = require("../../lib/meta");
28
- const Types = __importStar(require("../../lib/schema/types"));
29
- const imports_1 = require("../../lib/imports");
30
- /**
31
- * Generates a generic data service object that may be used on the server to access database.
32
- */
33
- function generateTestDataService({ meta, models }) {
34
- const imports = imports_1.ImportsGenerator.from(meta.data.testDataServiceFilePath).addImport({
35
- items: [Types.toVariableName('MockData')],
36
- from: meta.data.dataMockModuleFilePath,
37
- });
38
- const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
39
- for (const { meta } of mm) {
40
- imports.addImport({
41
- items: [meta.data.repositoryClassName],
42
- from: meta.data.repoFilePath,
43
- });
44
- }
45
- const constructor = mm
46
- .map(({ meta }) => `private ${meta.data.dataServiceName} :${meta.data.repositoryClassName}`)
47
- .join(',\n');
48
- return `
49
- import { Injectable, Logger } from '@nestjs/common'
50
-
51
- import { ResetService } from '@pxl/common'
52
- import { DbService } from '@${meta.config.project}/db'
53
-
54
- ${imports.generate()}
55
-
56
- @Injectable()
57
- export class TestDataService {
58
- private logger = new Logger(TestDataService.name)
59
- constructor(
60
- private db: DbService,
61
- private resetService: ResetService,
62
- ${constructor}
63
- ) {}
64
-
65
- public async resetTestData(data: MockData) {
66
- this.logger.log(\`✅ Reset test data\`)
67
- await this.db.emptyDatabase()
68
-
69
- ${mm
70
- .map(({ meta }) => `await this.${meta.data.dataServiceName}.reInit(data.${meta.data.mockDataPropertyName} ?? [])`)
71
- .join('\n')}
72
-
73
- return this.resetService.reset()
74
- }
75
- }
76
- `;
77
- }
78
- exports.generateTestDataService = generateTestDataService;
@@ -1,9 +0,0 @@
1
- import { ModelMetaData } from '../../lib/meta';
2
- import { Model } from '../../lib/schema/schema';
3
- /**
4
- * Generates business logic for a given model.
5
- */
6
- export declare function generateModelBusinessLogic({ model, meta }: {
7
- model: Model;
8
- meta: ModelMetaData;
9
- }): string;