@autobe/compiler 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/AutoBeInterfaceCompiler.js +1 -1
- package/lib/AutoBeInterfaceCompiler.js.map +1 -1
- package/lib/prisma/validatePrismaApplication.js +162 -29
- package/lib/prisma/validatePrismaApplication.js.map +1 -1
- package/lib/prisma/writePrismaApplication.js +3 -2
- package/lib/prisma/writePrismaApplication.js.map +1 -1
- package/lib/raw/AutoBeCompilerConstants.d.ts +1 -1
- package/lib/utils/StringUtil.d.ts +4 -0
- package/lib/utils/StringUtil.js +43 -0
- package/lib/utils/StringUtil.js.map +1 -0
- package/package.json +2 -2
- package/src/prisma/validatePrismaApplication.ts +188 -38
- package/src/prisma/writePrismaApplication.ts +3 -2
- package/src/raw/AutoBeCompilerConstants.ts +1 -1
- package/src/utils/StringUtil.ts +45 -0
|
@@ -40,7 +40,7 @@ class AutoBeInterfaceCompiler {
|
|
|
40
40
|
? yield beautify(value)
|
|
41
41
|
: value,
|
|
42
42
|
];
|
|
43
|
-
})))), { "packages/api/swagger.json": JSON.stringify(swagger, null, 2), "README.md": "# AutoBE Generated Backend Server\n\n\n\nA backend repository generated by [`@autobe`](https://github.com/wrtnlabs/autobe).\n\nThis backend program was automatically generated using [`@autobe`](https://github.com/wrtnlabs/autobe), the AI vibe coding agent for backend servers of below stack.\n\n- TypeScript\n- NestJS / Nestia\n- Prisma\n- Postgres\n\n## Project Structure\n\nThis template project has categorized directories like below.\n\
|
|
43
|
+
})))), { "packages/api/swagger.json": JSON.stringify(swagger, null, 2), "README.md": "# AutoBE Generated Backend Server\n\n\n\nA backend repository generated by [`@autobe`](https://github.com/wrtnlabs/autobe).\n\nThis backend program was automatically generated using [`@autobe`](https://github.com/wrtnlabs/autobe), the AI vibe coding agent for backend servers of below stack.\n\n- TypeScript\n- NestJS / Nestia\n- Prisma\n- Postgres\n\n## Project Structure\n\nThis template project has categorized directories like below.\n\nAt first, [`@autobe`](https://github.com/wrtnlabs/autobe) generated files are placed like below:\n\n- analysis agent: [docs/analysis](docs/analysis)\n- prisma agent\n - [prisma/schema](prisma/schema)\n - [docs/ERD.md](docs/ERD.md)\n- interface agent\n - [src/api/structures](src/api/structures): DTO structures\n - [src/api/controllers](src/controllers): API controller classes\n - [test/features](test/features): List of e2e test functions\n\nFrom a source code perspective, all backend files are organized within the `src` directory.\n\nWhen you build the TypeScript source files, compiled files will be placed in the `lib` directory according to the [tsconfig.json](tsconfig.json) configuration.\n\nOtherwise you build client [SDK](https://nestia.io/docs/sdk) library for npm publishing and their compiled files would be placed into the [packages/api](packages/api) directory.\n\n - [packages/api](packages/api): SDK module built by `npm run build:api`\n - [src](src): Backend source directory\n - [src/api](src/api): Client SDK that would be published to the `@ORGANIZATION/PROJECT-api`\n - [src/api/functional](src/api/functional): API functions generated by the [`nestia`](https://github.com/samchon/nestia)\n - [src/api/structures](src/api/structures): DTO structures\n - [src/controllers](src/controllers): Controller classes of the Main Program\n - [**test/**](test): Test Automation Program\n - [test/features](test/features): List of test functions\n - [nestia.config.ts](nestia.config.ts): Configuration file of [`nestia`](https://github.com/samchon/nestia)\n - [package.json](package.json): NPM configuration\n - [tsconfig.json](tsconfig.json): TypeScript configuration for the main program\n\n## NPM Run Commands\n\nList of the run commands defined in the [package.json](package.json) are like below:\n\n - Test\n - **`test`**: Run test automation program\n - `benchmark`: Run performance benchmark program\n - Build\n - `build`: Build everything\n - `build:main`: Build main program (`src` directory)\n - `build:test` Build test automation program (`test` directory)\n - `build:sdk`: Build SDK into main program only\n - `build:swagger`: Build Swagger Documents\n - **`dev`**: Incremental build for development (test program)\n - Deploy\n - `package:api`: Build and deploy the SDK library to the NPM\n - `start`: Start the backend server\n - `start:dev`: Start the backend server with incremental build and reload\n - Webpack\n - `webpack`: Run webpack bundler\n - `webpack:start`: Start the backend server built by webpack\n - `webpack:test`: Run test program to the webpack built\n\n## Specialization\n\nTransform this template project to be yours.\n\nWhen you've created a new backend project through this template project, you can specialize it to be suitable for you by changing some words. Replace below words through IDE specific function like `Edit > Replace in Files` (*Ctrl + Shift + H*), who've been supported by the VSCode.\n\n| Before | After\n|--------------|----------------------------------------\n| ORGANIZATION | Your account or corporation name\n| PROJECT | Your own project name\n| AUTHOR | Author name\n| https://github.com/samchon/nestia-start | Your repository URL" /* AutoBeCompilerConstants.README */ });
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoBeInterfaceCompiler.js","sourceRoot":"","sources":["../src/AutoBeInterfaceCompiler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,6CAA2D;AAC3D,8CAAwD;AACxD,yGAA+D;AAC/D,sDAA8B;AAC9B,uCAAkC;AAGlC,iDAA8C;AAE9C,MAAa,uBAAuB;IACrB,OAAO,CAClB,QAAiC;;YAEjC,MAAM,OAAO,GAAsB,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,OAAO,GAA6B,IAAI,kCAAwB,CACpE,OAAO,CACR,CAAC;YACF,MAAM,KAAK,GAA2B,OAAO,CAAC,IAAI,CAAC;gBACjD,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,GAAG,EAAE,IAAI;gBACT,MAAM,EAAE;oBACN,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,0DAA0D;iBAClE;aACF,CAAC,CAAC;YACH,uCACK,MAAM,CAAC,WAAW,CACnB,MAAM,qBAAS,CAAC,QAAQ,CACtB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EACrB,KAAqB,EAAE,0CAAhB,CAAC,GAAG,EAAE,KAAK,CAAC;gBAAK,OAAA;oBACtB,GAAG;oBACH,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,KAAK;wBACpD,CAAC,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC;wBACvB,CAAC,CAAC,KAAK;iBACV,CAAA;cAAA,CACF,CACF,KACD,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7D,WAAW,
|
|
1
|
+
{"version":3,"file":"AutoBeInterfaceCompiler.js","sourceRoot":"","sources":["../src/AutoBeInterfaceCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.validatePrismaApplication = validatePrismaApplication;
|
|
4
4
|
const tstl_1 = require("tstl");
|
|
5
5
|
const MapUtil_1 = require("../utils/MapUtil");
|
|
6
|
+
const StringUtil_1 = require("../utils/StringUtil");
|
|
6
7
|
function validatePrismaApplication(application) {
|
|
7
8
|
const dict = new Map(application.files
|
|
8
|
-
.map((file) => file.models)
|
|
9
|
-
.
|
|
10
|
-
|
|
9
|
+
.map((file, fi) => file.models.map((model, mi) => [
|
|
10
|
+
model.name,
|
|
11
|
+
{
|
|
12
|
+
file,
|
|
13
|
+
model,
|
|
14
|
+
fileIndex: fi,
|
|
15
|
+
modelIndex: mi,
|
|
16
|
+
},
|
|
17
|
+
]))
|
|
18
|
+
.flat());
|
|
11
19
|
const errors = [
|
|
12
20
|
...validateDuplicatedFiles(application),
|
|
13
21
|
...validateDuplicatedModels(application),
|
|
@@ -15,7 +23,7 @@ function validatePrismaApplication(application) {
|
|
|
15
23
|
.map((file, fi) => file.models.map((model, mi) => {
|
|
16
24
|
const accessor = `application.files[${fi}].models[${mi}]`;
|
|
17
25
|
return [
|
|
18
|
-
...validateDuplicatedFields(model, accessor),
|
|
26
|
+
...validateDuplicatedFields(dict, model, accessor),
|
|
19
27
|
...validateDuplicatedIndexes(model, accessor),
|
|
20
28
|
...validateIndexes(model, accessor),
|
|
21
29
|
...validateReferences(model, accessor, dict),
|
|
@@ -24,8 +32,15 @@ function validatePrismaApplication(application) {
|
|
|
24
32
|
.flat(2),
|
|
25
33
|
];
|
|
26
34
|
return errors.length === 0
|
|
27
|
-
? {
|
|
28
|
-
|
|
35
|
+
? {
|
|
36
|
+
success: true,
|
|
37
|
+
data: application,
|
|
38
|
+
}
|
|
39
|
+
: {
|
|
40
|
+
success: false,
|
|
41
|
+
data: application,
|
|
42
|
+
errors,
|
|
43
|
+
};
|
|
29
44
|
}
|
|
30
45
|
/* -----------------------------------------------------------
|
|
31
46
|
DUPLICATES
|
|
@@ -91,12 +106,13 @@ function validateDuplicatedModels(app) {
|
|
|
91
106
|
});
|
|
92
107
|
return errors;
|
|
93
108
|
}
|
|
94
|
-
function validateDuplicatedFields(model, accessor) {
|
|
109
|
+
function validateDuplicatedFields(dict, model, accessor) {
|
|
110
|
+
const errors = [];
|
|
111
|
+
// FIND DUPLICATED FIELDS
|
|
95
112
|
const group = new Map();
|
|
96
113
|
MapUtil_1.MapUtil.take(group, model.primaryField.name, () => []).push(`${accessor}.primaryField.name`);
|
|
97
114
|
model.foreignFields.forEach((field, i) => MapUtil_1.MapUtil.take(group, field.name, () => []).push(`${accessor}.foreignFields[${i}].name`));
|
|
98
115
|
model.plainFields.forEach((field, i) => MapUtil_1.MapUtil.take(group, field.name, () => []).push(`${accessor}.plainFields[${i}].name`));
|
|
99
|
-
const errors = [];
|
|
100
116
|
for (const [field, array] of group)
|
|
101
117
|
if (array.length !== 1)
|
|
102
118
|
array.forEach((path, i) => {
|
|
@@ -113,9 +129,28 @@ function validateDuplicatedFields(model, accessor) {
|
|
|
113
129
|
].join("\n"),
|
|
114
130
|
});
|
|
115
131
|
});
|
|
132
|
+
// FIND TABLE NAMED FIELDS
|
|
133
|
+
model.plainFields.forEach((field, i) => {
|
|
134
|
+
if (dict.has(field.name) === true)
|
|
135
|
+
errors.push({
|
|
136
|
+
path: `${accessor}.plainFields[${i}].name`,
|
|
137
|
+
table: model.name,
|
|
138
|
+
field: field.name,
|
|
139
|
+
message: StringUtil_1.StringUtil.trim `
|
|
140
|
+
There's a same named table in the application.
|
|
141
|
+
|
|
142
|
+
Check whether the field has been designed for denormalization
|
|
143
|
+
like pre-calculation. If do so, remove the field.
|
|
144
|
+
|
|
145
|
+
Otherwise, change the field name to something else.
|
|
146
|
+
`,
|
|
147
|
+
});
|
|
148
|
+
});
|
|
116
149
|
return errors;
|
|
117
150
|
}
|
|
118
151
|
function validateDuplicatedIndexes(model, accessor) {
|
|
152
|
+
const errors = [];
|
|
153
|
+
// FIND DUPLICATED INDEXES
|
|
119
154
|
const group = new tstl_1.HashMap((x) => (0, tstl_1.hash)(...x), (x, y) => x.length === y.length && x.every((v, i) => v === y[i]));
|
|
120
155
|
model.uniqueIndexes.forEach((unique, i) => group
|
|
121
156
|
.take(unique.fieldNames, () => [])
|
|
@@ -126,7 +161,6 @@ function validateDuplicatedIndexes(model, accessor) {
|
|
|
126
161
|
model.ginIndexes.forEach((gin, i) => group
|
|
127
162
|
.take([gin.fieldName], () => [])
|
|
128
163
|
.push(`${accessor}.ginIndexes[${i}].fieldName`));
|
|
129
|
-
const errors = [];
|
|
130
164
|
for (const { first: fieldNames, second: array } of group)
|
|
131
165
|
if (array.length !== 1)
|
|
132
166
|
array.forEach((path, i) => {
|
|
@@ -135,7 +169,7 @@ function validateDuplicatedIndexes(model, accessor) {
|
|
|
135
169
|
table: model.name,
|
|
136
170
|
field: null,
|
|
137
171
|
message: [
|
|
138
|
-
`Duplicated index found (${fieldNames.join(", ")})
|
|
172
|
+
`Duplicated index found (${fieldNames.join(", ")}).`,
|
|
139
173
|
"",
|
|
140
174
|
"Accessors of the other duplicated indexes are:",
|
|
141
175
|
"",
|
|
@@ -143,18 +177,84 @@ function validateDuplicatedIndexes(model, accessor) {
|
|
|
143
177
|
].join("\n"),
|
|
144
178
|
});
|
|
145
179
|
});
|
|
180
|
+
// SUBSET RELATIONS
|
|
181
|
+
model.uniqueIndexes.forEach((unique, i) => {
|
|
182
|
+
if (unique.fieldNames.length <= 1)
|
|
183
|
+
return;
|
|
184
|
+
unique.fieldNames.forEach((_, j, array) => {
|
|
185
|
+
if (j === array.length - 1)
|
|
186
|
+
return;
|
|
187
|
+
const subset = unique.fieldNames.slice(0, j);
|
|
188
|
+
if (j === 0 &&
|
|
189
|
+
model.foreignFields.some((f) => f.name === subset[0] && f.unique === true))
|
|
190
|
+
errors.push({
|
|
191
|
+
path: `${accessor}.uniqueIndexes[${i}].fieldNames[0]`,
|
|
192
|
+
table: model.name,
|
|
193
|
+
field: null,
|
|
194
|
+
message: StringUtil_1.StringUtil.trim `
|
|
195
|
+
Duplicated unique index found (${subset[0]}).
|
|
196
|
+
|
|
197
|
+
You have defined an unique index that is already included,
|
|
198
|
+
in the foreign field with unique constraint.
|
|
199
|
+
|
|
200
|
+
Remove this unique index to avoid the duplication.
|
|
201
|
+
`,
|
|
202
|
+
});
|
|
203
|
+
const cIndex = model.uniqueIndexes.findIndex((u) => u.fieldNames.length === subset.length &&
|
|
204
|
+
u.fieldNames.every((name, k) => name === subset[k]));
|
|
205
|
+
if (cIndex !== -1)
|
|
206
|
+
errors.push({
|
|
207
|
+
path: `${accessor}.uniqueIndexes[${i}].fieldNames`,
|
|
208
|
+
table: model.name,
|
|
209
|
+
field: null,
|
|
210
|
+
message: StringUtil_1.StringUtil.trim `
|
|
211
|
+
Subset unique index found (${subset.join(", ")}).
|
|
212
|
+
|
|
213
|
+
You have defined an unique index with multiple fields,
|
|
214
|
+
but its subset is already defined as an unique index.
|
|
215
|
+
|
|
216
|
+
Consider to change the unique index to a plain index,
|
|
217
|
+
or drop the redundant unique index please.
|
|
218
|
+
`,
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
// SUPERSET RELATIONS
|
|
223
|
+
model.plainIndexes.forEach((x, i) => {
|
|
224
|
+
model.plainIndexes.forEach((y, j) => {
|
|
225
|
+
if (i === j)
|
|
226
|
+
return;
|
|
227
|
+
else if (x.fieldNames.length < y.fieldNames.length &&
|
|
228
|
+
x.fieldNames.every((n, z) => y.fieldNames[z] === n))
|
|
229
|
+
errors.push({
|
|
230
|
+
path: `${accessor}.plainIndexes[${i}].fieldNames`,
|
|
231
|
+
table: model.name,
|
|
232
|
+
field: null,
|
|
233
|
+
message: StringUtil_1.StringUtil.trim `
|
|
234
|
+
Superset plain index found (${y.fieldNames.join(", ")}).
|
|
235
|
+
|
|
236
|
+
You have defined a plain index with multiple fields,
|
|
237
|
+
but its superset is already defined as another plain index.
|
|
238
|
+
|
|
239
|
+
As subset index is vulnerable, drop this plain index please.
|
|
240
|
+
`,
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
// CONSIDER GIN INDEXES
|
|
146
245
|
if (model.ginIndexes.length !==
|
|
147
246
|
new Set(model.ginIndexes.map((g) => g.fieldName)).size)
|
|
148
247
|
errors.push({
|
|
149
248
|
path: `${accessor}.ginIndexes[].fieldName`,
|
|
150
249
|
table: model.name,
|
|
151
250
|
field: null,
|
|
152
|
-
message:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
251
|
+
message: StringUtil_1.StringUtil.trim `
|
|
252
|
+
Duplicated GIN index found.
|
|
253
|
+
|
|
254
|
+
GIN index can only be used once per field.
|
|
255
|
+
|
|
256
|
+
Please remove the duplicated GIN indexes.
|
|
257
|
+
`,
|
|
158
258
|
});
|
|
159
259
|
return errors;
|
|
160
260
|
}
|
|
@@ -212,24 +312,24 @@ function validateIndexes(model, accessor) {
|
|
|
212
312
|
path: `${accessor}.ginIndexes[${i}].fieldName`,
|
|
213
313
|
table: model.name,
|
|
214
314
|
field: null,
|
|
215
|
-
message:
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
315
|
+
message: StringUtil_1.StringUtil.trim `
|
|
316
|
+
GIN index can only be used on string typed field.
|
|
317
|
+
However, the target field ${gin.fieldName} does not exist
|
|
318
|
+
in the {@link plainFields}.
|
|
319
|
+
`,
|
|
220
320
|
});
|
|
221
321
|
else if (model.plainFields[pIndex].type !== "string")
|
|
222
322
|
errors.push({
|
|
223
323
|
path: `${accessor}.ginIndexes[${i}].fieldName`,
|
|
224
324
|
table: model.name,
|
|
225
325
|
field: model.plainFields[pIndex].name,
|
|
226
|
-
message:
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
326
|
+
message: StringUtil_1.StringUtil.trim `
|
|
327
|
+
GIN index can only be used on string typed field.
|
|
328
|
+
However, the target field ${gin.fieldName} is not string,
|
|
329
|
+
but ${model.plainFields[pIndex].type}.
|
|
330
|
+
|
|
331
|
+
- accessor of the wrong typed field: ${`${accessor}.plainFields[${pIndex}].type`},
|
|
332
|
+
`,
|
|
233
333
|
});
|
|
234
334
|
},
|
|
235
335
|
});
|
|
@@ -239,13 +339,46 @@ function validateReferences(model, accessor, dict) {
|
|
|
239
339
|
const errors = [];
|
|
240
340
|
model.foreignFields.forEach((field, i) => {
|
|
241
341
|
const target = dict.get(field.relation.targetModel);
|
|
242
|
-
if (target === undefined)
|
|
342
|
+
if (target === undefined) {
|
|
343
|
+
// CHECK EXISTENCE
|
|
243
344
|
errors.push({
|
|
244
345
|
path: `${accessor}.foreignFields[${i}].relation.targetModel`,
|
|
245
346
|
table: model.name,
|
|
246
347
|
field: field.name,
|
|
247
348
|
message: `Target model ${field.relation.targetModel} does not exist.`,
|
|
248
349
|
});
|
|
350
|
+
}
|
|
351
|
+
else if (target.model !== model) {
|
|
352
|
+
// CHECK CROSS REFERENCE
|
|
353
|
+
target.model.foreignFields.forEach((oppo, j) => {
|
|
354
|
+
if (oppo.relation.targetModel === model.name) {
|
|
355
|
+
errors.push({
|
|
356
|
+
path: `${accessor}.foreignFields[${i}].relation.targetModel`,
|
|
357
|
+
table: model.name,
|
|
358
|
+
field: field.name,
|
|
359
|
+
message: StringUtil_1.StringUtil.trim `
|
|
360
|
+
Cross-reference dependency detected between models.
|
|
361
|
+
|
|
362
|
+
- accessor of opposite side: application.files[${target.fileIndex}].models[${target.modelIndex}].foreignFields[${j}].relation.targetModel
|
|
363
|
+
|
|
364
|
+
Cross-references (circular dependencies) are not permitted in AutoBe Prisma schemas.
|
|
365
|
+
|
|
366
|
+
To resolve this issue:
|
|
367
|
+
|
|
368
|
+
1. Remove one of the foreign key fields from either model
|
|
369
|
+
2. Keep only the foreign key that represents the primary relationship direction
|
|
370
|
+
3. Remove any related indexes that reference the deleted foreign key field
|
|
371
|
+
|
|
372
|
+
The foreign key field to remove is typically:
|
|
373
|
+
|
|
374
|
+
- A redundant field that can be computed from the existing relationship
|
|
375
|
+
- A field that duplicates information already accessible through the primary relationship
|
|
376
|
+
|
|
377
|
+
Please eliminate the circular dependency and try again.`,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
}
|
|
249
382
|
});
|
|
250
383
|
return errors;
|
|
251
384
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validatePrismaApplication.js","sourceRoot":"","sources":["../../src/prisma/validatePrismaApplication.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validatePrismaApplication.js","sourceRoot":"","sources":["../../src/prisma/validatePrismaApplication.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,7 +85,8 @@ function writeRelations(app, model) {
|
|
|
85
85
|
}))))
|
|
86
86
|
.flat(2);
|
|
87
87
|
const foreignIndexes = model.foreignFields.filter((f) => model.uniqueIndexes.every((u) => u.fieldNames[0] !== f.name) &&
|
|
88
|
-
|
|
88
|
+
(f.unique === true ||
|
|
89
|
+
model.plainIndexes.every((p) => p.fieldNames[0] !== f.name)));
|
|
89
90
|
const contents = [
|
|
90
91
|
model.foreignFields.map(writeConstraint),
|
|
91
92
|
hasRelationships.map((r) => {
|
|
@@ -128,7 +129,7 @@ function writeConstraint(field) {
|
|
|
128
129
|
].join(" ");
|
|
129
130
|
}
|
|
130
131
|
function writeForeignIndex(field) {
|
|
131
|
-
return `@@${field.unique ? "unique" : "index"}([${field.name}])`;
|
|
132
|
+
return `@@${field.unique === true ? "unique" : "index"}([${field.name}])`;
|
|
132
133
|
}
|
|
133
134
|
function writeUniqueIndex(field) {
|
|
134
135
|
return `@@unique([${field.fieldNames.join(", ")}])`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writePrismaApplication.js","sourceRoot":"","sources":["../../src/prisma/writePrismaApplication.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"writePrismaApplication.js","sourceRoot":"","sources":["../../src/prisma/writePrismaApplication.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare const enum AutoBeCompilerConstants {
|
|
2
|
-
README = "# AutoBE Generated Backend Server\n\n\n\nA backend repository generated by [`@autobe`](https://github.com/wrtnlabs/autobe).\n\nThis backend program was automatically generated using [`@autobe`](https://github.com/wrtnlabs/autobe), the AI vibe coding agent for backend servers of below stack.\n\n- TypeScript\n- NestJS / Nestia\n- Prisma\n- Postgres\n\n## Project Structure\n\nThis template project has categorized directories like below.\n\
|
|
2
|
+
README = "# AutoBE Generated Backend Server\n\n\n\nA backend repository generated by [`@autobe`](https://github.com/wrtnlabs/autobe).\n\nThis backend program was automatically generated using [`@autobe`](https://github.com/wrtnlabs/autobe), the AI vibe coding agent for backend servers of below stack.\n\n- TypeScript\n- NestJS / Nestia\n- Prisma\n- Postgres\n\n## Project Structure\n\nThis template project has categorized directories like below.\n\nAt first, [`@autobe`](https://github.com/wrtnlabs/autobe) generated files are placed like below:\n\n- analysis agent: [docs/analysis](docs/analysis)\n- prisma agent\n - [prisma/schema](prisma/schema)\n - [docs/ERD.md](docs/ERD.md)\n- interface agent\n - [src/api/structures](src/api/structures): DTO structures\n - [src/api/controllers](src/controllers): API controller classes\n - [test/features](test/features): List of e2e test functions\n\nFrom a source code perspective, all backend files are organized within the `src` directory.\n\nWhen you build the TypeScript source files, compiled files will be placed in the `lib` directory according to the [tsconfig.json](tsconfig.json) configuration.\n\nOtherwise you build client [SDK](https://nestia.io/docs/sdk) library for npm publishing and their compiled files would be placed into the [packages/api](packages/api) directory.\n\n - [packages/api](packages/api): SDK module built by `npm run build:api`\n - [src](src): Backend source directory\n - [src/api](src/api): Client SDK that would be published to the `@ORGANIZATION/PROJECT-api`\n - [src/api/functional](src/api/functional): API functions generated by the [`nestia`](https://github.com/samchon/nestia)\n - [src/api/structures](src/api/structures): DTO structures\n - [src/controllers](src/controllers): Controller classes of the Main Program\n - [**test/**](test): Test Automation Program\n - [test/features](test/features): List of test functions\n - [nestia.config.ts](nestia.config.ts): Configuration file of [`nestia`](https://github.com/samchon/nestia)\n - [package.json](package.json): NPM configuration\n - [tsconfig.json](tsconfig.json): TypeScript configuration for the main program\n\n## NPM Run Commands\n\nList of the run commands defined in the [package.json](package.json) are like below:\n\n - Test\n - **`test`**: Run test automation program\n - `benchmark`: Run performance benchmark program\n - Build\n - `build`: Build everything\n - `build:main`: Build main program (`src` directory)\n - `build:test` Build test automation program (`test` directory)\n - `build:sdk`: Build SDK into main program only\n - `build:swagger`: Build Swagger Documents\n - **`dev`**: Incremental build for development (test program)\n - Deploy\n - `package:api`: Build and deploy the SDK library to the NPM\n - `start`: Start the backend server\n - `start:dev`: Start the backend server with incremental build and reload\n - Webpack\n - `webpack`: Run webpack bundler\n - `webpack:start`: Start the backend server built by webpack\n - `webpack:test`: Run test program to the webpack built\n\n## Specialization\n\nTransform this template project to be yours.\n\nWhen you've created a new backend project through this template project, you can specialize it to be suitable for you by changing some words. Replace below words through IDE specific function like `Edit > Replace in Files` (*Ctrl + Shift + H*), who've been supported by the VSCode.\n\n| Before | After\n|--------------|----------------------------------------\n| ORGANIZATION | Your account or corporation name\n| PROJECT | Your own project name\n| AUTHOR | Author name\n| https://github.com/samchon/nestia-start | Your repository URL"
|
|
3
3
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StringUtil = void 0;
|
|
4
|
+
var StringUtil;
|
|
5
|
+
(function (StringUtil) {
|
|
6
|
+
function trim(strings, ...values) {
|
|
7
|
+
var _a;
|
|
8
|
+
let result = strings[0];
|
|
9
|
+
for (let i = 0; i < values.length; i++) {
|
|
10
|
+
result += String(values[i]) + strings[i + 1];
|
|
11
|
+
}
|
|
12
|
+
const lines = result.split("\n");
|
|
13
|
+
while (lines.length > 0 && lines[0].trim() === "") {
|
|
14
|
+
lines.shift();
|
|
15
|
+
}
|
|
16
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === "") {
|
|
17
|
+
lines.pop();
|
|
18
|
+
}
|
|
19
|
+
if (lines.length === 0)
|
|
20
|
+
return "";
|
|
21
|
+
const firstNonEmptyLine = lines.find((line) => line.trim() !== "");
|
|
22
|
+
if (!firstNonEmptyLine)
|
|
23
|
+
return "";
|
|
24
|
+
const leadingWhitespace = ((_a = firstNonEmptyLine.match(/^[ \t]*/)) === null || _a === void 0 ? void 0 : _a[0]) || "";
|
|
25
|
+
const indentLength = leadingWhitespace.length;
|
|
26
|
+
const trimmedLines = lines.map((line) => {
|
|
27
|
+
if (line.trim() === "")
|
|
28
|
+
return "";
|
|
29
|
+
return line.slice(indentLength);
|
|
30
|
+
});
|
|
31
|
+
return trimmedLines.join("\n");
|
|
32
|
+
}
|
|
33
|
+
StringUtil.trim = trim;
|
|
34
|
+
function singleLine(strings, ...values) {
|
|
35
|
+
let result = strings[0];
|
|
36
|
+
for (let i = 0; i < values.length; i++) {
|
|
37
|
+
result += String(values[i]) + strings[i + 1];
|
|
38
|
+
}
|
|
39
|
+
return result.replace(/\n/g, " ").replace(/\s+/g, " ").trim();
|
|
40
|
+
}
|
|
41
|
+
StringUtil.singleLine = singleLine;
|
|
42
|
+
})(StringUtil || (exports.StringUtil = StringUtil = {}));
|
|
43
|
+
//# sourceMappingURL=StringUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StringUtil.js","sourceRoot":"","sources":["../../src/utils/StringUtil.ts"],"names":[],"mappings":";;;AAAA,IAAiB,UAAU,CA4C1B;AA5CD,WAAiB,UAAU;IACzB,SAAgB,IAAI,CAClB,OAA6B,EAC7B,GAAG,MAAa;;QAEhB,IAAI,MAAM,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,KAAK,GAAa,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClD,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjE,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,iBAAiB,GAAuB,KAAK,CAAC,IAAI,CACtD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAC7B,CAAC;QACF,IAAI,CAAC,iBAAiB;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,iBAAiB,GACrB,CAAA,MAAA,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,0CAAG,CAAC,CAAC,KAAI,EAAE,CAAC;QAChD,MAAM,YAAY,GAAW,iBAAiB,CAAC,MAAM,CAAC;QACtD,MAAM,YAAY,GAAa,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IA/Be,eAAI,OA+BnB,CAAA;IAED,SAAgB,UAAU,CACxB,OAA6B,EAC7B,GAAG,MAAa;QAEhB,IAAI,MAAM,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IATe,qBAAU,aASzB,CAAA;AACH,CAAC,EA5CgB,UAAU,0BAAV,UAAU,QA4C1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autobe/compiler",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "AI backend server code generator",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"author": "Wrtn Technologies",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"prisma-markdown": "^3.0.0",
|
|
26
26
|
"tstl": "^3.0.0",
|
|
27
27
|
"typia": "^9.3.1",
|
|
28
|
-
"@autobe/interface": "^0.
|
|
28
|
+
"@autobe/interface": "^0.6.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^22.15.3",
|
|
@@ -2,15 +2,28 @@ import { AutoBePrisma, IAutoBePrismaValidation } from "@autobe/interface";
|
|
|
2
2
|
import { HashMap, hash } from "tstl";
|
|
3
3
|
|
|
4
4
|
import { MapUtil } from "../utils/MapUtil";
|
|
5
|
+
import { StringUtil } from "../utils/StringUtil";
|
|
5
6
|
|
|
6
7
|
export function validatePrismaApplication(
|
|
7
8
|
application: AutoBePrisma.IApplication,
|
|
8
9
|
): IAutoBePrismaValidation {
|
|
9
|
-
const dict: Map<string,
|
|
10
|
+
const dict: Map<string, IModelContainer> = new Map(
|
|
10
11
|
application.files
|
|
11
|
-
.map((file) =>
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
.map((file, fi) =>
|
|
13
|
+
file.models.map(
|
|
14
|
+
(model, mi) =>
|
|
15
|
+
[
|
|
16
|
+
model.name,
|
|
17
|
+
{
|
|
18
|
+
file,
|
|
19
|
+
model,
|
|
20
|
+
fileIndex: fi,
|
|
21
|
+
modelIndex: mi,
|
|
22
|
+
},
|
|
23
|
+
] satisfies [string, IModelContainer],
|
|
24
|
+
),
|
|
25
|
+
)
|
|
26
|
+
.flat(),
|
|
14
27
|
);
|
|
15
28
|
const errors: IAutoBePrismaValidation.IError[] = [
|
|
16
29
|
...validateDuplicatedFiles(application),
|
|
@@ -20,7 +33,7 @@ export function validatePrismaApplication(
|
|
|
20
33
|
file.models.map((model, mi) => {
|
|
21
34
|
const accessor: string = `application.files[${fi}].models[${mi}]`;
|
|
22
35
|
return [
|
|
23
|
-
...validateDuplicatedFields(model, accessor),
|
|
36
|
+
...validateDuplicatedFields(dict, model, accessor),
|
|
24
37
|
...validateDuplicatedIndexes(model, accessor),
|
|
25
38
|
...validateIndexes(model, accessor),
|
|
26
39
|
...validateReferences(model, accessor, dict),
|
|
@@ -30,8 +43,22 @@ export function validatePrismaApplication(
|
|
|
30
43
|
.flat(2),
|
|
31
44
|
];
|
|
32
45
|
return errors.length === 0
|
|
33
|
-
? {
|
|
34
|
-
|
|
46
|
+
? {
|
|
47
|
+
success: true,
|
|
48
|
+
data: application,
|
|
49
|
+
}
|
|
50
|
+
: {
|
|
51
|
+
success: false,
|
|
52
|
+
data: application,
|
|
53
|
+
errors,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface IModelContainer {
|
|
58
|
+
file: AutoBePrisma.IFile;
|
|
59
|
+
model: AutoBePrisma.IModel;
|
|
60
|
+
fileIndex: number;
|
|
61
|
+
modelIndex: number;
|
|
35
62
|
}
|
|
36
63
|
|
|
37
64
|
/* -----------------------------------------------------------
|
|
@@ -75,12 +102,6 @@ function validateDuplicatedFiles(
|
|
|
75
102
|
function validateDuplicatedModels(
|
|
76
103
|
app: AutoBePrisma.IApplication,
|
|
77
104
|
): IAutoBePrismaValidation.IError[] {
|
|
78
|
-
interface IModelContainer {
|
|
79
|
-
file: AutoBePrisma.IFile;
|
|
80
|
-
model: AutoBePrisma.IModel;
|
|
81
|
-
fileIndex: number;
|
|
82
|
-
modelIndex: number;
|
|
83
|
-
}
|
|
84
105
|
const modelContainers: Map<string, IModelContainer[]> = new Map();
|
|
85
106
|
app.files.forEach((file, fileIndex) => {
|
|
86
107
|
file.models.forEach((model, modelIndex) => {
|
|
@@ -120,9 +141,13 @@ function validateDuplicatedModels(
|
|
|
120
141
|
}
|
|
121
142
|
|
|
122
143
|
function validateDuplicatedFields(
|
|
144
|
+
dict: Map<string, IModelContainer>,
|
|
123
145
|
model: AutoBePrisma.IModel,
|
|
124
146
|
accessor: string,
|
|
125
147
|
): IAutoBePrismaValidation.IError[] {
|
|
148
|
+
const errors: IAutoBePrismaValidation.IError[] = [];
|
|
149
|
+
|
|
150
|
+
// FIND DUPLICATED FIELDS
|
|
126
151
|
const group: Map<string, string[]> = new Map();
|
|
127
152
|
MapUtil.take(group, model.primaryField.name, () => []).push(
|
|
128
153
|
`${accessor}.primaryField.name`,
|
|
@@ -137,8 +162,6 @@ function validateDuplicatedFields(
|
|
|
137
162
|
`${accessor}.plainFields[${i}].name`,
|
|
138
163
|
),
|
|
139
164
|
);
|
|
140
|
-
|
|
141
|
-
const errors: IAutoBePrismaValidation.IError[] = [];
|
|
142
165
|
for (const [field, array] of group)
|
|
143
166
|
if (array.length !== 1)
|
|
144
167
|
array.forEach((path, i) => {
|
|
@@ -155,6 +178,24 @@ function validateDuplicatedFields(
|
|
|
155
178
|
].join("\n"),
|
|
156
179
|
});
|
|
157
180
|
});
|
|
181
|
+
|
|
182
|
+
// FIND TABLE NAMED FIELDS
|
|
183
|
+
model.plainFields.forEach((field, i) => {
|
|
184
|
+
if (dict.has(field.name) === true)
|
|
185
|
+
errors.push({
|
|
186
|
+
path: `${accessor}.plainFields[${i}].name`,
|
|
187
|
+
table: model.name,
|
|
188
|
+
field: field.name,
|
|
189
|
+
message: StringUtil.trim`
|
|
190
|
+
There's a same named table in the application.
|
|
191
|
+
|
|
192
|
+
Check whether the field has been designed for denormalization
|
|
193
|
+
like pre-calculation. If do so, remove the field.
|
|
194
|
+
|
|
195
|
+
Otherwise, change the field name to something else.
|
|
196
|
+
`,
|
|
197
|
+
});
|
|
198
|
+
});
|
|
158
199
|
return errors;
|
|
159
200
|
}
|
|
160
201
|
|
|
@@ -162,6 +203,9 @@ function validateDuplicatedIndexes(
|
|
|
162
203
|
model: AutoBePrisma.IModel,
|
|
163
204
|
accessor: string,
|
|
164
205
|
): IAutoBePrismaValidation.IError[] {
|
|
206
|
+
const errors: IAutoBePrismaValidation.IError[] = [];
|
|
207
|
+
|
|
208
|
+
// FIND DUPLICATED INDEXES
|
|
165
209
|
const group: HashMap<string[], string[]> = new HashMap(
|
|
166
210
|
(x) => hash(...x),
|
|
167
211
|
(x, y) => x.length === y.length && x.every((v, i) => v === y[i]),
|
|
@@ -181,8 +225,6 @@ function validateDuplicatedIndexes(
|
|
|
181
225
|
.take([gin.fieldName], () => [])
|
|
182
226
|
.push(`${accessor}.ginIndexes[${i}].fieldName`),
|
|
183
227
|
);
|
|
184
|
-
|
|
185
|
-
const errors: IAutoBePrismaValidation.IError[] = [];
|
|
186
228
|
for (const { first: fieldNames, second: array } of group)
|
|
187
229
|
if (array.length !== 1)
|
|
188
230
|
array.forEach((path, i) => {
|
|
@@ -191,7 +233,7 @@ function validateDuplicatedIndexes(
|
|
|
191
233
|
table: model.name,
|
|
192
234
|
field: null,
|
|
193
235
|
message: [
|
|
194
|
-
`Duplicated index found (${fieldNames.join(", ")})
|
|
236
|
+
`Duplicated index found (${fieldNames.join(", ")}).`,
|
|
195
237
|
"",
|
|
196
238
|
"Accessors of the other duplicated indexes are:",
|
|
197
239
|
"",
|
|
@@ -200,6 +242,79 @@ function validateDuplicatedIndexes(
|
|
|
200
242
|
});
|
|
201
243
|
});
|
|
202
244
|
|
|
245
|
+
// SUBSET RELATIONS
|
|
246
|
+
model.uniqueIndexes.forEach((unique, i) => {
|
|
247
|
+
if (unique.fieldNames.length <= 1) return;
|
|
248
|
+
unique.fieldNames.forEach((_, j, array) => {
|
|
249
|
+
if (j === array.length - 1) return;
|
|
250
|
+
const subset: string[] = unique.fieldNames.slice(0, j);
|
|
251
|
+
if (
|
|
252
|
+
j === 0 &&
|
|
253
|
+
model.foreignFields.some(
|
|
254
|
+
(f) => f.name === subset[0] && f.unique === true,
|
|
255
|
+
)
|
|
256
|
+
)
|
|
257
|
+
errors.push({
|
|
258
|
+
path: `${accessor}.uniqueIndexes[${i}].fieldNames[0]`,
|
|
259
|
+
table: model.name,
|
|
260
|
+
field: null,
|
|
261
|
+
message: StringUtil.trim`
|
|
262
|
+
Duplicated unique index found (${subset[0]}).
|
|
263
|
+
|
|
264
|
+
You have defined an unique index that is already included,
|
|
265
|
+
in the foreign field with unique constraint.
|
|
266
|
+
|
|
267
|
+
Remove this unique index to avoid the duplication.
|
|
268
|
+
`,
|
|
269
|
+
});
|
|
270
|
+
const cIndex: number = model.uniqueIndexes.findIndex(
|
|
271
|
+
(u) =>
|
|
272
|
+
u.fieldNames.length === subset.length &&
|
|
273
|
+
u.fieldNames.every((name, k) => name === subset[k]),
|
|
274
|
+
);
|
|
275
|
+
if (cIndex !== -1)
|
|
276
|
+
errors.push({
|
|
277
|
+
path: `${accessor}.uniqueIndexes[${i}].fieldNames`,
|
|
278
|
+
table: model.name,
|
|
279
|
+
field: null,
|
|
280
|
+
message: StringUtil.trim`
|
|
281
|
+
Subset unique index found (${subset.join(", ")}).
|
|
282
|
+
|
|
283
|
+
You have defined an unique index with multiple fields,
|
|
284
|
+
but its subset is already defined as an unique index.
|
|
285
|
+
|
|
286
|
+
Consider to change the unique index to a plain index,
|
|
287
|
+
or drop the redundant unique index please.
|
|
288
|
+
`,
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// SUPERSET RELATIONS
|
|
294
|
+
model.plainIndexes.forEach((x, i) => {
|
|
295
|
+
model.plainIndexes.forEach((y, j) => {
|
|
296
|
+
if (i === j) return;
|
|
297
|
+
else if (
|
|
298
|
+
x.fieldNames.length < y.fieldNames.length &&
|
|
299
|
+
x.fieldNames.every((n, z) => y.fieldNames[z] === n)
|
|
300
|
+
)
|
|
301
|
+
errors.push({
|
|
302
|
+
path: `${accessor}.plainIndexes[${i}].fieldNames`,
|
|
303
|
+
table: model.name,
|
|
304
|
+
field: null,
|
|
305
|
+
message: StringUtil.trim`
|
|
306
|
+
Superset plain index found (${y.fieldNames.join(", ")}).
|
|
307
|
+
|
|
308
|
+
You have defined a plain index with multiple fields,
|
|
309
|
+
but its superset is already defined as another plain index.
|
|
310
|
+
|
|
311
|
+
As subset index is vulnerable, drop this plain index please.
|
|
312
|
+
`,
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
// CONSIDER GIN INDEXES
|
|
203
318
|
if (
|
|
204
319
|
model.ginIndexes.length !==
|
|
205
320
|
new Set(model.ginIndexes.map((g) => g.fieldName)).size
|
|
@@ -208,12 +323,13 @@ function validateDuplicatedIndexes(
|
|
|
208
323
|
path: `${accessor}.ginIndexes[].fieldName`,
|
|
209
324
|
table: model.name,
|
|
210
325
|
field: null,
|
|
211
|
-
message:
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
326
|
+
message: StringUtil.trim`
|
|
327
|
+
Duplicated GIN index found.
|
|
328
|
+
|
|
329
|
+
GIN index can only be used once per field.
|
|
330
|
+
|
|
331
|
+
Please remove the duplicated GIN indexes.
|
|
332
|
+
`,
|
|
217
333
|
});
|
|
218
334
|
|
|
219
335
|
return errors;
|
|
@@ -292,24 +408,24 @@ function validateIndexes(
|
|
|
292
408
|
path: `${accessor}.ginIndexes[${i}].fieldName`,
|
|
293
409
|
table: model.name,
|
|
294
410
|
field: null,
|
|
295
|
-
message:
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
411
|
+
message: StringUtil.trim`
|
|
412
|
+
GIN index can only be used on string typed field.
|
|
413
|
+
However, the target field ${gin.fieldName} does not exist
|
|
414
|
+
in the {@link plainFields}.
|
|
415
|
+
`,
|
|
300
416
|
});
|
|
301
417
|
else if (model.plainFields[pIndex].type !== "string")
|
|
302
418
|
errors.push({
|
|
303
419
|
path: `${accessor}.ginIndexes[${i}].fieldName`,
|
|
304
420
|
table: model.name,
|
|
305
421
|
field: model.plainFields[pIndex].name,
|
|
306
|
-
message:
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
422
|
+
message: StringUtil.trim`
|
|
423
|
+
GIN index can only be used on string typed field.
|
|
424
|
+
However, the target field ${gin.fieldName} is not string,
|
|
425
|
+
but ${model.plainFields[pIndex].type}.
|
|
426
|
+
|
|
427
|
+
- accessor of the wrong typed field: ${`${accessor}.plainFields[${pIndex}].type`},
|
|
428
|
+
`,
|
|
313
429
|
});
|
|
314
430
|
},
|
|
315
431
|
});
|
|
@@ -319,18 +435,52 @@ function validateIndexes(
|
|
|
319
435
|
function validateReferences(
|
|
320
436
|
model: AutoBePrisma.IModel,
|
|
321
437
|
accessor: string,
|
|
322
|
-
dict: Map<string,
|
|
438
|
+
dict: Map<string, IModelContainer>,
|
|
323
439
|
): IAutoBePrismaValidation.IError[] {
|
|
324
440
|
const errors: IAutoBePrismaValidation.IError[] = [];
|
|
441
|
+
|
|
325
442
|
model.foreignFields.forEach((field, i) => {
|
|
326
443
|
const target = dict.get(field.relation.targetModel);
|
|
327
|
-
if (target === undefined)
|
|
444
|
+
if (target === undefined) {
|
|
445
|
+
// CHECK EXISTENCE
|
|
328
446
|
errors.push({
|
|
329
447
|
path: `${accessor}.foreignFields[${i}].relation.targetModel`,
|
|
330
448
|
table: model.name,
|
|
331
449
|
field: field.name,
|
|
332
450
|
message: `Target model ${field.relation.targetModel} does not exist.`,
|
|
333
451
|
});
|
|
452
|
+
} else if (target.model !== model) {
|
|
453
|
+
// CHECK CROSS REFERENCE
|
|
454
|
+
target.model.foreignFields.forEach((oppo, j) => {
|
|
455
|
+
if (oppo.relation.targetModel === model.name) {
|
|
456
|
+
errors.push({
|
|
457
|
+
path: `${accessor}.foreignFields[${i}].relation.targetModel`,
|
|
458
|
+
table: model.name,
|
|
459
|
+
field: field.name,
|
|
460
|
+
message: StringUtil.trim`
|
|
461
|
+
Cross-reference dependency detected between models.
|
|
462
|
+
|
|
463
|
+
- accessor of opposite side: application.files[${target.fileIndex}].models[${target.modelIndex}].foreignFields[${j}].relation.targetModel
|
|
464
|
+
|
|
465
|
+
Cross-references (circular dependencies) are not permitted in AutoBe Prisma schemas.
|
|
466
|
+
|
|
467
|
+
To resolve this issue:
|
|
468
|
+
|
|
469
|
+
1. Remove one of the foreign key fields from either model
|
|
470
|
+
2. Keep only the foreign key that represents the primary relationship direction
|
|
471
|
+
3. Remove any related indexes that reference the deleted foreign key field
|
|
472
|
+
|
|
473
|
+
The foreign key field to remove is typically:
|
|
474
|
+
|
|
475
|
+
- A redundant field that can be computed from the existing relationship
|
|
476
|
+
- A field that duplicates information already accessible through the primary relationship
|
|
477
|
+
|
|
478
|
+
Please eliminate the circular dependency and try again.`,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
334
483
|
});
|
|
484
|
+
|
|
335
485
|
return errors;
|
|
336
486
|
}
|
|
@@ -129,7 +129,8 @@ function writeRelations(
|
|
|
129
129
|
model.foreignFields.filter(
|
|
130
130
|
(f) =>
|
|
131
131
|
model.uniqueIndexes.every((u) => u.fieldNames[0] !== f.name) &&
|
|
132
|
-
|
|
132
|
+
(f.unique === true ||
|
|
133
|
+
model.plainIndexes.every((p) => p.fieldNames[0] !== f.name)),
|
|
133
134
|
);
|
|
134
135
|
const contents: string[][] = [
|
|
135
136
|
model.foreignFields.map(writeConstraint),
|
|
@@ -173,7 +174,7 @@ function writeConstraint(field: AutoBePrisma.IForeignField): string {
|
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
function writeForeignIndex(field: AutoBePrisma.IForeignField): string {
|
|
176
|
-
return `@@${field.unique ? "unique" : "index"}([${field.name}])`;
|
|
177
|
+
return `@@${field.unique === true ? "unique" : "index"}([${field.name}])`;
|
|
177
178
|
}
|
|
178
179
|
|
|
179
180
|
function writeUniqueIndex(field: AutoBePrisma.IUniqueIndex): string {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export const enum AutoBeCompilerConstants {
|
|
2
|
-
README = "# AutoBE Generated Backend Server\n\n\n\nA backend repository generated by [`@autobe`](https://github.com/wrtnlabs/autobe).\n\nThis backend program was automatically generated using [`@autobe`](https://github.com/wrtnlabs/autobe), the AI vibe coding agent for backend servers of below stack.\n\n- TypeScript\n- NestJS / Nestia\n- Prisma\n- Postgres\n\n## Project Structure\n\nThis template project has categorized directories like below.\n\
|
|
2
|
+
README = "# AutoBE Generated Backend Server\n\n\n\nA backend repository generated by [`@autobe`](https://github.com/wrtnlabs/autobe).\n\nThis backend program was automatically generated using [`@autobe`](https://github.com/wrtnlabs/autobe), the AI vibe coding agent for backend servers of below stack.\n\n- TypeScript\n- NestJS / Nestia\n- Prisma\n- Postgres\n\n## Project Structure\n\nThis template project has categorized directories like below.\n\nAt first, [`@autobe`](https://github.com/wrtnlabs/autobe) generated files are placed like below:\n\n- analysis agent: [docs/analysis](docs/analysis)\n- prisma agent\n - [prisma/schema](prisma/schema)\n - [docs/ERD.md](docs/ERD.md)\n- interface agent\n - [src/api/structures](src/api/structures): DTO structures\n - [src/api/controllers](src/controllers): API controller classes\n - [test/features](test/features): List of e2e test functions\n\nFrom a source code perspective, all backend files are organized within the `src` directory.\n\nWhen you build the TypeScript source files, compiled files will be placed in the `lib` directory according to the [tsconfig.json](tsconfig.json) configuration.\n\nOtherwise you build client [SDK](https://nestia.io/docs/sdk) library for npm publishing and their compiled files would be placed into the [packages/api](packages/api) directory.\n\n - [packages/api](packages/api): SDK module built by `npm run build:api`\n - [src](src): Backend source directory\n - [src/api](src/api): Client SDK that would be published to the `@ORGANIZATION/PROJECT-api`\n - [src/api/functional](src/api/functional): API functions generated by the [`nestia`](https://github.com/samchon/nestia)\n - [src/api/structures](src/api/structures): DTO structures\n - [src/controllers](src/controllers): Controller classes of the Main Program\n - [**test/**](test): Test Automation Program\n - [test/features](test/features): List of test functions\n - [nestia.config.ts](nestia.config.ts): Configuration file of [`nestia`](https://github.com/samchon/nestia)\n - [package.json](package.json): NPM configuration\n - [tsconfig.json](tsconfig.json): TypeScript configuration for the main program\n\n## NPM Run Commands\n\nList of the run commands defined in the [package.json](package.json) are like below:\n\n - Test\n - **`test`**: Run test automation program\n - `benchmark`: Run performance benchmark program\n - Build\n - `build`: Build everything\n - `build:main`: Build main program (`src` directory)\n - `build:test` Build test automation program (`test` directory)\n - `build:sdk`: Build SDK into main program only\n - `build:swagger`: Build Swagger Documents\n - **`dev`**: Incremental build for development (test program)\n - Deploy\n - `package:api`: Build and deploy the SDK library to the NPM\n - `start`: Start the backend server\n - `start:dev`: Start the backend server with incremental build and reload\n - Webpack\n - `webpack`: Run webpack bundler\n - `webpack:start`: Start the backend server built by webpack\n - `webpack:test`: Run test program to the webpack built\n\n## Specialization\n\nTransform this template project to be yours.\n\nWhen you've created a new backend project through this template project, you can specialize it to be suitable for you by changing some words. Replace below words through IDE specific function like `Edit > Replace in Files` (*Ctrl + Shift + H*), who've been supported by the VSCode.\n\n| Before | After\n|--------------|----------------------------------------\n| ORGANIZATION | Your account or corporation name\n| PROJECT | Your own project name\n| AUTHOR | Author name\n| https://github.com/samchon/nestia-start | Your repository URL"
|
|
3
3
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export namespace StringUtil {
|
|
2
|
+
export function trim(
|
|
3
|
+
strings: TemplateStringsArray,
|
|
4
|
+
...values: any[]
|
|
5
|
+
): string {
|
|
6
|
+
let result: string = strings[0];
|
|
7
|
+
for (let i = 0; i < values.length; i++) {
|
|
8
|
+
result += String(values[i]) + strings[i + 1];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const lines: string[] = result.split("\n");
|
|
12
|
+
while (lines.length > 0 && lines[0].trim() === "") {
|
|
13
|
+
lines.shift();
|
|
14
|
+
}
|
|
15
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === "") {
|
|
16
|
+
lines.pop();
|
|
17
|
+
}
|
|
18
|
+
if (lines.length === 0) return "";
|
|
19
|
+
|
|
20
|
+
const firstNonEmptyLine: string | undefined = lines.find(
|
|
21
|
+
(line) => line.trim() !== "",
|
|
22
|
+
);
|
|
23
|
+
if (!firstNonEmptyLine) return "";
|
|
24
|
+
|
|
25
|
+
const leadingWhitespace: string =
|
|
26
|
+
firstNonEmptyLine.match(/^[ \t]*/)?.[0] || "";
|
|
27
|
+
const indentLength: number = leadingWhitespace.length;
|
|
28
|
+
const trimmedLines: string[] = lines.map((line) => {
|
|
29
|
+
if (line.trim() === "") return "";
|
|
30
|
+
return line.slice(indentLength);
|
|
31
|
+
});
|
|
32
|
+
return trimmedLines.join("\n");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function singleLine(
|
|
36
|
+
strings: TemplateStringsArray,
|
|
37
|
+
...values: any[]
|
|
38
|
+
): string {
|
|
39
|
+
let result: string = strings[0];
|
|
40
|
+
for (let i = 0; i < values.length; i++) {
|
|
41
|
+
result += String(values[i]) + strings[i + 1];
|
|
42
|
+
}
|
|
43
|
+
return result.replace(/\n/g, " ").replace(/\s+/g, " ").trim();
|
|
44
|
+
}
|
|
45
|
+
}
|