@nestledjs/api 0.0.5 → 0.0.8
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/package.json +2 -2
- package/src/account/generator.d.ts +3 -0
- package/src/account/generator.js +19 -0
- package/src/account/generator.js.map +1 -0
- package/src/app/generator.d.ts +6 -0
- package/src/app/generator.js +96 -0
- package/src/app/generator.js.map +1 -0
- package/src/config/generator.d.ts +3 -0
- package/src/config/generator.js +18 -0
- package/src/config/generator.js.map +1 -0
- package/src/core/generator.d.ts +3 -0
- package/src/core/generator.js +31 -0
- package/src/core/generator.js.map +1 -0
- package/src/custom/generator.d.ts +24 -0
- package/src/custom/generator.js +199 -0
- package/src/custom/generator.js.map +1 -0
- package/src/custom/schema.d.ts +5 -0
- package/src/custom/schema.js +3 -0
- package/src/custom/schema.js.map +1 -0
- package/src/extended/generator.d.ts +3 -0
- package/src/extended/generator.js +136 -0
- package/src/extended/generator.js.map +1 -0
- package/src/extended/index.d.ts +1 -0
- package/src/extended/index.js +7 -0
- package/src/extended/index.js.map +1 -0
- package/src/extended/{schema.ts → schema.d.ts} +2 -2
- package/src/extended/schema.js +3 -0
- package/src/extended/schema.js.map +1 -0
- package/src/generate-crud/generator.d.ts +50 -0
- package/src/generate-crud/generator.js +296 -0
- package/src/generate-crud/generator.js.map +1 -0
- package/src/generate-crud/schema.d.ts +8 -0
- package/src/generate-crud/schema.js +3 -0
- package/src/generate-crud/schema.js.map +1 -0
- package/src/index.d.ts +13 -0
- package/src/index.js +17 -0
- package/src/index.js.map +1 -0
- package/src/plugin/generator.d.ts +3 -0
- package/src/plugin/generator.js +74 -0
- package/src/plugin/generator.js.map +1 -0
- package/src/plugin/{schema.ts → schema.d.ts} +3 -3
- package/src/plugin/schema.js +3 -0
- package/src/plugin/schema.js.map +1 -0
- package/src/prisma/generator.d.ts +3 -0
- package/src/prisma/generator.js +61 -0
- package/src/prisma/generator.js.map +1 -0
- package/src/setup/generator.d.ts +3 -0
- package/src/setup/generator.js +104 -0
- package/src/setup/generator.js.map +1 -0
- package/src/smtp-mailer/generator.d.ts +2 -0
- package/src/smtp-mailer/generator.js +17 -0
- package/src/smtp-mailer/generator.js.map +1 -0
- package/src/user/generator.d.ts +2 -0
- package/src/user/generator.js +18 -0
- package/src/user/generator.js.map +1 -0
- package/src/utils/generator.d.ts +2 -0
- package/src/utils/generator.js +17 -0
- package/src/utils/generator.js.map +1 -0
- package/src/workspace-setup/generator.d.ts +1 -0
- package/src/workspace-setup/generator.js +42 -0
- package/src/workspace-setup/generator.js.map +1 -0
- package/src/workspace-setup/lib/helpers.d.ts +16 -0
- package/src/workspace-setup/lib/helpers.js +164 -0
- package/src/workspace-setup/lib/helpers.js.map +1 -0
- package/eslint.config.cjs +0 -28
- package/project.json +0 -51
- package/src/account/generator.spec.ts +0 -71
- package/src/account/generator.ts +0 -20
- package/src/app/generator.spec.ts +0 -112
- package/src/app/generator.ts +0 -105
- package/src/config/generator.spec.ts +0 -47
- package/src/config/generator.ts +0 -16
- package/src/core/generator.spec.ts +0 -85
- package/src/core/generator.ts +0 -35
- package/src/custom/generator.spec.ts +0 -75
- package/src/custom/generator.ts +0 -239
- package/src/custom/schema.ts +0 -5
- package/src/extended/generator.spec.ts +0 -95
- package/src/extended/generator.ts +0 -161
- package/src/extended/index.ts +0 -1
- package/src/generate-crud/generator.spec.ts +0 -84
- package/src/generate-crud/generator.ts +0 -354
- package/src/generate-crud/schema.ts +0 -8
- package/src/index.ts +0 -13
- package/src/plugin/generator.spec.ts +0 -18
- package/src/plugin/generator.ts +0 -74
- package/src/prisma/generator.spec.ts +0 -60
- package/src/prisma/generator.ts +0 -61
- package/src/setup/generator.spec.ts +0 -18
- package/src/setup/generator.ts +0 -107
- package/src/smtp-mailer/generator.spec.ts +0 -41
- package/src/smtp-mailer/generator.ts +0 -14
- package/src/user/generator.spec.ts +0 -41
- package/src/user/generator.ts +0 -15
- package/src/utils/generator.ts +0 -14
- package/src/workspace-setup/generator.spec.ts +0 -85
- package/src/workspace-setup/generator.ts +0 -57
- package/src/workspace-setup/lib/helpers.ts +0 -149
- package/tsconfig.json +0 -16
- package/tsconfig.lib.json +0 -23
- package/tsconfig.spec.json +0 -22
- package/vite.config.mts +0 -31
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
var generator_1 = require("./generator");
|
|
6
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(generator_1).default; } });
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../generators/api/src/extended/index.ts"],"names":[],"mappings":";;;;AAAA,yCAAqC;AAA5B,6HAAA,OAAO,OAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export interface GenerateExtendedGeneratorSchema {
|
|
2
|
-
|
|
3
|
-
}
|
|
2
|
+
overwrite?: boolean;
|
|
3
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../generators/api/src/extended/schema.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { formatFiles, generateFiles, installPackagesTask, joinPathFragments, names, Tree } from '@nx/devkit';
|
|
2
|
+
import { getDMMF } from '@prisma/internals';
|
|
3
|
+
import { apiLibraryGenerator, getPrismaSchemaPath, readPrismaSchema } from '@nestledjs/utils';
|
|
4
|
+
import { GenerateCrudGeneratorSchema } from './schema';
|
|
5
|
+
import { getNpmScope } from '@nx/js/src/utils/package-json/get-npm-scope';
|
|
6
|
+
import pluralize from 'pluralize';
|
|
7
|
+
interface CrudAuthConfig {
|
|
8
|
+
readOne?: string;
|
|
9
|
+
readMany?: string;
|
|
10
|
+
count?: string;
|
|
11
|
+
create?: string;
|
|
12
|
+
update?: string;
|
|
13
|
+
delete?: string;
|
|
14
|
+
}
|
|
15
|
+
interface ModelType {
|
|
16
|
+
name: string;
|
|
17
|
+
pluralName: string;
|
|
18
|
+
fields: ReadonlyArray<Record<string, unknown> & {
|
|
19
|
+
name: string;
|
|
20
|
+
type: string;
|
|
21
|
+
}>;
|
|
22
|
+
primaryField: string;
|
|
23
|
+
modelName: string;
|
|
24
|
+
modelPropertyName: string;
|
|
25
|
+
pluralModelName: string;
|
|
26
|
+
pluralModelPropertyName: string;
|
|
27
|
+
auth?: CrudAuthConfig;
|
|
28
|
+
}
|
|
29
|
+
export interface GenerateCrudGeneratorDependencies {
|
|
30
|
+
formatFiles: typeof formatFiles;
|
|
31
|
+
generateFiles: typeof generateFiles;
|
|
32
|
+
installPackagesTask: typeof installPackagesTask;
|
|
33
|
+
joinPathFragments: typeof joinPathFragments;
|
|
34
|
+
names: typeof names;
|
|
35
|
+
getDMMF: typeof getDMMF;
|
|
36
|
+
apiLibraryGenerator: typeof apiLibraryGenerator;
|
|
37
|
+
getPrismaSchemaPath: typeof getPrismaSchemaPath;
|
|
38
|
+
readPrismaSchema: typeof readPrismaSchema;
|
|
39
|
+
getNpmScope: typeof getNpmScope;
|
|
40
|
+
pluralize: typeof pluralize;
|
|
41
|
+
}
|
|
42
|
+
export declare function parseCrudAuth(comment: string): CrudAuthConfig | null;
|
|
43
|
+
export declare function getCrudAuthForModel(schema: string, modelName: string): CrudAuthConfig;
|
|
44
|
+
export declare function getGuardForAuthLevel(level: string): string | null;
|
|
45
|
+
export declare function generateResolverContent(model: ModelType, npmScope: string): string;
|
|
46
|
+
export declare function generateFeatureModuleContent(models: ModelType[], npmScope: string): string;
|
|
47
|
+
export declare function generateFeatureIndexContent(models: ModelType[]): string;
|
|
48
|
+
export declare function generateCrudLogic(tree: Tree, schema: GenerateCrudGeneratorSchema, dependencies: GenerateCrudGeneratorDependencies): Promise<() => void>;
|
|
49
|
+
export default function (tree: Tree, schema: GenerateCrudGeneratorSchema): Promise<() => void>;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCrudAuth = parseCrudAuth;
|
|
4
|
+
exports.getCrudAuthForModel = getCrudAuthForModel;
|
|
5
|
+
exports.getGuardForAuthLevel = getGuardForAuthLevel;
|
|
6
|
+
exports.generateResolverContent = generateResolverContent;
|
|
7
|
+
exports.generateFeatureModuleContent = generateFeatureModuleContent;
|
|
8
|
+
exports.generateFeatureIndexContent = generateFeatureIndexContent;
|
|
9
|
+
exports.generateCrudLogic = generateCrudLogic;
|
|
10
|
+
exports.default = default_1;
|
|
11
|
+
const tslib_1 = require("tslib");
|
|
12
|
+
const devkit_1 = require("@nx/devkit");
|
|
13
|
+
const internals_1 = require("@prisma/internals");
|
|
14
|
+
const utils_1 = require("@nestledjs/utils");
|
|
15
|
+
const get_npm_scope_1 = require("@nx/js/src/utils/package-json/get-npm-scope");
|
|
16
|
+
const pluralize_1 = tslib_1.__importDefault(require("pluralize"));
|
|
17
|
+
// STEP 2: DEFINE PURE HELPER & CONTENT GENERATION FUNCTIONS
|
|
18
|
+
// These functions are side-effect free and can be tested independently.
|
|
19
|
+
function parseCrudAuth(comment) {
|
|
20
|
+
try {
|
|
21
|
+
const match = comment.match(/@crudAuth:\s*(\{.*\})/);
|
|
22
|
+
if (!match)
|
|
23
|
+
return null;
|
|
24
|
+
return JSON.parse(match[1]);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.error('Error parsing @crudAuth:', e);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function getCrudAuthForModel(schema, modelName) {
|
|
32
|
+
const defaultConfig = {
|
|
33
|
+
readOne: 'admin',
|
|
34
|
+
readMany: 'admin',
|
|
35
|
+
count: 'admin',
|
|
36
|
+
create: 'admin',
|
|
37
|
+
update: 'admin',
|
|
38
|
+
delete: 'admin',
|
|
39
|
+
};
|
|
40
|
+
const lines = schema.split('\n');
|
|
41
|
+
let modelDoc = [];
|
|
42
|
+
let foundModel = false;
|
|
43
|
+
for (const line of lines) {
|
|
44
|
+
const trimmedLine = line.trim();
|
|
45
|
+
if (trimmedLine.startsWith(`model ${modelName}`) ||
|
|
46
|
+
trimmedLine.startsWith(`model ${modelName} `) ||
|
|
47
|
+
trimmedLine.startsWith(`model ${modelName}{`)) {
|
|
48
|
+
foundModel = true;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
else if (trimmedLine.startsWith('model ')) {
|
|
52
|
+
modelDoc = [];
|
|
53
|
+
}
|
|
54
|
+
else if (trimmedLine.startsWith('///') && !foundModel) {
|
|
55
|
+
modelDoc.push(trimmedLine);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!foundModel)
|
|
59
|
+
return defaultConfig;
|
|
60
|
+
const authLine = modelDoc.find((line) => line.includes('@crudAuth:'));
|
|
61
|
+
if (!authLine)
|
|
62
|
+
return defaultConfig;
|
|
63
|
+
const config = parseCrudAuth(authLine);
|
|
64
|
+
return config ? Object.assign(Object.assign({}, defaultConfig), config) : defaultConfig;
|
|
65
|
+
}
|
|
66
|
+
function getGuardForAuthLevel(level) {
|
|
67
|
+
if (!level)
|
|
68
|
+
return 'GqlAuthAdminGuard';
|
|
69
|
+
level = level.toLowerCase();
|
|
70
|
+
if (level === 'public')
|
|
71
|
+
return null;
|
|
72
|
+
if (level === 'user')
|
|
73
|
+
return 'GqlAuthGuard';
|
|
74
|
+
if (level === 'admin')
|
|
75
|
+
return 'GqlAuthAdminGuard';
|
|
76
|
+
const pascalCase = level.charAt(0).toUpperCase() + level.slice(1).toLowerCase();
|
|
77
|
+
return `GqlAuth${pascalCase}Guard`;
|
|
78
|
+
}
|
|
79
|
+
function toKebabCase(str) {
|
|
80
|
+
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
81
|
+
}
|
|
82
|
+
function generateResolverContent(model, npmScope) {
|
|
83
|
+
var _a, _b, _c, _d, _e, _f;
|
|
84
|
+
const usedGuards = new Set();
|
|
85
|
+
if (model.auth) {
|
|
86
|
+
Object.values(model.auth).forEach((level) => {
|
|
87
|
+
if (level === 'public')
|
|
88
|
+
return;
|
|
89
|
+
const guard = getGuardForAuthLevel(level);
|
|
90
|
+
if (guard)
|
|
91
|
+
usedGuards.add(guard);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
usedGuards.add('GqlAuthAdminGuard');
|
|
96
|
+
}
|
|
97
|
+
const guardImports = usedGuards.size > 0 ? `import { ${Array.from(usedGuards).sort().join(', ')} } from '@${npmScope}/api/utils'` : '';
|
|
98
|
+
const readManyGuardDecorator = ((_a = model.auth) === null || _a === void 0 ? void 0 : _a.readMany) ? getGuardForAuthLevel(model.auth.readMany) : 'GqlAuthAdminGuard';
|
|
99
|
+
const countGuardDecorator = ((_b = model.auth) === null || _b === void 0 ? void 0 : _b.count) ? getGuardForAuthLevel(model.auth.count) : 'GqlAuthAdminGuard';
|
|
100
|
+
const readOneGuardDecorator = ((_c = model.auth) === null || _c === void 0 ? void 0 : _c.readOne) ? getGuardForAuthLevel(model.auth.readOne) : 'GqlAuthAdminGuard';
|
|
101
|
+
const createGuardDecorator = ((_d = model.auth) === null || _d === void 0 ? void 0 : _d.create) ? getGuardForAuthLevel(model.auth.create) : 'GqlAuthAdminGuard';
|
|
102
|
+
const updateGuardDecorator = ((_e = model.auth) === null || _e === void 0 ? void 0 : _e.update) ? getGuardForAuthLevel(model.auth.update) : 'GqlAuthAdminGuard';
|
|
103
|
+
const deleteGuardDecorator = ((_f = model.auth) === null || _f === void 0 ? void 0 : _f.delete) ? getGuardForAuthLevel(model.auth.delete) : 'GqlAuthAdminGuard';
|
|
104
|
+
const readManyMethodName = model.pluralModelPropertyName;
|
|
105
|
+
const countMethodName = `${model.pluralModelPropertyName}Count`;
|
|
106
|
+
const readOneMethodName = model.modelPropertyName;
|
|
107
|
+
return `import { Args, Mutation, Query, Resolver, Info } from '@nestjs/graphql'
|
|
108
|
+
import { UseGuards } from '@nestjs/common'
|
|
109
|
+
import type { GraphQLResolveInfo } from 'graphql'
|
|
110
|
+
import { CorePaging } from '@${npmScope}/api/core/data-access'
|
|
111
|
+
import { ApiCrudDataAccessService } from '@${npmScope}/api/generated-crud/data-access'
|
|
112
|
+
import { ${model.modelName} } from '@${npmScope}/api/core/models'
|
|
113
|
+
import { Create${model.modelName}Input, List${model.modelName}Input, Update${model.modelName}Input } from '@${npmScope}/api/generated-crud/data-access'
|
|
114
|
+
${guardImports}
|
|
115
|
+
|
|
116
|
+
@Resolver(() => ${model.modelName})
|
|
117
|
+
export class Generated${model.modelName}Resolver {
|
|
118
|
+
constructor(private readonly service: ApiCrudDataAccessService) {}
|
|
119
|
+
|
|
120
|
+
@Query(() => [${model.modelName}], { nullable: true })
|
|
121
|
+
${readManyGuardDecorator ? `@UseGuards(${readManyGuardDecorator})` : ''}
|
|
122
|
+
${readManyMethodName}(
|
|
123
|
+
@Info() info: GraphQLResolveInfo,
|
|
124
|
+
@Args({ name: 'input', type: () => List${model.modelName}Input, nullable: true }) input?: List${model.modelName}Input,
|
|
125
|
+
) {
|
|
126
|
+
return this.service.${readManyMethodName}(info, input)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@Query(() => CorePaging, { nullable: true })
|
|
130
|
+
${countGuardDecorator ? `@UseGuards(${countGuardDecorator})` : ''}
|
|
131
|
+
${countMethodName}(
|
|
132
|
+
@Args({ name: 'input', type: () => List${model.modelName}Input, nullable: true }) input?: List${model.modelName}Input,
|
|
133
|
+
) {
|
|
134
|
+
return this.service.${countMethodName}(input)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@Query(() => ${model.modelName}, { nullable: true })
|
|
138
|
+
${readOneGuardDecorator ? `@UseGuards(${readOneGuardDecorator})` : ''}
|
|
139
|
+
${readOneMethodName}(
|
|
140
|
+
@Info() info: GraphQLResolveInfo,
|
|
141
|
+
@Args('${model.modelPropertyName}Id') ${model.modelPropertyName}Id: string
|
|
142
|
+
) {
|
|
143
|
+
return this.service.${readOneMethodName}(info, ${model.modelPropertyName}Id)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
@Mutation(() => ${model.modelName}, { nullable: true })
|
|
147
|
+
${createGuardDecorator ? `@UseGuards(${createGuardDecorator})` : ''}
|
|
148
|
+
create${model.modelName}(
|
|
149
|
+
@Info() info: GraphQLResolveInfo,
|
|
150
|
+
@Args('input') input: Create${model.modelName}Input,
|
|
151
|
+
) {
|
|
152
|
+
return this.service.create${model.modelName}(info, input)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@Mutation(() => ${model.modelName}, { nullable: true })
|
|
156
|
+
${updateGuardDecorator ? `@UseGuards(${updateGuardDecorator})` : ''}
|
|
157
|
+
update${model.modelName}(
|
|
158
|
+
@Info() info: GraphQLResolveInfo,
|
|
159
|
+
@Args('${model.modelPropertyName}Id') ${model.modelPropertyName}Id: string,
|
|
160
|
+
@Args('input') input: Update${model.modelName}Input,
|
|
161
|
+
) {
|
|
162
|
+
return this.service.update${model.modelName}(info, ${model.modelPropertyName}Id, input)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
@Mutation(() => ${model.modelName}, { nullable: true })
|
|
166
|
+
${deleteGuardDecorator ? `@UseGuards(${deleteGuardDecorator})` : ''}
|
|
167
|
+
delete${model.modelName}(
|
|
168
|
+
@Args('${model.modelPropertyName}Id') ${model.modelPropertyName}Id: string,
|
|
169
|
+
) {
|
|
170
|
+
return this.service.delete${model.modelName}(${model.modelPropertyName}Id)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
`;
|
|
174
|
+
}
|
|
175
|
+
function generateFeatureModuleContent(models, npmScope) {
|
|
176
|
+
return `import { Module } from '@nestjs/common'\nimport { ApiCrudDataAccessModule } from '@${npmScope}/api/generated-crud/data-access'\n${models
|
|
177
|
+
.map((model) => `import { Generated${model.modelName}Resolver } from './${toKebabCase(model.modelName)}.resolver'`)
|
|
178
|
+
.join('\n')}\n\n@Module({\n imports: [ApiCrudDataAccessModule],\n providers: [${models
|
|
179
|
+
.map((model) => `Generated${model.modelName}Resolver`)
|
|
180
|
+
.join(', ')}],\n})\nexport class ApiGeneratedCrudFeatureModule {}\n`;
|
|
181
|
+
}
|
|
182
|
+
function generateFeatureIndexContent(models) {
|
|
183
|
+
return `export * from './lib/api-admin-crud-feature.module'\n${models
|
|
184
|
+
.map((model) => `export * from './lib/${toKebabCase(model.modelName)}.resolver'`)
|
|
185
|
+
.join('\n')}\n`;
|
|
186
|
+
}
|
|
187
|
+
// STEP 3: DEFINE THE CORE LOGIC FUNCTION
|
|
188
|
+
// This function contains all the generator's logic but uses injected dependencies, making it testable.
|
|
189
|
+
function generateCrudLogic(tree, schema, dependencies) {
|
|
190
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
191
|
+
// Helper functions that now use injected dependencies
|
|
192
|
+
function getAllPrismaModels(tree) {
|
|
193
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
194
|
+
const prismaPath = dependencies.getPrismaSchemaPath(tree);
|
|
195
|
+
const prismaSchema = dependencies.readPrismaSchema(tree, prismaPath);
|
|
196
|
+
if (!prismaSchema) {
|
|
197
|
+
console.error(`No Prisma schema found at ${prismaPath}`);
|
|
198
|
+
return [];
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
const dmmf = yield dependencies.getDMMF({ datamodel: prismaSchema });
|
|
202
|
+
return dmmf.datamodel.models.map((model) => {
|
|
203
|
+
var _a;
|
|
204
|
+
const singularPropertyName = model.name.charAt(0).toLowerCase() + model.name.slice(1);
|
|
205
|
+
const pluralPropertyName = dependencies.pluralize(singularPropertyName);
|
|
206
|
+
const authConfig = getCrudAuthForModel(prismaSchema, model.name);
|
|
207
|
+
return {
|
|
208
|
+
name: model.name,
|
|
209
|
+
pluralName: dependencies.pluralize(model.name),
|
|
210
|
+
fields: model.fields.map((field) => (Object.assign({}, field))),
|
|
211
|
+
primaryField: ((_a = model.fields.find((f) => !f.isId && f.type === 'String')) === null || _a === void 0 ? void 0 : _a.name) || 'name',
|
|
212
|
+
modelName: model.name,
|
|
213
|
+
modelPropertyName: singularPropertyName,
|
|
214
|
+
pluralModelName: dependencies.pluralize(model.name),
|
|
215
|
+
pluralModelPropertyName: pluralPropertyName,
|
|
216
|
+
auth: authConfig,
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.error('Error parsing Prisma schema:', error);
|
|
222
|
+
return [];
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
function createLibraries(tree, name) {
|
|
227
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
228
|
+
const dataAccessLibraryRoot = `libs/api/${name}/data-access`;
|
|
229
|
+
const featureLibraryRoot = `libs/api/${name}/feature`;
|
|
230
|
+
const dataAccessTemplatePath = dependencies.joinPathFragments(__dirname, './files/data-access');
|
|
231
|
+
const featureTemplatePath = dependencies.joinPathFragments(__dirname, './files/feature');
|
|
232
|
+
yield dependencies.apiLibraryGenerator(tree, { name }, dataAccessTemplatePath, 'data-access');
|
|
233
|
+
yield dependencies.apiLibraryGenerator(tree, { name }, featureTemplatePath, 'feature');
|
|
234
|
+
return { dataAccessLibraryRoot, featureLibraryRoot };
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
function generateModelFiles(tree, dataAccessLibraryRoot, featureLibraryRoot, models, name) {
|
|
238
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
239
|
+
const npmScope = dependencies.getNpmScope(tree);
|
|
240
|
+
const nameObj = dependencies.names(name);
|
|
241
|
+
const substitutions = Object.assign(Object.assign({}, nameObj), { name, models, npmScope: `@${npmScope}`, apiClassName: 'PrismaCrud', tmpl: '' });
|
|
242
|
+
dependencies.generateFiles(tree, dependencies.joinPathFragments(__dirname, './files/data-access/src/lib'), dependencies.joinPathFragments(dataAccessLibraryRoot, 'src/lib'), Object.assign(Object.assign({}, substitutions), { type: 'data-access' }));
|
|
243
|
+
dependencies.generateFiles(tree, dependencies.joinPathFragments(__dirname, './files/data-access/src'), dependencies.joinPathFragments(dataAccessLibraryRoot, 'src'), Object.assign(Object.assign({}, substitutions), { type: 'data-access' }));
|
|
244
|
+
const featureModuleContent = generateFeatureModuleContent(models, npmScope);
|
|
245
|
+
tree.write(dependencies.joinPathFragments(featureLibraryRoot, 'src/lib/api-admin-crud-feature.module.ts'), featureModuleContent);
|
|
246
|
+
const featureIndexContent = generateFeatureIndexContent(models);
|
|
247
|
+
tree.write(dependencies.joinPathFragments(featureLibraryRoot, 'src/index.ts'), featureIndexContent);
|
|
248
|
+
for (const model of models) {
|
|
249
|
+
const resolverFilePath = dependencies.joinPathFragments(featureLibraryRoot, `src/lib/${toKebabCase(model.modelName)}.resolver.ts`);
|
|
250
|
+
const resolverContent = generateResolverContent(model, npmScope);
|
|
251
|
+
tree.write(resolverFilePath, resolverContent);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Main Orchestration Logic
|
|
256
|
+
const name = schema.name || 'generated-crud';
|
|
257
|
+
const models = yield getAllPrismaModels(tree);
|
|
258
|
+
if (models.length === 0) {
|
|
259
|
+
console.error('No Prisma models found');
|
|
260
|
+
return; // Return early for the test case
|
|
261
|
+
}
|
|
262
|
+
const { dataAccessLibraryRoot, featureLibraryRoot } = yield createLibraries(tree, name);
|
|
263
|
+
yield generateModelFiles(tree, dataAccessLibraryRoot, featureLibraryRoot, models, name);
|
|
264
|
+
yield dependencies.formatFiles(tree);
|
|
265
|
+
return () => {
|
|
266
|
+
dependencies.installPackagesTask(tree);
|
|
267
|
+
};
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// STEP 4: DEFINE THE DEFAULT EXPORT
|
|
271
|
+
// This is what Nx CLI executes. It's a simple wrapper that provides the *real* dependencies to the logic function.
|
|
272
|
+
function default_1(tree, schema) {
|
|
273
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
274
|
+
const dependencies = {
|
|
275
|
+
formatFiles: devkit_1.formatFiles,
|
|
276
|
+
generateFiles: devkit_1.generateFiles,
|
|
277
|
+
installPackagesTask: devkit_1.installPackagesTask,
|
|
278
|
+
joinPathFragments: devkit_1.joinPathFragments,
|
|
279
|
+
names: devkit_1.names,
|
|
280
|
+
getDMMF: internals_1.getDMMF,
|
|
281
|
+
apiLibraryGenerator: utils_1.apiLibraryGenerator,
|
|
282
|
+
getPrismaSchemaPath: utils_1.getPrismaSchemaPath,
|
|
283
|
+
readPrismaSchema: utils_1.readPrismaSchema,
|
|
284
|
+
getNpmScope: get_npm_scope_1.getNpmScope,
|
|
285
|
+
pluralize: pluralize_1.default,
|
|
286
|
+
};
|
|
287
|
+
try {
|
|
288
|
+
return yield generateCrudLogic(tree, schema, dependencies);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
console.error('Error in CRUD generator:', error);
|
|
292
|
+
throw error;
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/generate-crud/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../generators/api/src/generate-crud/schema.ts"],"names":[],"mappings":""}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './account/generator';
|
|
2
|
+
export * from './app/generator';
|
|
3
|
+
export * from './config/generator';
|
|
4
|
+
export * from './core/generator';
|
|
5
|
+
export * from './custom/generator';
|
|
6
|
+
export * from './generate-crud/generator';
|
|
7
|
+
export * from './smtp-mailer/generator';
|
|
8
|
+
export * from './prisma/generator';
|
|
9
|
+
export * from './setup/generator';
|
|
10
|
+
export * from './user/generator';
|
|
11
|
+
export * from './workspace-setup/generator';
|
|
12
|
+
export * from './plugin/generator';
|
|
13
|
+
export * from './utils/generator';
|
package/src/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./account/generator"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./app/generator"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./config/generator"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./core/generator"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./custom/generator"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./generate-crud/generator"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./smtp-mailer/generator"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./prisma/generator"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./setup/generator"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./user/generator"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./workspace-setup/generator"), exports);
|
|
15
|
+
tslib_1.__exportStar(require("./plugin/generator"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./utils/generator"), exports);
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../generators/api/src/index.ts"],"names":[],"mappings":";;;AAAA,8DAAmC;AACnC,0DAA+B;AAC/B,6DAAkC;AAClC,2DAAgC;AAChC,6DAAkC;AAClC,oEAAyC;AACzC,kEAAuC;AACvC,6DAAkC;AAClC,4DAAiC;AACjC,2DAAgC;AAChC,sEAA2C;AAC3C,6DAAkC;AAClC,4DAAiC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = default_1;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
function toKebabCase(str) {
|
|
8
|
+
return str
|
|
9
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
10
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
|
|
11
|
+
.toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
function toPascalCase(str) {
|
|
14
|
+
return str
|
|
15
|
+
.replace(/(^\w|[-_\s]\w)/g, (match) => match.replace(/[-_\s]/, '').toUpperCase());
|
|
16
|
+
}
|
|
17
|
+
function ensureDirExists(tree, path) {
|
|
18
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
if (!tree.exists(path)) {
|
|
20
|
+
// Directory will be created when a file is written into it
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function default_1(tree, schema) {
|
|
25
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
const name = schema.name;
|
|
27
|
+
if (!name)
|
|
28
|
+
throw new Error('Name is required');
|
|
29
|
+
const kebabName = toKebabCase(name);
|
|
30
|
+
const className = toPascalCase(name);
|
|
31
|
+
const customLibraryRoot = schema.directory ? `libs/api/${schema.directory}/custom` : `libs/api/custom`;
|
|
32
|
+
const pluginsDir = (0, path_1.join)(customLibraryRoot, 'src/lib/plugins');
|
|
33
|
+
const pluginFolder = (0, path_1.join)(pluginsDir, kebabName);
|
|
34
|
+
yield ensureDirExists(tree, pluginsDir);
|
|
35
|
+
yield ensureDirExists(tree, pluginFolder);
|
|
36
|
+
// Service
|
|
37
|
+
const serviceContent = `import { Injectable } from '@nestjs/common'
|
|
38
|
+
|
|
39
|
+
@Injectable()
|
|
40
|
+
export class ${className}Service {
|
|
41
|
+
// Add your service logic here
|
|
42
|
+
}
|
|
43
|
+
`;
|
|
44
|
+
tree.write((0, path_1.join)(pluginFolder, `${kebabName}.service.ts`), serviceContent);
|
|
45
|
+
// Resolver
|
|
46
|
+
const resolverContent = `import { Resolver } from '@nestjs/graphql'
|
|
47
|
+
import { Injectable } from '@nestjs/common'
|
|
48
|
+
|
|
49
|
+
@Resolver()
|
|
50
|
+
@Injectable()
|
|
51
|
+
export class ${className}Resolver {
|
|
52
|
+
// Add your resolver logic here
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
tree.write((0, path_1.join)(pluginFolder, `${kebabName}.resolver.ts`), resolverContent);
|
|
56
|
+
// Module
|
|
57
|
+
const moduleContent = `import { Module } from '@nestjs/common'
|
|
58
|
+
import { ${className}Service } from './${kebabName}.service'
|
|
59
|
+
import { ${className}Resolver } from './${kebabName}.resolver'
|
|
60
|
+
|
|
61
|
+
@Module({
|
|
62
|
+
providers: [${className}Service, ${className}Resolver],
|
|
63
|
+
exports: [${className}Service, ${className}Resolver],
|
|
64
|
+
})
|
|
65
|
+
export class ${className}Module {}
|
|
66
|
+
`;
|
|
67
|
+
tree.write((0, path_1.join)(pluginFolder, `${kebabName}.module.ts`), moduleContent);
|
|
68
|
+
yield (0, devkit_1.formatFiles)(tree);
|
|
69
|
+
return () => {
|
|
70
|
+
(0, devkit_1.installPackagesTask)(tree);
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/plugin/generator.ts"],"names":[],"mappings":";;AAsBA,4BAmDC;;AAzED,uCAAmE;AACnE,+BAA2B;AAG3B,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC;SACxC,WAAW,EAAE,CAAA;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;AACrF,CAAC;AAED,SAAe,eAAe,CAAC,IAAU,EAAE,IAAY;;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,2DAA2D;QAC7D,CAAC;IACH,CAAC;CAAA;AAED,mBAA+B,IAAU,EAAE,MAAqC;;QAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAA;QACtG,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;QAC7D,MAAM,YAAY,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,SAAS,CAAC,CAAA;QAEhD,MAAM,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QACvC,MAAM,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QAEzC,UAAU;QACV,MAAM,cAAc,GAAG;;;eAGV,SAAS;;;CAGvB,CAAA;QACC,IAAI,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,YAAY,EAAE,GAAG,SAAS,aAAa,CAAC,EAAE,cAAc,CAAC,CAAA;QAEzE,WAAW;QACX,MAAM,eAAe,GAAG;;;;;eAKX,SAAS;;;CAGvB,CAAA;QACC,IAAI,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,YAAY,EAAE,GAAG,SAAS,cAAc,CAAC,EAAE,eAAe,CAAC,CAAA;QAE3E,SAAS;QACT,MAAM,aAAa,GAAG;WACb,SAAS,qBAAqB,SAAS;WACvC,SAAS,sBAAsB,SAAS;;;gBAGnC,SAAS,YAAY,SAAS;cAChC,SAAS,YAAY,SAAS;;eAE7B,SAAS;CACvB,CAAA;QACC,IAAI,CAAC,KAAK,CAAC,IAAA,WAAI,EAAC,YAAY,EAAE,GAAG,SAAS,YAAY,CAAC,EAAE,aAAa,CAAC,CAAA;QAEvE,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;QACvB,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAA;IACH,CAAC;CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export interface GeneratePluginGeneratorSchema {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
2
|
+
name: string;
|
|
3
|
+
directory?: string;
|
|
4
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../generators/api/src/plugin/schema.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = generateLibraries;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
|
+
const utils_1 = require("@nestledjs/utils");
|
|
7
|
+
function generateLibraries(tree_1) {
|
|
8
|
+
return tslib_1.__awaiter(this, arguments, void 0, function* (tree, options = {}) {
|
|
9
|
+
const templateRootPath = (0, devkit_1.joinPathFragments)(__dirname, './files');
|
|
10
|
+
const overwrite = options.overwrite === true;
|
|
11
|
+
// Update package.json
|
|
12
|
+
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
|
13
|
+
// Add prisma schema path
|
|
14
|
+
json.prisma = {
|
|
15
|
+
schema: 'libs/api/prisma/src/lib/schemas',
|
|
16
|
+
seed: 'ts-node --project libs/api/core/models/tsconfig.lib.json libs/api/prisma/src/lib/seed/seed.ts',
|
|
17
|
+
};
|
|
18
|
+
// Add GraphQL model generation script for the 'core' library
|
|
19
|
+
if (!json.scripts) {
|
|
20
|
+
json.scripts = {};
|
|
21
|
+
}
|
|
22
|
+
if (!json.scripts['generate:models']) {
|
|
23
|
+
json.scripts['generate:models'] =
|
|
24
|
+
'ts-node --project libs/api/core/models/tsconfig.lib.json libs/api/core/models/src/lib/generate-models.ts';
|
|
25
|
+
}
|
|
26
|
+
// Add all requested prisma scripts if not already present
|
|
27
|
+
if (!json.scripts['prisma:apply']) {
|
|
28
|
+
json.scripts['prisma:apply'] = 'pnpm prisma:format && pnpm prisma db push';
|
|
29
|
+
}
|
|
30
|
+
if (!json.scripts['prisma:db-push']) {
|
|
31
|
+
json.scripts['prisma:db-push'] = 'pnpm prisma db push';
|
|
32
|
+
}
|
|
33
|
+
if (!json.scripts['prisma:format']) {
|
|
34
|
+
json.scripts['prisma:format'] = 'pnpm prisma format';
|
|
35
|
+
}
|
|
36
|
+
if (!json.scripts['prisma:generate']) {
|
|
37
|
+
json.scripts['prisma:generate'] = 'pnpm prisma generate';
|
|
38
|
+
}
|
|
39
|
+
if (!json.scripts['prisma:migrate']) {
|
|
40
|
+
json.scripts['prisma:migrate'] = 'pnpm prisma migrate save && pnpm prisma migrate up';
|
|
41
|
+
}
|
|
42
|
+
if (!json.scripts['prisma:seed']) {
|
|
43
|
+
json.scripts['prisma:seed'] =
|
|
44
|
+
'ts-node --project libs/api/prisma/tsconfig.lib.json libs/api/prisma/src/lib/seed/seed.ts';
|
|
45
|
+
}
|
|
46
|
+
if (!json.scripts['prisma:studio']) {
|
|
47
|
+
json.scripts['prisma:studio'] = 'pnpm nx prisma:studio api';
|
|
48
|
+
}
|
|
49
|
+
if (!json.scripts['prisma:reset']) {
|
|
50
|
+
json.scripts['prisma:reset'] = 'pnpm prisma migrate reset && pnpm prisma:seed';
|
|
51
|
+
}
|
|
52
|
+
return json;
|
|
53
|
+
});
|
|
54
|
+
yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'prisma', overwrite }, templateRootPath);
|
|
55
|
+
yield (0, devkit_1.formatFiles)(tree);
|
|
56
|
+
return () => {
|
|
57
|
+
(0, devkit_1.installPackagesTask)(tree);
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/prisma/generator.ts"],"names":[],"mappings":";;AAIA,oCAwDC;;AA5DD,uCAAkG;AAClG,4CAAsD;AAGtD,SAA8B,iBAAiB;iEAAC,IAAU,EAAE,UAAoC,EAAE;QAChG,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAA;QAE5C,sBAAsB;QACtB,IAAA,mBAAU,EAAC,IAAI,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;YACxC,yBAAyB;YACzB,IAAI,CAAC,MAAM,GAAG;gBACZ,MAAM,EAAE,iCAAiC;gBACzC,IAAI,EAAE,+FAA+F;aACtG,CAAA;YACD,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;YACnB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;oBAC7B,0GAA0G,CAAA;YAC9G,CAAC;YAED,0DAA0D;YAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,2CAA2C,CAAA;YAC5E,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,qBAAqB,CAAA;YACxD,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,oBAAoB,CAAA;YACtD,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,sBAAsB,CAAA;YAC1D,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,oDAAoD,CAAA;YACvF,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;oBACzB,0FAA0F,CAAA;YAC9F,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,2BAA2B,CAAA;YAC7D,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,+CAA+C,CAAA;YAChF,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,CAAC,CAAA;QAEhF,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;QAEvB,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAA;IACH,CAAC;CAAA"}
|