@postxl/generator 0.10.0 → 0.12.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.
@@ -4,10 +4,10 @@ import { Logger } from './lib/utils/logger';
4
4
  /**
5
5
  * Generates PXL files and flushes them to disk.
6
6
  */
7
- export declare const generate: ({ models, enums, config, prismaClientPath, logger, }: {
7
+ export declare function generate({ models, enums, config, prismaClientPath, logger, }: {
8
8
  models: Schema.Model[];
9
9
  enums: Schema.Enum[];
10
10
  config: Schema.SchemaConfig;
11
11
  prismaClientPath: string;
12
12
  logger: Logger;
13
- }) => Promise<void>;
13
+ }): Promise<void>;
package/dist/generator.js CHANGED
@@ -61,7 +61,7 @@ const meta_1 = require("./lib/meta");
61
61
  const types_1 = require("./lib/schema/types");
62
62
  const client_path_1 = require("./prisma/client-path");
63
63
  const parse_1 = require("./prisma/parse");
64
- const configDecoder = zod_1.z
64
+ const CONFIG_SCHEMA = zod_1.z
65
65
  .object({
66
66
  project: zod_1.z.string(),
67
67
  pathToTypes: zod_1.z.string().optional(),
@@ -113,7 +113,7 @@ const configDecoder = zod_1.z
113
113
  onGenerate: ({ generator, otherGenerators, dmmf }) => __awaiter(void 0, void 0, void 0, function* () {
114
114
  internals_1.logger.info(`PXL started generating code...`);
115
115
  const prismaClientPath = (0, client_path_1.getClientImportPath)(otherGenerators);
116
- const decodedConfig = configDecoder.safeParse(generator.config);
116
+ const decodedConfig = CONFIG_SCHEMA.safeParse(generator.config);
117
117
  if (!decodedConfig.success) {
118
118
  throw new Error(`Invalid generator config: ${decodedConfig.error.message}`);
119
119
  }
@@ -121,92 +121,94 @@ const configDecoder = zod_1.z
121
121
  internals_1.logger.log(`Parsing DMMF...`);
122
122
  const { models, enums } = (0, parse_1.parsePrismaSchema)({ datamodel: dmmf.datamodel, config });
123
123
  internals_1.logger.log(`Generating...`);
124
- yield (0, exports.generate)({ models, enums, config, prismaClientPath, logger: internals_1.logger });
124
+ yield generate({ models, enums, config, prismaClientPath, logger: internals_1.logger });
125
125
  internals_1.logger.info(`PXL finished!`);
126
126
  }),
127
127
  });
128
128
  /**
129
129
  * Generates PXL files and flushes them to disk.
130
130
  */
131
- const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awaiter(void 0, void 0, void 0, function* () {
132
- const root = yield lock_1.LockUtils.findProjectRoot();
133
- if (root == undefined) {
134
- throw new Error(`Could not find lock file. Make sure you are running the generator in a project folder.`);
135
- }
136
- faker_1.faker.seed(config.randomSeed);
137
- const vfs = yield lock_1.VirtualFS.fromLockFile(root);
138
- const generated = new lock_1.VirtualFS();
139
- // Generate Models
140
- for (const model of models) {
141
- const meta = (0, meta_1.getModelMetadata)({ model });
142
- // Types
143
- if (!config.disableGenerators.types) {
144
- generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_3.generateModelTypes)({ model, meta }));
131
+ function generate({ models, enums, config, prismaClientPath, logger, }) {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ const root = yield lock_1.LockUtils.findProjectRoot();
134
+ if (root == undefined) {
135
+ throw new Error(`Could not find lock file. Make sure you are running the generator in a project folder.`);
145
136
  }
146
- // Seed
147
- if (!config.disableGenerators.seed) {
148
- generated.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_2.generateSeedModel)({ model, itemCount: 5, meta }));
137
+ faker_1.faker.seed(config.randomSeed);
138
+ const vfs = yield lock_1.VirtualFS.fromLockFile(root);
139
+ const generated = new lock_1.VirtualFS();
140
+ // Generate Models
141
+ for (const model of models) {
142
+ const meta = (0, meta_1.getModelMetadata)({ model });
143
+ // Types
144
+ if (!config.disableGenerators.types) {
145
+ generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_3.generateModelTypes)({ model, meta }));
146
+ }
147
+ // Seed
148
+ if (!config.disableGenerators.seed) {
149
+ generated.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_2.generateSeedModel)({ model, itemCount: 5, meta }));
150
+ }
151
+ // Generate Repositories
152
+ if (!config.disableGenerators.data) {
153
+ generated.write(`/${meta.data.stubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
154
+ generated.write(`/${meta.data.repoFilePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
155
+ generated.write(`/${meta.data.mockRepoFilePath}.ts`, (0, repository_generator_1.generateMockRepository)({ model, meta }));
156
+ }
157
+ // Routes
158
+ if (!config.disableGenerators.trpc) {
159
+ generated.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
160
+ }
161
+ // React
162
+ if (!config.disableGenerators.react) {
163
+ generated.copy((0, react_generator_2.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
164
+ }
165
+ logger.log(`- ${model.name} processed`);
166
+ }
167
+ // Generate Enums
168
+ for (const enumerator of enums.values()) {
169
+ const meta = (0, meta_1.getEnumMetadata)({ enumerator });
170
+ if (!config.disableGenerators.types) {
171
+ generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateEnumType)({ enumerator, prismaClientPath, meta }));
172
+ }
173
+ if (!config.disableGenerators.react) {
174
+ generated.copy((0, react_generator_1.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
175
+ }
149
176
  }
150
- // Generate Repositories
177
+ // Generate Index Files and Services
178
+ const meta = (0, meta_1.getSchemaMetadata)({ config });
151
179
  if (!config.disableGenerators.data) {
152
- generated.write(`/${meta.data.stubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
153
- generated.write(`/${meta.data.repoFilePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
154
- generated.write(`/${meta.data.mockRepoFilePath}.ts`, (0, repository_generator_1.generateMockRepository)({ model, meta }));
180
+ generated.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamockmodule_generator_1.generateDataMockModule)({ models, meta }));
181
+ generated.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
182
+ generated.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
183
+ generated.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ models, meta }));
184
+ generated.write(`/${meta.data.repositoriesConstFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
185
+ generated.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
186
+ generated.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
187
+ generated.write(`/${meta.migrationsPath}/emptyDatabase.template.sql`, (0, emptydatabasemigration_generator_1.generateEmptyDatabaseStoredProcedure)({ models, meta }));
155
188
  }
156
- // Routes
157
- if (!config.disableGenerators.trpc) {
158
- generated.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
189
+ if (!config.disableGenerators.seed) {
190
+ generated.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_1.generateSeedIndex)({ models, meta }));
159
191
  }
160
- // React
161
- if (!config.disableGenerators.react) {
162
- generated.copy((0, react_generator_2.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
192
+ if (!config.disableGenerators.trpc) {
193
+ generated.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
163
194
  }
164
- logger.log(`- ${model.name} processed`);
165
- }
166
- // Generate Enums
167
- for (const enumerator of enums.values()) {
168
- const meta = (0, meta_1.getEnumMetadata)({ enumerator });
169
195
  if (!config.disableGenerators.types) {
170
- generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateEnumType)({ enumerator, prismaClientPath, meta }));
196
+ generated.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_2.generateTypesIndex)({ models, enums, meta }));
171
197
  }
172
- if (!config.disableGenerators.react) {
173
- generated.copy((0, react_generator_1.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
174
- }
175
- }
176
- // Generate Index Files and Services
177
- const meta = (0, meta_1.getSchemaMetadata)({ config });
178
- if (!config.disableGenerators.data) {
179
- generated.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamockmodule_generator_1.generateDataMockModule)({ models, meta }));
180
- generated.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
181
- generated.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
182
- generated.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ models, meta }));
183
- generated.write(`/${meta.data.repositoriesConstFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
184
- generated.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
185
- generated.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
186
- generated.write(`/${meta.migrationsPath}/emptyDatabase.template.sql`, (0, emptydatabasemigration_generator_1.generateEmptyDatabaseStoredProcedure)({ models, meta }));
187
- }
188
- if (!config.disableGenerators.seed) {
189
- generated.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_1.generateSeedIndex)({ models, meta }));
190
- }
191
- if (!config.disableGenerators.trpc) {
192
- generated.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
193
- }
194
- if (!config.disableGenerators.types) {
195
- generated.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_2.generateTypesIndex)({ models, enums, meta }));
196
- }
197
- // -------------------------------------------------------------------------
198
- // Add disclaimer and format.
199
- const prettierConfig = yield prettier.resolveConfig(process.cwd());
200
- generated.transformUTF8Files((path, content) => `${DISCLAIMER}\n${content}`);
201
- generated.format(prettierConfig);
202
- // -------------------------------------------------------------------------
203
- // Merge with existing files.
204
- vfs.copy(generated, './');
205
- // Flush to disk.
206
- const changes = yield vfs.flush(process.cwd(), { force: config.force });
207
- const log = lock_1.ConsoleUtils.getFilesChangelog(changes);
208
- console.info(log);
209
- });
198
+ // -------------------------------------------------------------------------
199
+ // Add disclaimer and format.
200
+ const prettierConfig = yield prettier.resolveConfig(process.cwd());
201
+ generated.transformUTF8Files((path, content) => `${DISCLAIMER}\n${content}`);
202
+ generated.formatUTF8Files(prettierConfig);
203
+ // -------------------------------------------------------------------------
204
+ // Merge with existing files.
205
+ vfs.copy(generated, './');
206
+ // Flush to disk.
207
+ const changes = yield vfs.flush(process.cwd(), { force: config.force });
208
+ const log = lock_1.ConsoleUtils.getFilesChangelog(changes.filter((c) => !c.static));
209
+ console.info(log);
210
+ });
211
+ }
210
212
  exports.generate = generate;
211
213
  const DISCLAIMER = `
212
214
  /**
@@ -18,7 +18,7 @@ function generateDataService({ models, meta }) {
18
18
  const constructor = mm
19
19
  .map(({ meta }) => `public ${meta.data.dataServiceName} :${meta.data.repositoryClassName}`)
20
20
  .join(',\n');
21
- const initializer = mm.map(({ meta }) => `await this.${meta.data.dataServiceName}.init()`).join(',\n');
21
+ const initializer = mm.map(({ meta }) => `this.${meta.data.dataServiceName}.init()`).join(',\n');
22
22
  const excelExports = mm
23
23
  .map(({ meta }) => `${meta.data.excelExportTableName}: mapValues(this.${meta.data.dataServiceName}.getAll()),`)
24
24
  .join('\n');
@@ -40,7 +40,7 @@ export class DataService {
40
40
  }
41
41
 
42
42
  public async init(): Promise<void> {
43
- ${initializer}
43
+ await Promise.all([${initializer}])
44
44
  }
45
45
 
46
46
  public isEmpty(): boolean {
@@ -3,7 +3,7 @@ import { Model } from '../../lib/schema/schema';
3
3
  /**
4
4
  * Generates a data module class.
5
5
  */
6
- export declare function generateEmptyDatabaseStoredProcedure({ models, meta, }: {
6
+ export declare function generateEmptyDatabaseStoredProcedure({ models }: {
7
7
  models: Model[];
8
8
  meta: SchemaMetaData;
9
9
  }): string;
@@ -4,14 +4,16 @@ exports.generateEmptyDatabaseStoredProcedure = void 0;
4
4
  /**
5
5
  * Generates a data module class.
6
6
  */
7
- function generateEmptyDatabaseStoredProcedure({ models, meta, }) {
7
+ function generateEmptyDatabaseStoredProcedure({ models }) {
8
8
  const tables = models
9
9
  .map((model) => `\t${model.sourceSchemaName !== undefined ? `"${model.sourceSchemaName}".` : ''}"${model.sourceName}"`)
10
10
  .join(',\n');
11
+ const useSchemas = models.some((model) => model.sourceSchemaName !== undefined);
12
+ const configTableName = useSchemas ? ' "Configuration"."Config"' : '"Config"';
11
13
  return `
12
14
  CREATE OR REPLACE PROCEDURE "emptyDatabase"() AS $BODY$ BEGIN IF EXISTS (
13
15
  SELECT
14
- FROM "Configuration"."Config"
16
+ FROM ${configTableName}
15
17
  WHERE NOT "isTest"
16
18
  ) THEN RETURN;
17
19
  END IF;
@@ -76,7 +76,7 @@ export const ${modals.createComponentName} = ({ show, onHide }: { show: boolean;
76
76
  },
77
77
  {
78
78
  async onSuccess() {
79
- await cache.${trpc.getMap.reactQueryMethod}.invalidate()
79
+ await cache.${trpc.routerName}.invalidate()
80
80
  },
81
81
  },
82
82
  ),
@@ -75,7 +75,7 @@ function generateRepository({ model, meta }) {
75
75
  return `
76
76
  import { Injectable, Logger } from '@nestjs/common'
77
77
  import { DbService, ${model.sourceName} as DbType } from '@${model.schemaConfig.project}/db'
78
- import { format, pluralize, NestedMap } from '@pxl/common'
78
+ import { format, pluralize ${indexes.length === 0 ? '' : ', NestedMap'} } from '@pxl/common'
79
79
 
80
80
  ${imports.generate()}
81
81
 
@@ -140,8 +140,6 @@ export class ${meta.data.repositoryClassName} implements Repository<
140
140
  this.set(item)
141
141
 
142
142
  ${model.defaultField ? defaultValueInitFn : ''}
143
- ${uniqueStringFields.map((f) => `this.uniqueIds.${f.name}.set(item.${f.name}, item)`).join('\n')}
144
- ${indexes.map((i) => `this.${i.name}.set(item)`).join('\n')}
145
143
  }
146
144
 
147
145
  ${isGenerated ? idIntInitFn : ''}
@@ -173,6 +171,15 @@ export class ${meta.data.repositoryClassName} implements Repository<
173
171
  `}
174
172
  }
175
173
 
174
+ public async deleteAll(): Promise<void> {
175
+ ${model.attributes.inMemoryOnly
176
+ ? ''
177
+ : `
178
+ await this.db.runOnlyOnTestDb(() => this.db.$executeRaw\`DELETE FROM ${model.sourceSchemaName !== undefined ? `"${model.sourceSchemaName}".` : ''}"${model.sourceName}"\`)
179
+ `}
180
+ return this.init()
181
+ }
182
+
176
183
  public get(id: ${model.brandedIdType} | null): ${model.typeName} | null {
177
184
  if (id === null) {
178
185
  return null
@@ -79,7 +79,7 @@ function getModelAttributes(model) {
79
79
  skipDelete: obj.skipDelete || obj.customDelete,
80
80
  inMemoryOnly: obj.inMemoryOnly,
81
81
  description: obj.description,
82
- schema: obj.schema,
82
+ databaseSchema: obj.schema,
83
83
  index: obj.index,
84
84
  }));
85
85
  const result = decoder.safeParse(attributes);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@postxl/generator",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "main": "./dist/generator.js",
5
5
  "typings": "./dist/generator.d.ts",
6
6
  "bin": {
@@ -21,7 +21,7 @@
21
21
  "prettier": "^2.8.7",
22
22
  "remeda": "1.9.4",
23
23
  "zod": "3.21.4",
24
- "@postxl/lock": "0.2.4"
24
+ "@postxl/lock": "0.3.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@prisma/client": "4.12.0",