sonamu 0.2.52 → 0.2.54
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/dist/bin/cli-wrapper.mjs +1 -2
- package/dist/bin/cli-wrapper.mjs.map +1 -1
- package/dist/bin/cli.js +48 -48
- package/dist/bin/cli.mjs +2 -3
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/{chunk-4EET56IE.js → chunk-JOHF7PK4.js} +24 -11
- package/dist/chunk-JOHF7PK4.js.map +1 -0
- package/dist/{chunk-HEPO4HGK.mjs → chunk-L4KELCY7.mjs} +16 -4
- package/dist/chunk-L4KELCY7.mjs.map +1 -0
- package/dist/{chunk-JXJTFHF7.mjs → chunk-PTFDTOJU.mjs} +1 -2
- package/dist/{chunk-JXJTFHF7.mjs.map → chunk-PTFDTOJU.mjs.map} +1 -1
- package/dist/index.js +3 -3
- package/dist/index.mjs +2 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/api/code-converters.ts +19 -0
- package/dist/chunk-4EET56IE.js.map +0 -1
- package/dist/chunk-HEPO4HGK.mjs.map +0 -1
package/dist/bin/cli-wrapper.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/cli-wrapper.ts"],"sourcesContent":["#!/usr/bin/env ts-node\n\nimport { spawnSync } from \"child_process\";\nimport { extname, resolve } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\n\nconst cjsPath = resolve(__dirname, \"bin/cli.js\");\nconst esmPath = resolve(__dirname, \"bin/cli.mjs\");\n\nconst isESM = () => {\n const packageJsonPath = resolve(process.cwd(), \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n\n // package.json에 \"type\": \"module\" 설정 확인\n if (packageJson.type === \"module\") {\n return true;\n }\n\n // 환경 변수에서 ESM 여부 확인\n if (process.env.USE_ESM === \"true\") {\n return true;\n }\n\n // package.json에 \"type\": \"module\" 설정\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n return packageJson.type === \"module\";\n }\n\n // main 필드가 .mjs로 끝나는지 확인\n if (packageJson.main && extname(packageJson.main) === \".mjs\") {\n return true;\n }\n\n return false;\n};\n\nconst scriptPath = isESM() ? esmPath : cjsPath;\n\nif (!existsSync(scriptPath)) {\n console.error(`Error: Script not found at ${scriptPath}`);\n process.exit(1);\n}\n\nconst result = spawnSync(\n process.execPath,\n [scriptPath, ...process.argv.slice(2)],\n {\n stdio: \"inherit\",\n }\n);\n\nprocess.exit(result.status ?? 1);\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/bin/cli-wrapper.ts"],"sourcesContent":["#!/usr/bin/env ts-node\n\nimport { spawnSync } from \"child_process\";\nimport { extname, resolve } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\n\nconst cjsPath = resolve(__dirname, \"bin/cli.js\");\nconst esmPath = resolve(__dirname, \"bin/cli.mjs\");\n\nconst isESM = () => {\n const packageJsonPath = resolve(process.cwd(), \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n\n // package.json에 \"type\": \"module\" 설정 확인\n if (packageJson.type === \"module\") {\n return true;\n }\n\n // 환경 변수에서 ESM 여부 확인\n if (process.env.USE_ESM === \"true\") {\n return true;\n }\n\n // package.json에 \"type\": \"module\" 설정\n if (existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n return packageJson.type === \"module\";\n }\n\n // main 필드가 .mjs로 끝나는지 확인\n if (packageJson.main && extname(packageJson.main) === \".mjs\") {\n return true;\n }\n\n return false;\n};\n\nconst scriptPath = isESM() ? esmPath : cjsPath;\n\nif (!existsSync(scriptPath)) {\n console.error(`Error: Script not found at ${scriptPath}`);\n process.exit(1);\n}\n\nconst result = spawnSync(\n process.execPath,\n [scriptPath, ...process.argv.slice(2)],\n {\n stdio: \"inherit\",\n }\n);\n\nprocess.exit(result.status ?? 1);\n"],"mappings":";;;;;;AAEA,SAAS,iBAAiB;AAC1B,SAAS,SAAS,eAAe;AACjC,SAAS,YAAY,oBAAoB;AAEzC,IAAM,UAAU,QAAQ,WAAW,YAAY;AAC/C,IAAM,UAAU,QAAQ,WAAW,aAAa;AAEhD,IAAM,QAAQ,MAAM;AAClB,QAAM,kBAAkB,QAAQ,QAAQ,IAAI,GAAG,cAAc;AAC7D,QAAM,cAAc,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAAC;AAGrE,MAAI,YAAY,SAAS,UAAU;AACjC,WAAO;AAAA,EACT;AAGA,MAAI,QAAQ,IAAI,YAAY,QAAQ;AAClC,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,eAAe,GAAG;AAC/B,UAAMA,eAAc,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAAC;AACrE,WAAOA,aAAY,SAAS;AAAA,EAC9B;AAGA,MAAI,YAAY,QAAQ,QAAQ,YAAY,IAAI,MAAM,QAAQ;AAC5D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,aAAa,MAAM,IAAI,UAAU;AAEvC,IAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,UAAQ,MAAM,8BAA8B,UAAU,EAAE;AACxD,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,SAAS;AAAA,EACb,QAAQ;AAAA,EACR,CAAC,YAAY,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EACrC;AAAA,IACE,OAAO;AAAA,EACT;AACF;AAEA,QAAQ,KAAK,OAAO,UAAU,CAAC;","names":["packageJson"]}
|
package/dist/bin/cli.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _chunkJOHF7PK4js = require('../chunk-JOHF7PK4.js');
|
|
15
15
|
|
|
16
16
|
// src/bin/cli.ts
|
|
17
17
|
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
@@ -54,7 +54,7 @@ var SMD = class {
|
|
|
54
54
|
this.table = _nullishCoalesce(table, () => ( _inflection2.default.underscore(_inflection2.default.pluralize(id))));
|
|
55
55
|
if (props) {
|
|
56
56
|
this.props = props.map((prop) => {
|
|
57
|
-
if (
|
|
57
|
+
if (_chunkJOHF7PK4js.isEnumProp.call(void 0, prop)) {
|
|
58
58
|
if (prop.id.includes("$Model")) {
|
|
59
59
|
prop.id = prop.id.replace("$Model", id);
|
|
60
60
|
}
|
|
@@ -67,7 +67,7 @@ var SMD = class {
|
|
|
67
67
|
[prop.name]: prop
|
|
68
68
|
};
|
|
69
69
|
}, {});
|
|
70
|
-
this.relations = props.filter((prop) =>
|
|
70
|
+
this.relations = props.filter((prop) => _chunkJOHF7PK4js.isRelationProp.call(void 0, prop)).reduce((result, prop) => {
|
|
71
71
|
return {
|
|
72
72
|
...result,
|
|
73
73
|
[prop.name]: prop
|
|
@@ -112,10 +112,10 @@ var SMD = class {
|
|
|
112
112
|
const fields2 = subsetGroup[groupKey];
|
|
113
113
|
if (groupKey === "") {
|
|
114
114
|
const realFields = fields2.filter(
|
|
115
|
-
(field) => !
|
|
115
|
+
(field) => !_chunkJOHF7PK4js.isVirtualProp.call(void 0, this.propsDict[field])
|
|
116
116
|
);
|
|
117
117
|
const virtualFields = fields2.filter(
|
|
118
|
-
(field) =>
|
|
118
|
+
(field) => _chunkJOHF7PK4js.isVirtualProp.call(void 0, this.propsDict[field])
|
|
119
119
|
);
|
|
120
120
|
if (prefix === "") {
|
|
121
121
|
r.select = r.select.concat(
|
|
@@ -136,7 +136,7 @@ var SMD = class {
|
|
|
136
136
|
throw new Error(`\uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 relation \uCC38\uC870 ${groupKey}`);
|
|
137
137
|
}
|
|
138
138
|
const relSMD = SMDManager.get(relation.with);
|
|
139
|
-
if (
|
|
139
|
+
if (_chunkJOHF7PK4js.isOneToOneRelationProp.call(void 0, relation) || _chunkJOHF7PK4js.isBelongsToOneRelationProp.call(void 0, relation)) {
|
|
140
140
|
const relFields = fields2.map(
|
|
141
141
|
(field) => field.split(".").slice(1).join(".")
|
|
142
142
|
);
|
|
@@ -154,7 +154,7 @@ var SMD = class {
|
|
|
154
154
|
if (isAlreadyOuterJoined) {
|
|
155
155
|
return "outer";
|
|
156
156
|
}
|
|
157
|
-
if (
|
|
157
|
+
if (_chunkJOHF7PK4js.isOneToOneRelationProp.call(void 0, relation)) {
|
|
158
158
|
if (relation.hasJoinColumn === true && (_nullishCoalesce(relation.nullable, () => ( false))) === false) {
|
|
159
159
|
return "inner";
|
|
160
160
|
} else {
|
|
@@ -184,7 +184,7 @@ var SMD = class {
|
|
|
184
184
|
};
|
|
185
185
|
} else {
|
|
186
186
|
let from, to;
|
|
187
|
-
if (
|
|
187
|
+
if (_chunkJOHF7PK4js.isOneToOneRelationProp.call(void 0, relation)) {
|
|
188
188
|
if (relation.hasJoinColumn) {
|
|
189
189
|
from = `${fromTable}.${relation.name}_id`;
|
|
190
190
|
to = `${joinAs}.id`;
|
|
@@ -223,13 +223,13 @@ var SMD = class {
|
|
|
223
223
|
r.loaders = [...r.loaders, ...convertedLoaders];
|
|
224
224
|
}
|
|
225
225
|
r.joins = r.joins.concat(relSubsetQuery.joins);
|
|
226
|
-
} else if (
|
|
226
|
+
} else if (_chunkJOHF7PK4js.isHasManyRelationProp.call(void 0, relation) || _chunkJOHF7PK4js.isManyToManyRelationProp.call(void 0, relation)) {
|
|
227
227
|
const relFields = fields2.map(
|
|
228
228
|
(field) => field.split(".").slice(1).join(".")
|
|
229
229
|
);
|
|
230
230
|
const relSubsetQuery = relSMD.resolveSubsetQuery("", relFields);
|
|
231
231
|
let manyJoin;
|
|
232
|
-
if (
|
|
232
|
+
if (_chunkJOHF7PK4js.isHasManyRelationProp.call(void 0, relation)) {
|
|
233
233
|
manyJoin = {
|
|
234
234
|
fromTable: this.table,
|
|
235
235
|
fromCol: "id",
|
|
@@ -237,7 +237,7 @@ var SMD = class {
|
|
|
237
237
|
toTable: relSMD.table,
|
|
238
238
|
toCol: relation.joinColumn
|
|
239
239
|
};
|
|
240
|
-
} else if (
|
|
240
|
+
} else if (_chunkJOHF7PK4js.isManyToManyRelationProp.call(void 0, relation)) {
|
|
241
241
|
const [table1, table2] = relation.joinTable.split("__");
|
|
242
242
|
manyJoin = {
|
|
243
243
|
fromTable: this.table,
|
|
@@ -320,11 +320,11 @@ var SMD = class {
|
|
|
320
320
|
});
|
|
321
321
|
}
|
|
322
322
|
const prop = smd.propsDict[key];
|
|
323
|
-
if (!
|
|
323
|
+
if (!_chunkJOHF7PK4js.isRelationProp.call(void 0, prop)) {
|
|
324
324
|
throw new Error(`\uC798\uBABB\uB41C FieldExpr ${key}.${group[0]}`);
|
|
325
325
|
}
|
|
326
326
|
const relSMD = SMDManager.get(prop.with);
|
|
327
|
-
if (
|
|
327
|
+
if (_chunkJOHF7PK4js.isBelongsToOneRelationProp.call(void 0, prop) || _chunkJOHF7PK4js.isOneToOneRelationProp.call(void 0, prop)) {
|
|
328
328
|
if (group.length == 1 && (group[0] === "id" || group[0] == "id?")) {
|
|
329
329
|
const idProp = relSMD.propsDict.id;
|
|
330
330
|
return {
|
|
@@ -339,7 +339,7 @@ var SMD = class {
|
|
|
339
339
|
}
|
|
340
340
|
}
|
|
341
341
|
const children = this.fieldExprsToPropNodes(group, relSMD);
|
|
342
|
-
const nodeType =
|
|
342
|
+
const nodeType = _chunkJOHF7PK4js.isBelongsToOneRelationProp.call(void 0, prop) || _chunkJOHF7PK4js.isOneToOneRelationProp.call(void 0, prop) ? "object" : "array";
|
|
343
343
|
return {
|
|
344
344
|
prop,
|
|
345
345
|
children,
|
|
@@ -353,7 +353,7 @@ var SMD = class {
|
|
|
353
353
|
if (propName === prefix) {
|
|
354
354
|
return null;
|
|
355
355
|
}
|
|
356
|
-
if (
|
|
356
|
+
if (_chunkJOHF7PK4js.isRelationProp.call(void 0, prop)) {
|
|
357
357
|
if (maxDepth < 0) {
|
|
358
358
|
return null;
|
|
359
359
|
}
|
|
@@ -393,7 +393,7 @@ var SMD = class {
|
|
|
393
393
|
}
|
|
394
394
|
const typesModulePath = `${basePath}/${this.names.fs}.types`;
|
|
395
395
|
const typesFileDistPath = _path2.default.join(
|
|
396
|
-
|
|
396
|
+
_chunkJOHF7PK4js.Sonamu.apiRootPath,
|
|
397
397
|
`dist/application/${typesModulePath}.js`
|
|
398
398
|
);
|
|
399
399
|
if (_fsextra2.default.existsSync(typesFileDistPath)) {
|
|
@@ -410,7 +410,7 @@ var SMD = class {
|
|
|
410
410
|
}
|
|
411
411
|
const enumsModulePath = `${basePath}/${this.names.fs}.enums`;
|
|
412
412
|
const enumsFileDistPath = _path2.default.join(
|
|
413
|
-
|
|
413
|
+
_chunkJOHF7PK4js.Sonamu.apiRootPath,
|
|
414
414
|
`/dist/application/${enumsModulePath}.js`
|
|
415
415
|
);
|
|
416
416
|
if (_fsextra2.default.existsSync(enumsFileDistPath)) {
|
|
@@ -454,7 +454,7 @@ var SMDManagerClass = class {
|
|
|
454
454
|
return;
|
|
455
455
|
}
|
|
456
456
|
const pathPattern = _path2.default.join(
|
|
457
|
-
|
|
457
|
+
_chunkJOHF7PK4js.Sonamu.apiRootPath,
|
|
458
458
|
"/dist/application/**/*.smd.js"
|
|
459
459
|
);
|
|
460
460
|
!doSilent && console.log(_chalk2.default.yellow(`autoload ${pathPattern}`));
|
|
@@ -550,14 +550,14 @@ console.log(_chalk2.default.bgBlue(`BEGIN ${/* @__PURE__ */ new Date()}`));
|
|
|
550
550
|
_dotenv2.default.config();
|
|
551
551
|
var migrator;
|
|
552
552
|
async function bootstrap() {
|
|
553
|
-
await
|
|
553
|
+
await _chunkJOHF7PK4js.Sonamu.init(false, false);
|
|
554
554
|
await _tsicli.tsicli.call(void 0, _process2.default.argv, {
|
|
555
555
|
types: {
|
|
556
556
|
"#entityId": {
|
|
557
557
|
type: "autocomplete",
|
|
558
558
|
name: "#entityId",
|
|
559
559
|
message: "Please input #entityId",
|
|
560
|
-
choices:
|
|
560
|
+
choices: _chunkJOHF7PK4js.EntityManager.getAllParentIds().map((entityId) => ({
|
|
561
561
|
title: entityId,
|
|
562
562
|
value: entityId
|
|
563
563
|
}))
|
|
@@ -607,18 +607,18 @@ bootstrap().finally(async () => {
|
|
|
607
607
|
if (migrator) {
|
|
608
608
|
await migrator.destroy();
|
|
609
609
|
}
|
|
610
|
-
await
|
|
611
|
-
await
|
|
610
|
+
await _chunkJOHF7PK4js.FixtureManager.destory();
|
|
611
|
+
await _chunkJOHF7PK4js.BaseModel.destroy();
|
|
612
612
|
console.log(_chalk2.default.bgBlue(`END ${/* @__PURE__ */ new Date()}
|
|
613
613
|
`));
|
|
614
614
|
});
|
|
615
615
|
async function setupMigrator() {
|
|
616
|
-
migrator = new (0,
|
|
616
|
+
migrator = new (0, _chunkJOHF7PK4js.Migrator)({
|
|
617
617
|
mode: "dev"
|
|
618
618
|
});
|
|
619
619
|
}
|
|
620
620
|
async function setupFixtureManager() {
|
|
621
|
-
|
|
621
|
+
_chunkJOHF7PK4js.FixtureManager.init();
|
|
622
622
|
}
|
|
623
623
|
async function migrate_run() {
|
|
624
624
|
await setupMigrator();
|
|
@@ -643,24 +643,24 @@ async function migrate_reset() {
|
|
|
643
643
|
await migrator.resetAll();
|
|
644
644
|
}
|
|
645
645
|
async function fixture_init() {
|
|
646
|
-
const srcConfig =
|
|
646
|
+
const srcConfig = _chunkJOHF7PK4js.Sonamu.dbConfig.development_master;
|
|
647
647
|
const targets = [
|
|
648
648
|
{
|
|
649
649
|
label: "(REMOTE) Fixture DB",
|
|
650
|
-
config:
|
|
650
|
+
config: _chunkJOHF7PK4js.Sonamu.dbConfig.fixture_remote
|
|
651
651
|
},
|
|
652
652
|
{
|
|
653
653
|
label: "(LOCAL) Fixture DB",
|
|
654
|
-
config:
|
|
654
|
+
config: _chunkJOHF7PK4js.Sonamu.dbConfig.fixture_local,
|
|
655
655
|
toSkip: (() => {
|
|
656
|
-
const remoteConn =
|
|
657
|
-
const localConn =
|
|
656
|
+
const remoteConn = _chunkJOHF7PK4js.Sonamu.dbConfig.fixture_remote.connection;
|
|
657
|
+
const localConn = _chunkJOHF7PK4js.Sonamu.dbConfig.fixture_local.connection;
|
|
658
658
|
return remoteConn.host === localConn.host && remoteConn.database === localConn.database;
|
|
659
659
|
})()
|
|
660
660
|
},
|
|
661
661
|
{
|
|
662
662
|
label: "(LOCAL) Testing DB",
|
|
663
|
-
config:
|
|
663
|
+
config: _chunkJOHF7PK4js.Sonamu.dbConfig.test
|
|
664
664
|
}
|
|
665
665
|
];
|
|
666
666
|
console.log("DUMP...");
|
|
@@ -705,15 +705,15 @@ async function fixture_init() {
|
|
|
705
705
|
}
|
|
706
706
|
async function fixture_import(entityId, recordIds) {
|
|
707
707
|
await setupFixtureManager();
|
|
708
|
-
await
|
|
709
|
-
await
|
|
708
|
+
await _chunkJOHF7PK4js.FixtureManager.importFixture(entityId, recordIds);
|
|
709
|
+
await _chunkJOHF7PK4js.FixtureManager.sync();
|
|
710
710
|
}
|
|
711
711
|
async function fixture_sync() {
|
|
712
712
|
await setupFixtureManager();
|
|
713
|
-
await
|
|
713
|
+
await _chunkJOHF7PK4js.FixtureManager.sync();
|
|
714
714
|
}
|
|
715
715
|
async function stub_practice(name) {
|
|
716
|
-
const practiceDir = _path2.default.join(
|
|
716
|
+
const practiceDir = _path2.default.join(_chunkJOHF7PK4js.Sonamu.apiRootPath, "src", "practices");
|
|
717
717
|
const fileNames = _fsextra2.default.readdirSync(practiceDir);
|
|
718
718
|
const maxSeqNo = (() => {
|
|
719
719
|
if (_fsextra2.default.existsSync(practiceDir) === false) {
|
|
@@ -756,22 +756,22 @@ async function stub_practice(name) {
|
|
|
756
756
|
_child_process.execSync.call(void 0, `echo "${runCode}" | pbcopy`);
|
|
757
757
|
}
|
|
758
758
|
async function stub_entity(entityId) {
|
|
759
|
-
await
|
|
759
|
+
await _chunkJOHF7PK4js.Sonamu.syncer.createEntity({ entityId });
|
|
760
760
|
}
|
|
761
761
|
async function scaffold_model(entityId) {
|
|
762
|
-
await
|
|
762
|
+
await _chunkJOHF7PK4js.Sonamu.syncer.generateTemplate("model", {
|
|
763
763
|
entityId
|
|
764
764
|
});
|
|
765
765
|
}
|
|
766
766
|
async function scaffold_model_test(entityId) {
|
|
767
|
-
await
|
|
767
|
+
await _chunkJOHF7PK4js.Sonamu.syncer.generateTemplate("model_test", {
|
|
768
768
|
entityId
|
|
769
769
|
});
|
|
770
770
|
}
|
|
771
771
|
async function ui() {
|
|
772
772
|
try {
|
|
773
773
|
const sonamuUI = await Promise.resolve().then(() => _interopRequireWildcard(require("@sonamu-kit/ui")));
|
|
774
|
-
sonamuUI.startServers(
|
|
774
|
+
sonamuUI.startServers(_chunkJOHF7PK4js.Sonamu.apiRootPath);
|
|
775
775
|
} catch (e) {
|
|
776
776
|
if (e instanceof Error && e.message.includes("isn't declared")) {
|
|
777
777
|
console.log(`You need to install ${_chalk2.default.blue(`@sonamu-kit/ui`)} first.`);
|
|
@@ -810,7 +810,7 @@ async function smd_migration() {
|
|
|
810
810
|
const parentNames = SMDManager.getNamesFromId(_nullishCoalesce(smd.parentId, () => ( smd.id)));
|
|
811
811
|
const names = SMDManager.getNamesFromId(smd.id);
|
|
812
812
|
const dstPath = _path2.default.join(
|
|
813
|
-
|
|
813
|
+
_chunkJOHF7PK4js.Sonamu.apiRootPath,
|
|
814
814
|
"src",
|
|
815
815
|
"application",
|
|
816
816
|
parentNames.fs,
|
|
@@ -822,7 +822,7 @@ async function smd_migration() {
|
|
|
822
822
|
_fsextra2.default.writeFileSync(dstPath, formatted);
|
|
823
823
|
console.log(_chalk2.default.blue(`CREATED: ${dstPath}`));
|
|
824
824
|
const srcSmdPath = _path2.default.join(
|
|
825
|
-
|
|
825
|
+
_chunkJOHF7PK4js.Sonamu.apiRootPath,
|
|
826
826
|
"src",
|
|
827
827
|
"application",
|
|
828
828
|
parentNames.fs,
|
|
@@ -830,7 +830,7 @@ async function smd_migration() {
|
|
|
830
830
|
);
|
|
831
831
|
const dstSmdPath = srcSmdPath.replace("/src/", "/dist/").replace(/\.ts$/, ".js");
|
|
832
832
|
const srcEnumsPath = _path2.default.join(
|
|
833
|
-
|
|
833
|
+
_chunkJOHF7PK4js.Sonamu.apiRootPath,
|
|
834
834
|
"src",
|
|
835
835
|
"application",
|
|
836
836
|
parentNames.fs,
|
|
@@ -838,7 +838,7 @@ async function smd_migration() {
|
|
|
838
838
|
);
|
|
839
839
|
const dstEnumsPath = srcEnumsPath.replace("/src/", "/dist/").replace(/\.ts$/, ".js");
|
|
840
840
|
const srcGeneratedPath = _path2.default.join(
|
|
841
|
-
|
|
841
|
+
_chunkJOHF7PK4js.Sonamu.apiRootPath,
|
|
842
842
|
"src",
|
|
843
843
|
"application",
|
|
844
844
|
parentNames.fs,
|
|
@@ -850,8 +850,8 @@ async function smd_migration() {
|
|
|
850
850
|
dstSmdPath,
|
|
851
851
|
srcEnumsPath,
|
|
852
852
|
dstEnumsPath,
|
|
853
|
-
...
|
|
854
|
-
(target) => srcEnumsPath.replace(
|
|
853
|
+
..._chunkJOHF7PK4js.Sonamu.config.sync.targets.map(
|
|
854
|
+
(target) => srcEnumsPath.replace(_chunkJOHF7PK4js.Sonamu.apiRootPath, _path2.default.join(_chunkJOHF7PK4js.Sonamu.appRootPath, target)).replace("/src/application/", "/src/services/")
|
|
855
855
|
),
|
|
856
856
|
srcGeneratedPath,
|
|
857
857
|
dstGeneratedPath
|
|
@@ -865,11 +865,11 @@ async function smd_migration() {
|
|
|
865
865
|
});
|
|
866
866
|
}
|
|
867
867
|
console.log("Entity\uB85C \uB2E4\uC2DC \uB85C\uB4DC\uD569\uB2C8\uB2E4.");
|
|
868
|
-
|
|
869
|
-
await
|
|
870
|
-
const entityIds =
|
|
868
|
+
_chunkJOHF7PK4js.EntityManager.isAutoloaded = false;
|
|
869
|
+
await _chunkJOHF7PK4js.EntityManager.autoload();
|
|
870
|
+
const entityIds = _chunkJOHF7PK4js.EntityManager.getAllParentIds();
|
|
871
871
|
for await (const entityId of entityIds) {
|
|
872
|
-
await
|
|
872
|
+
await _chunkJOHF7PK4js.Sonamu.syncer.generateTemplate("generated", { entityId });
|
|
873
873
|
}
|
|
874
874
|
}
|
|
875
875
|
//# sourceMappingURL=cli.js.map
|
package/dist/bin/cli.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const require = (await import('module')).createRequire(import.meta.url);
|
|
2
1
|
import {
|
|
3
2
|
BaseModel,
|
|
4
3
|
EntityManager,
|
|
@@ -12,10 +11,10 @@ import {
|
|
|
12
11
|
isOneToOneRelationProp,
|
|
13
12
|
isRelationProp,
|
|
14
13
|
isVirtualProp
|
|
15
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-L4KELCY7.mjs";
|
|
16
15
|
import {
|
|
17
16
|
__dirname
|
|
18
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-PTFDTOJU.mjs";
|
|
19
18
|
|
|
20
19
|
// src/bin/cli.ts
|
|
21
20
|
import chalk2 from "chalk";
|
package/dist/bin/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/cli.ts","../../src/smd/smd-manager.ts","../../src/smd/smd.ts"],"sourcesContent":["/* Global Begin */\nimport chalk from \"chalk\";\nconsole.log(chalk.bgBlue(`BEGIN ${new Date()}`));\n\nimport dotenv from \"dotenv\";\ndotenv.config();\n\nimport path from \"path\";\nimport { BaseModel } from \"../database/base-model\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { Migrator } from \"../entity/migrator\";\nimport { FixtureManager } from \"../testing/fixture-manager\";\nimport { tsicli } from \"tsicli\";\nimport { execSync } from \"child_process\";\nimport fs from \"fs-extra\";\nimport { Sonamu } from \"../api\";\nimport knex, { Knex } from \"knex\";\nimport inflection from \"inflection\";\nimport prettier from \"prettier\";\nimport { SMDManager } from \"../smd/smd-manager\";\nimport process from \"process\";\n\nlet migrator: Migrator;\n\nasync function bootstrap() {\n await Sonamu.init(false, false);\n\n await tsicli(process.argv, {\n types: {\n \"#entityId\": {\n type: \"autocomplete\",\n name: \"#entityId\",\n message: \"Please input #entityId\",\n choices: EntityManager.getAllParentIds().map((entityId) => ({\n title: entityId,\n value: entityId,\n })),\n },\n \"#recordIds\": \"number[]\",\n \"#name\": \"string\",\n },\n args: [\n [\"fixture\", \"init\"],\n [\"fixture\", \"import\", \"#entityId\", \"#recordIds\"],\n [\"fixture\", \"sync\"],\n [\"migrate\", \"run\"],\n [\"migrate\", \"check\"],\n [\"migrate\", \"rollback\"],\n [\"migrate\", \"reset\"],\n [\"migrate\", \"clear\"],\n [\"stub\", \"practice\", \"#name\"],\n [\"stub\", \"entity\", \"#name\"],\n [\"scaffold\", \"model\", \"#entityId\"],\n [\"scaffold\", \"model_test\", \"#entityId\"],\n [\"scaffold\", \"view_list\", \"#entityId\"],\n [\"scaffold\", \"view_form\", \"#entityId\"],\n [\"ui\"],\n [\"smd_migration\"],\n ],\n runners: {\n migrate_run,\n migrate_check,\n migrate_rollback,\n migrate_clear,\n migrate_reset,\n fixture_init,\n fixture_import,\n fixture_sync,\n stub_practice,\n stub_entity,\n scaffold_model,\n scaffold_model_test,\n ui,\n // scaffold_view_list,\n // scaffold_view_form,\n smd_migration,\n },\n });\n}\nbootstrap().finally(async () => {\n if (migrator) {\n await migrator.destroy();\n }\n await FixtureManager.destory();\n await BaseModel.destroy();\n\n /* Global End */\n console.log(chalk.bgBlue(`END ${new Date()}\\n`));\n});\n\nasync function setupMigrator() {\n // migrator\n migrator = new Migrator({\n mode: \"dev\",\n });\n}\n\nasync function setupFixtureManager() {\n FixtureManager.init();\n}\n\nasync function migrate_run() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.run();\n}\n\nasync function migrate_check() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.check();\n}\n\nasync function migrate_rollback() {\n await setupMigrator();\n\n await migrator.rollback();\n}\n\nasync function migrate_clear() {\n await setupMigrator();\n\n await migrator.clearPendingList();\n}\n\nasync function migrate_reset() {\n await setupMigrator();\n\n await migrator.resetAll();\n}\n\nasync function fixture_init() {\n const srcConfig = Sonamu.dbConfig.development_master;\n const targets = [\n {\n label: \"(REMOTE) Fixture DB\",\n config: Sonamu.dbConfig.fixture_remote,\n },\n {\n label: \"(LOCAL) Fixture DB\",\n config: Sonamu.dbConfig.fixture_local,\n toSkip: (() => {\n const remoteConn = Sonamu.dbConfig.fixture_remote\n .connection as Knex.ConnectionConfig;\n const localConn = Sonamu.dbConfig.fixture_local\n .connection as Knex.ConnectionConfig;\n return (\n remoteConn.host === localConn.host &&\n remoteConn.database === localConn.database\n );\n })(),\n },\n {\n label: \"(LOCAL) Testing DB\",\n config: Sonamu.dbConfig.test,\n },\n ] as {\n label: string;\n config: Knex.Config;\n toSkip?: boolean;\n }[];\n\n // 1. 기준DB 스키마를 덤프\n console.log(\"DUMP...\");\n const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;\n const srcConn = srcConfig.connection as Knex.ConnectionConfig;\n const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`\n );\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} knex_migrations knex_migrations_lock > ${migrationsDump}`\n );\n\n // 2. 대상DB 각각에 대하여 존재여부 확인 후 붓기\n for await (const { label, config, toSkip } of targets) {\n const conn = config.connection as Knex.ConnectionConfig;\n\n if (toSkip === true) {\n console.log(chalk.red(`${label}: Skipped!`));\n continue;\n }\n\n const db = knex({\n ...config,\n connection: {\n ...((config.connection ?? {}) as Knex.ConnectionConfig),\n database: undefined,\n },\n });\n const [[row]] = await db.raw(`SHOW DATABASES LIKE \"${conn.database}\"`);\n if (row) {\n console.log(\n chalk.yellow(`${label}: Database \"${conn.database}\" Already exists`)\n );\n await db.destroy();\n continue;\n }\n\n console.log(`SYNC to ${label}...`);\n const mysqlCmd = `mysql -h${conn.host} -u${conn.user} -p${conn.password}`;\n execSync(`${mysqlCmd} -e 'DROP DATABASE IF EXISTS \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} -e 'CREATE DATABASE \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} ${conn.database} < ${dumpFilename}`);\n execSync(`${mysqlCmd} ${conn.database} < ${migrationsDump}`);\n\n await db.destroy();\n }\n}\n\nasync function fixture_import(entityId: string, recordIds: number[]) {\n await setupFixtureManager();\n\n await FixtureManager.importFixture(entityId, recordIds);\n await FixtureManager.sync();\n}\n\nasync function fixture_sync() {\n await setupFixtureManager();\n\n await FixtureManager.sync();\n}\n\nasync function stub_practice(name: string) {\n const practiceDir = path.join(Sonamu.apiRootPath, \"src\", \"practices\");\n const fileNames = fs.readdirSync(practiceDir);\n\n const maxSeqNo = (() => {\n if (fs.existsSync(practiceDir) === false) {\n fs.mkdirSync(practiceDir, { recursive: true });\n }\n\n const filteredSeqs = fileNames\n .filter(\n (fileName) => fileName.startsWith(\"p\") && fileName.endsWith(\".ts\")\n )\n .map((fileName) => {\n const [, seqNo] = fileName.match(/^p([0-9]+)\\-/) ?? [\"0\", \"0\"];\n return parseInt(seqNo);\n })\n .sort((a, b) => b - a);\n\n if (filteredSeqs.length > 0) {\n return filteredSeqs[0];\n }\n\n return 0;\n })();\n\n const currentSeqNo = maxSeqNo + 1;\n const fileName = `p${currentSeqNo}-${name}.ts`;\n const dstPath = path.join(practiceDir, fileName);\n\n const code = [\n `import { BaseModel } from \"sonamu\";`,\n \"\",\n `console.clear();`,\n `console.log(\"${fileName}\");`,\n \"\",\n `async function bootstrap() {`,\n ` // TODO`,\n `}`,\n `bootstrap().finally(async () => {`,\n `await BaseModel.destroy();`,\n `});`,\n ].join(\"\\n\");\n fs.writeFileSync(dstPath, code);\n\n execSync(`code ${dstPath}`);\n\n const runCode = `yarn node -r source-map-support/register dist/practices/${fileName.replace(\n \".ts\",\n \".js\"\n )}`;\n console.log(`${chalk.blue(runCode)} copied to clipboard.`);\n execSync(`echo \"${runCode}\" | pbcopy`);\n}\n\nasync function stub_entity(entityId: string) {\n await Sonamu.syncer.createEntity({ entityId });\n}\n\nasync function scaffold_model(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model\", {\n entityId,\n });\n}\n\nasync function scaffold_model_test(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model_test\", {\n entityId,\n });\n}\n\nasync function ui() {\n try {\n const sonamuUI: {\n startServers: (appRootPath: string) => void;\n } = await import(\"@sonamu-kit/ui\" as string);\n sonamuUI.startServers(Sonamu.apiRootPath);\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes(\"isn't declared\")) {\n console.log(`You need to install ${chalk.blue(`@sonamu-kit/ui`)} first.`);\n return;\n }\n throw e;\n }\n}\n\nasync function smd_migration() {\n await SMDManager.autoload();\n const smdIds = SMDManager.getAllIds();\n\n function enumLabelsToEntityEnums(\n entityId: string,\n enumLabels: {\n [enumName: string]: { [name: string]: { ko: string } };\n }\n ): { [enumName: string]: { [name: string]: string } } {\n return Object.fromEntries(\n Object.entries(enumLabels).map(([enumLabelName, enumLabel]) => {\n const enumName =\n entityId + inflection.camelize(enumLabelName.toLowerCase(), false);\n return [\n enumName,\n Object.fromEntries(\n Object.entries(enumLabel).map(([name, { ko }]) => [name, ko])\n ),\n ];\n })\n );\n }\n for await (const smdId of smdIds) {\n const smd = SMDManager.get(smdId);\n const entityJson = {\n id: smd.id,\n ...(smd.parentId && { parentId: smd.parentId }),\n title: smd.title,\n props: smd.props,\n indexes: smd.indexes,\n subsets: smd.subsets,\n enums: enumLabelsToEntityEnums(smd.id, smd.enumLabels),\n };\n\n const parentNames = SMDManager.getNamesFromId(smd.parentId ?? smd.id);\n const names = SMDManager.getNamesFromId(smd.id);\n const dstPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.entity.json`\n );\n\n const formatted = await prettier.format(JSON.stringify(entityJson), {\n parser: \"json\",\n });\n fs.writeFileSync(dstPath, formatted);\n console.log(chalk.blue(`CREATED: ${dstPath}`));\n\n // smd.ts, enums.ts, genereated.ts 삭제 (트랜스파일 된 js파일도 삭제)\n const srcSmdPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.smd.ts`\n );\n const dstSmdPath = srcSmdPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcEnumsPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.enums.ts`\n );\n const dstEnumsPath = srcEnumsPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcGeneratedPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.generated.ts`\n );\n const dstGeneratedPath = srcGeneratedPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n\n [\n srcSmdPath,\n dstSmdPath,\n srcEnumsPath,\n dstEnumsPath,\n ...Sonamu.config.sync.targets.map((target) =>\n srcEnumsPath\n .replace(Sonamu.apiRootPath, path.join(Sonamu.appRootPath, target))\n .replace(\"/src/application/\", \"/src/services/\")\n ),\n srcGeneratedPath,\n dstGeneratedPath,\n ].map((p) => {\n if (fs.existsSync(p) === false) {\n console.log(chalk.yellow(`NOT FOUND: ${p}`));\n return;\n }\n fs.unlinkSync(p);\n console.log(chalk.red(`DELETED: ${p}`));\n });\n }\n\n // Entity로 reload\n console.log(\"Entity로 다시 로드합니다.\");\n EntityManager.isAutoloaded = false;\n await EntityManager.autoload();\n\n // Entity를 통해 generated.ts 재생성\n const entityIds = EntityManager.getAllParentIds();\n for await (const entityId of entityIds) {\n await Sonamu.syncer.generateTemplate(\"generated\", { entityId });\n }\n}\n","import chalk from \"chalk\";\nimport glob from \"glob\";\nimport inflection from \"inflection\";\nimport _ from \"lodash\";\nimport path from \"path\";\nimport { SMD } from \"./smd\";\nimport { SMDInput } from \"../types/types\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { EntityNamesRecord } from \"../entity/entity-manager\";\n\ntype TableSpec = {\n name: string;\n uniqueColumns: string[];\n};\nclass SMDManagerClass {\n private SMDs: Map<string, SMD> = new Map();\n public modulePaths: Map<string, string> = new Map();\n private tableSpecs: Map<string, TableSpec> = new Map();\n public isAutoloaded: boolean = false;\n\n // 경로 전달받아 모든 SMD 파일 로드\n async autoload(doSilent: boolean = false) {\n if (this.isAutoloaded) {\n return;\n }\n const pathPattern = path.join(\n Sonamu.apiRootPath,\n \"/dist/application/**/*.smd.js\"\n );\n !doSilent && console.log(chalk.yellow(`autoload ${pathPattern}`));\n\n return new Promise((resolve) => {\n glob.glob(path.resolve(pathPattern!), (_err, files) => {\n const importPaths = files.map((filePath) =>\n path.relative(__dirname, filePath)\n );\n Promise.all(\n importPaths.map(async (importPath) => {\n const imported = await import(importPath);\n Object.values(imported).map((smdInput) =>\n this.register(smdInput as SMDInput<string>)\n );\n return imported;\n })\n ).then(() => {\n resolve(\"ok\");\n this.isAutoloaded = true;\n });\n });\n });\n }\n\n register(smdInput: SMDInput<string>): void {\n const smd = new SMD(smdInput);\n this.SMDs.set(smdInput.id, smd);\n }\n\n get(smdId: string): SMD {\n const smd = this.SMDs.get(smdId);\n if (smd === undefined) {\n throw new Error(`존재하지 않는 SMD 요청 ${smdId}`);\n }\n\n return smd;\n }\n\n exists(smdId: string): boolean {\n const smd = this.SMDs.get(smdId);\n return smd !== undefined;\n }\n\n getAllIds(): string[] {\n return Array.from(SMDManager.SMDs.keys());\n }\n\n getAllParentIds(): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === undefined;\n });\n }\n\n getChildrenIds(parentId: string): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === parentId;\n });\n }\n\n setModulePath(key: string, modulePath: string): void {\n // console.debug(chalk.cyan(`setModulePath :: ${key} :: ${modulePath}`));\n this.modulePaths.set(key, modulePath);\n }\n\n getModulePath(key: string): string {\n const modulePath = this.modulePaths.get(key);\n if (modulePath === undefined) {\n throw new Error(`존재하지 않는 모듈 패스 요청 ${key}`);\n }\n\n return modulePath;\n }\n\n setTableSpec(tableSpec: TableSpec) {\n this.tableSpecs.set(tableSpec.name, tableSpec);\n }\n\n getTableSpec(key: string): TableSpec {\n const tableSpec = this.tableSpecs.get(key);\n if (tableSpec === undefined) {\n throw new Error(`존재하지 않는 테이블 스펙 요청 ${key}`);\n }\n\n return tableSpec;\n }\n\n getNamesFromId(smdId: string): EntityNamesRecord {\n // entityId가 단복수 동형 단어인 경우 List 붙여서 생성\n const pluralized =\n inflection.pluralize(smdId) === smdId\n ? `${smdId}List`\n : inflection.pluralize(smdId);\n\n return {\n fs: inflection.dasherize(inflection.underscore(smdId)).toLowerCase(),\n fsPlural: inflection\n .dasherize(inflection.underscore(pluralized))\n .toLowerCase(),\n camel: inflection.camelize(smdId, true),\n camelPlural: inflection.camelize(pluralized, true),\n capital: smdId,\n capitalPlural: pluralized,\n upper: smdId.toUpperCase(),\n constant: inflection.underscore(smdId).toUpperCase(),\n };\n }\n}\n\nexport const SMDManager = new SMDManagerClass();\n","import _ from \"lodash\";\nimport {\n EntityProp,\n RelationProp,\n isRelationProp,\n SubsetQuery,\n isVirtualProp,\n isBelongsToOneRelationProp,\n isOneToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n EntityPropNode,\n isEnumProp,\n StringProp,\n EntityIndex,\n EnumsLabelKo,\n SMDInput,\n} from \"../types/types\";\nimport inflection from \"inflection\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { SMDManager } from \"./smd-manager\";\n\nexport class SMD {\n id: string;\n parentId?: string;\n table: string;\n title: string;\n names: {\n fs: string;\n module: string;\n };\n props: EntityProp[];\n propsDict: {\n [key: string]: EntityProp;\n };\n relations: {\n [key: string]: RelationProp;\n };\n indexes: EntityIndex[];\n subsets: {\n [key: string]: string[];\n };\n types: {\n [name: string]: z.ZodTypeAny;\n } = {};\n enums: {\n [name: string]: z.ZodEnum<any>;\n } = {};\n enumLabels: {\n [name: string]: EnumsLabelKo<string>;\n } = {};\n\n constructor({\n id,\n parentId,\n table,\n title,\n props,\n indexes,\n subsets,\n }: SMDInput<any>) {\n // id\n this.id = id;\n this.parentId = parentId;\n this.title = title ?? this.id;\n this.table = table ?? inflection.underscore(inflection.pluralize(id));\n\n // props\n if (props) {\n this.props = props.map((prop) => {\n if (isEnumProp(prop)) {\n if (prop.id.includes(\"$Model\")) {\n prop.id = prop.id.replace(\"$Model\", id);\n }\n }\n return prop;\n });\n this.propsDict = props.reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n\n // relations\n this.relations = props\n .filter((prop) => isRelationProp(prop))\n .reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n } else {\n this.props = [];\n this.propsDict = {};\n this.relations = {};\n }\n\n // indexes\n this.indexes = indexes ?? [];\n\n // subsets\n this.subsets = subsets ?? {};\n\n // names\n this.names = {\n fs:\n parentId === undefined\n ? inflection.dasherize(inflection.underscore(id)).toLowerCase()\n : inflection.dasherize(parentId).toLowerCase(),\n module: id,\n };\n\n this.registerModulePaths();\n this.registerTableSpecs();\n }\n\n /*\n subset SELECT/JOIN/LOADER 결과 리턴\n */\n getSubsetQuery(subsetKey: string): SubsetQuery {\n const subset = this.subsets[subsetKey];\n\n const result: SubsetQuery = this.resolveSubsetQuery(\"\", subset);\n return result;\n }\n\n /*\n */\n resolveSubsetQuery(\n prefix: string,\n fields: string[],\n isAlreadyOuterJoined: boolean = false\n ): SubsetQuery {\n // prefix 치환 (prefix는 ToOneRelation이 복수로 붙은 경우 모두 __로 변경됨)\n prefix = prefix.replace(/\\./g, \"__\");\n\n // 서브셋을 1뎁스만 분리하여 그룹핑\n const subsetGroup = _.groupBy(fields, (field) => {\n if (field.includes(\".\")) {\n const [rel] = field.split(\".\");\n return rel;\n } else {\n return \"\";\n }\n });\n\n const result = Object.keys(subsetGroup).reduce(\n (r, groupKey) => {\n const fields = subsetGroup[groupKey];\n // 현재 테이블 필드셋은 select, virtual에 추가하고 리턴\n if (groupKey === \"\") {\n const realFields = fields.filter(\n (field) => !isVirtualProp(this.propsDict[field])\n );\n const virtualFields = fields.filter((field) =>\n isVirtualProp(this.propsDict[field])\n );\n\n if (prefix === \"\") {\n // 현재 테이블인 경우\n r.select = r.select.concat(\n realFields.map((field) => `${this.table}.${field}`)\n );\n r.virtual = r.virtual.concat(virtualFields);\n } else {\n // 넘어온 테이블인 경우\n r.select = r.select.concat(\n realFields.map(\n (field) => `${prefix}.${field} as ${prefix}__${field}`\n )\n );\n }\n\n return r;\n }\n\n const relation = this.relations[groupKey];\n if (relation === undefined) {\n throw new Error(`존재하지 않는 relation 참조 ${groupKey}`);\n }\n const relSMD = SMDManager.get(relation.with);\n\n if (\n isOneToOneRelationProp(relation) ||\n isBelongsToOneRelationProp(relation)\n ) {\n // -One Relation: JOIN 으로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n\n // -One Relation에서 id 필드만 참조하는 경우 릴레이션 넘기지 않고 리턴\n if (relFields.length === 1 && relFields[0] === \"id\") {\n if (prefix === \"\") {\n r.select = r.select.concat(`${this.table}.${groupKey}_id`);\n } else {\n r.select = r.select.concat(\n `${prefix}.${groupKey}_id as ${prefix}__${groupKey}_id`\n );\n }\n return r;\n }\n\n // innerOrOuter\n const innerOrOuter = (() => {\n if (isAlreadyOuterJoined) {\n return \"outer\";\n }\n\n if (isOneToOneRelationProp(relation)) {\n if (\n relation.hasJoinColumn === true &&\n (relation.nullable ?? false) === false\n ) {\n return \"inner\";\n } else {\n return \"outer\";\n }\n } else {\n if (relation.nullable) {\n return \"outer\";\n } else {\n return \"inner\";\n }\n }\n })();\n const relSubsetQuery = relSMD.resolveSubsetQuery(\n `${prefix !== \"\" ? prefix + \".\" : \"\"}${groupKey}`,\n relFields,\n innerOrOuter === \"outer\"\n );\n r.select = r.select.concat(relSubsetQuery.select);\n r.virtual = r.virtual.concat(relSubsetQuery.virtual);\n\n const joinAs = prefix === \"\" ? groupKey : prefix + \"__\" + groupKey;\n const fromTable = prefix === \"\" ? this.table : prefix;\n\n let joinClause;\n if (relation.customJoinClause) {\n joinClause = {\n custom: relation.customJoinClause,\n };\n } else {\n let from, to;\n if (isOneToOneRelationProp(relation)) {\n if (relation.hasJoinColumn) {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n } else {\n from = `${fromTable}.id`;\n to = `${joinAs}.${inflection.underscore(\n this.names.fs.replace(/\\-/g, \"_\")\n )}_id`;\n }\n } else {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n }\n joinClause = {\n from,\n to,\n };\n }\n\n r.joins.push({\n as: joinAs,\n join: innerOrOuter,\n table: relSMD.table,\n ...joinClause,\n });\n\n // BelongsToOne 밑에 HasMany가 붙은 경우\n if (relSubsetQuery.loaders.length > 0) {\n const convertedLoaders = relSubsetQuery.loaders.map((loader) => {\n const newAs = [groupKey, loader.as].join(\"__\");\n return {\n as: newAs,\n table: loader.table,\n manyJoin: loader.manyJoin,\n oneJoins: loader.oneJoins,\n select: loader.select,\n };\n });\n\n r.loaders = [...r.loaders, ...convertedLoaders];\n }\n\n r.joins = r.joins.concat(relSubsetQuery.joins);\n } else if (\n isHasManyRelationProp(relation) ||\n isManyToManyRelationProp(relation)\n ) {\n // -Many Relation: Loader 로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n const relSubsetQuery = relSMD.resolveSubsetQuery(\"\", relFields);\n\n let manyJoin: SubsetQuery[\"loaders\"][number][\"manyJoin\"];\n if (isHasManyRelationProp(relation)) {\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n toTable: relSMD.table,\n toCol: relation.joinColumn,\n };\n } else if (isManyToManyRelationProp(relation)) {\n const [table1, table2] = relation.joinTable.split(\"__\");\n\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n through: {\n table: relation.joinTable,\n fromCol: `${inflection.singularize(table1)}_id`,\n toCol: `${inflection.singularize(table2)}_id`,\n },\n toTable: relSMD.table,\n toCol: \"id\",\n };\n } else {\n throw new Error();\n }\n\n r.loaders.push({\n as: groupKey,\n table: relSMD.table,\n manyJoin,\n oneJoins: relSubsetQuery.joins,\n select: relSubsetQuery.select,\n loaders: relSubsetQuery.loaders,\n });\n }\n\n return r;\n },\n {\n select: [],\n virtual: [],\n joins: [],\n loaders: [],\n } as SubsetQuery\n );\n return result;\n }\n\n /*\n FieldExpr[] 을 SMDPropNode[] 로 변환\n */\n fieldExprsToPropNodes(\n fieldExprs: string[],\n smd: SMD = this\n ): EntityPropNode[] {\n const groups = fieldExprs.reduce(\n (result, fieldExpr) => {\n let key, value, elseExpr;\n if (fieldExpr.includes(\".\")) {\n [key, ...elseExpr] = fieldExpr.split(\".\");\n value = elseExpr.join(\".\");\n } else {\n key = \"\";\n value = fieldExpr;\n }\n result[key] = (result[key] ?? []).concat(value);\n\n return result;\n },\n {} as {\n [k: string]: string[];\n }\n );\n\n return Object.keys(groups)\n .map((key) => {\n const group = groups[key];\n\n // 일반 prop 처리\n if (key === \"\") {\n return group.map((propName) => {\n // uuid 개별 처리\n if (propName === \"uuid\") {\n return {\n nodeType: \"plain\" as const,\n prop: {\n type: \"string\",\n name: \"uuid\",\n length: 128,\n } as StringProp,\n children: [],\n };\n }\n\n const prop = smd.propsDict[propName];\n if (prop === undefined) {\n throw new Error(`${this.id} -- 잘못된 FieldExpr ${propName}`);\n }\n return {\n nodeType: \"plain\" as const,\n prop,\n children: [],\n };\n });\n }\n\n // relation prop 처리\n const prop = smd.propsDict[key];\n if (!isRelationProp(prop)) {\n throw new Error(`잘못된 FieldExpr ${key}.${group[0]}`);\n }\n const relSMD = SMDManager.get(prop.with);\n\n // relation -One 에 id 필드 하나인 경우\n if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)) {\n if (group.length == 1 && (group[0] === \"id\" || group[0] == \"id?\")) {\n // id 하나만 있는지 체크해서, 하나만 있으면 상위 prop으로 id를 리턴\n const idProp = relSMD.propsDict.id;\n return {\n nodeType: \"plain\" as const,\n prop: {\n ...idProp,\n name: key + \"_id\",\n nullable: prop.nullable,\n },\n children: [],\n };\n }\n }\n\n // -One 그외의 경우 object로 리턴\n // -Many의 경우 array로 리턴\n // Recursive 로 뎁스 처리\n const children = this.fieldExprsToPropNodes(group, relSMD);\n const nodeType =\n isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)\n ? (\"object\" as const)\n : (\"array\" as const);\n\n return {\n prop,\n children,\n nodeType,\n };\n })\n .flat();\n }\n\n getFieldExprs(\n prefix = \"\",\n maxDepth: number = 3,\n froms: string[] = []\n ): string[] {\n return this.props\n .map((prop) => {\n const propName = [prefix, prop.name].filter((v) => v !== \"\").join(\".\");\n if (propName === prefix) {\n return null;\n }\n if (isRelationProp(prop)) {\n if (maxDepth < 0) {\n return null;\n }\n if (froms.includes(prop.with)) {\n // 역방향 relation인 경우 제외\n return null;\n }\n // 정방향 relation인 경우 recursive 콜\n const relMd = SMDManager.get(prop.with);\n return relMd.getFieldExprs(propName, maxDepth - 1, [\n ...froms,\n this.id,\n ]);\n }\n return propName;\n })\n .flat()\n .filter((f) => f !== null) as string[];\n }\n\n registerModulePaths() {\n const basePath = `${this.names.fs}`;\n\n // base-scheme\n SMDManager.setModulePath(\n `${this.id}BaseSchema`,\n `${basePath}/${this.names.fs}.generated`\n );\n\n // subset\n if (Object.keys(this.subsets).length > 0) {\n SMDManager.setModulePath(\n `${this.id}SubsetKey`,\n `${basePath}/${this.names.fs}.generated`\n );\n SMDManager.setModulePath(\n `${this.id}SubsetMapping`,\n `${basePath}/${this.names.fs}.generated`\n );\n Object.keys(this.subsets).map((subsetKey) => {\n SMDManager.setModulePath(\n `${this.id}Subset${subsetKey.toUpperCase()}`,\n `${basePath}/${this.names.fs}.generated`\n );\n });\n }\n\n // types\n const typesModulePath = `${basePath}/${this.names.fs}.types`;\n const typesFileDistPath = path.join(\n Sonamu.apiRootPath,\n `dist/application/${typesModulePath}.js`\n );\n\n if (fs.existsSync(typesFileDistPath)) {\n const importPath = path.relative(__dirname, typesFileDistPath);\n import(importPath).then((t) => {\n this.types = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, typesModulePath);\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n\n // enums\n const enumsModulePath = `${basePath}/${this.names.fs}.enums`;\n const enumsFileDistPath = path.join(\n Sonamu.apiRootPath,\n `/dist/application/${enumsModulePath}.js`\n );\n if (fs.existsSync(enumsFileDistPath)) {\n const importPath = path.relative(__dirname, enumsFileDistPath);\n import(importPath).then((t) => {\n this.enums = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, enumsModulePath);\n\n // Enum Labels 별도 처리\n if (key === inflection.underscore(this.id).toUpperCase()) {\n this.enumLabels = t[key];\n }\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n }\n\n registerTableSpecs(): void {\n const uniqueColumns = _.uniq(\n this.indexes\n .filter((idx) => idx.type === \"unique\")\n .map((idx) => idx.columns)\n .flat()\n );\n\n SMDManager.setTableSpec({\n name: this.table,\n uniqueColumns,\n });\n }\n}\n"],"mappings":"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","names":["chalk","path","fs","inflection","inflection","path","fields","prop","path","inflection","chalk","path","fs","fileName","inflection"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/cli.ts","../../src/smd/smd-manager.ts","../../src/smd/smd.ts"],"sourcesContent":["/* Global Begin */\nimport chalk from \"chalk\";\nconsole.log(chalk.bgBlue(`BEGIN ${new Date()}`));\n\nimport dotenv from \"dotenv\";\ndotenv.config();\n\nimport path from \"path\";\nimport { BaseModel } from \"../database/base-model\";\nimport { EntityManager } from \"../entity/entity-manager\";\nimport { Migrator } from \"../entity/migrator\";\nimport { FixtureManager } from \"../testing/fixture-manager\";\nimport { tsicli } from \"tsicli\";\nimport { execSync } from \"child_process\";\nimport fs from \"fs-extra\";\nimport { Sonamu } from \"../api\";\nimport knex, { Knex } from \"knex\";\nimport inflection from \"inflection\";\nimport prettier from \"prettier\";\nimport { SMDManager } from \"../smd/smd-manager\";\nimport process from \"process\";\n\nlet migrator: Migrator;\n\nasync function bootstrap() {\n await Sonamu.init(false, false);\n\n await tsicli(process.argv, {\n types: {\n \"#entityId\": {\n type: \"autocomplete\",\n name: \"#entityId\",\n message: \"Please input #entityId\",\n choices: EntityManager.getAllParentIds().map((entityId) => ({\n title: entityId,\n value: entityId,\n })),\n },\n \"#recordIds\": \"number[]\",\n \"#name\": \"string\",\n },\n args: [\n [\"fixture\", \"init\"],\n [\"fixture\", \"import\", \"#entityId\", \"#recordIds\"],\n [\"fixture\", \"sync\"],\n [\"migrate\", \"run\"],\n [\"migrate\", \"check\"],\n [\"migrate\", \"rollback\"],\n [\"migrate\", \"reset\"],\n [\"migrate\", \"clear\"],\n [\"stub\", \"practice\", \"#name\"],\n [\"stub\", \"entity\", \"#name\"],\n [\"scaffold\", \"model\", \"#entityId\"],\n [\"scaffold\", \"model_test\", \"#entityId\"],\n [\"scaffold\", \"view_list\", \"#entityId\"],\n [\"scaffold\", \"view_form\", \"#entityId\"],\n [\"ui\"],\n [\"smd_migration\"],\n ],\n runners: {\n migrate_run,\n migrate_check,\n migrate_rollback,\n migrate_clear,\n migrate_reset,\n fixture_init,\n fixture_import,\n fixture_sync,\n stub_practice,\n stub_entity,\n scaffold_model,\n scaffold_model_test,\n ui,\n // scaffold_view_list,\n // scaffold_view_form,\n smd_migration,\n },\n });\n}\nbootstrap().finally(async () => {\n if (migrator) {\n await migrator.destroy();\n }\n await FixtureManager.destory();\n await BaseModel.destroy();\n\n /* Global End */\n console.log(chalk.bgBlue(`END ${new Date()}\\n`));\n});\n\nasync function setupMigrator() {\n // migrator\n migrator = new Migrator({\n mode: \"dev\",\n });\n}\n\nasync function setupFixtureManager() {\n FixtureManager.init();\n}\n\nasync function migrate_run() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.run();\n}\n\nasync function migrate_check() {\n await setupMigrator();\n\n await migrator.cleanUpDist();\n await migrator.check();\n}\n\nasync function migrate_rollback() {\n await setupMigrator();\n\n await migrator.rollback();\n}\n\nasync function migrate_clear() {\n await setupMigrator();\n\n await migrator.clearPendingList();\n}\n\nasync function migrate_reset() {\n await setupMigrator();\n\n await migrator.resetAll();\n}\n\nasync function fixture_init() {\n const srcConfig = Sonamu.dbConfig.development_master;\n const targets = [\n {\n label: \"(REMOTE) Fixture DB\",\n config: Sonamu.dbConfig.fixture_remote,\n },\n {\n label: \"(LOCAL) Fixture DB\",\n config: Sonamu.dbConfig.fixture_local,\n toSkip: (() => {\n const remoteConn = Sonamu.dbConfig.fixture_remote\n .connection as Knex.ConnectionConfig;\n const localConn = Sonamu.dbConfig.fixture_local\n .connection as Knex.ConnectionConfig;\n return (\n remoteConn.host === localConn.host &&\n remoteConn.database === localConn.database\n );\n })(),\n },\n {\n label: \"(LOCAL) Testing DB\",\n config: Sonamu.dbConfig.test,\n },\n ] as {\n label: string;\n config: Knex.Config;\n toSkip?: boolean;\n }[];\n\n // 1. 기준DB 스키마를 덤프\n console.log(\"DUMP...\");\n const dumpFilename = `/tmp/sonamu-fixture-init-${Date.now()}.sql`;\n const srcConn = srcConfig.connection as Knex.ConnectionConfig;\n const migrationsDump = `/tmp/sonamu-fixture-init-migrations-${Date.now()}.sql`;\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction -d --no-create-db --triggers ${srcConn.database} > ${dumpFilename}`\n );\n execSync(\n `mysqldump -h${srcConn.host} -u${srcConn.user} -p${srcConn.password} --single-transaction --no-create-db --triggers ${srcConn.database} knex_migrations knex_migrations_lock > ${migrationsDump}`\n );\n\n // 2. 대상DB 각각에 대하여 존재여부 확인 후 붓기\n for await (const { label, config, toSkip } of targets) {\n const conn = config.connection as Knex.ConnectionConfig;\n\n if (toSkip === true) {\n console.log(chalk.red(`${label}: Skipped!`));\n continue;\n }\n\n const db = knex({\n ...config,\n connection: {\n ...((config.connection ?? {}) as Knex.ConnectionConfig),\n database: undefined,\n },\n });\n const [[row]] = await db.raw(`SHOW DATABASES LIKE \"${conn.database}\"`);\n if (row) {\n console.log(\n chalk.yellow(`${label}: Database \"${conn.database}\" Already exists`)\n );\n await db.destroy();\n continue;\n }\n\n console.log(`SYNC to ${label}...`);\n const mysqlCmd = `mysql -h${conn.host} -u${conn.user} -p${conn.password}`;\n execSync(`${mysqlCmd} -e 'DROP DATABASE IF EXISTS \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} -e 'CREATE DATABASE \\`${conn.database}\\`'`);\n execSync(`${mysqlCmd} ${conn.database} < ${dumpFilename}`);\n execSync(`${mysqlCmd} ${conn.database} < ${migrationsDump}`);\n\n await db.destroy();\n }\n}\n\nasync function fixture_import(entityId: string, recordIds: number[]) {\n await setupFixtureManager();\n\n await FixtureManager.importFixture(entityId, recordIds);\n await FixtureManager.sync();\n}\n\nasync function fixture_sync() {\n await setupFixtureManager();\n\n await FixtureManager.sync();\n}\n\nasync function stub_practice(name: string) {\n const practiceDir = path.join(Sonamu.apiRootPath, \"src\", \"practices\");\n const fileNames = fs.readdirSync(practiceDir);\n\n const maxSeqNo = (() => {\n if (fs.existsSync(practiceDir) === false) {\n fs.mkdirSync(practiceDir, { recursive: true });\n }\n\n const filteredSeqs = fileNames\n .filter(\n (fileName) => fileName.startsWith(\"p\") && fileName.endsWith(\".ts\")\n )\n .map((fileName) => {\n const [, seqNo] = fileName.match(/^p([0-9]+)\\-/) ?? [\"0\", \"0\"];\n return parseInt(seqNo);\n })\n .sort((a, b) => b - a);\n\n if (filteredSeqs.length > 0) {\n return filteredSeqs[0];\n }\n\n return 0;\n })();\n\n const currentSeqNo = maxSeqNo + 1;\n const fileName = `p${currentSeqNo}-${name}.ts`;\n const dstPath = path.join(practiceDir, fileName);\n\n const code = [\n `import { BaseModel } from \"sonamu\";`,\n \"\",\n `console.clear();`,\n `console.log(\"${fileName}\");`,\n \"\",\n `async function bootstrap() {`,\n ` // TODO`,\n `}`,\n `bootstrap().finally(async () => {`,\n `await BaseModel.destroy();`,\n `});`,\n ].join(\"\\n\");\n fs.writeFileSync(dstPath, code);\n\n execSync(`code ${dstPath}`);\n\n const runCode = `yarn node -r source-map-support/register dist/practices/${fileName.replace(\n \".ts\",\n \".js\"\n )}`;\n console.log(`${chalk.blue(runCode)} copied to clipboard.`);\n execSync(`echo \"${runCode}\" | pbcopy`);\n}\n\nasync function stub_entity(entityId: string) {\n await Sonamu.syncer.createEntity({ entityId });\n}\n\nasync function scaffold_model(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model\", {\n entityId,\n });\n}\n\nasync function scaffold_model_test(entityId: string) {\n await Sonamu.syncer.generateTemplate(\"model_test\", {\n entityId,\n });\n}\n\nasync function ui() {\n try {\n const sonamuUI: {\n startServers: (appRootPath: string) => void;\n } = await import(\"@sonamu-kit/ui\" as string);\n sonamuUI.startServers(Sonamu.apiRootPath);\n } catch (e: unknown) {\n if (e instanceof Error && e.message.includes(\"isn't declared\")) {\n console.log(`You need to install ${chalk.blue(`@sonamu-kit/ui`)} first.`);\n return;\n }\n throw e;\n }\n}\n\nasync function smd_migration() {\n await SMDManager.autoload();\n const smdIds = SMDManager.getAllIds();\n\n function enumLabelsToEntityEnums(\n entityId: string,\n enumLabels: {\n [enumName: string]: { [name: string]: { ko: string } };\n }\n ): { [enumName: string]: { [name: string]: string } } {\n return Object.fromEntries(\n Object.entries(enumLabels).map(([enumLabelName, enumLabel]) => {\n const enumName =\n entityId + inflection.camelize(enumLabelName.toLowerCase(), false);\n return [\n enumName,\n Object.fromEntries(\n Object.entries(enumLabel).map(([name, { ko }]) => [name, ko])\n ),\n ];\n })\n );\n }\n for await (const smdId of smdIds) {\n const smd = SMDManager.get(smdId);\n const entityJson = {\n id: smd.id,\n ...(smd.parentId && { parentId: smd.parentId }),\n title: smd.title,\n props: smd.props,\n indexes: smd.indexes,\n subsets: smd.subsets,\n enums: enumLabelsToEntityEnums(smd.id, smd.enumLabels),\n };\n\n const parentNames = SMDManager.getNamesFromId(smd.parentId ?? smd.id);\n const names = SMDManager.getNamesFromId(smd.id);\n const dstPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.entity.json`\n );\n\n const formatted = await prettier.format(JSON.stringify(entityJson), {\n parser: \"json\",\n });\n fs.writeFileSync(dstPath, formatted);\n console.log(chalk.blue(`CREATED: ${dstPath}`));\n\n // smd.ts, enums.ts, genereated.ts 삭제 (트랜스파일 된 js파일도 삭제)\n const srcSmdPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.smd.ts`\n );\n const dstSmdPath = srcSmdPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcEnumsPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.enums.ts`\n );\n const dstEnumsPath = srcEnumsPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n const srcGeneratedPath = path.join(\n Sonamu.apiRootPath,\n \"src\",\n \"application\",\n parentNames.fs,\n `${names.fs}.generated.ts`\n );\n const dstGeneratedPath = srcGeneratedPath\n .replace(\"/src/\", \"/dist/\")\n .replace(/\\.ts$/, \".js\");\n\n [\n srcSmdPath,\n dstSmdPath,\n srcEnumsPath,\n dstEnumsPath,\n ...Sonamu.config.sync.targets.map((target) =>\n srcEnumsPath\n .replace(Sonamu.apiRootPath, path.join(Sonamu.appRootPath, target))\n .replace(\"/src/application/\", \"/src/services/\")\n ),\n srcGeneratedPath,\n dstGeneratedPath,\n ].map((p) => {\n if (fs.existsSync(p) === false) {\n console.log(chalk.yellow(`NOT FOUND: ${p}`));\n return;\n }\n fs.unlinkSync(p);\n console.log(chalk.red(`DELETED: ${p}`));\n });\n }\n\n // Entity로 reload\n console.log(\"Entity로 다시 로드합니다.\");\n EntityManager.isAutoloaded = false;\n await EntityManager.autoload();\n\n // Entity를 통해 generated.ts 재생성\n const entityIds = EntityManager.getAllParentIds();\n for await (const entityId of entityIds) {\n await Sonamu.syncer.generateTemplate(\"generated\", { entityId });\n }\n}\n","import chalk from \"chalk\";\nimport glob from \"glob\";\nimport inflection from \"inflection\";\nimport _ from \"lodash\";\nimport path from \"path\";\nimport { SMD } from \"./smd\";\nimport { SMDInput } from \"../types/types\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { EntityNamesRecord } from \"../entity/entity-manager\";\n\ntype TableSpec = {\n name: string;\n uniqueColumns: string[];\n};\nclass SMDManagerClass {\n private SMDs: Map<string, SMD> = new Map();\n public modulePaths: Map<string, string> = new Map();\n private tableSpecs: Map<string, TableSpec> = new Map();\n public isAutoloaded: boolean = false;\n\n // 경로 전달받아 모든 SMD 파일 로드\n async autoload(doSilent: boolean = false) {\n if (this.isAutoloaded) {\n return;\n }\n const pathPattern = path.join(\n Sonamu.apiRootPath,\n \"/dist/application/**/*.smd.js\"\n );\n !doSilent && console.log(chalk.yellow(`autoload ${pathPattern}`));\n\n return new Promise((resolve) => {\n glob.glob(path.resolve(pathPattern!), (_err, files) => {\n const importPaths = files.map((filePath) =>\n path.relative(__dirname, filePath)\n );\n Promise.all(\n importPaths.map(async (importPath) => {\n const imported = await import(importPath);\n Object.values(imported).map((smdInput) =>\n this.register(smdInput as SMDInput<string>)\n );\n return imported;\n })\n ).then(() => {\n resolve(\"ok\");\n this.isAutoloaded = true;\n });\n });\n });\n }\n\n register(smdInput: SMDInput<string>): void {\n const smd = new SMD(smdInput);\n this.SMDs.set(smdInput.id, smd);\n }\n\n get(smdId: string): SMD {\n const smd = this.SMDs.get(smdId);\n if (smd === undefined) {\n throw new Error(`존재하지 않는 SMD 요청 ${smdId}`);\n }\n\n return smd;\n }\n\n exists(smdId: string): boolean {\n const smd = this.SMDs.get(smdId);\n return smd !== undefined;\n }\n\n getAllIds(): string[] {\n return Array.from(SMDManager.SMDs.keys());\n }\n\n getAllParentIds(): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === undefined;\n });\n }\n\n getChildrenIds(parentId: string): string[] {\n return this.getAllIds().filter((smdId) => {\n const smd = this.get(smdId);\n return smd.parentId === parentId;\n });\n }\n\n setModulePath(key: string, modulePath: string): void {\n // console.debug(chalk.cyan(`setModulePath :: ${key} :: ${modulePath}`));\n this.modulePaths.set(key, modulePath);\n }\n\n getModulePath(key: string): string {\n const modulePath = this.modulePaths.get(key);\n if (modulePath === undefined) {\n throw new Error(`존재하지 않는 모듈 패스 요청 ${key}`);\n }\n\n return modulePath;\n }\n\n setTableSpec(tableSpec: TableSpec) {\n this.tableSpecs.set(tableSpec.name, tableSpec);\n }\n\n getTableSpec(key: string): TableSpec {\n const tableSpec = this.tableSpecs.get(key);\n if (tableSpec === undefined) {\n throw new Error(`존재하지 않는 테이블 스펙 요청 ${key}`);\n }\n\n return tableSpec;\n }\n\n getNamesFromId(smdId: string): EntityNamesRecord {\n // entityId가 단복수 동형 단어인 경우 List 붙여서 생성\n const pluralized =\n inflection.pluralize(smdId) === smdId\n ? `${smdId}List`\n : inflection.pluralize(smdId);\n\n return {\n fs: inflection.dasherize(inflection.underscore(smdId)).toLowerCase(),\n fsPlural: inflection\n .dasherize(inflection.underscore(pluralized))\n .toLowerCase(),\n camel: inflection.camelize(smdId, true),\n camelPlural: inflection.camelize(pluralized, true),\n capital: smdId,\n capitalPlural: pluralized,\n upper: smdId.toUpperCase(),\n constant: inflection.underscore(smdId).toUpperCase(),\n };\n }\n}\n\nexport const SMDManager = new SMDManagerClass();\n","import _ from \"lodash\";\nimport {\n EntityProp,\n RelationProp,\n isRelationProp,\n SubsetQuery,\n isVirtualProp,\n isBelongsToOneRelationProp,\n isOneToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n EntityPropNode,\n isEnumProp,\n StringProp,\n EntityIndex,\n EnumsLabelKo,\n SMDInput,\n} from \"../types/types\";\nimport inflection from \"inflection\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod\";\nimport { Sonamu } from \"../api/sonamu\";\nimport { SMDManager } from \"./smd-manager\";\n\nexport class SMD {\n id: string;\n parentId?: string;\n table: string;\n title: string;\n names: {\n fs: string;\n module: string;\n };\n props: EntityProp[];\n propsDict: {\n [key: string]: EntityProp;\n };\n relations: {\n [key: string]: RelationProp;\n };\n indexes: EntityIndex[];\n subsets: {\n [key: string]: string[];\n };\n types: {\n [name: string]: z.ZodTypeAny;\n } = {};\n enums: {\n [name: string]: z.ZodEnum<any>;\n } = {};\n enumLabels: {\n [name: string]: EnumsLabelKo<string>;\n } = {};\n\n constructor({\n id,\n parentId,\n table,\n title,\n props,\n indexes,\n subsets,\n }: SMDInput<any>) {\n // id\n this.id = id;\n this.parentId = parentId;\n this.title = title ?? this.id;\n this.table = table ?? inflection.underscore(inflection.pluralize(id));\n\n // props\n if (props) {\n this.props = props.map((prop) => {\n if (isEnumProp(prop)) {\n if (prop.id.includes(\"$Model\")) {\n prop.id = prop.id.replace(\"$Model\", id);\n }\n }\n return prop;\n });\n this.propsDict = props.reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n\n // relations\n this.relations = props\n .filter((prop) => isRelationProp(prop))\n .reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n } else {\n this.props = [];\n this.propsDict = {};\n this.relations = {};\n }\n\n // indexes\n this.indexes = indexes ?? [];\n\n // subsets\n this.subsets = subsets ?? {};\n\n // names\n this.names = {\n fs:\n parentId === undefined\n ? inflection.dasherize(inflection.underscore(id)).toLowerCase()\n : inflection.dasherize(parentId).toLowerCase(),\n module: id,\n };\n\n this.registerModulePaths();\n this.registerTableSpecs();\n }\n\n /*\n subset SELECT/JOIN/LOADER 결과 리턴\n */\n getSubsetQuery(subsetKey: string): SubsetQuery {\n const subset = this.subsets[subsetKey];\n\n const result: SubsetQuery = this.resolveSubsetQuery(\"\", subset);\n return result;\n }\n\n /*\n */\n resolveSubsetQuery(\n prefix: string,\n fields: string[],\n isAlreadyOuterJoined: boolean = false\n ): SubsetQuery {\n // prefix 치환 (prefix는 ToOneRelation이 복수로 붙은 경우 모두 __로 변경됨)\n prefix = prefix.replace(/\\./g, \"__\");\n\n // 서브셋을 1뎁스만 분리하여 그룹핑\n const subsetGroup = _.groupBy(fields, (field) => {\n if (field.includes(\".\")) {\n const [rel] = field.split(\".\");\n return rel;\n } else {\n return \"\";\n }\n });\n\n const result = Object.keys(subsetGroup).reduce(\n (r, groupKey) => {\n const fields = subsetGroup[groupKey];\n // 현재 테이블 필드셋은 select, virtual에 추가하고 리턴\n if (groupKey === \"\") {\n const realFields = fields.filter(\n (field) => !isVirtualProp(this.propsDict[field])\n );\n const virtualFields = fields.filter((field) =>\n isVirtualProp(this.propsDict[field])\n );\n\n if (prefix === \"\") {\n // 현재 테이블인 경우\n r.select = r.select.concat(\n realFields.map((field) => `${this.table}.${field}`)\n );\n r.virtual = r.virtual.concat(virtualFields);\n } else {\n // 넘어온 테이블인 경우\n r.select = r.select.concat(\n realFields.map(\n (field) => `${prefix}.${field} as ${prefix}__${field}`\n )\n );\n }\n\n return r;\n }\n\n const relation = this.relations[groupKey];\n if (relation === undefined) {\n throw new Error(`존재하지 않는 relation 참조 ${groupKey}`);\n }\n const relSMD = SMDManager.get(relation.with);\n\n if (\n isOneToOneRelationProp(relation) ||\n isBelongsToOneRelationProp(relation)\n ) {\n // -One Relation: JOIN 으로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n\n // -One Relation에서 id 필드만 참조하는 경우 릴레이션 넘기지 않고 리턴\n if (relFields.length === 1 && relFields[0] === \"id\") {\n if (prefix === \"\") {\n r.select = r.select.concat(`${this.table}.${groupKey}_id`);\n } else {\n r.select = r.select.concat(\n `${prefix}.${groupKey}_id as ${prefix}__${groupKey}_id`\n );\n }\n return r;\n }\n\n // innerOrOuter\n const innerOrOuter = (() => {\n if (isAlreadyOuterJoined) {\n return \"outer\";\n }\n\n if (isOneToOneRelationProp(relation)) {\n if (\n relation.hasJoinColumn === true &&\n (relation.nullable ?? false) === false\n ) {\n return \"inner\";\n } else {\n return \"outer\";\n }\n } else {\n if (relation.nullable) {\n return \"outer\";\n } else {\n return \"inner\";\n }\n }\n })();\n const relSubsetQuery = relSMD.resolveSubsetQuery(\n `${prefix !== \"\" ? prefix + \".\" : \"\"}${groupKey}`,\n relFields,\n innerOrOuter === \"outer\"\n );\n r.select = r.select.concat(relSubsetQuery.select);\n r.virtual = r.virtual.concat(relSubsetQuery.virtual);\n\n const joinAs = prefix === \"\" ? groupKey : prefix + \"__\" + groupKey;\n const fromTable = prefix === \"\" ? this.table : prefix;\n\n let joinClause;\n if (relation.customJoinClause) {\n joinClause = {\n custom: relation.customJoinClause,\n };\n } else {\n let from, to;\n if (isOneToOneRelationProp(relation)) {\n if (relation.hasJoinColumn) {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n } else {\n from = `${fromTable}.id`;\n to = `${joinAs}.${inflection.underscore(\n this.names.fs.replace(/\\-/g, \"_\")\n )}_id`;\n }\n } else {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n }\n joinClause = {\n from,\n to,\n };\n }\n\n r.joins.push({\n as: joinAs,\n join: innerOrOuter,\n table: relSMD.table,\n ...joinClause,\n });\n\n // BelongsToOne 밑에 HasMany가 붙은 경우\n if (relSubsetQuery.loaders.length > 0) {\n const convertedLoaders = relSubsetQuery.loaders.map((loader) => {\n const newAs = [groupKey, loader.as].join(\"__\");\n return {\n as: newAs,\n table: loader.table,\n manyJoin: loader.manyJoin,\n oneJoins: loader.oneJoins,\n select: loader.select,\n };\n });\n\n r.loaders = [...r.loaders, ...convertedLoaders];\n }\n\n r.joins = r.joins.concat(relSubsetQuery.joins);\n } else if (\n isHasManyRelationProp(relation) ||\n isManyToManyRelationProp(relation)\n ) {\n // -Many Relation: Loader 로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n const relSubsetQuery = relSMD.resolveSubsetQuery(\"\", relFields);\n\n let manyJoin: SubsetQuery[\"loaders\"][number][\"manyJoin\"];\n if (isHasManyRelationProp(relation)) {\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n toTable: relSMD.table,\n toCol: relation.joinColumn,\n };\n } else if (isManyToManyRelationProp(relation)) {\n const [table1, table2] = relation.joinTable.split(\"__\");\n\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n through: {\n table: relation.joinTable,\n fromCol: `${inflection.singularize(table1)}_id`,\n toCol: `${inflection.singularize(table2)}_id`,\n },\n toTable: relSMD.table,\n toCol: \"id\",\n };\n } else {\n throw new Error();\n }\n\n r.loaders.push({\n as: groupKey,\n table: relSMD.table,\n manyJoin,\n oneJoins: relSubsetQuery.joins,\n select: relSubsetQuery.select,\n loaders: relSubsetQuery.loaders,\n });\n }\n\n return r;\n },\n {\n select: [],\n virtual: [],\n joins: [],\n loaders: [],\n } as SubsetQuery\n );\n return result;\n }\n\n /*\n FieldExpr[] 을 SMDPropNode[] 로 변환\n */\n fieldExprsToPropNodes(\n fieldExprs: string[],\n smd: SMD = this\n ): EntityPropNode[] {\n const groups = fieldExprs.reduce(\n (result, fieldExpr) => {\n let key, value, elseExpr;\n if (fieldExpr.includes(\".\")) {\n [key, ...elseExpr] = fieldExpr.split(\".\");\n value = elseExpr.join(\".\");\n } else {\n key = \"\";\n value = fieldExpr;\n }\n result[key] = (result[key] ?? []).concat(value);\n\n return result;\n },\n {} as {\n [k: string]: string[];\n }\n );\n\n return Object.keys(groups)\n .map((key) => {\n const group = groups[key];\n\n // 일반 prop 처리\n if (key === \"\") {\n return group.map((propName) => {\n // uuid 개별 처리\n if (propName === \"uuid\") {\n return {\n nodeType: \"plain\" as const,\n prop: {\n type: \"string\",\n name: \"uuid\",\n length: 128,\n } as StringProp,\n children: [],\n };\n }\n\n const prop = smd.propsDict[propName];\n if (prop === undefined) {\n throw new Error(`${this.id} -- 잘못된 FieldExpr ${propName}`);\n }\n return {\n nodeType: \"plain\" as const,\n prop,\n children: [],\n };\n });\n }\n\n // relation prop 처리\n const prop = smd.propsDict[key];\n if (!isRelationProp(prop)) {\n throw new Error(`잘못된 FieldExpr ${key}.${group[0]}`);\n }\n const relSMD = SMDManager.get(prop.with);\n\n // relation -One 에 id 필드 하나인 경우\n if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)) {\n if (group.length == 1 && (group[0] === \"id\" || group[0] == \"id?\")) {\n // id 하나만 있는지 체크해서, 하나만 있으면 상위 prop으로 id를 리턴\n const idProp = relSMD.propsDict.id;\n return {\n nodeType: \"plain\" as const,\n prop: {\n ...idProp,\n name: key + \"_id\",\n nullable: prop.nullable,\n },\n children: [],\n };\n }\n }\n\n // -One 그외의 경우 object로 리턴\n // -Many의 경우 array로 리턴\n // Recursive 로 뎁스 처리\n const children = this.fieldExprsToPropNodes(group, relSMD);\n const nodeType =\n isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)\n ? (\"object\" as const)\n : (\"array\" as const);\n\n return {\n prop,\n children,\n nodeType,\n };\n })\n .flat();\n }\n\n getFieldExprs(\n prefix = \"\",\n maxDepth: number = 3,\n froms: string[] = []\n ): string[] {\n return this.props\n .map((prop) => {\n const propName = [prefix, prop.name].filter((v) => v !== \"\").join(\".\");\n if (propName === prefix) {\n return null;\n }\n if (isRelationProp(prop)) {\n if (maxDepth < 0) {\n return null;\n }\n if (froms.includes(prop.with)) {\n // 역방향 relation인 경우 제외\n return null;\n }\n // 정방향 relation인 경우 recursive 콜\n const relMd = SMDManager.get(prop.with);\n return relMd.getFieldExprs(propName, maxDepth - 1, [\n ...froms,\n this.id,\n ]);\n }\n return propName;\n })\n .flat()\n .filter((f) => f !== null) as string[];\n }\n\n registerModulePaths() {\n const basePath = `${this.names.fs}`;\n\n // base-scheme\n SMDManager.setModulePath(\n `${this.id}BaseSchema`,\n `${basePath}/${this.names.fs}.generated`\n );\n\n // subset\n if (Object.keys(this.subsets).length > 0) {\n SMDManager.setModulePath(\n `${this.id}SubsetKey`,\n `${basePath}/${this.names.fs}.generated`\n );\n SMDManager.setModulePath(\n `${this.id}SubsetMapping`,\n `${basePath}/${this.names.fs}.generated`\n );\n Object.keys(this.subsets).map((subsetKey) => {\n SMDManager.setModulePath(\n `${this.id}Subset${subsetKey.toUpperCase()}`,\n `${basePath}/${this.names.fs}.generated`\n );\n });\n }\n\n // types\n const typesModulePath = `${basePath}/${this.names.fs}.types`;\n const typesFileDistPath = path.join(\n Sonamu.apiRootPath,\n `dist/application/${typesModulePath}.js`\n );\n\n if (fs.existsSync(typesFileDistPath)) {\n const importPath = path.relative(__dirname, typesFileDistPath);\n import(importPath).then((t) => {\n this.types = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, typesModulePath);\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n\n // enums\n const enumsModulePath = `${basePath}/${this.names.fs}.enums`;\n const enumsFileDistPath = path.join(\n Sonamu.apiRootPath,\n `/dist/application/${enumsModulePath}.js`\n );\n if (fs.existsSync(enumsFileDistPath)) {\n const importPath = path.relative(__dirname, enumsFileDistPath);\n import(importPath).then((t) => {\n this.enums = Object.keys(t).reduce((result, key) => {\n SMDManager.setModulePath(key, enumsModulePath);\n\n // Enum Labels 별도 처리\n if (key === inflection.underscore(this.id).toUpperCase()) {\n this.enumLabels = t[key];\n }\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n });\n }\n }\n\n registerTableSpecs(): void {\n const uniqueColumns = _.uniq(\n this.indexes\n .filter((idx) => idx.type === \"unique\")\n .map((idx) => idx.columns)\n .flat()\n );\n\n SMDManager.setTableSpec({\n name: this.table,\n uniqueColumns,\n });\n }\n}\n"],"mappings":"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","names":["chalk","path","fs","inflection","inflection","path","fields","prop","path","inflection","chalk","path","fs","fileName","inflection"]}
|