@postxl/generator 0.1.1 → 0.2.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.
@@ -1,5 +1,6 @@
1
- import { Logger } from './lib/utils/logger';
1
+ #! /usr/bin/env node
2
2
  import * as Schema from './lib/schema/schema';
3
+ import { Logger } from './lib/utils/logger';
3
4
  /**
4
5
  * Generates PXL files and flushes them to disk.
5
6
  */
@@ -1,3 +1,4 @@
1
+ #! /usr/bin/env node
1
2
  "use strict";
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
@@ -33,32 +34,32 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
33
34
  };
34
35
  Object.defineProperty(exports, "__esModule", { value: true });
35
36
  exports.generate = void 0;
37
+ const faker_1 = require("@faker-js/faker");
36
38
  const generator_helper_1 = require("@prisma/generator-helper");
37
39
  const internals_1 = require("@prisma/internals");
38
40
  const prettier = __importStar(require("prettier"));
39
- const client_path_1 = require("./prisma/client-path");
40
- const parse_1 = require("./prisma/parse");
41
- const meta_1 = require("./lib/meta");
42
- const vfs_1 = require("./lib/vfs");
43
- const route_generator_1 = require("./generators/models/route.generator");
44
- const repository_generator_1 = require("./generators/models/repository.generator");
45
- const stub_generator_1 = require("./generators/models/stub.generator");
46
- const seed_generator_1 = require("./generators/models/seed.generator");
47
- const react_generator_1 = require("./generators/models/react.generator");
48
- const types_generator_1 = require("./generators/models/types.generator");
49
- const types_generator_2 = require("./generators/enums/types.generator");
50
- const react_generator_2 = require("./generators/enums/react.generator");
41
+ const zod_1 = require("zod");
42
+ const react_generator_1 = require("./generators/enums/react.generator");
43
+ const types_generator_1 = require("./generators/enums/types.generator");
51
44
  const datamockmodule_generator_1 = require("./generators/indices/datamockmodule.generator");
52
- const dataservice_generator_1 = require("./generators/indices/dataservice.generator");
53
45
  const datamodule_generator_1 = require("./generators/indices/datamodule.generator");
54
- const types_1 = require("./lib/schema/types");
55
- const faker_1 = require("@faker-js/faker");
46
+ const dataservice_generator_1 = require("./generators/indices/dataservice.generator");
56
47
  const repositories_generator_1 = require("./generators/indices/repositories.generator");
48
+ const seed_generator_1 = require("./generators/indices/seed.generator");
57
49
  const stubs_generator_1 = require("./generators/indices/stubs.generator");
58
- const seed_generator_2 = require("./generators/indices/seed.generator");
59
- const types_generator_3 = require("./generators/indices/types.generator");
60
50
  const testdataservice_generator_1 = require("./generators/indices/testdataservice.generator");
61
- const zod_1 = require("zod");
51
+ const types_generator_2 = require("./generators/indices/types.generator");
52
+ const react_generator_2 = require("./generators/models/react.generator");
53
+ const repository_generator_1 = require("./generators/models/repository.generator");
54
+ const route_generator_1 = require("./generators/models/route.generator");
55
+ const seed_generator_2 = require("./generators/models/seed.generator");
56
+ const stub_generator_1 = require("./generators/models/stub.generator");
57
+ const types_generator_3 = require("./generators/models/types.generator");
58
+ const meta_1 = require("./lib/meta");
59
+ const types_1 = require("./lib/schema/types");
60
+ const vfs_1 = require("./lib/vfs");
61
+ const client_path_1 = require("./prisma/client-path");
62
+ const parse_1 = require("./prisma/parse");
62
63
  const configDecoder = zod_1.z
63
64
  .object({
64
65
  project: zod_1.z.string(),
@@ -132,11 +133,11 @@ const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awa
132
133
  const meta = (0, meta_1.getModelMetadata)({ model });
133
134
  // Types
134
135
  if (!config.disableGenerators.types) {
135
- vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateModelTypes)({ model, meta }));
136
+ vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_3.generateModelTypes)({ model, meta }));
136
137
  }
137
138
  // Seed
138
139
  if (!config.disableGenerators.seed) {
139
- vfs.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_1.generateSeedModel)({ model, itemCount: 5, meta }));
140
+ vfs.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_2.generateSeedModel)({ model, itemCount: 5, meta }));
140
141
  }
141
142
  // Generate Repositories
142
143
  if (!config.disableGenerators.data) {
@@ -149,7 +150,7 @@ const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awa
149
150
  }
150
151
  // React
151
152
  if (!config.disableGenerators.react) {
152
- vfs.copy((0, react_generator_1.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
153
+ vfs.copy((0, react_generator_2.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
153
154
  }
154
155
  logger.log(`✅ ${model.name} generated!`);
155
156
  }
@@ -157,10 +158,10 @@ const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awa
157
158
  for (const enumerator of enums.values()) {
158
159
  const meta = (0, meta_1.getEnumMetadata)({ enumerator });
159
160
  if (!config.disableGenerators.types) {
160
- vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_2.generateEnumType)({ enumerator, prismaClientPath, meta }));
161
+ vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateEnumType)({ enumerator, prismaClientPath, meta }));
161
162
  }
162
163
  if (!config.disableGenerators.react) {
163
- vfs.copy((0, react_generator_2.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
164
+ vfs.copy((0, react_generator_1.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
164
165
  }
165
166
  }
166
167
  // Generate Index Files and Services
@@ -175,13 +176,13 @@ const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awa
175
176
  vfs.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
176
177
  }
177
178
  if (!config.disableGenerators.seed) {
178
- vfs.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_2.generateSeedIndex)({ models, meta }));
179
+ vfs.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_1.generateSeedIndex)({ models, meta }));
179
180
  }
180
181
  if (!config.disableGenerators.trpc) {
181
182
  vfs.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
182
183
  }
183
184
  if (!config.disableGenerators.types) {
184
- vfs.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_3.generateTypesIndex)({ models, enums, meta }));
185
+ vfs.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_2.generateTypesIndex)({ models, enums, meta }));
185
186
  }
186
187
  // -------------------------------------------------------------------------
187
188
  // Add disclaimer and format.
@@ -35,7 +35,7 @@ function generateRepository({ model, meta }) {
35
35
  .addImport({ items: [meta.types.zodDecoderFnName], from: meta.types.importPath });
36
36
  return `
37
37
  import { Injectable, Logger } from '@nestjs/common'
38
- import { DbService } from '@${model.schemaConfig.project}/db'
38
+ import { DbService, ${model.sourceName} as DbType } from '@${model.schemaConfig.project}/db'
39
39
 
40
40
  import { Repository } from '../repository.type'
41
41
 
@@ -52,7 +52,15 @@ export class ${meta.data.repositoryClassName} implements Repository<
52
52
 
53
53
  ${model.defaultField ? `public defaultValue!: ${model.typeName}` : ''}
54
54
 
55
- ${isGenerated ? `protected currentMaxId = 0\n` : ''}
55
+ ${isGenerated
56
+ ? `
57
+
58
+ protected currentMaxId = 0\n
59
+ public get nextId(): ${model.brandedIdType} {
60
+ return ${meta.types.toBrandedIdTypeFnName}(this.currentMaxId + 1)
61
+ }
62
+ `
63
+ : ''}
56
64
 
57
65
  protected uniqueIds = {
58
66
  ${uniqueStringFields.map((f) => `'${f.name}': new Map<string, ${model.typeName}>()`).join(',\n')}
@@ -96,8 +104,10 @@ export class ${meta.data.repositoryClassName} implements Repository<
96
104
  }
97
105
 
98
106
  public get(id: ${model.brandedIdType} | null): ${model.typeName} | null {
99
- if (id === null) return null
100
- return this.data.get(${meta.types.toBrandedIdTypeFnName}(id)) ?? null
107
+ if (id === null) {
108
+ return null
109
+ }
110
+ return this.data.get(id) ?? null
101
111
  }
102
112
 
103
113
  public getAll(): Map<${model.brandedIdType}, ${model.typeName}> {
@@ -279,10 +289,12 @@ export class ${meta.data.repositoryClassName} implements Repository<
279
289
  /**
280
290
  * Utility function that converts a given Database object to a TypeScript model instance
281
291
  */
282
- private ${decoder}(item: unknown): ${model.typeName} {
283
- return ${meta.types.zodDecoderFnName}.parse(item)
292
+ private ${decoder}(item: DbType): ${model.typeName} {
293
+ return ${meta.types.zodDecoderFnName}.parse({
294
+ ${[...model.fields.values()].map((f) => `${f.name}: item.${f.sourceName}`).join(',\n')}
295
+ })
284
296
  }
285
- }
297
+ }
286
298
  `;
287
299
  }
288
300
  exports.generateRepository = generateRepository;
@@ -65,7 +65,7 @@ function getExampleMode({ model, maxItemCount }) {
65
65
  else if (sameNumberOfExamplesPerField) {
66
66
  return {
67
67
  mode: 'Tuples',
68
- itemCount: numberOfExamplesPerField < maxItemCount ? numberOfExamplesPerField : maxItemCount,
68
+ itemCount: numberOfExamplesPerField,
69
69
  };
70
70
  }
71
71
  else {
@@ -127,7 +127,7 @@ function getFieldExample({ field, model, index, exampleMode, }) {
127
127
  return { hasExample: true, example };
128
128
  }
129
129
  case 'Tuples': {
130
- const example = field.attributes.examples[index % field.attributes.examples.length];
130
+ const example = field.attributes.examples[(index - 1) % field.attributes.examples.length];
131
131
  return { hasExample: true, example };
132
132
  }
133
133
  default:
@@ -31,15 +31,16 @@ function parseArgumentToStringOrStringArray(str) {
31
31
  try {
32
32
  return JSON.parse(str);
33
33
  }
34
- catch (_a) {
35
- try {
36
- return JSON.parse(`[${str}]`);
37
- }
38
- catch (_b) {
39
- console.log(str);
40
- return JSON.parse(`"${str}"`);
41
- }
34
+ catch (_a) { }
35
+ try {
36
+ return JSON.parse(`[${str}]`);
37
+ }
38
+ catch (_b) { }
39
+ try {
40
+ return JSON.parse(`"${str}"`);
42
41
  }
42
+ catch (_c) { }
43
+ throw new Error(`Could not parse attribute argument: ${str}`);
43
44
  }
44
45
  exports.parseArgumentToStringOrStringArray = parseArgumentToStringOrStringArray;
45
46
  /**
@@ -107,6 +107,9 @@ function parseModel({ dmmfModel, enums, models, config, }) {
107
107
  }
108
108
  if (dmmfField.kind === 'scalar') {
109
109
  let validation = undefined;
110
+ if (dmmfField.isList) {
111
+ (0, error_1.throwError)(`Array fields with scalars (e.g. String[]) aren't supported! Use a relation instead. Field: ${dmmfModel.name}.${dmmfField.name}`);
112
+ }
110
113
  if (dmmfField.type === 'Int') {
111
114
  validation = { type: 'int' };
112
115
  }