@autobe/compiler 0.28.1 → 0.29.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.
@@ -10,9 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.AutoBePrismaCompiler = void 0;
13
+ const utils_1 = require("@autobe/utils");
13
14
  const embed_prisma_1 = require("embed-prisma");
14
15
  const validatePrismaApplication_1 = require("./validatePrismaApplication");
15
- const writePrismaApplication_1 = require("./writePrismaApplication");
16
16
  class AutoBePrismaCompiler {
17
17
  compile(props) {
18
18
  return __awaiter(this, void 0, void 0, function* () {
@@ -27,7 +27,7 @@ class AutoBePrismaCompiler {
27
27
  }
28
28
  write(application_1) {
29
29
  return __awaiter(this, arguments, void 0, function* (application, dbms = "postgres") {
30
- return (0, writePrismaApplication_1.writePrismaApplication)({
30
+ return (0, utils_1.writePrismaApplication)({
31
31
  application,
32
32
  dbms,
33
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AutoBePrismaCompiler.js","sourceRoot":"","sources":["../../src/prisma/AutoBePrismaCompiler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAOA,+CAA2C;AAE3C,2EAAwE;AACxE,qEAAkE;AAElE,MAAa,oBAAoB;IAClB,OAAO,CAClB,KAAiC;;YAEjC,MAAM,QAAQ,GAAgB,IAAI,0BAAW,EAAE,CAAC;YAChD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;KAAA;IAEY,QAAQ,CACnB,WAAsC;;YAEtC,OAAO,IAAA,qDAAyB,EAAC,WAAW,CAAC,CAAC;QAChD,CAAC;KAAA;IAEY,KAAK;6DAChB,WAAsC,EACtC,OAA8B,UAAU;YAExC,OAAO,IAAA,+CAAsB,EAAC;gBAC5B,WAAW;gBACX,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KAAA;CACF;AAvBD,oDAuBC"}
1
+ {"version":3,"file":"AutoBePrismaCompiler.js","sourceRoot":"","sources":["../../src/prisma/AutoBePrismaCompiler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAOA,yCAAuD;AACvD,+CAA2C;AAE3C,2EAAwE;AAExE,MAAa,oBAAoB;IAClB,OAAO,CAClB,KAAiC;;YAEjC,MAAM,QAAQ,GAAgB,IAAI,0BAAW,EAAE,CAAC;YAChD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;KAAA;IAEY,QAAQ,CACnB,WAAsC;;YAEtC,OAAO,IAAA,qDAAyB,EAAC,WAAW,CAAC,CAAC;QAChD,CAAC;KAAA;IAEY,KAAK;6DAChB,WAAsC,EACtC,OAA8B,UAAU;YAExC,OAAO,IAAA,8BAAsB,EAAC;gBAC5B,WAAW;gBACX,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KAAA;CACF;AAvBD,oDAuBC"}
@@ -22,7 +22,15 @@ var FilePrinter;
22
22
  FilePrinter.description = (node, comment) => {
23
23
  if (comment.length === 0)
24
24
  return node;
25
- typescript_1.default.addSyntheticLeadingComment(node, typescript_1.default.SyntaxKind.MultiLineCommentTrivia, ["*", ...comment.split("\n").map((str) => ` * ${str}`), ""].join("\n"), true);
25
+ typescript_1.default.addSyntheticLeadingComment(node, typescript_1.default.SyntaxKind.MultiLineCommentTrivia, [
26
+ "*",
27
+ ...comment
28
+ .split("\r\n")
29
+ .join("\n")
30
+ .split("\n")
31
+ .map((str) => ` * ${str.split("*/").join("*\\\\/").split("*\\/").join("*\\\\/")}`),
32
+ "",
33
+ ].join("\n"), true);
26
34
  return node;
27
35
  };
28
36
  FilePrinter.newLine = () => typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createIdentifier("\n"));
@@ -1 +1 @@
1
- {"version":3,"file":"FilePrinter.js","sourceRoot":"","sources":["../../src/utils/FilePrinter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yGAA+D;AAC/D,sDAA8B;AAC9B,uCAAkC;AAClC,4DAA4B;AAE5B,IAAiB,WAAW,CAkD3B;AAlDD,WAAiB,WAAW;IACb,uBAAW,GAAG,CACzB,IAAU,EACV,OAAe,EACT,EAAE;QACR,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,oBAAE,CAAC,0BAA0B,CAC3B,IAAI,EACJ,oBAAE,CAAC,UAAU,CAAC,sBAAsB,EACpC,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EACtE,IAAI,CACL,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEW,mBAAO,GAAG,GAAG,EAAE,CAC1B,oBAAE,CAAC,OAAO,CAAC,yBAAyB,CAAC,oBAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,iBAAK,GAAG,CAAC,KAGrB,EAAU,EAAE;;QACX,MAAM,MAAM,GAAW,oBAAE;aACtB,aAAa,CAAC;YACb,OAAO,EAAE,oBAAE,CAAC,WAAW,CAAC,QAAQ;SACjC,CAAC;aACD,SAAS,CACR,oBAAE,CAAC,OAAO,CAAC,gBAAgB,CACzB,KAAK,CAAC,UAAU,EAChB,oBAAE,CAAC,OAAO,CAAC,WAAW,CAAC,oBAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EACpD,oBAAE,CAAC,SAAS,CAAC,IAAI,CAClB,CACF,CAAC;QACJ,OAAO,CAAC,MAAA,KAAK,CAAC,GAAG,mCAAI,EAAE,CAAC,GAAG,MAAM,CAAC;IACpC,CAAC,CAAC;IAEW,oBAAQ,GAAG,CAAO,MAAc,EAAmB,EAAE;QAChE,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,iBAAM,EAAC,MAAM,EAAE;gBAC1B,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,CAAC,sCAAU,EAAE,MAAM,IAAA,iBAAO,EAAC,uBAAuB,CAAC,CAAC;gBAC7D,WAAW,EAAE,CAAC,uBAAuB,EAAE,OAAO,CAAC;gBAC/C,qBAAqB,EAAE,IAAI;gBAC3B,yBAAyB,EAAE,IAAI;gBAC/B,wBAAwB,EAAE,CAAC,mBAAmB,EAAE,YAAY,EAAE,KAAK,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,EAlDgB,WAAW,2BAAX,WAAW,QAkD3B"}
1
+ {"version":3,"file":"FilePrinter.js","sourceRoot":"","sources":["../../src/utils/FilePrinter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yGAA+D;AAC/D,sDAA8B;AAC9B,uCAAkC;AAClC,4DAA4B;AAE5B,IAAiB,WAAW,CA6D3B;AA7DD,WAAiB,WAAW;IACb,uBAAW,GAAG,CACzB,IAAU,EACV,OAAe,EACT,EAAE;QACR,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,oBAAE,CAAC,0BAA0B,CAC3B,IAAI,EACJ,oBAAE,CAAC,UAAU,CAAC,sBAAsB,EACpC;YACE,GAAG;YACH,GAAG,OAAO;iBACP,KAAK,CAAC,MAAM,CAAC;iBACb,IAAI,CAAC,IAAI,CAAC;iBACV,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CACtE;YACH,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,IAAI,CACL,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEW,mBAAO,GAAG,GAAG,EAAE,CAC1B,oBAAE,CAAC,OAAO,CAAC,yBAAyB,CAAC,oBAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,iBAAK,GAAG,CAAC,KAGrB,EAAU,EAAE;;QACX,MAAM,MAAM,GAAW,oBAAE;aACtB,aAAa,CAAC;YACb,OAAO,EAAE,oBAAE,CAAC,WAAW,CAAC,QAAQ;SACjC,CAAC;aACD,SAAS,CACR,oBAAE,CAAC,OAAO,CAAC,gBAAgB,CACzB,KAAK,CAAC,UAAU,EAChB,oBAAE,CAAC,OAAO,CAAC,WAAW,CAAC,oBAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EACpD,oBAAE,CAAC,SAAS,CAAC,IAAI,CAClB,CACF,CAAC;QACJ,OAAO,CAAC,MAAA,KAAK,CAAC,GAAG,mCAAI,EAAE,CAAC,GAAG,MAAM,CAAC;IACpC,CAAC,CAAC;IAEW,oBAAQ,GAAG,CAAO,MAAc,EAAmB,EAAE;QAChE,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,iBAAM,EAAC,MAAM,EAAE;gBAC1B,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,CAAC,sCAAU,EAAE,MAAM,IAAA,iBAAO,EAAC,uBAAuB,CAAC,CAAC;gBAC7D,WAAW,EAAE,CAAC,uBAAuB,EAAE,OAAO,CAAC;gBAC/C,qBAAqB,EAAE,IAAI;gBAC3B,yBAAyB,EAAE,IAAI;gBAC/B,wBAAwB,EAAE,CAAC,mBAAmB,EAAE,YAAY,EAAE,KAAK,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,EA7DgB,WAAW,2BAAX,WAAW,QA6D3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autobe/compiler",
3
- "version": "0.28.1",
3
+ "version": "0.29.1",
4
4
  "description": "AI backend server code generator",
5
5
  "main": "lib/index.js",
6
6
  "author": "Wrtn Technologies",
@@ -13,8 +13,8 @@
13
13
  "url": "https://github.com/wrtnlabs/autobe/issues"
14
14
  },
15
15
  "dependencies": {
16
- "@nestia/core": "^9.0.1",
17
- "@nestia/migrate": "^9.0.1",
16
+ "@nestia/core": "^9.0.3",
17
+ "@nestia/migrate": "^9.0.3",
18
18
  "@samchon/openapi": "^5.0.1",
19
19
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
20
20
  "@typescript-eslint/eslint-plugin": "8.40.0",
@@ -30,9 +30,9 @@
30
30
  "tgrid": "^1.2.0",
31
31
  "tstl": "^3.0.0",
32
32
  "typia": "^10.0.2",
33
- "@autobe/filesystem": "^0.28.1",
34
- "@autobe/interface": "^0.28.1",
35
- "@autobe/utils": "^0.28.1"
33
+ "@autobe/filesystem": "^0.29.1",
34
+ "@autobe/interface": "^0.29.1",
35
+ "@autobe/utils": "^0.29.1"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^22.15.3",
@@ -5,10 +5,10 @@ import {
5
5
  IAutoBePrismaCompilerProps,
6
6
  IAutoBePrismaValidation,
7
7
  } from "@autobe/interface";
8
+ import { writePrismaApplication } from "@autobe/utils";
8
9
  import { EmbedPrisma } from "embed-prisma";
9
10
 
10
11
  import { validatePrismaApplication } from "./validatePrismaApplication";
11
- import { writePrismaApplication } from "./writePrismaApplication";
12
12
 
13
13
  export class AutoBePrismaCompiler implements IAutoBePrismaCompiler {
14
14
  public async compile(
@@ -12,7 +12,18 @@ export namespace FilePrinter {
12
12
  ts.addSyntheticLeadingComment(
13
13
  node,
14
14
  ts.SyntaxKind.MultiLineCommentTrivia,
15
- ["*", ...comment.split("\n").map((str) => ` * ${str}`), ""].join("\n"),
15
+ [
16
+ "*",
17
+ ...comment
18
+ .split("\r\n")
19
+ .join("\n")
20
+ .split("\n")
21
+ .map(
22
+ (str) =>
23
+ ` * ${str.split("*/").join("*\\\\/").split("*\\/").join("*\\\\/")}`,
24
+ ),
25
+ "",
26
+ ].join("\n"),
16
27
  true,
17
28
  );
18
29
  return node;
@@ -1,5 +0,0 @@
1
- import { AutoBePrisma } from "@autobe/interface";
2
- export declare function writePrismaApplication(props: {
3
- dbms: "postgres" | "sqlite";
4
- application: AutoBePrisma.IApplication;
5
- }): Record<string, string>;
@@ -1,341 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.writePrismaApplication = writePrismaApplication;
7
- const utils_1 = require("@autobe/utils");
8
- const crypto_1 = __importDefault(require("crypto"));
9
- const ArrayUtil_1 = require("../utils/ArrayUtil");
10
- function writePrismaApplication(props) {
11
- for (const file of props.application.files)
12
- for (const model of file.models)
13
- fillMappingName(model);
14
- return Object.assign(Object.assign({}, Object.fromEntries(props.application.files
15
- .filter((file) => file.filename !== "main.prisma")
16
- .map((file) => [
17
- file.filename,
18
- writeFile(Object.assign(Object.assign({}, props), { file })),
19
- ]))), { "main.prisma": props.dbms === "postgres" ? POSTGRES_MAIN_FILE : SQLITE_MAIN_FILE });
20
- }
21
- function writeFile(props) {
22
- return props.file.models
23
- .map((model) => writeModel(Object.assign(Object.assign({}, props), { model })))
24
- .join("\n\n");
25
- }
26
- function writeModel(props) {
27
- return [
28
- writeComment([
29
- props.model.description,
30
- "",
31
- ...(props.model.material ? [] : [`@namespace ${props.file.namespace}`]),
32
- "@author AutoBE - https://github.com/wrtnlabs/autobe",
33
- ].join("\n"), 80),
34
- `model ${props.model.name} {`,
35
- addIndent(ArrayUtil_1.ArrayUtil.paddle([writeColumns(props), writeRelations(props)]).join("\n")),
36
- "}",
37
- ].join("\n");
38
- }
39
- function fillMappingName(model) {
40
- const group = new Map();
41
- for (const ff of model.foreignFields) {
42
- utils_1.MapUtil.take(group, ff.relation.targetModel, () => []).push(ff);
43
- if (ff.relation.targetModel == model.name)
44
- ff.relation.mappingName = "recursive";
45
- }
46
- for (const array of group.values())
47
- if (array.length !== 1)
48
- for (const ff of array)
49
- ff.relation.mappingName = shortName(`${model.name}_of_${ff.name}`);
50
- }
51
- /* -----------------------------------------------------------
52
- COLUMNS
53
- ----------------------------------------------------------- */
54
- function writeColumns(props) {
55
- return [
56
- "//----",
57
- "// COLUMNS",
58
- "//----",
59
- writePrimary({
60
- dbms: props.dbms,
61
- model: props.model,
62
- field: props.model.primaryField,
63
- }),
64
- ...props.model.foreignFields
65
- .map((x) => [
66
- "",
67
- writeField({
68
- dbms: props.dbms,
69
- field: x,
70
- }),
71
- ])
72
- .flat(),
73
- ...props.model.plainFields
74
- .map((x) => [
75
- "",
76
- writeField({
77
- dbms: props.dbms,
78
- field: x,
79
- }),
80
- ])
81
- .flat(),
82
- ];
83
- }
84
- function writePrimary(props) {
85
- const type = props.dbms === "postgres" ? POSTGRES_PHYSICAL_TYPES.uuid : undefined;
86
- const pkeyName = `${props.model.name}__pkey`;
87
- const signature = pkeyName.length <= MAX_IDENTIFIER_LENGTH
88
- ? "@id"
89
- : `@id(map: "${shortName(pkeyName)}")`;
90
- return [
91
- writeComment(props.field.description, 78),
92
- `${props.field.name} String ${signature}${type ? ` ${type}` : ""}`,
93
- ].join("\n");
94
- }
95
- function writeField(props) {
96
- const logical = LOGICAL_TYPES[props.field.type];
97
- const physical = props.dbms === "postgres"
98
- ? POSTGRES_PHYSICAL_TYPES[props.field.type]
99
- : undefined;
100
- return [
101
- writeComment(props.field.description, 78),
102
- [
103
- props.field.name,
104
- `${logical}${props.field.nullable ? "?" : ""}`,
105
- ...(physical ? [physical] : []),
106
- ].join(" "),
107
- ].join("\n");
108
- }
109
- /* -----------------------------------------------------------
110
- RELATIONS
111
- ----------------------------------------------------------- */
112
- function writeRelations(props) {
113
- const hasRelationships = props.application.files
114
- .map((otherFile) => otherFile.models.map((otherModel) => otherModel.foreignFields
115
- .filter((otherForeign) => otherForeign.relation.targetModel === props.model.name)
116
- .map((otherForeign) => ({
117
- modelName: otherModel.name,
118
- unique: otherForeign.unique,
119
- mappingName: otherForeign.relation.mappingName,
120
- }))))
121
- .flat(2);
122
- const foreignIndexes = props.model.foreignFields.filter((f) => {
123
- if (f.unique === true)
124
- return props.model.uniqueIndexes.every((u) => u.fieldNames.length !== 1 || u.fieldNames[0] !== f.name);
125
- return (props.model.uniqueIndexes.every((u) => u.fieldNames[0] !== f.name) &&
126
- props.model.plainIndexes.every((p) => p.fieldNames[0] !== f.name));
127
- });
128
- const contents = [
129
- props.model.foreignFields.map((foreign) => writeConstraint({
130
- dbms: props.dbms,
131
- model: props.model,
132
- foreign,
133
- })),
134
- hasRelationships.map((r) => {
135
- var _a;
136
- return [
137
- (_a = r.mappingName) !== null && _a !== void 0 ? _a : r.modelName,
138
- `${r.modelName}${r.unique ? "?" : "[]"}`,
139
- ...(r.mappingName ? [`@relation("${r.mappingName}")`] : []),
140
- ].join(" ");
141
- }),
142
- foreignIndexes.map((field) => writeForeignIndex({
143
- model: props.model,
144
- field,
145
- })),
146
- [
147
- ...props.model.uniqueIndexes.map((unique) => writeUniqueIndex({
148
- model: props.model,
149
- unique,
150
- })),
151
- ...props.model.plainIndexes.map((plain) => writePlainIndex({
152
- model: props.model,
153
- plain,
154
- })),
155
- ...(props.dbms === "postgres"
156
- ? props.model.ginIndexes.map((gin) => writeGinIndex({
157
- model: props.model,
158
- gin,
159
- }))
160
- : []),
161
- ],
162
- ];
163
- if (contents.every((c) => c.length === 0))
164
- return [];
165
- return [
166
- "//----",
167
- "// RELATIONS",
168
- "//----",
169
- // paddled content
170
- ...ArrayUtil_1.ArrayUtil.paddle(contents),
171
- ];
172
- }
173
- function writeConstraint(props) {
174
- // spellchecker:ignore-next-line
175
- const name = `${props.model.name}_${props.foreign.name}_rela`;
176
- const tooMuchLong = props.dbms === "postgres" && name.length > MAX_IDENTIFIER_LENGTH;
177
- const body = [
178
- props.foreign.relation.name,
179
- `${props.foreign.relation.targetModel}${props.foreign.nullable ? "?" : ""}`,
180
- `@relation(${[
181
- ...(props.foreign.relation.mappingName
182
- ? [`"${props.foreign.relation.mappingName}"`]
183
- : []),
184
- `fields: [${props.foreign.name}]`,
185
- `references: [id]`,
186
- `onDelete: Cascade`,
187
- ...(tooMuchLong ? [`map: "${shortName(name)}"`] : []),
188
- ].join(", ")})`,
189
- ].join(" ");
190
- return tooMuchLong
191
- ? utils_1.StringUtil.trim `
192
- // spellchecker: ignore-next-line
193
- ${body}
194
- `
195
- : body;
196
- }
197
- function writeForeignIndex(props) {
198
- const name = `${props.model.name}_${props.field.name}_fkey`;
199
- const prefix = `@@${props.field.unique === true ? "unique" : "index"}([${props.field.name}]`;
200
- if (name.length <= MAX_IDENTIFIER_LENGTH)
201
- return `${prefix})`;
202
- return utils_1.StringUtil.trim `
203
- // spellchecker: ignore-next-line
204
- ${prefix}, map: "${shortName(name)}")
205
- `;
206
- }
207
- function writeUniqueIndex(props) {
208
- const name = `${props.model.name}_${props.unique.fieldNames.join("_")}_key`;
209
- const prefix = `@@unique([${props.unique.fieldNames.join(", ")}]`;
210
- if (name.length <= MAX_IDENTIFIER_LENGTH)
211
- return `${prefix})`;
212
- return utils_1.StringUtil.trim `
213
- // spellchecker: ignore-next-line
214
- ${prefix}, map: "${shortName(name)}")
215
- `;
216
- }
217
- function writePlainIndex(props) {
218
- const name = `${props.model.name}_${props.plain.fieldNames.join("_")}_idx`;
219
- const prefix = `@@index([${props.plain.fieldNames.join(", ")}]`;
220
- if (name.length <= MAX_IDENTIFIER_LENGTH)
221
- return `${prefix})`;
222
- return utils_1.StringUtil.trim `
223
- // spellchecker: ignore-next-line
224
- ${prefix}, map: "${shortName(name)}")
225
- `;
226
- }
227
- function writeGinIndex(props) {
228
- const name = `${props.model.name}_${props.gin.fieldName}_idx`;
229
- const prefix = `@@index([${props.gin.fieldName}(ops: raw("gin_trgm_ops"))], type: Gin`;
230
- if (name.length <= MAX_IDENTIFIER_LENGTH)
231
- return `${prefix})`;
232
- return utils_1.StringUtil.trim `
233
- // spellchecker: ignore-next-line
234
- ${prefix}, map: "${shortName(name)}")
235
- `;
236
- }
237
- /* -----------------------------------------------------------
238
- BACKGROUND
239
- ----------------------------------------------------------- */
240
- function writeComment(content, length) {
241
- return content
242
- .split("\r\n")
243
- .join("\n")
244
- .split("\n")
245
- .map((line) => line.trim())
246
- .map((line) => {
247
- // 77자에서 "/// " 4자를 뺀 73자가 실제 컨텐츠 최대 길이
248
- if (line.length <= length - 4)
249
- return [line];
250
- const words = line.split(" ");
251
- const result = [];
252
- let currentLine = "";
253
- for (const word of words) {
254
- const potentialLine = currentLine ? `${currentLine} ${word}` : word;
255
- if (potentialLine.length <= 73) {
256
- currentLine = potentialLine;
257
- }
258
- else {
259
- if (currentLine)
260
- result.push(currentLine);
261
- currentLine = word;
262
- }
263
- }
264
- if (currentLine)
265
- result.push(currentLine);
266
- return result;
267
- })
268
- .flat()
269
- .map((str) => `///${str.length ? ` ${str}` : ""}`)
270
- .join("\n")
271
- .trim();
272
- }
273
- function addIndent(content) {
274
- return content
275
- .split("\r\n")
276
- .join("\n")
277
- .split("\n")
278
- .map((str) => ` ${str}`)
279
- .join("\n");
280
- }
281
- function shortName(name) {
282
- if (name.length <= MAX_IDENTIFIER_LENGTH)
283
- return name;
284
- const hash = crypto_1.default
285
- .createHash("md5")
286
- .update(name)
287
- .digest("hex")
288
- .substring(0, HASH_TRUNCATION_LENGTH);
289
- return `${name.substring(0, MAX_IDENTIFIER_LENGTH - HASH_TRUNCATION_LENGTH - 1)}_${hash}`;
290
- }
291
- const LOGICAL_TYPES = {
292
- // native types
293
- boolean: "Boolean",
294
- int: "Int",
295
- double: "Float",
296
- string: "String",
297
- // formats
298
- datetime: "DateTime",
299
- uuid: "String",
300
- uri: "String",
301
- };
302
- const POSTGRES_PHYSICAL_TYPES = {
303
- int: "@db.Integer",
304
- double: "@db.DoublePrecision",
305
- uuid: "@db.Uuid",
306
- datetime: "@db.Timestamptz",
307
- uri: "@db.VarChar(80000)",
308
- };
309
- const POSTGRES_MAIN_FILE = utils_1.StringUtil.trim `
310
- generator client {
311
- provider = "prisma-client-js"
312
- engineType = "client"
313
- previewFeatures = ["postgresqlExtensions", "views"]
314
- }
315
- datasource db {
316
- provider = "postgresql"
317
- url = env("DATABASE_URL")
318
- extensions = [pg_trgm]
319
- }
320
- generator markdown {
321
- provider = "prisma-markdown"
322
- output = "../../docs/ERD.md"
323
- }
324
- `;
325
- const SQLITE_MAIN_FILE = utils_1.StringUtil.trim `
326
- generator client {
327
- provider = "prisma-client-js"
328
- engineType = "client"
329
- }
330
- datasource db {
331
- provider = "sqlite"
332
- url = "file:../db.sqlite"
333
- }
334
- generator markdown {
335
- provider = "prisma-markdown"
336
- output = "../../docs/ERD.md"
337
- }
338
- `;
339
- const MAX_IDENTIFIER_LENGTH = 63;
340
- const HASH_TRUNCATION_LENGTH = 8;
341
- //# sourceMappingURL=writePrismaApplication.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"writePrismaApplication.js","sourceRoot":"","sources":["../../src/prisma/writePrismaApplication.ts"],"names":[],"mappings":"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"}
@@ -1,438 +0,0 @@
1
- import { AutoBePrisma } from "@autobe/interface";
2
- import { MapUtil, StringUtil } from "@autobe/utils";
3
- import crypto from "crypto";
4
-
5
- import { ArrayUtil } from "../utils/ArrayUtil";
6
-
7
- export function writePrismaApplication(props: {
8
- dbms: "postgres" | "sqlite";
9
- application: AutoBePrisma.IApplication;
10
- }): Record<string, string> {
11
- for (const file of props.application.files)
12
- for (const model of file.models) fillMappingName(model);
13
- return {
14
- ...Object.fromEntries(
15
- props.application.files
16
- .filter((file) => file.filename !== "main.prisma")
17
- .map((file) => [
18
- file.filename,
19
- writeFile({
20
- ...props,
21
- file,
22
- }),
23
- ]),
24
- ),
25
- "main.prisma":
26
- props.dbms === "postgres" ? POSTGRES_MAIN_FILE : SQLITE_MAIN_FILE,
27
- };
28
- }
29
-
30
- function writeFile(props: {
31
- dbms: "postgres" | "sqlite";
32
- application: AutoBePrisma.IApplication;
33
- file: AutoBePrisma.IFile;
34
- }): string {
35
- return props.file.models
36
- .map((model) =>
37
- writeModel({
38
- ...props,
39
- model,
40
- }),
41
- )
42
- .join("\n\n");
43
- }
44
-
45
- function writeModel(props: {
46
- dbms: "postgres" | "sqlite";
47
- application: AutoBePrisma.IApplication;
48
- file: AutoBePrisma.IFile;
49
- model: AutoBePrisma.IModel;
50
- }): string {
51
- return [
52
- writeComment(
53
- [
54
- props.model.description,
55
- "",
56
- ...(props.model.material ? [] : [`@namespace ${props.file.namespace}`]),
57
- "@author AutoBE - https://github.com/wrtnlabs/autobe",
58
- ].join("\n"),
59
- 80,
60
- ),
61
- `model ${props.model.name} {`,
62
- addIndent(
63
- ArrayUtil.paddle([writeColumns(props), writeRelations(props)]).join("\n"),
64
- ),
65
- "}",
66
- ].join("\n");
67
- }
68
-
69
- function fillMappingName(model: AutoBePrisma.IModel): void {
70
- const group: Map<string, AutoBePrisma.IForeignField[]> = new Map();
71
- for (const ff of model.foreignFields) {
72
- MapUtil.take(group, ff.relation.targetModel, () => []).push(ff);
73
- if (ff.relation.targetModel == model.name)
74
- ff.relation.mappingName = "recursive";
75
- }
76
- for (const array of group.values())
77
- if (array.length !== 1)
78
- for (const ff of array)
79
- ff.relation.mappingName = shortName(`${model.name}_of_${ff.name}`);
80
- }
81
-
82
- /* -----------------------------------------------------------
83
- COLUMNS
84
- ----------------------------------------------------------- */
85
- function writeColumns(props: {
86
- dbms: "postgres" | "sqlite";
87
- model: AutoBePrisma.IModel;
88
- }): string[] {
89
- return [
90
- "//----",
91
- "// COLUMNS",
92
- "//----",
93
- writePrimary({
94
- dbms: props.dbms,
95
- model: props.model,
96
- field: props.model.primaryField,
97
- }),
98
- ...props.model.foreignFields
99
- .map((x) => [
100
- "",
101
- writeField({
102
- dbms: props.dbms,
103
- field: x,
104
- }),
105
- ])
106
- .flat(),
107
- ...props.model.plainFields
108
- .map((x) => [
109
- "",
110
- writeField({
111
- dbms: props.dbms,
112
- field: x,
113
- }),
114
- ])
115
- .flat(),
116
- ];
117
- }
118
-
119
- function writePrimary(props: {
120
- dbms: "postgres" | "sqlite";
121
- model: AutoBePrisma.IModel;
122
- field: AutoBePrisma.IPrimaryField;
123
- }): string {
124
- const type: string | undefined =
125
- props.dbms === "postgres" ? POSTGRES_PHYSICAL_TYPES.uuid : undefined;
126
- const pkeyName: string = `${props.model.name}__pkey`;
127
- const signature: string =
128
- pkeyName.length <= MAX_IDENTIFIER_LENGTH
129
- ? "@id"
130
- : `@id(map: "${shortName(pkeyName)}")`;
131
- return [
132
- writeComment(props.field.description, 78),
133
- `${props.field.name} String ${signature}${type ? ` ${type}` : ""}`,
134
- ].join("\n");
135
- }
136
-
137
- function writeField(props: {
138
- dbms: "postgres" | "sqlite";
139
- field: AutoBePrisma.IPlainField;
140
- }): string {
141
- const logical: string = LOGICAL_TYPES[props.field.type];
142
- const physical: string | undefined =
143
- props.dbms === "postgres"
144
- ? POSTGRES_PHYSICAL_TYPES[
145
- props.field.type as keyof typeof POSTGRES_PHYSICAL_TYPES
146
- ]
147
- : undefined;
148
- return [
149
- writeComment(props.field.description, 78),
150
- [
151
- props.field.name,
152
- `${logical}${props.field.nullable ? "?" : ""}`,
153
- ...(physical ? [physical] : []),
154
- ].join(" "),
155
- ].join("\n");
156
- }
157
-
158
- /* -----------------------------------------------------------
159
- RELATIONS
160
- ----------------------------------------------------------- */
161
- function writeRelations(props: {
162
- dbms: "postgres" | "sqlite";
163
- application: AutoBePrisma.IApplication;
164
- model: AutoBePrisma.IModel;
165
- }): string[] {
166
- interface IHasRelationship {
167
- modelName: string;
168
- unique: boolean;
169
- mappingName?: string;
170
- }
171
- const hasRelationships: IHasRelationship[] = props.application.files
172
- .map((otherFile) =>
173
- otherFile.models.map((otherModel) =>
174
- otherModel.foreignFields
175
- .filter(
176
- (otherForeign) =>
177
- otherForeign.relation.targetModel === props.model.name,
178
- )
179
- .map((otherForeign) => ({
180
- modelName: otherModel.name,
181
- unique: otherForeign.unique,
182
- mappingName: otherForeign.relation.mappingName,
183
- })),
184
- ),
185
- )
186
- .flat(2);
187
- const foreignIndexes: AutoBePrisma.IForeignField[] =
188
- props.model.foreignFields.filter((f) => {
189
- if (f.unique === true)
190
- return props.model.uniqueIndexes.every(
191
- (u) => u.fieldNames.length !== 1 || u.fieldNames[0] !== f.name,
192
- );
193
- return (
194
- props.model.uniqueIndexes.every((u) => u.fieldNames[0] !== f.name) &&
195
- props.model.plainIndexes.every((p) => p.fieldNames[0] !== f.name)
196
- );
197
- });
198
- const contents: string[][] = [
199
- props.model.foreignFields.map((foreign) =>
200
- writeConstraint({
201
- dbms: props.dbms,
202
- model: props.model,
203
- foreign,
204
- }),
205
- ),
206
- hasRelationships.map((r) =>
207
- [
208
- r.mappingName ?? r.modelName,
209
- `${r.modelName}${r.unique ? "?" : "[]"}`,
210
- ...(r.mappingName ? [`@relation("${r.mappingName}")`] : []),
211
- ].join(" "),
212
- ),
213
- foreignIndexes.map((field) =>
214
- writeForeignIndex({
215
- model: props.model,
216
- field,
217
- }),
218
- ),
219
- [
220
- ...props.model.uniqueIndexes.map((unique) =>
221
- writeUniqueIndex({
222
- model: props.model,
223
- unique,
224
- }),
225
- ),
226
- ...props.model.plainIndexes.map((plain) =>
227
- writePlainIndex({
228
- model: props.model,
229
- plain,
230
- }),
231
- ),
232
- ...(props.dbms === "postgres"
233
- ? props.model.ginIndexes.map((gin) =>
234
- writeGinIndex({
235
- model: props.model,
236
- gin,
237
- }),
238
- )
239
- : []),
240
- ],
241
- ];
242
- if (contents.every((c) => c.length === 0)) return [];
243
- return [
244
- "//----",
245
- "// RELATIONS",
246
- "//----",
247
- // paddled content
248
- ...ArrayUtil.paddle(contents),
249
- ];
250
- }
251
-
252
- function writeConstraint(props: {
253
- dbms: "postgres" | "sqlite";
254
- model: AutoBePrisma.IModel;
255
- foreign: AutoBePrisma.IForeignField;
256
- }): string {
257
- // spellchecker:ignore-next-line
258
- const name: string = `${props.model.name}_${props.foreign.name}_rela`;
259
- const tooMuchLong: boolean =
260
- props.dbms === "postgres" && name.length > MAX_IDENTIFIER_LENGTH;
261
- const body: string = [
262
- props.foreign.relation.name,
263
- `${props.foreign.relation.targetModel}${props.foreign.nullable ? "?" : ""}`,
264
- `@relation(${[
265
- ...(props.foreign.relation.mappingName
266
- ? [`"${props.foreign.relation.mappingName}"`]
267
- : []),
268
- `fields: [${props.foreign.name}]`,
269
- `references: [id]`,
270
- `onDelete: Cascade`,
271
- ...(tooMuchLong ? [`map: "${shortName(name)}"`] : []),
272
- ].join(", ")})`,
273
- ].join(" ");
274
- return tooMuchLong
275
- ? StringUtil.trim`
276
- // spellchecker: ignore-next-line
277
- ${body}
278
- `
279
- : body;
280
- }
281
-
282
- function writeForeignIndex(props: {
283
- model: AutoBePrisma.IModel;
284
- field: AutoBePrisma.IForeignField;
285
- }): string {
286
- const name: string = `${props.model.name}_${props.field.name}_fkey`;
287
- const prefix: string = `@@${props.field.unique === true ? "unique" : "index"}([${props.field.name}]`;
288
- if (name.length <= MAX_IDENTIFIER_LENGTH) return `${prefix})`;
289
- return StringUtil.trim`
290
- // spellchecker: ignore-next-line
291
- ${prefix}, map: "${shortName(name)}")
292
- `;
293
- }
294
-
295
- function writeUniqueIndex(props: {
296
- model: AutoBePrisma.IModel;
297
- unique: AutoBePrisma.IUniqueIndex;
298
- }): string {
299
- const name: string = `${props.model.name}_${props.unique.fieldNames.join("_")}_key`;
300
- const prefix: string = `@@unique([${props.unique.fieldNames.join(", ")}]`;
301
- if (name.length <= MAX_IDENTIFIER_LENGTH) return `${prefix})`;
302
- return StringUtil.trim`
303
- // spellchecker: ignore-next-line
304
- ${prefix}, map: "${shortName(name)}")
305
- `;
306
- }
307
-
308
- function writePlainIndex(props: {
309
- model: AutoBePrisma.IModel;
310
- plain: AutoBePrisma.IPlainIndex;
311
- }): string {
312
- const name: string = `${props.model.name}_${props.plain.fieldNames.join("_")}_idx`;
313
- const prefix: string = `@@index([${props.plain.fieldNames.join(", ")}]`;
314
- if (name.length <= MAX_IDENTIFIER_LENGTH) return `${prefix})`;
315
- return StringUtil.trim`
316
- // spellchecker: ignore-next-line
317
- ${prefix}, map: "${shortName(name)}")
318
- `;
319
- }
320
-
321
- function writeGinIndex(props: {
322
- model: AutoBePrisma.IModel;
323
- gin: AutoBePrisma.IGinIndex;
324
- }): string {
325
- const name: string = `${props.model.name}_${props.gin.fieldName}_idx`;
326
- const prefix: string = `@@index([${props.gin.fieldName}(ops: raw("gin_trgm_ops"))], type: Gin`;
327
- if (name.length <= MAX_IDENTIFIER_LENGTH) return `${prefix})`;
328
- return StringUtil.trim`
329
- // spellchecker: ignore-next-line
330
- ${prefix}, map: "${shortName(name)}")
331
- `;
332
- }
333
-
334
- /* -----------------------------------------------------------
335
- BACKGROUND
336
- ----------------------------------------------------------- */
337
- function writeComment(content: string, length: number): string {
338
- return content
339
- .split("\r\n")
340
- .join("\n")
341
- .split("\n")
342
- .map((line) => line.trim())
343
- .map((line) => {
344
- // 77자에서 "/// " 4자를 뺀 73자가 실제 컨텐츠 최대 길이
345
- if (line.length <= length - 4) return [line];
346
- const words: string[] = line.split(" ");
347
- const result: string[] = [];
348
- let currentLine = "";
349
-
350
- for (const word of words) {
351
- const potentialLine = currentLine ? `${currentLine} ${word}` : word;
352
- if (potentialLine.length <= 73) {
353
- currentLine = potentialLine;
354
- } else {
355
- if (currentLine) result.push(currentLine);
356
- currentLine = word;
357
- }
358
- }
359
-
360
- if (currentLine) result.push(currentLine);
361
- return result;
362
- })
363
- .flat()
364
- .map((str) => `///${str.length ? ` ${str}` : ""}`)
365
- .join("\n")
366
- .trim();
367
- }
368
-
369
- function addIndent(content: string): string {
370
- return content
371
- .split("\r\n")
372
- .join("\n")
373
- .split("\n")
374
- .map((str) => ` ${str}`)
375
- .join("\n");
376
- }
377
-
378
- function shortName(name: string): string {
379
- if (name.length <= MAX_IDENTIFIER_LENGTH) return name;
380
- const hash: string = crypto
381
- .createHash("md5")
382
- .update(name)
383
- .digest("hex")
384
- .substring(0, HASH_TRUNCATION_LENGTH);
385
- return `${name.substring(0, MAX_IDENTIFIER_LENGTH - HASH_TRUNCATION_LENGTH - 1)}_${hash}`;
386
- }
387
-
388
- const LOGICAL_TYPES = {
389
- // native types
390
- boolean: "Boolean",
391
- int: "Int",
392
- double: "Float",
393
- string: "String",
394
- // formats
395
- datetime: "DateTime",
396
- uuid: "String",
397
- uri: "String",
398
- };
399
- const POSTGRES_PHYSICAL_TYPES = {
400
- int: "@db.Integer",
401
- double: "@db.DoublePrecision",
402
- uuid: "@db.Uuid",
403
- datetime: "@db.Timestamptz",
404
- uri: "@db.VarChar(80000)",
405
- };
406
-
407
- const POSTGRES_MAIN_FILE = StringUtil.trim`
408
- generator client {
409
- provider = "prisma-client-js"
410
- engineType = "client"
411
- previewFeatures = ["postgresqlExtensions", "views"]
412
- }
413
- datasource db {
414
- provider = "postgresql"
415
- url = env("DATABASE_URL")
416
- extensions = [pg_trgm]
417
- }
418
- generator markdown {
419
- provider = "prisma-markdown"
420
- output = "../../docs/ERD.md"
421
- }
422
- `;
423
- const SQLITE_MAIN_FILE = StringUtil.trim`
424
- generator client {
425
- provider = "prisma-client-js"
426
- engineType = "client"
427
- }
428
- datasource db {
429
- provider = "sqlite"
430
- url = "file:../db.sqlite"
431
- }
432
- generator markdown {
433
- provider = "prisma-markdown"
434
- output = "../../docs/ERD.md"
435
- }
436
- `;
437
- const MAX_IDENTIFIER_LENGTH = 63;
438
- const HASH_TRUNCATION_LENGTH = 8;