@postxl/generator 0.5.0 → 0.6.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.
- package/dist/{src/generator.js → generator.js} +42 -59
- package/dist/{src/generators → generators}/enums/react.generator.d.ts +1 -1
- package/dist/{src/generators → generators}/enums/react.generator.js +2 -2
- package/dist/{src/generators → generators}/models/react.generator/index.d.ts +1 -1
- package/dist/{src/generators → generators}/models/react.generator/index.js +2 -2
- package/dist/{src/lib → lib}/schema/types.d.ts +7 -7
- package/dist/{src/lib → lib}/utils/string.js +33 -0
- package/package.json +10 -8
- package/dist/jest.config.d.ts +0 -3
- package/dist/jest.config.js +0 -17
- package/dist/src/lib/vfs.d.ts +0 -137
- package/dist/src/lib/vfs.js +0 -431
- package/dist/tests/attributes.test.d.ts +0 -1
- package/dist/tests/attributes.test.js +0 -76
- package/dist/tests/file.test.d.ts +0 -1
- package/dist/tests/file.test.js +0 -26
- package/dist/tests/utils/random.d.ts +0 -3
- package/dist/tests/utils/random.js +0 -15
- package/dist/tests/vfs.test.d.ts +0 -1
- package/dist/tests/vfs.test.js +0 -74
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src/generator.d.ts → generator.d.ts} +0 -0
- /package/dist/{src/generators → generators}/enums/types.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/enums/types.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/datamockmodule.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/datamockmodule.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/datamodule.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/datamodule.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/dataservice.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/dataservice.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/emptydatabasemigration.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/emptydatabasemigration.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/repositories.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/repositories.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/seed.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/seed.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/stubs.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/stubs.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/testdataservice.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/testdataservice.generator.js +0 -0
- /package/dist/{src/generators → generators}/indices/types.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/indices/types.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/context.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/context.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/library.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/library.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/lookup.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/lookup.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/modals.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/react.generator/modals.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/repository.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/repository.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/route.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/route.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/seed.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/seed.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/stub.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/stub.generator.js +0 -0
- /package/dist/{src/generators → generators}/models/types.generator.d.ts +0 -0
- /package/dist/{src/generators → generators}/models/types.generator.js +0 -0
- /package/dist/{src/lib → lib}/attributes.d.ts +0 -0
- /package/dist/{src/lib → lib}/attributes.js +0 -0
- /package/dist/{src/lib → lib}/exports.d.ts +0 -0
- /package/dist/{src/lib → lib}/exports.js +0 -0
- /package/dist/{src/lib → lib}/imports.d.ts +0 -0
- /package/dist/{src/lib → lib}/imports.js +0 -0
- /package/dist/{src/lib → lib}/meta.d.ts +0 -0
- /package/dist/{src/lib → lib}/meta.js +0 -0
- /package/dist/{src/lib → lib}/schema/fields.d.ts +0 -0
- /package/dist/{src/lib → lib}/schema/fields.js +0 -0
- /package/dist/{src/lib → lib}/schema/schema.d.ts +0 -0
- /package/dist/{src/lib → lib}/schema/schema.js +0 -0
- /package/dist/{src/lib → lib}/schema/types.js +0 -0
- /package/dist/{src/lib → lib}/schema/zod.d.ts +0 -0
- /package/dist/{src/lib → lib}/schema/zod.js +0 -0
- /package/dist/{src/lib → lib}/serializer.d.ts +0 -0
- /package/dist/{src/lib → lib}/serializer.js +0 -0
- /package/dist/{src/lib → lib}/types.d.ts +0 -0
- /package/dist/{src/lib → lib}/types.js +0 -0
- /package/dist/{src/lib → lib}/utils/error.d.ts +0 -0
- /package/dist/{src/lib → lib}/utils/error.js +0 -0
- /package/dist/{src/lib → lib}/utils/file.d.ts +0 -0
- /package/dist/{src/lib → lib}/utils/file.js +0 -0
- /package/dist/{src/lib → lib}/utils/logger.d.ts +0 -0
- /package/dist/{src/lib → lib}/utils/logger.js +0 -0
- /package/dist/{src/lib → lib}/utils/string.d.ts +0 -0
- /package/dist/{src/lib → lib}/utils/types.d.ts +0 -0
- /package/dist/{src/lib → lib}/utils/types.js +0 -0
- /package/dist/{src/prisma → prisma}/attributes.d.ts +0 -0
- /package/dist/{src/prisma → prisma}/attributes.js +0 -0
- /package/dist/{src/prisma → prisma}/client-path.d.ts +0 -0
- /package/dist/{src/prisma → prisma}/client-path.js +0 -0
- /package/dist/{src/prisma → prisma}/parse.d.ts +0 -0
- /package/dist/{src/prisma → prisma}/parse.js +0 -0
|
@@ -32,22 +32,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
32
32
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
33
33
|
});
|
|
34
34
|
};
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
36
|
exports.generate = void 0;
|
|
40
37
|
const faker_1 = require("@faker-js/faker");
|
|
38
|
+
const lock_1 = require("@postxl/lock");
|
|
41
39
|
const generator_helper_1 = require("@prisma/generator-helper");
|
|
42
40
|
const internals_1 = require("@prisma/internals");
|
|
43
41
|
const prettier = __importStar(require("prettier"));
|
|
44
42
|
const zod_1 = require("zod");
|
|
45
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
46
43
|
const react_generator_1 = require("./generators/enums/react.generator");
|
|
47
44
|
const types_generator_1 = require("./generators/enums/types.generator");
|
|
48
45
|
const datamockmodule_generator_1 = require("./generators/indices/datamockmodule.generator");
|
|
49
46
|
const datamodule_generator_1 = require("./generators/indices/datamodule.generator");
|
|
50
47
|
const dataservice_generator_1 = require("./generators/indices/dataservice.generator");
|
|
48
|
+
const emptydatabasemigration_generator_1 = require("./generators/indices/emptydatabasemigration.generator");
|
|
51
49
|
const repositories_generator_1 = require("./generators/indices/repositories.generator");
|
|
52
50
|
const seed_generator_1 = require("./generators/indices/seed.generator");
|
|
53
51
|
const stubs_generator_1 = require("./generators/indices/stubs.generator");
|
|
@@ -61,10 +59,8 @@ const stub_generator_1 = require("./generators/models/stub.generator");
|
|
|
61
59
|
const types_generator_3 = require("./generators/models/types.generator");
|
|
62
60
|
const meta_1 = require("./lib/meta");
|
|
63
61
|
const types_1 = require("./lib/schema/types");
|
|
64
|
-
const vfs_1 = require("./lib/vfs");
|
|
65
62
|
const client_path_1 = require("./prisma/client-path");
|
|
66
63
|
const parse_1 = require("./prisma/parse");
|
|
67
|
-
const emptydatabasemigration_generator_1 = require("./generators/indices/emptydatabasemigration.generator");
|
|
68
64
|
const configDecoder = zod_1.z
|
|
69
65
|
.object({
|
|
70
66
|
project: zod_1.z.string(),
|
|
@@ -133,102 +129,89 @@ const configDecoder = zod_1.z
|
|
|
133
129
|
* Generates PXL files and flushes them to disk.
|
|
134
130
|
*/
|
|
135
131
|
const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
136
|
-
const
|
|
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
|
+
}
|
|
137
136
|
faker_1.faker.seed(config.randomSeed);
|
|
137
|
+
const vfs = yield lock_1.VirtualFS.fromLockFile(root);
|
|
138
|
+
const generated = new lock_1.VirtualFS();
|
|
138
139
|
// Generate Models
|
|
139
140
|
for (const model of models) {
|
|
140
141
|
const meta = (0, meta_1.getModelMetadata)({ model });
|
|
141
142
|
// Types
|
|
142
143
|
if (!config.disableGenerators.types) {
|
|
143
|
-
|
|
144
|
+
generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_3.generateModelTypes)({ model, meta }));
|
|
144
145
|
}
|
|
145
146
|
// Seed
|
|
146
147
|
if (!config.disableGenerators.seed) {
|
|
147
|
-
|
|
148
|
+
generated.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_2.generateSeedModel)({ model, itemCount: 5, meta }));
|
|
148
149
|
}
|
|
149
150
|
// Generate Repositories
|
|
150
151
|
if (!config.disableGenerators.data) {
|
|
151
|
-
|
|
152
|
-
|
|
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 }));
|
|
153
154
|
}
|
|
154
155
|
// Routes
|
|
155
156
|
if (!config.disableGenerators.trpc) {
|
|
156
|
-
|
|
157
|
+
generated.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
|
|
157
158
|
}
|
|
158
159
|
// React
|
|
159
160
|
if (!config.disableGenerators.react) {
|
|
160
|
-
|
|
161
|
+
generated.copy((0, react_generator_2.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
|
|
161
162
|
}
|
|
162
|
-
logger.log(
|
|
163
|
+
logger.log(`- ${model.name} processed`);
|
|
163
164
|
}
|
|
164
165
|
// Generate Enums
|
|
165
166
|
for (const enumerator of enums.values()) {
|
|
166
167
|
const meta = (0, meta_1.getEnumMetadata)({ enumerator });
|
|
167
168
|
if (!config.disableGenerators.types) {
|
|
168
|
-
|
|
169
|
+
generated.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateEnumType)({ enumerator, prismaClientPath, meta }));
|
|
169
170
|
}
|
|
170
171
|
if (!config.disableGenerators.react) {
|
|
171
|
-
|
|
172
|
+
generated.copy((0, react_generator_1.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
|
|
172
173
|
}
|
|
173
174
|
}
|
|
174
175
|
// Generate Index Files and Services
|
|
175
176
|
const meta = (0, meta_1.getSchemaMetadata)({ config });
|
|
176
177
|
if (!config.disableGenerators.data) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
178
|
+
generated.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamockmodule_generator_1.generateDataMockModule)({ models, meta }));
|
|
179
|
+
generated.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
|
|
180
|
+
generated.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
|
|
181
|
+
generated.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ meta }));
|
|
182
|
+
generated.write(`/${meta.data.repositoriesConstFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesArray)({ models, meta }));
|
|
183
|
+
generated.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
|
|
184
|
+
generated.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
|
|
185
|
+
generated.write(`/${meta.migrationsPath}/emptyDatabase.template.sql`, (0, emptydatabasemigration_generator_1.generateEmptyDatabaseStoredProcedure)({ models, meta }));
|
|
185
186
|
}
|
|
186
187
|
if (!config.disableGenerators.seed) {
|
|
187
|
-
|
|
188
|
+
generated.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_1.generateSeedIndex)({ models, meta }));
|
|
188
189
|
}
|
|
189
190
|
if (!config.disableGenerators.trpc) {
|
|
190
|
-
|
|
191
|
+
generated.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
|
|
191
192
|
}
|
|
192
193
|
if (!config.disableGenerators.types) {
|
|
193
|
-
|
|
194
|
+
generated.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_2.generateTypesIndex)({ models, enums, meta }));
|
|
194
195
|
}
|
|
195
196
|
// -------------------------------------------------------------------------
|
|
196
197
|
// Add disclaimer and format.
|
|
197
198
|
const prettierConfig = yield prettier.resolveConfig(process.cwd());
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
if (unchanged.length > 0) {
|
|
208
|
-
logger.info(`PXL ${chalk_1.default.dim(`skipped ${unchanged.length} files`)} because no change occurded since last generation.`);
|
|
209
|
-
}
|
|
210
|
-
if (changes.length === 0) {
|
|
211
|
-
logger.info(`PXL generated no files.`);
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
logger.info(`PXL ${chalk_1.default.green(`generated the following ${changes.length}`)} files:`);
|
|
215
|
-
for (const file of changes) {
|
|
216
|
-
logger.info(`+ [generated] ${file.path}`);
|
|
217
|
-
}
|
|
218
|
-
logger.info(`PXL finished! 🚀`);
|
|
199
|
+
generated.transformUTF8Files((path, content) => `${DISCLAIMER}\n${content}`);
|
|
200
|
+
generated.format(prettierConfig);
|
|
201
|
+
// -------------------------------------------------------------------------
|
|
202
|
+
// Merge with existing files.
|
|
203
|
+
vfs.copy(generated, './');
|
|
204
|
+
// Flush to disk.
|
|
205
|
+
const changes = yield vfs.flush(process.cwd(), { force: config.force });
|
|
206
|
+
const log = lock_1.ConsoleUtils.getFilesChangelog(changes);
|
|
207
|
+
console.info(log);
|
|
219
208
|
});
|
|
220
209
|
exports.generate = generate;
|
|
221
|
-
const DISCLAIMER =
|
|
222
|
-
|
|
210
|
+
const DISCLAIMER = `
|
|
211
|
+
/**
|
|
212
|
+
* This file was generated by PostXL generator.
|
|
223
213
|
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
* To modify this file, edit the Prisma schema file and run
|
|
227
|
-
* \`prisma generate\` or \`pnpm prisma generate\`
|
|
228
|
-
* again!
|
|
229
|
-
*
|
|
230
|
-
* If you need to modify the structure of this file, please edit the generator
|
|
231
|
-
* at \`packages/generator/\`
|
|
232
|
-
*
|
|
214
|
+
* Feel free to manually edit it. The generator will not overwrite it. We suggest you
|
|
215
|
+
* remove the disclaimer to avoid confusion.
|
|
233
216
|
**/
|
|
234
217
|
`;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateEnumReactComponents = void 0;
|
|
4
|
+
const lock_1 = require("@postxl/lock");
|
|
4
5
|
const imports_1 = require("../../lib/imports");
|
|
5
|
-
const vfs_1 = require("../../lib/vfs");
|
|
6
6
|
/**
|
|
7
7
|
* Generates React components for a given enumerator.
|
|
8
8
|
*/
|
|
9
9
|
function generateEnumReactComponents({ enumerator, meta }) {
|
|
10
|
-
const vfs = new
|
|
10
|
+
const vfs = new lock_1.VirtualFS({
|
|
11
11
|
'index.ts': `
|
|
12
12
|
export * from './Select'
|
|
13
13
|
`,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateReactComponentsForModel = void 0;
|
|
4
|
+
const lock_1 = require("@postxl/lock");
|
|
4
5
|
const exports_1 = require("../../../lib/exports");
|
|
5
|
-
const vfs_1 = require("../../../lib/vfs");
|
|
6
6
|
const context_generator_1 = require("./context.generator");
|
|
7
7
|
const library_generator_1 = require("./library.generator");
|
|
8
8
|
const lookup_generator_1 = require("./lookup.generator");
|
|
@@ -11,7 +11,7 @@ const modals_generator_1 = require("./modals.generator");
|
|
|
11
11
|
* Generates generic React components for a given model.
|
|
12
12
|
*/
|
|
13
13
|
function generateReactComponentsForModel({ model, meta }) {
|
|
14
|
-
const vfs = new
|
|
14
|
+
const vfs = new lock_1.VirtualFS({});
|
|
15
15
|
const exports = exports_1.ExportsGenerator.fromRoot()
|
|
16
16
|
.exportEverythingFromFile('./CreateModal')
|
|
17
17
|
.exportEverythingFromFile('./EditModal')
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Name of a Typescript type, e.g. "Aggregation".
|
|
3
3
|
*/
|
|
4
4
|
export type TypeName = string & {
|
|
5
|
-
readonly
|
|
5
|
+
readonly ___type: 'TypeName';
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
8
|
* Brands a raw string to a TypeScript Type identifier.
|
|
@@ -12,7 +12,7 @@ export declare const toTypeName: (t: string) => TypeName;
|
|
|
12
12
|
* The name of a function (e.g. "toAggregation").
|
|
13
13
|
*/
|
|
14
14
|
export type Function = string & {
|
|
15
|
-
readonly
|
|
15
|
+
readonly ___type: 'FunctionName';
|
|
16
16
|
};
|
|
17
17
|
/**
|
|
18
18
|
* Converts a string to a branded function name.
|
|
@@ -22,7 +22,7 @@ export declare const toFunction: (t: string) => Function;
|
|
|
22
22
|
* The name of a class, e.g. "AggregationRepository".
|
|
23
23
|
*/
|
|
24
24
|
export type ClassName = string & {
|
|
25
|
-
readonly
|
|
25
|
+
readonly ___type: 'ClassName';
|
|
26
26
|
};
|
|
27
27
|
/**
|
|
28
28
|
* Converts a raw string to a branded ClassName.
|
|
@@ -32,7 +32,7 @@ export declare const toClassName: (t: string) => ClassName;
|
|
|
32
32
|
* The name of a variable or a property in the generated code.
|
|
33
33
|
*/
|
|
34
34
|
export type VariableName = string & {
|
|
35
|
-
readonly
|
|
35
|
+
readonly ___type: 'VariableName';
|
|
36
36
|
};
|
|
37
37
|
/**
|
|
38
38
|
* Converts a string to a branded VariableName.
|
|
@@ -42,7 +42,7 @@ export declare const toVariableName: (t: string) => VariableName;
|
|
|
42
42
|
* A name of the file without a file extension, e.g. "aggregation.type".
|
|
43
43
|
*/
|
|
44
44
|
export type FileName = string & {
|
|
45
|
-
readonly
|
|
45
|
+
readonly ___type: 'FileName';
|
|
46
46
|
};
|
|
47
47
|
/**
|
|
48
48
|
* Lets you brand a string value as a name of the file.
|
|
@@ -54,7 +54,7 @@ export declare const toFileName: (t: string) => FileName;
|
|
|
54
54
|
* A name of the folder without the trailing and leading slash (e.g. "aggregation").
|
|
55
55
|
*/
|
|
56
56
|
export type FolderName = string & {
|
|
57
|
-
readonly
|
|
57
|
+
readonly ___type: 'FolderName';
|
|
58
58
|
};
|
|
59
59
|
/**
|
|
60
60
|
* Converts a string to a branded FolderName.
|
|
@@ -64,7 +64,7 @@ export declare const toFolderName: (t: string) => FolderName;
|
|
|
64
64
|
* A relative or absolute path to a file or folder.
|
|
65
65
|
*/
|
|
66
66
|
export type Path = string & {
|
|
67
|
-
readonly
|
|
67
|
+
readonly ___type: 'FileName';
|
|
68
68
|
};
|
|
69
69
|
/**
|
|
70
70
|
* Converts a string to a branded FileName.
|
|
@@ -33,6 +33,32 @@ const toPascalCase = (str) => {
|
|
|
33
33
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
34
34
|
};
|
|
35
35
|
exports.toPascalCase = toPascalCase;
|
|
36
|
+
const irregularPlurals = {
|
|
37
|
+
alumnus: 'alumni',
|
|
38
|
+
analysis: 'analyses',
|
|
39
|
+
appendix: 'appendices',
|
|
40
|
+
axis: 'axes',
|
|
41
|
+
basis: 'bases',
|
|
42
|
+
child: 'children',
|
|
43
|
+
crisis: 'crises',
|
|
44
|
+
criterion: 'criteria',
|
|
45
|
+
data: 'data',
|
|
46
|
+
datum: 'data',
|
|
47
|
+
diagnosis: 'diagnoses',
|
|
48
|
+
focus: 'foci',
|
|
49
|
+
hypothesis: 'hypotheses',
|
|
50
|
+
index: 'indices',
|
|
51
|
+
matrix: 'matrices',
|
|
52
|
+
medium: 'media',
|
|
53
|
+
parenthesis: 'parentheses',
|
|
54
|
+
phenomenon: 'phenomena',
|
|
55
|
+
prognosis: 'prognoses',
|
|
56
|
+
radius: 'radii',
|
|
57
|
+
suffix: 'suffixes',
|
|
58
|
+
syllabus: 'syllabi',
|
|
59
|
+
synopsis: 'synopses',
|
|
60
|
+
thesis: 'theses',
|
|
61
|
+
};
|
|
36
62
|
/**
|
|
37
63
|
* Returns a pluralized version of the given string based on the count.
|
|
38
64
|
*/
|
|
@@ -50,6 +76,13 @@ const pluralize = (s, count = 2) => {
|
|
|
50
76
|
if (s.endsWith('s')) {
|
|
51
77
|
return s;
|
|
52
78
|
}
|
|
79
|
+
//check if word ends with any irregular plurals
|
|
80
|
+
const lower = s.toLowerCase();
|
|
81
|
+
for (const [irregularPlural, irregularSingular] of Object.entries(irregularPlurals)) {
|
|
82
|
+
if (lower.endsWith(irregularPlural)) {
|
|
83
|
+
return s.slice(0, -irregularPlural.length + 1) + irregularSingular.slice(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
53
86
|
return s + 's';
|
|
54
87
|
};
|
|
55
88
|
exports.pluralize = pluralize;
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@postxl/generator",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"main": "./dist/
|
|
5
|
-
"typings": "./dist/
|
|
3
|
+
"version": "0.6.1",
|
|
4
|
+
"main": "./dist/generator.js",
|
|
5
|
+
"typings": "./dist/generator.d.ts",
|
|
6
6
|
"bin": {
|
|
7
|
-
"@postxl/generator": "./dist/
|
|
7
|
+
"@postxl/generator": "./dist/generator.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist"
|
|
@@ -17,11 +17,11 @@
|
|
|
17
17
|
"@faker-js/faker": "7.6.0",
|
|
18
18
|
"@prisma/generator-helper": "4.12.0",
|
|
19
19
|
"@prisma/internals": "^4.12.0",
|
|
20
|
-
"chalk": "^4.1.2",
|
|
21
20
|
"fast-glob": "^3.2.12",
|
|
22
21
|
"prettier": "^2.8.7",
|
|
23
22
|
"remeda": "1.9.4",
|
|
24
|
-
"zod": "3.21.4"
|
|
23
|
+
"zod": "3.21.4",
|
|
24
|
+
"@postxl/lock": "0.1.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@prisma/client": "4.12.0",
|
|
@@ -46,8 +46,10 @@
|
|
|
46
46
|
"prepublish": "tsc -b",
|
|
47
47
|
"dev": "tsc -b -w",
|
|
48
48
|
"test": "jest",
|
|
49
|
+
"test:watch": "jest --watch",
|
|
49
50
|
"test:types": "tsc --noEmit",
|
|
50
|
-
"testgen:
|
|
51
|
-
"testgen:
|
|
51
|
+
"testgen:simple": "cd ./tests/schemas/simple/ && prisma generate",
|
|
52
|
+
"testgen:mca": "cd ./tests/schemas/mca/ && prisma generate",
|
|
53
|
+
"testgen:la": "cd ./tests/schemas/la/ && prisma generate"
|
|
52
54
|
}
|
|
53
55
|
}
|
package/dist/jest.config.d.ts
DELETED
package/dist/jest.config.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
// import { pathsToModuleNameMapper } from 'ts-jest'
|
|
4
|
-
// import { compilerOptions } from './tsconfig.json'
|
|
5
|
-
const config = {
|
|
6
|
-
verbose: true,
|
|
7
|
-
// roots: ['<rootDir>/tests', '<rootDir>/src'],
|
|
8
|
-
testEnvironment: 'node',
|
|
9
|
-
transform: {
|
|
10
|
-
'^.+\\.tsx?$': 'ts-jest',
|
|
11
|
-
},
|
|
12
|
-
testRegex: '(\\.|/)test\\.tsx?$',
|
|
13
|
-
testPathIgnorePatterns: ['/node_modules/', '/__fixtures__/'],
|
|
14
|
-
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
|
|
15
|
-
// moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/src/' }),
|
|
16
|
-
};
|
|
17
|
-
exports.default = config;
|
package/dist/src/lib/vfs.d.ts
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import * as prettier from 'prettier';
|
|
2
|
-
type FileWriteError = 'EIP' | 'EISDIR';
|
|
3
|
-
type FileReadError = 'ENF' | 'EISDIR';
|
|
4
|
-
type FileStatus = 'UNCHANGED' | 'WRITTEN' | 'SKIPPED';
|
|
5
|
-
/**
|
|
6
|
-
* A utility class that helps you manage a collection of files.
|
|
7
|
-
*/
|
|
8
|
-
export declare class VirtualFS {
|
|
9
|
-
/**
|
|
10
|
-
* Human readable messages for file write errors.
|
|
11
|
-
*/
|
|
12
|
-
static WRITE_ERROR_MESSAGES: {
|
|
13
|
-
[Key in FileWriteError]: string;
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Human readable messages for file read errors.
|
|
17
|
-
*/
|
|
18
|
-
static READ_ERROR_MESSAGES: {
|
|
19
|
-
[Key in FileReadError]: string;
|
|
20
|
-
};
|
|
21
|
-
private _files;
|
|
22
|
-
constructor(files?: {
|
|
23
|
-
[key: string]: string;
|
|
24
|
-
});
|
|
25
|
-
/**
|
|
26
|
-
* Returns the chunks of the resolved path.
|
|
27
|
-
*/
|
|
28
|
-
private _parse;
|
|
29
|
-
/**
|
|
30
|
-
* Writes the given contents to the given path. Path should be a relative path from the root
|
|
31
|
-
* of the virtual file system with no special characters.
|
|
32
|
-
*/
|
|
33
|
-
write(path: string, content: string): {
|
|
34
|
-
ok: true;
|
|
35
|
-
} | {
|
|
36
|
-
ok: false;
|
|
37
|
-
path: string;
|
|
38
|
-
err: FileWriteError;
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Appends given content to the file at a given path if it exists.
|
|
42
|
-
*/
|
|
43
|
-
append(path: string, content: string): {
|
|
44
|
-
ok: true;
|
|
45
|
-
} | {
|
|
46
|
-
ok: false;
|
|
47
|
-
path: string;
|
|
48
|
-
err: FileWriteError | FileReadError;
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Copies given files to the given path.
|
|
52
|
-
*/
|
|
53
|
-
copy(files: VirtualFS, path: string): void;
|
|
54
|
-
/**
|
|
55
|
-
* Lists all files and folders in the given path.
|
|
56
|
-
*/
|
|
57
|
-
list(path: string): {
|
|
58
|
-
kind: 'FILE' | 'FOLDER';
|
|
59
|
-
name: string;
|
|
60
|
-
}[];
|
|
61
|
-
/**
|
|
62
|
-
* Returns a dictionary of all files in the virtual file system indexed by their paths.
|
|
63
|
-
*/
|
|
64
|
-
files(): {
|
|
65
|
-
[path: string]: string;
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* Lets you read the contents of a file in the given path.
|
|
69
|
-
*/
|
|
70
|
-
read(path: string): {
|
|
71
|
-
ok: true;
|
|
72
|
-
content: string;
|
|
73
|
-
} | {
|
|
74
|
-
ok: false;
|
|
75
|
-
path: string;
|
|
76
|
-
err: FileReadError;
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* Writes files to the given path, overriding managed files and ignoring
|
|
80
|
-
* detached files (i.e. files that don't have a checksum value).
|
|
81
|
-
*
|
|
82
|
-
* Returns a list of paths that were written.
|
|
83
|
-
*/
|
|
84
|
-
flush(relativeOutPath: string, force?: boolean): Promise<{
|
|
85
|
-
status: FileStatus;
|
|
86
|
-
path: string;
|
|
87
|
-
}[]>;
|
|
88
|
-
/**
|
|
89
|
-
* Writes the contents of the file to a given path. If there's already a file there,
|
|
90
|
-
* it checks the checksum and overrides it if the content hasn't changed.
|
|
91
|
-
*
|
|
92
|
-
* Returns `true` if the file was written, `false` if it wasn't.
|
|
93
|
-
*/
|
|
94
|
-
private _safeWriteUTF8File;
|
|
95
|
-
/**
|
|
96
|
-
* Tries to read a file at a given path and surpresses the error if it fails to do so.
|
|
97
|
-
*/
|
|
98
|
-
private _safeReadUTF8File;
|
|
99
|
-
private static CHECKSUM_PREFIX;
|
|
100
|
-
private static META_PREFIX;
|
|
101
|
-
/**
|
|
102
|
-
* Returns the checksum of the given content, ignoring
|
|
103
|
-
* the line containing the checksum if present.
|
|
104
|
-
*/
|
|
105
|
-
private _calculateContentChecksum;
|
|
106
|
-
/**
|
|
107
|
-
* Adds the checksum indicator to the given content.
|
|
108
|
-
*/
|
|
109
|
-
private _appendChecksumToContent;
|
|
110
|
-
/**
|
|
111
|
-
* Adds arbitrary meta information to the given content.
|
|
112
|
-
*
|
|
113
|
-
* NOTE: This only changes when the content changes regardless of the change of the meta value.
|
|
114
|
-
*/
|
|
115
|
-
private _appendMetaToContent;
|
|
116
|
-
/**
|
|
117
|
-
* Extracts the checksum from the given content.
|
|
118
|
-
*/
|
|
119
|
-
private _extractChecksumFromContent;
|
|
120
|
-
/**
|
|
121
|
-
* Creates a new file system from the given directory.
|
|
122
|
-
*/
|
|
123
|
-
static fromDirectory(cwd: string): Promise<VirtualFS>;
|
|
124
|
-
/**
|
|
125
|
-
* Walks the file tree, calling the given function for each file.
|
|
126
|
-
*/
|
|
127
|
-
walk(fn: (path: string, content: string) => void): void;
|
|
128
|
-
/**
|
|
129
|
-
* Transforms files in the file system.
|
|
130
|
-
*/
|
|
131
|
-
transform(fn: (path: string, content: string) => string): void;
|
|
132
|
-
/**
|
|
133
|
-
* Formats the file system using configuration in the given directory.
|
|
134
|
-
*/
|
|
135
|
-
format(options?: prettier.Options | null): void;
|
|
136
|
-
}
|
|
137
|
-
export {};
|