@postxl/generator 0.0.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/README.md +3 -0
- package/dist/jest.config.d.ts +3 -0
- package/dist/src/generator.d.ts +12 -0
- package/dist/src/generator.js +164 -0
- package/dist/src/generators/enums/react.generator.d.ts +10 -0
- package/dist/src/generators/enums/react.generator.js +81 -0
- package/dist/src/generators/enums/types.generator.d.ts +10 -0
- package/dist/src/generators/enums/types.generator.js +18 -0
- package/dist/src/generators/indices/datamockmodule.generator.d.ts +9 -0
- package/dist/src/generators/indices/datamockmodule.generator.js +104 -0
- package/dist/src/generators/indices/datamodule.generator.d.ts +9 -0
- package/dist/src/generators/indices/datamodule.generator.js +128 -0
- package/dist/src/generators/indices/dataservice.generator.d.ts +9 -0
- package/dist/src/generators/indices/dataservice.generator.js +47 -0
- package/dist/src/generators/indices/repositories.generator.d.ts +9 -0
- package/dist/src/generators/indices/repositories.generator.js +17 -0
- package/dist/src/generators/indices/seed.generator.d.ts +9 -0
- package/dist/src/generators/indices/seed.generator.js +17 -0
- package/dist/src/generators/indices/stubs.generator.d.ts +9 -0
- package/dist/src/generators/indices/stubs.generator.js +17 -0
- package/dist/src/generators/indices/testdataservice.generator.d.ts +7 -0
- package/dist/src/generators/indices/testdataservice.generator.js +61 -0
- package/dist/src/generators/indices/types.generator.d.ts +10 -0
- package/dist/src/generators/indices/types.generator.js +21 -0
- package/dist/src/generators/models/react.generator/context.generator.d.ts +9 -0
- package/dist/src/generators/models/react.generator/context.generator.js +66 -0
- package/dist/src/generators/models/react.generator/index.d.ts +10 -0
- package/dist/src/generators/models/react.generator/index.js +32 -0
- package/dist/src/generators/models/react.generator/library.generator.d.ts +9 -0
- package/dist/src/generators/models/react.generator/library.generator.js +113 -0
- package/dist/src/generators/models/react.generator/lookup.generator.d.ts +9 -0
- package/dist/src/generators/models/react.generator/lookup.generator.js +97 -0
- package/dist/src/generators/models/react.generator/modals.generator.d.ts +23 -0
- package/dist/src/generators/models/react.generator/modals.generator.js +521 -0
- package/dist/src/generators/models/repository.generator.d.ts +9 -0
- package/dist/src/generators/models/repository.generator.js +282 -0
- package/dist/src/generators/models/route.generator.d.ts +16 -0
- package/dist/src/generators/models/route.generator.js +112 -0
- package/dist/src/generators/models/seed.generator.d.ts +20 -0
- package/dist/src/generators/models/seed.generator.js +185 -0
- package/dist/src/generators/models/stub.generator.d.ts +9 -0
- package/dist/src/generators/models/stub.generator.js +74 -0
- package/dist/src/generators/models/types.generator.d.ts +9 -0
- package/dist/src/generators/models/types.generator.js +116 -0
- package/dist/src/lib/attributes.d.ts +43 -0
- package/dist/src/lib/attributes.js +2 -0
- package/dist/src/lib/exports.d.ts +26 -0
- package/dist/src/lib/exports.js +38 -0
- package/dist/src/lib/imports.d.ts +35 -0
- package/dist/src/lib/imports.js +55 -0
- package/dist/src/lib/meta.d.ts +359 -0
- package/dist/src/lib/meta.js +195 -0
- package/dist/src/lib/schema/fields.d.ts +35 -0
- package/dist/src/lib/schema/fields.js +49 -0
- package/dist/src/lib/schema/schema.d.ts +275 -0
- package/dist/src/lib/schema/schema.js +2 -0
- package/dist/src/lib/schema/types.d.ts +72 -0
- package/dist/src/lib/schema/types.js +41 -0
- package/dist/src/lib/schema/zod.d.ts +8 -0
- package/dist/src/lib/schema/zod.js +44 -0
- package/dist/src/lib/serializer.d.ts +15 -0
- package/dist/src/lib/serializer.js +24 -0
- package/dist/src/lib/utils/error.d.ts +5 -0
- package/dist/src/lib/utils/error.js +13 -0
- package/dist/src/lib/utils/file.d.ts +10 -0
- package/dist/src/lib/utils/file.js +54 -0
- package/dist/src/lib/utils/logger.d.ts +11 -0
- package/dist/src/lib/utils/logger.js +2 -0
- package/dist/src/lib/utils/string.d.ts +29 -0
- package/dist/src/lib/utils/string.js +75 -0
- package/dist/src/lib/utils/types.d.ts +12 -0
- package/dist/src/lib/utils/types.js +2 -0
- package/dist/src/lib/vfs.d.ts +137 -0
- package/dist/src/lib/vfs.js +419 -0
- package/dist/src/prisma/attributes.d.ts +17 -0
- package/dist/src/prisma/attributes.js +80 -0
- package/dist/src/prisma/client-path.d.ts +7 -0
- package/dist/src/prisma/client-path.js +29 -0
- package/dist/src/prisma/parse.d.ts +12 -0
- package/dist/src/prisma/parse.js +276 -0
- package/dist/tests/attributes.test.d.ts +1 -0
- package/dist/tests/attributes.test.js +76 -0
- package/dist/tests/file.test.d.ts +1 -0
- package/dist/tests/file.test.js +26 -0
- package/dist/tests/utils/random.d.ts +3 -0
- package/dist/tests/utils/random.js +15 -0
- package/dist/tests/vfs.test.d.ts +1 -0
- package/dist/tests/vfs.test.js +74 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/jest.config.ts +18 -0
- package/package.json +42 -0
- package/tests/attributes.test.ts +91 -0
- package/tests/file.test.ts +32 -0
- package/tests/utils/random.ts +11 -0
- package/tests/vfs.test.ts +92 -0
package/README.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Logger } from './lib/utils/logger';
|
|
2
|
+
import * as Schema from './lib/schema/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Generates PXL files and flushes them to disk.
|
|
5
|
+
*/
|
|
6
|
+
export declare const generate: ({ models, enums, config, prismaClientPath, logger, }: {
|
|
7
|
+
models: Schema.Model[];
|
|
8
|
+
enums: Schema.Enum[];
|
|
9
|
+
config: Schema.SchemaConfig;
|
|
10
|
+
prismaClientPath: string;
|
|
11
|
+
logger: Logger;
|
|
12
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,164 @@
|
|
|
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
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.generate = void 0;
|
|
36
|
+
const generator_helper_1 = require("@prisma/generator-helper");
|
|
37
|
+
const internals_1 = require("@prisma/internals");
|
|
38
|
+
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");
|
|
51
|
+
const datamockmodule_generator_1 = require("./generators/indices/datamockmodule.generator");
|
|
52
|
+
const dataservice_generator_1 = require("./generators/indices/dataservice.generator");
|
|
53
|
+
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");
|
|
56
|
+
const repositories_generator_1 = require("./generators/indices/repositories.generator");
|
|
57
|
+
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
|
+
const testdataservice_generator_1 = require("./generators/indices/testdataservice.generator");
|
|
61
|
+
(0, generator_helper_1.generatorHandler)({
|
|
62
|
+
onManifest() {
|
|
63
|
+
internals_1.logger.info(`PXL Registered`);
|
|
64
|
+
return {
|
|
65
|
+
version: '1.0.0',
|
|
66
|
+
defaultOutput: '../generated',
|
|
67
|
+
prettyName: `PXL`,
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
onGenerate: ({ generator, otherGenerators, dmmf }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
71
|
+
internals_1.logger.info(`PXL started generating code...`);
|
|
72
|
+
const prismaClientPath = (0, client_path_1.getClientImportPath)(otherGenerators);
|
|
73
|
+
const config = {
|
|
74
|
+
project: generator.config['project'] || 'pxl',
|
|
75
|
+
paths: {
|
|
76
|
+
dataLibPath: (0, types_1.toPath)(generator.config['pathToDataLib'] || 'repos'),
|
|
77
|
+
reactFolderPath: (0, types_1.toPath)(generator.config['reactFolderOutput'] || 'react'),
|
|
78
|
+
modelTypeDefinitionsPath: (0, types_1.toPath)(generator.config['pathToTypes'] || 'types'),
|
|
79
|
+
seedPath: (0, types_1.toPath)(generator.config['pathToSeedLib'] || 'seed'),
|
|
80
|
+
trpcRoutesFolderPath: (0, types_1.toPath)(generator.config['trpcRoutesFolder'] || 'trpc'),
|
|
81
|
+
},
|
|
82
|
+
randomSeed: parseInt(generator.config['randomSeed']) || 1,
|
|
83
|
+
force: generator.config['force'] === 'true',
|
|
84
|
+
};
|
|
85
|
+
internals_1.logger.log(`Parsing DMMF...`);
|
|
86
|
+
const { models, enums } = (0, parse_1.parsePrismaSchema)({ datamodel: dmmf.datamodel, config });
|
|
87
|
+
internals_1.logger.log(`Generating...`);
|
|
88
|
+
yield (0, exports.generate)({ models, enums, config, prismaClientPath, logger: internals_1.logger });
|
|
89
|
+
internals_1.logger.info(`PXL finished!`);
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* Generates PXL files and flushes them to disk.
|
|
94
|
+
*/
|
|
95
|
+
const generate = ({ models, enums, config, prismaClientPath, logger, }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
96
|
+
const vfs = new vfs_1.VirtualFS();
|
|
97
|
+
faker_1.faker.seed(config.randomSeed);
|
|
98
|
+
// Generate Models
|
|
99
|
+
for (const model of models) {
|
|
100
|
+
const meta = (0, meta_1.getModelMetadata)({ model });
|
|
101
|
+
// Types
|
|
102
|
+
vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_1.generateModelTypes)({ model, meta }));
|
|
103
|
+
// Seed
|
|
104
|
+
vfs.write(`/${meta.seed.filePath}.ts`, (0, seed_generator_1.generateSeedModel)({ model, itemCount: 5, meta }));
|
|
105
|
+
// Generate Repositories
|
|
106
|
+
vfs.write(`/${meta.data.stubFilePath}.ts`, (0, stub_generator_1.generateStub)({ model, meta }));
|
|
107
|
+
vfs.write(`/${meta.data.repoFilePath}.ts`, (0, repository_generator_1.generateRepository)({ model, meta }));
|
|
108
|
+
// Routes
|
|
109
|
+
vfs.write(`/${meta.trpc.routerFilePath}.ts`, (0, route_generator_1.generateRoute)({ model, meta }));
|
|
110
|
+
// React
|
|
111
|
+
vfs.copy((0, react_generator_1.generateReactComponentsForModel)({ model, meta }), meta.react.folderPath);
|
|
112
|
+
logger.log(`✅ ${model.name} generated!`);
|
|
113
|
+
}
|
|
114
|
+
// Generate Enums
|
|
115
|
+
for (const enumerator of enums.values()) {
|
|
116
|
+
const meta = (0, meta_1.getEnumMetadata)({ enumerator });
|
|
117
|
+
vfs.write(`/${meta.types.filePath}.ts`, (0, types_generator_2.generateEnumType)({ enumerator, prismaClientPath, meta }));
|
|
118
|
+
vfs.copy((0, react_generator_2.generateEnumReactComponents)({ enumerator, meta }), meta.react.folderPath);
|
|
119
|
+
}
|
|
120
|
+
// Generate Index Files and Services
|
|
121
|
+
const meta = (0, meta_1.getSchemaMetadata)({ config });
|
|
122
|
+
vfs.write(`/${meta.data.dataMockModuleFilePath}.ts`, (0, datamockmodule_generator_1.generateDataMockModule)({ models, meta }));
|
|
123
|
+
vfs.write(`/${meta.data.dataModuleFilePath}.ts`, (0, datamodule_generator_1.generateDataModule)({ models, meta }));
|
|
124
|
+
vfs.write(`/${meta.data.dataServiceFilePath}.ts`, (0, dataservice_generator_1.generateDataService)({ models, meta }));
|
|
125
|
+
vfs.write(`/${meta.data.testDataServiceFilePath}.ts`, (0, testdataservice_generator_1.generateTestDataService)({ meta }));
|
|
126
|
+
vfs.write(`/${meta.data.repositoriesIndexFilePath}.ts`, (0, repositories_generator_1.generateRepositoriesIndex)({ models, meta }));
|
|
127
|
+
vfs.write(`/${meta.data.stubIndexFilePath}.ts`, (0, stubs_generator_1.generateStubsIndex)({ models, meta }));
|
|
128
|
+
vfs.write(`/${meta.seed.indexFilePath}.ts`, (0, seed_generator_2.generateSeedIndex)({ models, meta }));
|
|
129
|
+
vfs.write(`/${meta.trpc.routesFilePath}.ts`, (0, route_generator_1.generateRoutesIndex)({ models, meta }));
|
|
130
|
+
vfs.write(`/${meta.types.indexFilePath}.ts`, (0, types_generator_3.generateTypesIndex)({ models, enums, meta }));
|
|
131
|
+
// -------------------------------------------------------------------------
|
|
132
|
+
// Add disclaimer and format.
|
|
133
|
+
const prettierConfig = yield prettier.resolveConfig(process.cwd());
|
|
134
|
+
vfs.transform((path, content) => `${DISCLAIMER}\n${content}`);
|
|
135
|
+
vfs.format(prettierConfig);
|
|
136
|
+
const entries = yield vfs.flush(process.cwd(), config.force);
|
|
137
|
+
const changes = entries.filter((e) => e.status === 'WRITTEN');
|
|
138
|
+
const skipped = entries.filter((e) => e.status === 'SKIPPED');
|
|
139
|
+
logger.info(`PXL skipped ${skipped.length} files because checksums didn't match.`);
|
|
140
|
+
if (changes.length === 0) {
|
|
141
|
+
logger.info(`PXL generated no files.`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
logger.info(`PXL generated the following files:`);
|
|
145
|
+
for (const file of changes) {
|
|
146
|
+
logger.info(`+ [generated] ${file.path}`);
|
|
147
|
+
}
|
|
148
|
+
logger.info(`PXL finished! 🚀`);
|
|
149
|
+
});
|
|
150
|
+
exports.generate = generate;
|
|
151
|
+
const DISCLAIMER = `/**
|
|
152
|
+
* DO NOT EDIT THIS FILE!
|
|
153
|
+
*
|
|
154
|
+
* This file was generated by generator.
|
|
155
|
+
* Any manual changes will be overwritten.
|
|
156
|
+
* To modify this file, edit the Prisma schema file and run
|
|
157
|
+
* \`prisma generate\` or \`pnpm prisma generate\`
|
|
158
|
+
* again!
|
|
159
|
+
*
|
|
160
|
+
* If you need to modify the structure of this file, please edit the generator
|
|
161
|
+
* at \`packages/generator/\`
|
|
162
|
+
*
|
|
163
|
+
**/
|
|
164
|
+
`;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EnumMetaData } from '../../lib/meta';
|
|
2
|
+
import { Enum } from '../../lib/schema/schema';
|
|
3
|
+
import { VirtualFS } from '../../lib/vfs';
|
|
4
|
+
/**
|
|
5
|
+
* Generates React components for a given enumerator.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateEnumReactComponents({ enumerator, meta }: {
|
|
8
|
+
enumerator: Enum;
|
|
9
|
+
meta: EnumMetaData;
|
|
10
|
+
}): VirtualFS;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateEnumReactComponents = void 0;
|
|
4
|
+
const imports_1 = require("../../lib/imports");
|
|
5
|
+
const vfs_1 = require("../../lib/vfs");
|
|
6
|
+
/**
|
|
7
|
+
* Generates React components for a given enumerator.
|
|
8
|
+
*/
|
|
9
|
+
function generateEnumReactComponents({ enumerator, meta }) {
|
|
10
|
+
const vfs = new vfs_1.VirtualFS({
|
|
11
|
+
'index.ts': `
|
|
12
|
+
export * from './Select'
|
|
13
|
+
`,
|
|
14
|
+
});
|
|
15
|
+
vfs.write('/Select.tsx', generateEnumSelect({ enumerator, meta }));
|
|
16
|
+
return vfs;
|
|
17
|
+
}
|
|
18
|
+
exports.generateEnumReactComponents = generateEnumReactComponents;
|
|
19
|
+
/**
|
|
20
|
+
* Utility function that generates the select component for a given enumerator.
|
|
21
|
+
*/
|
|
22
|
+
function generateEnumSelect({ enumerator, meta }) {
|
|
23
|
+
const imports = imports_1.ImportsGenerator.from(meta.react.folderPath).addImport({
|
|
24
|
+
items: [enumerator.typeName],
|
|
25
|
+
from: meta.types.importPath,
|
|
26
|
+
});
|
|
27
|
+
return `
|
|
28
|
+
import { useField } from 'formik'
|
|
29
|
+
import React from 'react'
|
|
30
|
+
|
|
31
|
+
import { ButtonSwitcher } from '@components/atoms/ButtonSwitcher'
|
|
32
|
+
import { SelectInput, SelectField } from '@components/atoms/SelectInput'
|
|
33
|
+
import { UnionOmit } from '@lib/types'
|
|
34
|
+
|
|
35
|
+
${imports.generate()}
|
|
36
|
+
|
|
37
|
+
type Option = {
|
|
38
|
+
id: ${enumerator.typeName}
|
|
39
|
+
label: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const OPTIONS: Option[] = [
|
|
43
|
+
${enumerator.values.map((v) => `{ id: '${v}', label: '${v}' },`).join('\n')}
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
// Switcher
|
|
47
|
+
|
|
48
|
+
export const ${meta.react.switcherInputName} = ({ ...delegated }: UnionOmit<
|
|
49
|
+
React.ComponentPropsWithoutRef<typeof ButtonSwitcher<${enumerator.typeName}>>,
|
|
50
|
+
'options'
|
|
51
|
+
>) => (
|
|
52
|
+
<ButtonSwitcher options={OPTIONS} {...delegated} />
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
export const ${meta.react.switcherFieldName} = ({
|
|
56
|
+
name,
|
|
57
|
+
...delegated
|
|
58
|
+
}: { name: string } & UnionOmit<
|
|
59
|
+
React.ComponentPropsWithoutRef<typeof ${meta.react.switcherInputName}>,
|
|
60
|
+
'value' | 'onChange'
|
|
61
|
+
>) => {
|
|
62
|
+
const [field, meta, helpers] = useField<${enumerator.name}>({ name })
|
|
63
|
+
|
|
64
|
+
return <${meta.react.switcherInputName} value={field.value} onChange={helpers.setValue} {...delegated} />
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Select
|
|
68
|
+
|
|
69
|
+
export const ${meta.react.selectInputName} = ({
|
|
70
|
+
...delegated
|
|
71
|
+
}: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectInput<Option>>, 'label' | 'options'>) => {
|
|
72
|
+
return <SelectInput<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const ${meta.react.selectFieldName} = ({
|
|
76
|
+
...delegated
|
|
77
|
+
}: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectField<Option>>, 'label' | 'options'>) => {
|
|
78
|
+
return <SelectField<Option> options={OPTIONS} label={(l) => l.label} {...delegated} />
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EnumMetaData } from '../../lib/meta';
|
|
2
|
+
import { Enum } from '../../lib/schema/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Generator that generates type definitions for all enumerators.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateEnumType({ enumerator, meta, prismaClientPath, }: {
|
|
7
|
+
enumerator: Enum;
|
|
8
|
+
meta: EnumMetaData;
|
|
9
|
+
prismaClientPath: string;
|
|
10
|
+
}): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateEnumType = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Generator that generates type definitions for all enumerators.
|
|
6
|
+
*/
|
|
7
|
+
function generateEnumType({ enumerator, meta, prismaClientPath, }) {
|
|
8
|
+
return `
|
|
9
|
+
import * as Prisma from '${prismaClientPath}'
|
|
10
|
+
|
|
11
|
+
export type ${enumerator.typeName} = Prisma.${enumerator.sourceName}
|
|
12
|
+
export const ${enumerator.typeName} = Prisma.${enumerator.sourceName}
|
|
13
|
+
export const ${meta.types.membersList}: ${enumerator.typeName}[] = [
|
|
14
|
+
${enumerator.values.map((v) => `'${v}'`).join(', ')}
|
|
15
|
+
]
|
|
16
|
+
`;
|
|
17
|
+
}
|
|
18
|
+
exports.generateEnumType = generateEnumType;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SchemaMetaData } from '../../lib/meta';
|
|
2
|
+
import { Model } from '../../lib/schema/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Generates a mocking class
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateDataMockModule({ models, meta }: {
|
|
7
|
+
models: Model[];
|
|
8
|
+
meta: SchemaMetaData;
|
|
9
|
+
}): string;
|
|
@@ -0,0 +1,104 @@
|
|
|
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.generateDataMockModule = 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 mocking class
|
|
32
|
+
*/
|
|
33
|
+
function generateDataMockModule({ models, meta }) {
|
|
34
|
+
const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
|
|
35
|
+
const imports = imports_1.ImportsGenerator.from(meta.data.dataMockModuleFilePath)
|
|
36
|
+
.addImport({
|
|
37
|
+
items: [Types.toVariableName('DataModule')],
|
|
38
|
+
from: meta.data.dataModuleFilePath,
|
|
39
|
+
})
|
|
40
|
+
.addImport({
|
|
41
|
+
items: [Types.toVariableName('DataService')],
|
|
42
|
+
from: meta.data.dataServiceFilePath,
|
|
43
|
+
})
|
|
44
|
+
.addImport({
|
|
45
|
+
items: [Types.toVariableName('TestDataService')],
|
|
46
|
+
from: meta.data.testDataServiceFilePath,
|
|
47
|
+
});
|
|
48
|
+
for (const { model, meta } of mm) {
|
|
49
|
+
imports.addImport({ items: [model.typeName], from: meta.types.importPath });
|
|
50
|
+
imports.addImport({ items: [meta.data.repositoryClassName], from: meta.data.importPath });
|
|
51
|
+
imports.addImport({ items: [meta.seed.constantName], from: meta.seed.importPath });
|
|
52
|
+
}
|
|
53
|
+
const providers = mm
|
|
54
|
+
.map(({ meta, model }) => `provideMockRepository<
|
|
55
|
+
${model.typeName},
|
|
56
|
+
${model.idField.unbrandedTypeName},
|
|
57
|
+
${model.typeName}
|
|
58
|
+
>(${meta.data.repositoryClassName}, ${meta.seed.constantName})`)
|
|
59
|
+
.join(', ');
|
|
60
|
+
return `
|
|
61
|
+
import { DynamicModule } from '@nestjs/common'
|
|
62
|
+
import { DbModule } from '@la/db'
|
|
63
|
+
|
|
64
|
+
import { provideMockRepository } from '../mock.repository'
|
|
65
|
+
|
|
66
|
+
${imports.generate()}
|
|
67
|
+
|
|
68
|
+
export class DataMockModule {
|
|
69
|
+
private static cachedModule: DynamicModule | undefined = undefined
|
|
70
|
+
|
|
71
|
+
static isInstantiated(): boolean {
|
|
72
|
+
return !!DataMockModule.cachedModule
|
|
73
|
+
}
|
|
74
|
+
static getInstance(): DataModule {
|
|
75
|
+
if (!DataMockModule.cachedModule) throw new Error('DataMockModule must be called via .mock first!')
|
|
76
|
+
return DataMockModule.cachedModule
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/require-await, @typescript-eslint/no-unused-vars
|
|
80
|
+
static async mock(): Promise<DynamicModule> {
|
|
81
|
+
const providers = [
|
|
82
|
+
DataService,
|
|
83
|
+
TestDataService,
|
|
84
|
+
${providers}
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
DataMockModule.cachedModule = {
|
|
88
|
+
module: DataModule,
|
|
89
|
+
imports: [DbModule.provideMock()],
|
|
90
|
+
providers: providers,
|
|
91
|
+
exports: providers,
|
|
92
|
+
global: true,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return DataMockModule.cachedModule
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface MockData {
|
|
100
|
+
${mm.map(({ model, meta }) => `${meta.data.mockDataPropertyName}?: ${model.typeName}[]`).join('\n')}
|
|
101
|
+
}
|
|
102
|
+
`;
|
|
103
|
+
}
|
|
104
|
+
exports.generateDataMockModule = generateDataMockModule;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SchemaMetaData } from '../../lib/meta';
|
|
2
|
+
import { Model } from '../../lib/schema/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Generates a data module class.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateDataModule({ models, meta }: {
|
|
7
|
+
models: Model[];
|
|
8
|
+
meta: SchemaMetaData;
|
|
9
|
+
}): string;
|
|
@@ -0,0 +1,128 @@
|
|
|
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.generateDataModule = 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 data module class.
|
|
32
|
+
*/
|
|
33
|
+
function generateDataModule({ models, meta }) {
|
|
34
|
+
const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
|
|
35
|
+
const imports = imports_1.ImportsGenerator.from(meta.data.dataModuleFilePath)
|
|
36
|
+
.addImport({
|
|
37
|
+
items: [Types.toVariableName('TestDataService')],
|
|
38
|
+
from: meta.data.testDataServiceFilePath,
|
|
39
|
+
})
|
|
40
|
+
.addImport({
|
|
41
|
+
items: [Types.toVariableName('DataService')],
|
|
42
|
+
from: meta.data.dataServiceFilePath,
|
|
43
|
+
});
|
|
44
|
+
for (const { meta } of mm) {
|
|
45
|
+
imports.addImport({
|
|
46
|
+
items: [meta.data.repositoryClassName],
|
|
47
|
+
from: meta.data.repoFilePath,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return `
|
|
51
|
+
import { DynamicModule, Provider, Type } from '@nestjs/common'
|
|
52
|
+
import { DbModule, DbService } from '@la/db'
|
|
53
|
+
|
|
54
|
+
import { AsyncInit, Repository } from '../repository.type'
|
|
55
|
+
|
|
56
|
+
${imports.generate()}
|
|
57
|
+
|
|
58
|
+
const createRepositoryProvider = <T extends AsyncInit>(t: Type<T>, loadData: boolean): Provider => ({
|
|
59
|
+
inject: [DbService],
|
|
60
|
+
provide: t,
|
|
61
|
+
useFactory: async (dbService: DbService): Promise<T> => {
|
|
62
|
+
const repository = new t(dbService)
|
|
63
|
+
await dbService.isInitialized(t.name)
|
|
64
|
+
if (loadData) {
|
|
65
|
+
await repository.init()
|
|
66
|
+
}
|
|
67
|
+
return repository
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
export class DataModule {
|
|
72
|
+
private static cachedModule: DynamicModule | undefined = undefined
|
|
73
|
+
|
|
74
|
+
static isInstantiated(): boolean {
|
|
75
|
+
return !!DataModule.cachedModule
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static getInstance(): DataModule {
|
|
79
|
+
if (!DataModule.cachedModule) throw new Error('DataModule must be called via .provide first!')
|
|
80
|
+
return DataModule.cachedModule
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static provide({ loadData }: { loadData: boolean }): DynamicModule {
|
|
84
|
+
if (DataModule.cachedModule) {
|
|
85
|
+
console.warn('DataModule is already instantiated, skipping...')
|
|
86
|
+
return DataModule.cachedModule
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const repositoryProviders: Provider<Repository<any, any>>[] = [
|
|
90
|
+
${mm.map(({ meta }) => meta.data.repositoryClassName).join(',\n')}
|
|
91
|
+
].map((r) => createRepositoryProvider(r as any, loadData))
|
|
92
|
+
|
|
93
|
+
DataModule.cachedModule = {
|
|
94
|
+
module: DataModule,
|
|
95
|
+
global: true,
|
|
96
|
+
imports: [DbModule.provide()],
|
|
97
|
+
providers: [DataService, ...repositoryProviders],
|
|
98
|
+
exports: [DataService, ...repositoryProviders],
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return DataModule.cachedModule
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static provideE2E(): DynamicModule {
|
|
105
|
+
if (DataModule.cachedModule) {
|
|
106
|
+
console.warn('DataModule is already instantiated, skipping...')
|
|
107
|
+
return DataModule.cachedModule
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const providers: Provider<Repository<any, any>>[] = [
|
|
111
|
+
// createRepositoryProvider(TherapeuticAreaRepository, true),
|
|
112
|
+
TestDataService,
|
|
113
|
+
]
|
|
114
|
+
|
|
115
|
+
DataModule.cachedModule = {
|
|
116
|
+
module: DataModule,
|
|
117
|
+
global: true,
|
|
118
|
+
imports: [DbModule.provide()],
|
|
119
|
+
providers: [...providers],
|
|
120
|
+
exports: providers,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return DataModule.cachedModule
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
`;
|
|
127
|
+
}
|
|
128
|
+
exports.generateDataModule = generateDataModule;
|
|
@@ -0,0 +1,9 @@
|
|
|
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 generateDataService({ models, meta }: {
|
|
7
|
+
models: Model[];
|
|
8
|
+
meta: SchemaMetaData;
|
|
9
|
+
}): string;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateDataService = void 0;
|
|
4
|
+
const meta_1 = require("../../lib/meta");
|
|
5
|
+
const imports_1 = require("../../lib/imports");
|
|
6
|
+
/**
|
|
7
|
+
* Generates a generic data service object that may be used on the server to access database.
|
|
8
|
+
*/
|
|
9
|
+
function generateDataService({ models, meta }) {
|
|
10
|
+
const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
|
|
11
|
+
const imports = imports_1.ImportsGenerator.from(meta.data.dataServiceFilePath);
|
|
12
|
+
for (const { meta } of mm) {
|
|
13
|
+
imports.addImport({
|
|
14
|
+
items: [meta.data.repositoryClassName],
|
|
15
|
+
from: meta.data.importPath,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
const constructor = mm
|
|
19
|
+
.map(({ meta }) => `public ${meta.data.dataServiceName} :${meta.data.repositoryClassName}`)
|
|
20
|
+
.join(',\n');
|
|
21
|
+
const initializer = mm.map(({ meta }) => `await this.${meta.data.dataServiceName}.init()`).join(',\n');
|
|
22
|
+
const excelExports = mm
|
|
23
|
+
.map(({ meta }) => `${meta.data.excelExportTableName}: mapValues(this.${meta.data.dataServiceName}.getAll()),`)
|
|
24
|
+
.join('\n');
|
|
25
|
+
return `
|
|
26
|
+
import { Injectable } from '@nestjs/common'
|
|
27
|
+
import { mapValues } from '@d2i/common'
|
|
28
|
+
|
|
29
|
+
${imports.generate()}
|
|
30
|
+
|
|
31
|
+
@Injectable()
|
|
32
|
+
export class DataService {
|
|
33
|
+
constructor(${constructor}) {}
|
|
34
|
+
|
|
35
|
+
public prepareExcelExport() {
|
|
36
|
+
return {
|
|
37
|
+
${excelExports}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public async init(): Promise<void> {
|
|
42
|
+
${initializer}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
exports.generateDataService = generateDataService;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SchemaMetaData } from '../../lib/meta';
|
|
2
|
+
import { Model } from '../../lib/schema/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Generates an index file that exports all stubs.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateRepositoriesIndex({ models, meta }: {
|
|
7
|
+
models: Model[];
|
|
8
|
+
meta: SchemaMetaData;
|
|
9
|
+
}): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRepositoriesIndex = void 0;
|
|
4
|
+
const exports_1 = require("../../lib/exports");
|
|
5
|
+
const meta_1 = require("../../lib/meta");
|
|
6
|
+
/**
|
|
7
|
+
* Generates an index file that exports all stubs.
|
|
8
|
+
*/
|
|
9
|
+
function generateRepositoriesIndex({ models, meta }) {
|
|
10
|
+
const exports = exports_1.ExportsGenerator.from(meta.data.repositoriesIndexFilePath);
|
|
11
|
+
for (const model of models) {
|
|
12
|
+
const meta = (0, meta_1.getModelMetadata)({ model });
|
|
13
|
+
exports.exportEverythingFrom(meta.data.repoFilePath);
|
|
14
|
+
}
|
|
15
|
+
return exports.generate();
|
|
16
|
+
}
|
|
17
|
+
exports.generateRepositoriesIndex = generateRepositoriesIndex;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SchemaMetaData } from '../../lib/meta';
|
|
2
|
+
import { Model } from '../../lib/schema/schema';
|
|
3
|
+
/**
|
|
4
|
+
* Generates index file for all seed files.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateSeedIndex({ models, meta }: {
|
|
7
|
+
models: Model[];
|
|
8
|
+
meta: SchemaMetaData;
|
|
9
|
+
}): string;
|