@postxl/generator 0.74.1 → 1.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/LICENSE +50 -0
- package/README.md +79 -1
- package/dist/generator-manager.class.d.ts +59 -0
- package/dist/generator-manager.class.js +221 -0
- package/dist/generator.class.d.ts +90 -0
- package/dist/generator.class.js +32 -0
- package/dist/generator.context.d.ts +174 -0
- package/dist/generator.context.js +125 -0
- package/dist/helpers/branded.types.d.ts +149 -0
- package/dist/helpers/branded.types.js +111 -0
- package/dist/helpers/config-builder.class.d.ts +27 -0
- package/dist/helpers/config-builder.class.js +54 -0
- package/dist/helpers/import-generator.class.d.ts +70 -0
- package/dist/helpers/import-generator.class.js +166 -0
- package/dist/helpers/importable.types.d.ts +52 -0
- package/dist/helpers/importable.types.js +15 -0
- package/dist/helpers/index-generator.class.d.ts +10 -0
- package/dist/helpers/index-generator.class.js +46 -0
- package/dist/helpers/index.d.ts +8 -0
- package/dist/helpers/index.js +24 -0
- package/dist/helpers/package-json.generator.d.ts +56 -0
- package/dist/helpers/package-json.generator.js +36 -0
- package/dist/helpers/tsconfig.generator.d.ts +1 -0
- package/dist/helpers/tsconfig.generator.js +14 -0
- package/dist/helpers/verify-context.d.ts +4 -0
- package/dist/helpers/verify-context.js +23 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +21 -0
- package/dist/utils/checksum.d.ts +10 -0
- package/dist/utils/checksum.js +132 -0
- package/dist/utils/fs-utils.d.ts +34 -0
- package/dist/utils/fs-utils.js +126 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.js +26 -0
- package/dist/utils/jsdoc.d.ts +12 -0
- package/dist/utils/jsdoc.js +37 -0
- package/dist/utils/lint.d.ts +46 -0
- package/dist/utils/lint.js +154 -0
- package/dist/utils/lockfile.d.ts +7 -0
- package/dist/utils/lockfile.js +80 -0
- package/dist/utils/logger.class.d.ts +25 -0
- package/dist/utils/logger.class.js +55 -0
- package/dist/utils/merge-conflict.d.ts +55 -0
- package/dist/utils/merge-conflict.js +264 -0
- package/dist/utils/path.d.ts +52 -0
- package/dist/utils/path.js +183 -0
- package/dist/utils/prettier-config.d.ts +2 -0
- package/dist/utils/prettier-config.js +13 -0
- package/dist/utils/prettier.d.ts +5 -0
- package/dist/utils/prettier.js +67 -0
- package/dist/utils/prettier.skiptest.d.ts +1 -0
- package/dist/utils/prettier.skiptest.js +22 -0
- package/dist/utils/promise.d.ts +2 -0
- package/dist/utils/promise.js +10 -0
- package/dist/utils/string-functions.d.ts +9 -0
- package/dist/utils/string-functions.js +23 -0
- package/dist/utils/sync-log-result.d.ts +9 -0
- package/dist/utils/sync-log-result.js +90 -0
- package/dist/utils/sync.d.ts +143 -0
- package/dist/utils/sync.js +325 -0
- package/dist/utils/template.d.ts +66 -0
- package/dist/utils/template.js +159 -0
- package/dist/utils/vfs.class.d.ts +115 -0
- package/dist/utils/vfs.class.js +239 -0
- package/dist/utils/zip.d.ts +13 -0
- package/dist/utils/zip.js +40 -0
- package/package.json +57 -34
- package/dist/generator.d.ts +0 -13
- package/dist/generator.js +0 -455
- package/dist/generators/enums/react.generator.d.ts +0 -10
- package/dist/generators/enums/react.generator.js +0 -110
- package/dist/generators/enums/types.generator.d.ts +0 -10
- package/dist/generators/enums/types.generator.js +0 -39
- package/dist/generators/indices/data/module.generator.d.ts +0 -9
- package/dist/generators/indices/data/module.generator.js +0 -60
- package/dist/generators/indices/data/service.generator.d.ts +0 -9
- package/dist/generators/indices/data/service.generator.js +0 -249
- package/dist/generators/indices/data/types.generator.d.ts +0 -9
- package/dist/generators/indices/data/types.generator.js +0 -49
- package/dist/generators/indices/dispatcher-service.generator.d.ts +0 -9
- package/dist/generators/indices/dispatcher-service.generator.js +0 -107
- package/dist/generators/indices/export/class.generator.d.ts +0 -9
- package/dist/generators/indices/export/class.generator.js +0 -140
- package/dist/generators/indices/export/encoder.generator.d.ts +0 -9
- package/dist/generators/indices/export/encoder.generator.js +0 -50
- package/dist/generators/indices/import/convert-functions.generator.d.ts +0 -9
- package/dist/generators/indices/import/convert-functions.generator.js +0 -509
- package/dist/generators/indices/import/decoder.generator.d.ts +0 -9
- package/dist/generators/indices/import/decoder.generator.js +0 -40
- package/dist/generators/indices/import/service.generator.d.ts +0 -9
- package/dist/generators/indices/import/service.generator.js +0 -573
- package/dist/generators/indices/import/types.generator.d.ts +0 -9
- package/dist/generators/indices/import/types.generator.js +0 -242
- package/dist/generators/indices/repositories.generator.d.ts +0 -9
- package/dist/generators/indices/repositories.generator.js +0 -25
- package/dist/generators/indices/routes.generator.d.ts +0 -9
- package/dist/generators/indices/routes.generator.js +0 -29
- package/dist/generators/indices/seed-migration.generator.d.ts +0 -9
- package/dist/generators/indices/seed-migration.generator.js +0 -36
- package/dist/generators/indices/seed-template.generator.d.ts +0 -9
- package/dist/generators/indices/seed-template.generator.js +0 -80
- package/dist/generators/indices/testids.generator.d.ts +0 -7
- package/dist/generators/indices/testids.generator.js +0 -71
- package/dist/generators/indices/types.generator.d.ts +0 -10
- package/dist/generators/indices/types.generator.js +0 -35
- package/dist/generators/indices/update/actiontypes.generator.d.ts +0 -9
- package/dist/generators/indices/update/actiontypes.generator.js +0 -49
- package/dist/generators/indices/update/module.generator.d.ts +0 -9
- package/dist/generators/indices/update/module.generator.js +0 -41
- package/dist/generators/indices/update/service.generator.d.ts +0 -9
- package/dist/generators/indices/update/service.generator.js +0 -34
- package/dist/generators/indices/view/module.generator.d.ts +0 -9
- package/dist/generators/indices/view/module.generator.js +0 -39
- package/dist/generators/indices/view/service.generator.d.ts +0 -9
- package/dist/generators/indices/view/service.generator.js +0 -34
- package/dist/generators/models/admin.page.generator.d.ts +0 -7
- package/dist/generators/models/admin.page.generator.js +0 -74
- package/dist/generators/models/export/encoder.generator.d.ts +0 -9
- package/dist/generators/models/export/encoder.generator.js +0 -51
- package/dist/generators/models/import/decoder.generator.d.ts +0 -9
- package/dist/generators/models/import/decoder.generator.js +0 -148
- package/dist/generators/models/react/context.generator.d.ts +0 -9
- package/dist/generators/models/react/context.generator.js +0 -71
- package/dist/generators/models/react/index.d.ts +0 -10
- package/dist/generators/models/react/index.js +0 -31
- package/dist/generators/models/react/library.generator.d.ts +0 -10
- package/dist/generators/models/react/library.generator.js +0 -94
- package/dist/generators/models/react/lookup.generator.d.ts +0 -9
- package/dist/generators/models/react/lookup.generator.js +0 -175
- package/dist/generators/models/react/modals.generator.d.ts +0 -23
- package/dist/generators/models/react/modals.generator.js +0 -710
- package/dist/generators/models/repository.generator.d.ts +0 -9
- package/dist/generators/models/repository.generator.js +0 -955
- package/dist/generators/models/route.generator.d.ts +0 -9
- package/dist/generators/models/route.generator.js +0 -92
- package/dist/generators/models/seed.generator.d.ts +0 -21
- package/dist/generators/models/seed.generator.js +0 -285
- package/dist/generators/models/stub.generator.d.ts +0 -9
- package/dist/generators/models/stub.generator.js +0 -92
- package/dist/generators/models/types.generator.d.ts +0 -9
- package/dist/generators/models/types.generator.js +0 -125
- package/dist/generators/models/update/service.generator.d.ts +0 -10
- package/dist/generators/models/update/service.generator.js +0 -302
- package/dist/generators/models/view/service.generator.d.ts +0 -10
- package/dist/generators/models/view/service.generator.js +0 -239
- package/dist/lib/attributes.d.ts +0 -114
- package/dist/lib/attributes.js +0 -2
- package/dist/lib/exports.d.ts +0 -45
- package/dist/lib/exports.js +0 -90
- package/dist/lib/imports.d.ts +0 -65
- package/dist/lib/imports.js +0 -114
- package/dist/lib/meta.d.ts +0 -1191
- package/dist/lib/meta.js +0 -434
- package/dist/lib/schema/fields.d.ts +0 -46
- package/dist/lib/schema/fields.js +0 -62
- package/dist/lib/schema/schema.d.ts +0 -466
- package/dist/lib/schema/schema.js +0 -18
- package/dist/lib/schema/types.d.ts +0 -201
- package/dist/lib/schema/types.js +0 -112
- package/dist/lib/serializer.d.ts +0 -15
- package/dist/lib/serializer.js +0 -24
- package/dist/lib/test-id-collector.d.ts +0 -42
- package/dist/lib/test-id-collector.js +0 -53
- package/dist/lib/types.d.ts +0 -7
- package/dist/lib/types.js +0 -13
- package/dist/lib/typescript.d.ts +0 -5
- package/dist/lib/typescript.js +0 -22
- package/dist/lib/utils/ast.d.ts +0 -29
- package/dist/lib/utils/ast.js +0 -23
- package/dist/lib/utils/error.d.ts +0 -17
- package/dist/lib/utils/error.js +0 -52
- package/dist/lib/utils/file.d.ts +0 -10
- package/dist/lib/utils/file.js +0 -56
- package/dist/lib/utils/jsdoc.d.ts +0 -9
- package/dist/lib/utils/jsdoc.js +0 -37
- package/dist/lib/utils/logger.d.ts +0 -17
- package/dist/lib/utils/logger.js +0 -12
- package/dist/lib/utils/string.d.ts +0 -40
- package/dist/lib/utils/string.js +0 -187
- package/dist/lib/utils/types.d.ts +0 -12
- package/dist/lib/utils/types.js +0 -2
- package/dist/lib/zod.d.ts +0 -8
- package/dist/lib/zod.js +0 -60
- package/dist/prisma/attributes.d.ts +0 -21
- package/dist/prisma/attributes.js +0 -175
- package/dist/prisma/client-path.d.ts +0 -7
- package/dist/prisma/client-path.js +0 -29
- package/dist/prisma/parse.d.ts +0 -12
- package/dist/prisma/parse.js +0 -452
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateDataModule = void 0;
|
|
4
|
-
const imports_1 = require("../../../lib/imports");
|
|
5
|
-
const meta_1 = require("../../../lib/meta");
|
|
6
|
-
/**
|
|
7
|
-
* Generates a data module class.
|
|
8
|
-
*/
|
|
9
|
-
function generateDataModule({ models, meta }) {
|
|
10
|
-
const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
|
|
11
|
-
const imports = imports_1.ImportsGenerator.from(meta.data.moduleLocation.path).addImports({
|
|
12
|
-
[meta.data.dataService.location.path]: [meta.data.dataService.class],
|
|
13
|
-
[meta.backendModules.db.databaseService.location.import]: [meta.backendModules.db.databaseService.name],
|
|
14
|
-
[meta.backendModules.db.moduleLocation.import]: [meta.backendModules.db.moduleName],
|
|
15
|
-
});
|
|
16
|
-
for (const { meta } of mm) {
|
|
17
|
-
imports.addImport({
|
|
18
|
-
items: [meta.data.repository.className],
|
|
19
|
-
from: meta.data.repository.location.path,
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
return /* ts */ `
|
|
23
|
-
import { DynamicModule, FactoryProvider } from '@nestjs/common'
|
|
24
|
-
|
|
25
|
-
${imports.generate()}
|
|
26
|
-
|
|
27
|
-
export class ${meta.data.moduleName} {
|
|
28
|
-
public static forRoot(): DynamicModule {
|
|
29
|
-
const userRepositoryProvider: FactoryProvider<UserRepository> = {
|
|
30
|
-
provide: UserRepository,
|
|
31
|
-
inject: [DatabaseService],
|
|
32
|
-
useFactory: async (dbService: DatabaseService) => {
|
|
33
|
-
const repository = new UserRepository(dbService)
|
|
34
|
-
await repository.init()
|
|
35
|
-
return repository
|
|
36
|
-
},
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const providers = [
|
|
40
|
-
DataService,
|
|
41
|
-
|
|
42
|
-
userRepositoryProvider,
|
|
43
|
-
|
|
44
|
-
${mm
|
|
45
|
-
.filter((mm) => mm.model.name !== 'User')
|
|
46
|
-
.map(({ meta }) => meta.data.repository.className)
|
|
47
|
-
.join(',')}
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
module: ${meta.data.moduleName},
|
|
52
|
-
global: true,
|
|
53
|
-
imports: [DatabaseModule],
|
|
54
|
-
providers,
|
|
55
|
-
exports: providers,
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}`;
|
|
59
|
-
}
|
|
60
|
-
exports.generateDataModule = generateDataModule;
|
|
@@ -1,9 +0,0 @@
|
|
|
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;
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateDataService = void 0;
|
|
4
|
-
const imports_1 = require("../../../lib/imports");
|
|
5
|
-
const meta_1 = require("../../../lib/meta");
|
|
6
|
-
const types_1 = require("../../../lib/schema/types");
|
|
7
|
-
/**
|
|
8
|
-
* Generates a generic data service object that may be used on the server to access database.
|
|
9
|
-
*/
|
|
10
|
-
function generateDataService({ models, meta }) {
|
|
11
|
-
const mm = models.map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }));
|
|
12
|
-
const imports = imports_1.ImportsGenerator.from(meta.data.dataService.location.path);
|
|
13
|
-
for (const { meta } of mm) {
|
|
14
|
-
imports.addImport({
|
|
15
|
-
items: [meta.data.repository.className],
|
|
16
|
-
from: meta.data.repository.location.path,
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
const constructor = mm
|
|
20
|
-
.map(({ meta }) => `public ${meta.data.dataServiceName} :${meta.data.repository.className}`)
|
|
21
|
-
.join(',\n');
|
|
22
|
-
const initializer = mm.map(({ meta }) => `await this.${meta.data.dataServiceName}.init()`).join('\n');
|
|
23
|
-
const excelExports = mm
|
|
24
|
-
.map(({ meta }) => `${meta.import.tableName}: Array.from((await this.${meta.data.dataServiceName}.getAll()).values()),`)
|
|
25
|
-
.join('\n');
|
|
26
|
-
const isEmptyChecks = mm.map(({ meta }) => `(await this.${meta.data.dataServiceName}.count()) === 0`).join(' &&');
|
|
27
|
-
// Building blocks for bulk mutations
|
|
28
|
-
imports.addImports({
|
|
29
|
-
[meta.types.importPath]: [(0, types_1.toAnnotatedTypeName)(meta.types.dto.create), (0, types_1.toAnnotatedTypeName)(meta.types.dto.update)],
|
|
30
|
-
[meta.data.repository.typeFilePath]: [(0, types_1.toAnnotatedTypeName)(meta.data.repository.typeName)],
|
|
31
|
-
[meta.data.types.location.import]: [(0, types_1.toAnnotatedTypeName)(meta.data.types.bulkMutation)],
|
|
32
|
-
[meta.actions.execution.interfaceLocation.import]: [meta.actions.execution.interface],
|
|
33
|
-
});
|
|
34
|
-
const creates = [];
|
|
35
|
-
const updates = [];
|
|
36
|
-
const upserts = [];
|
|
37
|
-
const deletes = [];
|
|
38
|
-
for (const model of models) {
|
|
39
|
-
const modelMeta = (0, meta_1.getModelMetadata)({ model });
|
|
40
|
-
creates.push(`await this.create({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.create, repo: this.${modelMeta.data.dataServiceName}, execution })`);
|
|
41
|
-
updates.push(`await this.update({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.update, repo: this.${modelMeta.data.dataServiceName}, execution })`);
|
|
42
|
-
upserts.push(`await this.upsert({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.upsert, repo: this.${modelMeta.data.dataServiceName}, execution })`);
|
|
43
|
-
deletes.push(`await this.delete({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}?.delete, repo: this.${modelMeta.data.dataServiceName}, execution })`);
|
|
44
|
-
}
|
|
45
|
-
return /* ts */ `
|
|
46
|
-
import { Injectable, Logger } from '@nestjs/common'
|
|
47
|
-
|
|
48
|
-
import { format, pluralize } from '@postxl/runtime'
|
|
49
|
-
|
|
50
|
-
${imports.generate()}
|
|
51
|
-
|
|
52
|
-
// If true, the bulk mutation will be executed one by one, instead of all at once (which is the default).
|
|
53
|
-
// Also, each item will be logged to the console.
|
|
54
|
-
// This should help to quickly identify the item that causes an error in a bulk mutation.
|
|
55
|
-
const DEBUG = false
|
|
56
|
-
|
|
57
|
-
@Injectable()
|
|
58
|
-
export class ${meta.data.dataService.class} {
|
|
59
|
-
private readonly logger = new Logger(${meta.data.dataService.class}.name)
|
|
60
|
-
|
|
61
|
-
constructor(${constructor}) {}
|
|
62
|
-
|
|
63
|
-
public async prepareExcelExport() {
|
|
64
|
-
return {
|
|
65
|
-
${excelExports}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
public async init(): Promise<void> {
|
|
70
|
-
${initializer}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
public async isEmpty(): Promise<boolean> {
|
|
74
|
-
return (
|
|
75
|
-
${isEmptyChecks}
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
public async ${meta.data.dataService.executeBulkMutations}(
|
|
79
|
-
{ steps, execution }:
|
|
80
|
-
{ steps: ${meta.data.types.bulkMutation}[]; execution: ${meta.actions.execution.interface} }
|
|
81
|
-
) {
|
|
82
|
-
let index = 0
|
|
83
|
-
for (const step of steps) {
|
|
84
|
-
this.logger.log(\`Uploading data step \${++index}/\${steps.length}\`)
|
|
85
|
-
await this.${meta.data.dataService.executeBulkMutation}({ data: step, execution })
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
public async ${meta.data.dataService.executeBulkMutation}(
|
|
90
|
-
{ data, execution }:
|
|
91
|
-
{ data: ${meta.data.types.bulkMutation}, execution: ${meta.actions.execution.interface}}
|
|
92
|
-
) {
|
|
93
|
-
// NOTE: the order of these calls is important, because of foreign key constraints
|
|
94
|
-
// The current order is based on the order of the models in the schema
|
|
95
|
-
// Change the order based on your needs.
|
|
96
|
-
// Attention: Depending on the dependencies in seed data, you may also have to take care of relations,
|
|
97
|
-
// e.g. by removing any foreign key first - and then update these after all data is created.
|
|
98
|
-
// Alternatively, you can also do this in multiple steps
|
|
99
|
-
${creates.join('\n')}
|
|
100
|
-
|
|
101
|
-
${updates.join('\n')}
|
|
102
|
-
|
|
103
|
-
${upserts.join('\n')}
|
|
104
|
-
|
|
105
|
-
${deletes.join('\n')}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
private async create<T extends { id: ID }, ID extends number | string | boolean>({
|
|
109
|
-
name,
|
|
110
|
-
data,
|
|
111
|
-
repo,
|
|
112
|
-
execution,
|
|
113
|
-
}: {
|
|
114
|
-
name: string
|
|
115
|
-
data: ${meta.types.dto.create}<T, ID>[] | undefined
|
|
116
|
-
repo: ${meta.data.repository.typeName}<T, ID>
|
|
117
|
-
execution: ${meta.actions.execution.interface}
|
|
118
|
-
}): Promise<void> {
|
|
119
|
-
if (!data || data.length === 0) {
|
|
120
|
-
return
|
|
121
|
-
}
|
|
122
|
-
if (!DEBUG) {
|
|
123
|
-
await repo.createMany?.({ items: data, execution })
|
|
124
|
-
} else {
|
|
125
|
-
let i = 0
|
|
126
|
-
for (const item of data) {
|
|
127
|
-
i++
|
|
128
|
-
this.logger.log(\`Creating \${name} \${i} - \${_getItemDescription(item)}\`)
|
|
129
|
-
try {
|
|
130
|
-
await repo.create?.({ item, execution })
|
|
131
|
-
} catch (error) {
|
|
132
|
-
this.logger.error(\`Error creating \${name} \${i} - \${_getItemDescription(item)}\`, error)
|
|
133
|
-
throw error
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
this.logger.log(\`✅ Created \${format(data.length)} \${pluralize(name)}\`)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
private async update<T extends { id: ID }, ID extends number | string | boolean>({
|
|
141
|
-
name,
|
|
142
|
-
data,
|
|
143
|
-
repo,
|
|
144
|
-
execution,
|
|
145
|
-
}: {
|
|
146
|
-
name: string
|
|
147
|
-
data: ${meta.types.dto.update}<T, ID>[] | undefined
|
|
148
|
-
repo: ${meta.data.repository.typeName}<T, ID>
|
|
149
|
-
execution: ${meta.actions.execution.interface}
|
|
150
|
-
}): Promise<void> {
|
|
151
|
-
if (!data || data.length === 0) {
|
|
152
|
-
return
|
|
153
|
-
}
|
|
154
|
-
if (!DEBUG) {
|
|
155
|
-
await repo.updateMany?.({ items: data, execution })
|
|
156
|
-
} else {
|
|
157
|
-
let i = 0
|
|
158
|
-
for (const item of data) {
|
|
159
|
-
i++
|
|
160
|
-
this.logger.log(\`Updating \${name} \${i} - \${_getItemDescription(item)}\`)
|
|
161
|
-
try {
|
|
162
|
-
await repo.update?.({ item, execution })
|
|
163
|
-
} catch (error) {
|
|
164
|
-
this.logger.error(\`Error updating \${name} \${i} - \${_getItemDescription(item)}\`, error)
|
|
165
|
-
throw error
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
this.logger.log(\`✅ Updated \${format(data.length)} \${pluralize(name)}\`)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
private async upsert<T extends { id: ID }, ID extends number | string | boolean>({
|
|
173
|
-
name,
|
|
174
|
-
data,
|
|
175
|
-
repo,
|
|
176
|
-
execution,
|
|
177
|
-
}: {
|
|
178
|
-
name: string
|
|
179
|
-
data: (${meta.types.dto.create}<T, ID> | ${meta.types.dto.update}<T, ID>)[] | undefined
|
|
180
|
-
repo: ${meta.data.repository.typeName}<T, ID>
|
|
181
|
-
execution: ${meta.actions.execution.interface}
|
|
182
|
-
}): Promise<void> {
|
|
183
|
-
if (!data || data.length === 0) {
|
|
184
|
-
return
|
|
185
|
-
}
|
|
186
|
-
if (!DEBUG) {
|
|
187
|
-
await repo.upsertMany?.({ items: data, execution })
|
|
188
|
-
} else {
|
|
189
|
-
let i = 0
|
|
190
|
-
for (const item of data) {
|
|
191
|
-
i++
|
|
192
|
-
this.logger.log(\`Upserting \${name} \${i} - \${_getItemDescription(item)}\`)
|
|
193
|
-
try {
|
|
194
|
-
await repo.upsert?.({ item, execution })
|
|
195
|
-
} catch (error) {
|
|
196
|
-
this.logger.error(\`Error upserting \${name} \${i} - \${_getItemDescription(item)}\`, error)
|
|
197
|
-
throw error
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
this.logger.log(\`✅ Upserted \${format(data.length)} \${pluralize(name)}\`)
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
private async delete<T extends { id: ID }, ID extends number | string | boolean>({
|
|
205
|
-
name,
|
|
206
|
-
data,
|
|
207
|
-
repo,
|
|
208
|
-
execution,
|
|
209
|
-
}: {
|
|
210
|
-
name: string
|
|
211
|
-
data: ID[] | undefined
|
|
212
|
-
repo: ${meta.data.repository.typeName}<T, ID>
|
|
213
|
-
execution: ${meta.actions.execution.interface}
|
|
214
|
-
}): Promise<void> {
|
|
215
|
-
if (!data || data.length === 0) {
|
|
216
|
-
return
|
|
217
|
-
}
|
|
218
|
-
if (!DEBUG) {
|
|
219
|
-
await repo.deleteMany?.({ ids: data, execution })
|
|
220
|
-
} else {
|
|
221
|
-
let i = 0
|
|
222
|
-
for (const id of data) {
|
|
223
|
-
i++
|
|
224
|
-
this.logger.log(\`Deleting \${name} \${i} - id: \${id.toString()}\`)
|
|
225
|
-
try {
|
|
226
|
-
await repo.delete?.({ id, execution })
|
|
227
|
-
} catch (error) {
|
|
228
|
-
this.logger.error(\`Error deleting \${name} \${i} - id: \${id.toString()}\`, error)
|
|
229
|
-
throw error
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
this.logger.log(\`✅ Deleted \${format(data.length)} \${pluralize(name)}\`)
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function _getItemDescription<T extends Partial<{ id: ID }>, ID extends number | string | boolean>(item: T): string {
|
|
238
|
-
const id = \`id: \${item.id !== undefined ? item.id.toString() : 'not provided'}\`
|
|
239
|
-
|
|
240
|
-
// If the item has a name, we can assume it is a string and add it to the description
|
|
241
|
-
if ('name' in item) {
|
|
242
|
-
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
243
|
-
return \`\${id}, name: \${item.name}\`
|
|
244
|
-
}
|
|
245
|
-
return id
|
|
246
|
-
}
|
|
247
|
-
`;
|
|
248
|
-
}
|
|
249
|
-
exports.generateDataService = generateDataService;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { SchemaMetaData } from '../../../lib/meta';
|
|
2
|
-
import { Model } from '../../../lib/schema/schema';
|
|
3
|
-
/**
|
|
4
|
-
* Generates type for BulkMutations.
|
|
5
|
-
*/
|
|
6
|
-
export declare function generateDataTypes({ models, meta }: {
|
|
7
|
-
models: Model[];
|
|
8
|
-
meta: SchemaMetaData;
|
|
9
|
-
}): string;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateDataTypes = void 0;
|
|
4
|
-
const imports_1 = require("../../../lib/imports");
|
|
5
|
-
const meta_1 = require("../../../lib/meta");
|
|
6
|
-
/**
|
|
7
|
-
* Generates type for BulkMutations.
|
|
8
|
-
*/
|
|
9
|
-
function generateDataTypes({ models, meta }) {
|
|
10
|
-
const { types } = meta.data;
|
|
11
|
-
const imports = imports_1.ImportsGenerator.from(types.location.path);
|
|
12
|
-
const dto = meta.types.dto;
|
|
13
|
-
imports.addTypeImport({
|
|
14
|
-
from: meta.types.importPath,
|
|
15
|
-
items: [dto.create, dto.update, dto.upsert, dto.genericModel, dto.idType],
|
|
16
|
-
});
|
|
17
|
-
const modelTypes = [];
|
|
18
|
-
for (const model of models) {
|
|
19
|
-
const modelMeta = (0, meta_1.getModelMetadata)({ model });
|
|
20
|
-
imports.addTypeImport({
|
|
21
|
-
items: [modelMeta.types.typeName, modelMeta.types.brandedIdType],
|
|
22
|
-
from: modelMeta.types.importPath,
|
|
23
|
-
});
|
|
24
|
-
modelTypes.push(`${modelMeta.seed.constantName}?: ${types.bulkMutationForModel}<${modelMeta.types.typeName}, ${modelMeta.types.brandedIdType}>`);
|
|
25
|
-
}
|
|
26
|
-
return /* ts */ `
|
|
27
|
-
${imports.generate()}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Generic type for BulkMutation for a model.
|
|
31
|
-
*/
|
|
32
|
-
export type ${types.bulkMutationForModel}<
|
|
33
|
-
Model extends ${dto.genericModel}<ID>,
|
|
34
|
-
ID extends ${dto.idType}
|
|
35
|
-
> = {
|
|
36
|
-
create?: ${dto.create}<Model, ID>[]
|
|
37
|
-
update?: ${dto.update}<Model, ID>[]
|
|
38
|
-
upsert?: ${dto.upsert}<Model, ID>[]
|
|
39
|
-
delete?: ID[]
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Bulk changes for all models.
|
|
44
|
-
*/
|
|
45
|
-
export type ${types.bulkMutation} = {
|
|
46
|
-
${modelTypes.join('\n')}
|
|
47
|
-
}`;
|
|
48
|
-
}
|
|
49
|
-
exports.generateDataTypes = generateDataTypes;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { SchemaMetaData } from '../../lib/meta';
|
|
2
|
-
import { Model } from '../../lib/schema/schema';
|
|
3
|
-
/**
|
|
4
|
-
* Generates the action dispatcher service.
|
|
5
|
-
*/
|
|
6
|
-
export declare function generateActionsDispatcherService({ models, meta }: {
|
|
7
|
-
models: Model[];
|
|
8
|
-
meta: SchemaMetaData;
|
|
9
|
-
}): string;
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateActionsDispatcherService = void 0;
|
|
4
|
-
const imports_1 = require("../../lib/imports");
|
|
5
|
-
const meta_1 = require("../../lib/meta");
|
|
6
|
-
const types_1 = require("../../lib/schema/types");
|
|
7
|
-
/**
|
|
8
|
-
* Generates the action dispatcher service.
|
|
9
|
-
*/
|
|
10
|
-
function generateActionsDispatcherService({ models, meta }) {
|
|
11
|
-
const imports = imports_1.ImportsGenerator.from(meta.actions.dispatcher.classLocation.path).addImports({
|
|
12
|
-
[meta.seed.serviceLocation.import]: [meta.seed.serviceClassName],
|
|
13
|
-
[meta.import.importService.location.import]: [meta.import.importService.name],
|
|
14
|
-
[meta.update.serviceLocation.import]: [meta.update.serviceClassName],
|
|
15
|
-
[meta.types.importPath]: (0, types_1.toAnnotatedTypeName)(meta.config.userType),
|
|
16
|
-
[meta.backendModules.db.databaseService.location.import]: [meta.backendModules.db.databaseService.name],
|
|
17
|
-
[meta.actions.execution.interfaceLocation.path]: [meta.actions.execution.interface],
|
|
18
|
-
});
|
|
19
|
-
const dataLoader = [];
|
|
20
|
-
for (const model of models) {
|
|
21
|
-
const modelMeta = (0, meta_1.getModelMetadata)({ model });
|
|
22
|
-
dataLoader.push(`await this.upload({ name: '${modelMeta.userFriendlyName}', data: data.${modelMeta.seed.constantName}, repo: this.dataService.${modelMeta.data.dataServiceName}, log })`);
|
|
23
|
-
}
|
|
24
|
-
return /* ts */ `
|
|
25
|
-
import { Injectable } from '@nestjs/common'
|
|
26
|
-
|
|
27
|
-
import { ExhaustiveSwitchCheck } from '@postxl/runtime'
|
|
28
|
-
|
|
29
|
-
${imports.generate()}
|
|
30
|
-
|
|
31
|
-
import { ActionExecutionFactory } from './execution/action'
|
|
32
|
-
import { Action, ResultOfAction } from './actions.types'
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@Injectable()
|
|
36
|
-
export class ${meta.actions.dispatcher.class} {
|
|
37
|
-
|
|
38
|
-
// As SeedModule and ImportModule get instantiated after the ActionsModule, we use this hack to avoid a circular dependency:
|
|
39
|
-
// we set the seedService and the importService to value and then overwrite it in the services' constructors.
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
|
|
41
|
-
public seedService: SeedService = {} as unknown as any
|
|
42
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
|
|
43
|
-
public ${meta.import.importService.sharedName}: ImportService = {} as unknown as any
|
|
44
|
-
|
|
45
|
-
constructor(
|
|
46
|
-
private readonly updateService: ${meta.update.serviceClassName},
|
|
47
|
-
private readonly databaseService: DatabaseService,
|
|
48
|
-
private readonly actionExecutionFactory: ActionExecutionFactory,
|
|
49
|
-
) {}
|
|
50
|
-
|
|
51
|
-
public async dispatch<A extends Action>({ action, user }: {
|
|
52
|
-
action: A;
|
|
53
|
-
user: ${meta.config.userType}
|
|
54
|
-
}): Promise<ResultOfAction<A>> {
|
|
55
|
-
const execution = await this.actionExecutionFactory.create({ action, databaseService: this.databaseService, user })
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
const result = await this.execute({ action, execution })
|
|
59
|
-
|
|
60
|
-
await execution.success(result)
|
|
61
|
-
|
|
62
|
-
return result
|
|
63
|
-
} catch (e) {
|
|
64
|
-
await execution.error(e)
|
|
65
|
-
throw e
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private async execute<A extends Action>({
|
|
70
|
-
action,
|
|
71
|
-
execution,
|
|
72
|
-
}: {
|
|
73
|
-
action: A
|
|
74
|
-
execution: IActionExecution
|
|
75
|
-
}): Promise<ResultOfAction<A>> {
|
|
76
|
-
switch (action.scope) {
|
|
77
|
-
${models
|
|
78
|
-
.map((model) => {
|
|
79
|
-
const modelMeta = (0, meta_1.getModelMetadata)({ model });
|
|
80
|
-
return `
|
|
81
|
-
case '${modelMeta.update.scopeName}': {
|
|
82
|
-
const method = this.updateService.${modelMeta.update.serviceVariableName}[action.type] as (params: {
|
|
83
|
-
data: A['payload']
|
|
84
|
-
execution: IActionExecution
|
|
85
|
-
}) => Promise<ResultOfAction<A>>
|
|
86
|
-
|
|
87
|
-
// NOTE: We need to bind the method to the service instance, as it is a method of the service and not a standalone function.
|
|
88
|
-
return method.bind(this.updateService.${modelMeta.update.serviceVariableName})({ data: action.payload, execution })
|
|
89
|
-
}
|
|
90
|
-
`;
|
|
91
|
-
})
|
|
92
|
-
.join('\n')}
|
|
93
|
-
|
|
94
|
-
case 'seed':
|
|
95
|
-
return this.seedService.dispatch({ action, execution }) as Promise<ResultOfAction<A>>
|
|
96
|
-
|
|
97
|
-
case 'import':
|
|
98
|
-
return this.importService.dispatch({ action, execution }) as Promise<ResultOfAction<A>>
|
|
99
|
-
|
|
100
|
-
default:
|
|
101
|
-
throw new ExhaustiveSwitchCheck(action)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
`;
|
|
106
|
-
}
|
|
107
|
-
exports.generateActionsDispatcherService = generateActionsDispatcherService;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { SchemaMetaData } from '../../../lib/meta';
|
|
2
|
-
import { Model } from '../../../lib/schema/schema';
|
|
3
|
-
/**
|
|
4
|
-
* Generates the Exporter class for the Export module
|
|
5
|
-
*/
|
|
6
|
-
export declare function generateExporterClass({ models, meta }: {
|
|
7
|
-
models: Model[];
|
|
8
|
-
meta: SchemaMetaData;
|
|
9
|
-
}): string;
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateExporterClass = void 0;
|
|
4
|
-
const imports_1 = require("../../../lib/imports");
|
|
5
|
-
const meta_1 = require("../../../lib/meta");
|
|
6
|
-
const types_1 = require("../../../lib/schema/types");
|
|
7
|
-
/**
|
|
8
|
-
* Generates the Exporter class for the Export module
|
|
9
|
-
*/
|
|
10
|
-
function generateExporterClass({ models, meta }) {
|
|
11
|
-
const imports = imports_1.ImportsGenerator.from(meta.export.exporterClass.location.path);
|
|
12
|
-
imports.addImports({
|
|
13
|
-
[meta.view.serviceLocation.import]: [meta.view.serviceClassName],
|
|
14
|
-
[meta.export.encoder.location.path]: [
|
|
15
|
-
meta.export.encoder.fullEncoderFunctionName,
|
|
16
|
-
(0, types_1.toAnnotatedTypeName)(meta.export.encoder.encodedExcelDataTypeName),
|
|
17
|
-
],
|
|
18
|
-
});
|
|
19
|
-
const typeExports = [];
|
|
20
|
-
const typeExportsDataEntries = [];
|
|
21
|
-
const privateMaps = [];
|
|
22
|
-
const exportDataProperties = [];
|
|
23
|
-
const addFunctions = [];
|
|
24
|
-
const addAllCalls = [];
|
|
25
|
-
for (const model of models) {
|
|
26
|
-
const modelMeta = (0, meta_1.getModelMetadata)({ model });
|
|
27
|
-
imports.addTypeImport({
|
|
28
|
-
from: modelMeta.types.importPath,
|
|
29
|
-
items: [modelMeta.types.brandedIdType, modelMeta.types.typeName],
|
|
30
|
-
});
|
|
31
|
-
typeExports.push(`export type ${modelMeta.export.exportDataTypeName} = CapitalizedKeys<${model.name}>`);
|
|
32
|
-
typeExportsDataEntries.push(`${modelMeta.export.exportDataPropertyName}?: ${modelMeta.export.exportDataTypeName}[]`);
|
|
33
|
-
privateMaps.push(`private ${modelMeta.internalPluralName} = new Map<${modelMeta.types.brandedIdType}, ${modelMeta.types.typeName}>()`);
|
|
34
|
-
exportDataProperties.push(`${modelMeta.export.exportDataFullPropertyName}: Array.from(this.${modelMeta.internalPluralName}.values())`);
|
|
35
|
-
const linkedItems = [];
|
|
36
|
-
for (const field of model.fields) {
|
|
37
|
-
if (field.kind !== 'relation') {
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
const linkedModelMeta = (0, meta_1.getModelMetadata)({ model: field.relationToModel });
|
|
41
|
-
if (field.isRequired) {
|
|
42
|
-
linkedItems.push(`await this.${linkedModelMeta.export.exportAddFunctionName}({id: item.${field.name}, includeChildren: false, user})`);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
linkedItems.push(`
|
|
46
|
-
if (item.${field.name}) {
|
|
47
|
-
await this.${linkedModelMeta.export.exportAddFunctionName}({id: item.${field.name}, includeChildren: false, user})
|
|
48
|
-
}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const childItemCalls = [];
|
|
52
|
-
for (const { referencingField, referencingModel } of model.references) {
|
|
53
|
-
const linkedModelMeta = (0, meta_1.getModelMetadata)({ model: referencingModel });
|
|
54
|
-
const linkedFieldMeta = (0, meta_1.getFieldMetadata)({ field: referencingField });
|
|
55
|
-
childItemCalls.push(`
|
|
56
|
-
// Add all ${linkedModelMeta.userFriendlyNamePlural} that are related to the ${modelMeta.userFriendlyName} via ${referencingField.name}
|
|
57
|
-
for (const ${referencingField.name} of await this.viewService.${linkedModelMeta.view.serviceVariableName}.data.${linkedFieldMeta.getByForeignKeyIdsMethodFnName}(id)) {
|
|
58
|
-
await this.${linkedModelMeta.export.exportAddFunctionName}({id: ${referencingField.name}, includeChildren, user})
|
|
59
|
-
}
|
|
60
|
-
`);
|
|
61
|
-
}
|
|
62
|
-
const childItems = childItemCalls.length > 0
|
|
63
|
-
? `
|
|
64
|
-
if (includeChildren) {
|
|
65
|
-
${childItemCalls.join('\n')}
|
|
66
|
-
}`
|
|
67
|
-
: '';
|
|
68
|
-
const signature = `{id, includeChildren = true, user}: {id: ${model.brandedIdType}, includeChildren?: boolean, user: User}`;
|
|
69
|
-
addFunctions.push(`
|
|
70
|
-
/**
|
|
71
|
-
* Adds a ${modelMeta.userFriendlyName} and all related (and nested) dependencies to the export.
|
|
72
|
-
*/
|
|
73
|
-
public async ${modelMeta.export.exportAddFunctionName}(${signature}) {
|
|
74
|
-
if (this.${modelMeta.internalPluralName}.has(id)) {
|
|
75
|
-
return
|
|
76
|
-
}
|
|
77
|
-
const item = await this.viewService.${modelMeta.view.serviceVariableName}.get({ id, user })
|
|
78
|
-
if (!item) {
|
|
79
|
-
this.logger.error(\`Cannot find ${modelMeta.userFriendlyName} \${id}\`)
|
|
80
|
-
return
|
|
81
|
-
}
|
|
82
|
-
this.${modelMeta.internalPluralName}.set(id, item)
|
|
83
|
-
|
|
84
|
-
${linkedItems.join('\n')}
|
|
85
|
-
|
|
86
|
-
${childItems}
|
|
87
|
-
}
|
|
88
|
-
`);
|
|
89
|
-
addAllCalls.push(`this.${modelMeta.internalPluralName} = await this.viewService.${modelMeta.view.serviceVariableName}.getAll(user)`);
|
|
90
|
-
}
|
|
91
|
-
return /* ts */ `
|
|
92
|
-
// For consistency, we include \`{ includeChildren = true }\` in the signature of every add function.
|
|
93
|
-
// If the model does not have any related models, the \`includeChildren\` parameter is ignored.
|
|
94
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
95
|
-
|
|
96
|
-
import { Logger } from '@nestjs/common'
|
|
97
|
-
|
|
98
|
-
${imports.generate()}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Exporter helps to export data items and all their (nested) dependencies to Excel format.
|
|
102
|
-
*
|
|
103
|
-
* Usage:
|
|
104
|
-
* - Create an instance of the Exporter
|
|
105
|
-
* - Call the \`add{ModelName}({id})\` methods to add the items you want to export.
|
|
106
|
-
* This will automatically add all dependencies of the item.
|
|
107
|
-
* - Call the \`exportData()\` method to get the encoded Excel data.
|
|
108
|
-
* - Alternatively, you can call 'exportAll()' to dump all data.
|
|
109
|
-
*/
|
|
110
|
-
export class ${meta.export.exporterClass.name} {
|
|
111
|
-
private logger = new Logger(Exporter.name)
|
|
112
|
-
|
|
113
|
-
${privateMaps.join('\n ')}
|
|
114
|
-
|
|
115
|
-
constructor(private readonly viewService: ViewService) {}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Exports all data that was added by prior calls to \`.add{Model}\` functions.
|
|
119
|
-
*/
|
|
120
|
-
public exportData(): ${meta.export.encoder.encodedExcelDataTypeName} {
|
|
121
|
-
return ${meta.export.encoder.fullEncoderFunctionName}({
|
|
122
|
-
${exportDataProperties.join(',\n ')}
|
|
123
|
-
})
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Exports all data.
|
|
128
|
-
*/
|
|
129
|
-
public async exportAll(user: User): Promise<${meta.export.encoder.encodedExcelDataTypeName}> {
|
|
130
|
-
${addAllCalls.join('\n')}
|
|
131
|
-
|
|
132
|
-
return this.exportData()
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
${addFunctions.join('\n\n')}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
`;
|
|
139
|
-
}
|
|
140
|
-
exports.generateExporterClass = generateExporterClass;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { SchemaMetaData } from '../../../lib/meta';
|
|
2
|
-
import { Model } from '../../../lib/schema/schema';
|
|
3
|
-
/**
|
|
4
|
-
* Generates the data encoder, aggregating all the models.
|
|
5
|
-
*/
|
|
6
|
-
export declare function generateExportEncoder({ models, meta }: {
|
|
7
|
-
models: Model[];
|
|
8
|
-
meta: SchemaMetaData;
|
|
9
|
-
}): string;
|