@postxl/generator 0.47.2 → 0.49.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.
- package/dist/generator.js +13 -3
- package/dist/generators/indices/dispatcher-service.generator.js +1 -1
- package/dist/generators/indices/seed-migration.generator.js +4 -0
- package/dist/generators/models/importexport-decoder.generator.js +27 -9
- package/dist/lib/attributes.d.ts +6 -0
- package/dist/lib/meta.d.ts +6 -0
- package/dist/lib/meta.js +6 -0
- package/dist/lib/skip-generator.d.ts +18 -0
- package/dist/lib/skip-generator.js +41 -0
- package/dist/prisma/attributes.js +3 -0
- package/package.json +6 -6
package/dist/generator.js
CHANGED
|
@@ -77,6 +77,7 @@ const stub_generator_1 = require("./generators/models/stub.generator");
|
|
|
77
77
|
const types_generator_3 = require("./generators/models/types.generator");
|
|
78
78
|
const meta_1 = require("./lib/meta");
|
|
79
79
|
const types_1 = require("./lib/schema/types");
|
|
80
|
+
const skip_generator_1 = require("./lib/skip-generator");
|
|
80
81
|
const vfs_1 = require("./lib/vfs");
|
|
81
82
|
const client_path_1 = require("./prisma/client-path");
|
|
82
83
|
const parse_1 = require("./prisma/parse");
|
|
@@ -165,7 +166,9 @@ function generate({ models, enums, config, prismaClientPath, logger, }) {
|
|
|
165
166
|
// Types
|
|
166
167
|
generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_3.generateModelTypes)({ model, meta }));
|
|
167
168
|
// Seed
|
|
168
|
-
|
|
169
|
+
if (!(0, skip_generator_1.skipDecoder)({ model, generatorName: 'seed' })) {
|
|
170
|
+
generated.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_1.generateSeedModel)({ model, itemCount: 5, meta, models }));
|
|
171
|
+
}
|
|
169
172
|
// Data
|
|
170
173
|
generated.write(`/${meta.data.stubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
|
|
171
174
|
generated.write(`/${meta.data.repository.filePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
|
|
@@ -179,8 +182,15 @@ function generate({ models, enums, config, prismaClientPath, logger, }) {
|
|
|
179
182
|
// Routes
|
|
180
183
|
generated.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
|
|
181
184
|
// React
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
if (!(0, skip_generator_1.skipDecoder)({ model, generatorName: 'react' })) {
|
|
186
|
+
yield generated.copy((0, react_generator_2.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
|
|
187
|
+
}
|
|
188
|
+
if (model.attributes.skipGenerators.size === 0) {
|
|
189
|
+
logger.log(`- ${model.name} processed`);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
logger.log(`- ${model.name} processed (skipped generators for: ${[...model.attributes.skipGenerators].join(', ')})`);
|
|
193
|
+
}
|
|
184
194
|
}
|
|
185
195
|
// Generate Enums
|
|
186
196
|
for (const enumerator of enums.values()) {
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateSeedMigration = void 0;
|
|
4
4
|
const imports_1 = require("../../lib/imports");
|
|
5
5
|
const meta_1 = require("../../lib/meta");
|
|
6
|
+
const skip_generator_1 = require("../../lib/skip-generator");
|
|
6
7
|
/**
|
|
7
8
|
* Generates the initial migration based on the generated seed data.
|
|
8
9
|
*/
|
|
@@ -10,6 +11,9 @@ function generateSeedMigration({ models, meta }) {
|
|
|
10
11
|
const imports = imports_1.ImportsGenerator.from(meta.seedData.initialMigrationFilePath);
|
|
11
12
|
const modelTypes = [];
|
|
12
13
|
for (const model of models) {
|
|
14
|
+
if ((0, skip_generator_1.skipDecoder)({ model, generatorName: 'seed' })) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
13
17
|
const modelMeta = (0, meta_1.getModelMetadata)({ model });
|
|
14
18
|
imports.addImports({
|
|
15
19
|
[modelMeta.seed.filePath]: [modelMeta.seed.constantName],
|
|
@@ -54,7 +54,7 @@ const blank${singularCapitalized}ExcelRowImportDecoderInput = z
|
|
|
54
54
|
* The decoder for an Excel table that contains ${userFriendly} entries
|
|
55
55
|
*/
|
|
56
56
|
export const ${tableImportDecoder} = z
|
|
57
|
-
.array(${
|
|
57
|
+
.array(blank${singularCapitalized}ExcelRowImportDecoderInput.or(${singular}ExcelRowImportDecoder))
|
|
58
58
|
.transform((items) => items.filter(Boolean) as ${model.typeName}[])
|
|
59
59
|
|
|
60
60
|
/**
|
|
@@ -74,7 +74,8 @@ function generateFieldDecoders({ model, meta, schemaMeta, imports, }) {
|
|
|
74
74
|
const blankFieldDecoders = [];
|
|
75
75
|
for (const field of model.fields) {
|
|
76
76
|
const fieldMeta = (0, meta_1.getFieldMetadata)({ field });
|
|
77
|
-
|
|
77
|
+
const optionalModifier = field.attributes.isUpdatedAt || field.attributes.isCreatedAt ? '.optional()' : '';
|
|
78
|
+
blankFieldDecoders.push(`${fieldMeta.excelColumnName}: nullOrBlankDecoder${optionalModifier}`);
|
|
78
79
|
switch (field.kind) {
|
|
79
80
|
case 'id': {
|
|
80
81
|
imports.addImport({ items: [meta.types.toBrandedIdTypeFnName], from: meta.types.importPath });
|
|
@@ -94,7 +95,7 @@ function generateFieldDecoders({ model, meta, schemaMeta, imports, }) {
|
|
|
94
95
|
nullable: !field.isRequired,
|
|
95
96
|
imports,
|
|
96
97
|
schemaMeta,
|
|
97
|
-
})}`);
|
|
98
|
+
})}${optionalModifier}`);
|
|
98
99
|
break;
|
|
99
100
|
}
|
|
100
101
|
case 'relation': {
|
|
@@ -117,7 +118,7 @@ function generateFieldDecoders({ model, meta, schemaMeta, imports, }) {
|
|
|
117
118
|
case 'enum': {
|
|
118
119
|
fieldDecoders.push(`${fieldMeta.excelColumnName}: z.enum([
|
|
119
120
|
${field.enumerator.values.map((v) => `'${v}'`).join(', ')}
|
|
120
|
-
])${field.isRequired ? '' : '.nullable()'}`);
|
|
121
|
+
])${field.isRequired ? '' : '.nullable()'}${optionalModifier}`);
|
|
121
122
|
break;
|
|
122
123
|
}
|
|
123
124
|
default: {
|
|
@@ -127,7 +128,10 @@ function generateFieldDecoders({ model, meta, schemaMeta, imports, }) {
|
|
|
127
128
|
}
|
|
128
129
|
return { fieldDecoders, blankFieldDecoders };
|
|
129
130
|
}
|
|
130
|
-
function toExcelDecoder({ tsTypeName,
|
|
131
|
+
function toExcelDecoder({ tsTypeName,
|
|
132
|
+
// We will use the DB type later when extending the number decoder
|
|
133
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
134
|
+
dbTypeName, nullable, imports, schemaMeta, }) {
|
|
131
135
|
switch (tsTypeName) {
|
|
132
136
|
case 'string': {
|
|
133
137
|
const decoder = schemaMeta.backendModules.common.functions[nullable ? 'excelStringNullableDecoder' : 'excelStringDecoder'];
|
|
@@ -143,14 +147,28 @@ function toExcelDecoder({ tsTypeName, dbTypeName: typeName, nullable, imports, s
|
|
|
143
147
|
from: schemaMeta.backendModules.common.importPath,
|
|
144
148
|
});
|
|
145
149
|
return 'excelBooleanDecoder';
|
|
146
|
-
case 'number':
|
|
147
|
-
|
|
150
|
+
case 'number': {
|
|
151
|
+
let decoder;
|
|
152
|
+
switch (dbTypeName) {
|
|
148
153
|
case 'Int':
|
|
154
|
+
decoder =
|
|
155
|
+
schemaMeta.backendModules.common.functions[nullable ? 'excelNumberNullableDecoder' : 'excelNumberDecoder'];
|
|
156
|
+
break;
|
|
149
157
|
case 'BigInt':
|
|
150
|
-
|
|
158
|
+
decoder =
|
|
159
|
+
schemaMeta.backendModules.common.functions[nullable ? 'excelNumberNullableDecoder' : 'excelNumberDecoder'];
|
|
160
|
+
break;
|
|
151
161
|
default:
|
|
152
|
-
|
|
162
|
+
decoder =
|
|
163
|
+
schemaMeta.backendModules.common.functions[nullable ? 'excelNumberNullableDecoder' : 'excelNumberDecoder'];
|
|
164
|
+
break;
|
|
153
165
|
}
|
|
166
|
+
imports.addImport({
|
|
167
|
+
items: [decoder],
|
|
168
|
+
from: schemaMeta.backendModules.common.importPath,
|
|
169
|
+
});
|
|
170
|
+
return decoder;
|
|
171
|
+
}
|
|
154
172
|
case 'Date': {
|
|
155
173
|
const decoder = schemaMeta.backendModules.common.functions[nullable ? 'excelDateNullableDecoder' : 'excelDateDecoder'];
|
|
156
174
|
imports.addImport({
|
package/dist/lib/attributes.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GeneratorName } from './skip-generator';
|
|
1
2
|
export type AttributeValue = unknown;
|
|
2
3
|
export type Attributes = Record<string, AttributeValue>;
|
|
3
4
|
export type ModelAttributes = {
|
|
@@ -36,6 +37,11 @@ export type ModelAttributes = {
|
|
|
36
37
|
* The user that is used for system actions.
|
|
37
38
|
*/
|
|
38
39
|
systemUser?: object;
|
|
40
|
+
/**
|
|
41
|
+
* Set of generators that should be skipped for this model.
|
|
42
|
+
* Schema tag: ´@@Skip("seed", "react")`
|
|
43
|
+
*/
|
|
44
|
+
skipGenerators: Set<GeneratorName>;
|
|
39
45
|
};
|
|
40
46
|
export type FieldAttributes = {
|
|
41
47
|
/**
|
package/dist/lib/meta.d.ts
CHANGED
|
@@ -24,6 +24,12 @@ export type SchemaMetaData = {
|
|
|
24
24
|
nullOrBlankDecoder: Types.FunctionName;
|
|
25
25
|
excelStringNullableDecoder: Types.FunctionName;
|
|
26
26
|
excelStringDecoder: Types.FunctionName;
|
|
27
|
+
excelNumberNullableDecoder: Types.FunctionName;
|
|
28
|
+
excelNumberDecoder: Types.FunctionName;
|
|
29
|
+
excelIntDecoder: Types.FunctionName;
|
|
30
|
+
excelIntNullableDecoder: Types.FunctionName;
|
|
31
|
+
excelBigIntDecoder: Types.FunctionName;
|
|
32
|
+
excelBigIntNullableDecoder: Types.FunctionName;
|
|
27
33
|
excelDateNullableDecoder: Types.FunctionName;
|
|
28
34
|
excelDateDecoder: Types.FunctionName;
|
|
29
35
|
excelBooleanDecoder: Types.FunctionName;
|
package/dist/lib/meta.js
CHANGED
|
@@ -42,6 +42,12 @@ function getSchemaMetadata({ config }) {
|
|
|
42
42
|
nullOrBlankDecoder: Types.toFunctionName(`nullOrBlankDecoder`),
|
|
43
43
|
excelStringNullableDecoder: Types.toFunctionName(`excelStringNullableDecoder`),
|
|
44
44
|
excelStringDecoder: Types.toFunctionName(`excelStringDecoder`),
|
|
45
|
+
excelNumberNullableDecoder: Types.toFunctionName(`excelNumberNullableDecoder`),
|
|
46
|
+
excelNumberDecoder: Types.toFunctionName(`excelNumberDecoder`),
|
|
47
|
+
excelIntDecoder: Types.toFunctionName(`excelIntDecoder`),
|
|
48
|
+
excelIntNullableDecoder: Types.toFunctionName(`excelIntNullableDecoder`),
|
|
49
|
+
excelBigIntDecoder: Types.toFunctionName(`excelBigIntDecoder`),
|
|
50
|
+
excelBigIntNullableDecoder: Types.toFunctionName(`excelBigIntNullableDecoder`),
|
|
45
51
|
excelDateNullableDecoder: Types.toFunctionName(`excelDateNullableDecoder`),
|
|
46
52
|
excelDateDecoder: Types.toFunctionName(`excelDateDecoder`),
|
|
47
53
|
excelBooleanDecoder: Types.toFunctionName(`excelBooleanDecoder`),
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import { ModelCore } from './schema/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Identifiers of generators that can be skipped.
|
|
5
|
+
*/
|
|
6
|
+
export type GeneratorName = 'seed' | 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Decoder to convert a list of generator names to a Set of generator names.
|
|
9
|
+
*/
|
|
10
|
+
export declare const skipAttributeDecoder: z.ZodEffects<z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodLiteral<"seed">, z.ZodLiteral<"react">]>, "many">>, Set<"seed" | "react">, ("seed" | "react")[] | undefined>;
|
|
11
|
+
export type SkipAttribute = z.infer<typeof skipAttributeDecoder>;
|
|
12
|
+
/**
|
|
13
|
+
* Returns true if the given generator should be skipped.
|
|
14
|
+
*/
|
|
15
|
+
export declare function skipDecoder({ model, generatorName }: {
|
|
16
|
+
model: ModelCore;
|
|
17
|
+
generatorName: GeneratorName;
|
|
18
|
+
}): boolean;
|
|
@@ -0,0 +1,41 @@
|
|
|
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.skipDecoder = exports.skipAttributeDecoder = void 0;
|
|
27
|
+
const z = __importStar(require("zod"));
|
|
28
|
+
/**
|
|
29
|
+
* Decoder to convert a list of generator names to a Set of generator names.
|
|
30
|
+
*/
|
|
31
|
+
exports.skipAttributeDecoder = z
|
|
32
|
+
.array(z.union([z.literal('seed'), z.literal('react')]))
|
|
33
|
+
.optional()
|
|
34
|
+
.transform((t) => new Set(t));
|
|
35
|
+
/**
|
|
36
|
+
* Returns true if the given generator should be skipped.
|
|
37
|
+
*/
|
|
38
|
+
function skipDecoder({ model, generatorName }) {
|
|
39
|
+
return model.attributes.skipGenerators.has(generatorName);
|
|
40
|
+
}
|
|
41
|
+
exports.skipDecoder = skipDecoder;
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getFieldAttributes = exports.getEnumAttributes = exports.getModelAttributes = exports.parseArgumentToStringOrStringArray = exports.parseAttributesFromDocumentation = void 0;
|
|
7
7
|
const zod_1 = __importDefault(require("zod"));
|
|
8
|
+
const skip_generator_1 = require("../lib/skip-generator");
|
|
8
9
|
const string_1 = require("../lib/utils/string");
|
|
9
10
|
/**
|
|
10
11
|
* Parses attributes from a given string using provided prefix.
|
|
@@ -74,6 +75,7 @@ function getModelAttributes(model) {
|
|
|
74
75
|
schema: zod_1.default.string().optional(),
|
|
75
76
|
index: zod_1.default.array(zod_1.default.string()).optional(),
|
|
76
77
|
seed: zod_1.default.string().optional(),
|
|
78
|
+
skip: skip_generator_1.skipAttributeDecoder,
|
|
77
79
|
systemUser: zod_1.default
|
|
78
80
|
.string()
|
|
79
81
|
.transform((t) => JSON.parse(t))
|
|
@@ -85,6 +87,7 @@ function getModelAttributes(model) {
|
|
|
85
87
|
description: obj.description,
|
|
86
88
|
databaseSchema: obj.schema,
|
|
87
89
|
index: obj.index,
|
|
90
|
+
skipGenerators: obj.skip,
|
|
88
91
|
systemUser: obj.systemUser,
|
|
89
92
|
randomSeed: obj.seed !== undefined ? parseInt(obj.seed, 10) : undefined,
|
|
90
93
|
}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@postxl/generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.49.0",
|
|
4
4
|
"main": "./dist/generator.js",
|
|
5
5
|
"typings": "./dist/generator.d.ts",
|
|
6
6
|
"bin": {
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@faker-js/faker": "7.6.0",
|
|
18
|
-
"@prisma/generator-helper": "^5.
|
|
19
|
-
"@prisma/internals": "^5.
|
|
18
|
+
"@prisma/generator-helper": "^5.8.0",
|
|
19
|
+
"@prisma/internals": "^5.8.0",
|
|
20
20
|
"@typescript-eslint/eslint-plugin": "^6.10.0",
|
|
21
21
|
"@typescript-eslint/parser": "^6.10.0",
|
|
22
22
|
"@typescript-eslint/utils": "^6.10.0",
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
"@postxl/lock": "1.1.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@prisma/client": "^5.
|
|
33
|
+
"@prisma/client": "^5.8.0",
|
|
34
34
|
"@types/eslint": "^8.44.7",
|
|
35
35
|
"@types/jest": "^29.5.0",
|
|
36
36
|
"@types/node": "18.15.10",
|
|
37
37
|
"jest": "29.7.0",
|
|
38
|
-
"prisma": "5.
|
|
38
|
+
"prisma": "5.8.0",
|
|
39
39
|
"ts-jest": "29.0.5",
|
|
40
40
|
"ts-node": "10.9.1",
|
|
41
41
|
"ts-toolbelt": "^9.6.0",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"typescript": "5.2.2"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
|
-
"prisma": "5.
|
|
46
|
+
"prisma": "5.8.0"
|
|
47
47
|
},
|
|
48
48
|
"wallaby": {
|
|
49
49
|
"autoDetect": true
|