sonamu 0.0.7 → 0.0.9
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/.pnp.cjs +13 -0
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/init.d.ts +35 -5
- package/dist/api/init.d.ts.map +1 -1
- package/dist/api/init.js +142 -79
- package/dist/api/init.js.map +1 -1
- package/dist/api/sonamu.d.ts +42 -0
- package/dist/api/sonamu.d.ts.map +1 -0
- package/dist/api/sonamu.js +175 -0
- package/dist/api/sonamu.js.map +1 -0
- package/dist/bin/cli.js +152 -67
- package/dist/bin/cli.js.map +1 -1
- package/dist/database/db.d.ts +1 -3
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +12 -23
- package/dist/database/db.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/smd/migrator.d.ts +0 -5
- package/dist/smd/migrator.d.ts.map +1 -1
- package/dist/smd/migrator.js +18 -19
- package/dist/smd/migrator.js.map +1 -1
- package/dist/smd/smd-manager.js +2 -2
- package/dist/smd/smd-manager.js.map +1 -1
- package/dist/smd/smd.d.ts.map +1 -1
- package/dist/smd/smd.js +4 -5
- package/dist/smd/smd.js.map +1 -1
- package/dist/syncer/syncer.d.ts +8 -12
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +43 -43
- package/dist/syncer/syncer.js.map +1 -1
- package/dist/templates/generated_http.template.js +2 -2
- package/dist/templates/generated_http.template.js.map +1 -1
- package/dist/templates/init_enums.template.js +1 -1
- package/dist/templates/init_generated.template.d.ts.map +1 -1
- package/dist/templates/init_generated.template.js +8 -1
- package/dist/templates/init_generated.template.js.map +1 -1
- package/dist/templates/service.template.d.ts +1 -1
- package/dist/templates/service.template.d.ts.map +1 -1
- package/dist/templates/service.template.js +3 -2
- package/dist/templates/service.template.js.map +1 -1
- package/dist/templates/smd.template.js +2 -2
- package/dist/templates/smd.template.js.map +1 -1
- package/dist/templates/view_form.template.d.ts +2 -2
- package/dist/templates/view_list.template.d.ts +2 -2
- package/dist/testing/fixture-manager.d.ts +6 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +35 -41
- package/dist/testing/fixture-manager.js.map +1 -1
- package/dist/utils/utils.d.ts +1 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +13 -3
- package/dist/utils/utils.js.map +1 -1
- package/package.json +8 -4
- package/src/api/index.ts +1 -1
- package/src/api/sonamu.ts +212 -0
- package/src/bin/cli.ts +159 -70
- package/src/database/db.ts +15 -27
- package/src/index.ts +1 -1
- package/src/smd/migrator.ts +18 -31
- package/src/smd/smd-manager.ts +3 -3
- package/src/smd/smd.ts +10 -9
- package/src/syncer/syncer.ts +49 -68
- package/src/templates/generated_http.template.ts +2 -2
- package/src/templates/init_enums.template.ts +1 -1
- package/src/templates/init_generated.template.ts +8 -1
- package/src/templates/service.template.ts +6 -5
- package/src/templates/smd.template.ts +2 -2
- package/src/testing/fixture-manager.ts +44 -53
- package/src/utils/utils.ts +9 -1
- package/src/api/init.ts +0 -129
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Knex } from "knex";
|
|
2
|
-
import { SonamuDBConfig } from "../database/db";
|
|
3
2
|
export declare class FixtureManager {
|
|
4
3
|
usingTables?: string[] | undefined;
|
|
5
|
-
private
|
|
4
|
+
private _tdb;
|
|
5
|
+
set tdb(tdb: Knex);
|
|
6
|
+
get tdb(): Knex;
|
|
7
|
+
private _fdb;
|
|
8
|
+
set fdb(fdb: Knex);
|
|
9
|
+
get fdb(): Knex;
|
|
6
10
|
constructor(usingTables?: string[] | undefined);
|
|
7
|
-
init(): Promise<{
|
|
8
|
-
tdb: Knex;
|
|
9
|
-
fdb: Knex;
|
|
10
|
-
knexfile: SonamuDBConfig;
|
|
11
|
-
}>;
|
|
12
11
|
cleanAndSeed(): Promise<void>;
|
|
13
12
|
initFixtureDB(): Promise<void>;
|
|
14
13
|
getChecksum(db: Knex, tableName: string): Promise<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAEA,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAEA,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAUlC,qBAAa,cAAc;IAiBN,WAAW,CAAC;IAhB/B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAEd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAEd;gBAEkB,WAAW,CAAC,sBAAU;IAoBnC,YAAY;IAgDZ,aAAa;IA2Cb,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;IAKvC,IAAI;IAkDJ,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAqB1C,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IA6Dd,OAAO;CAId"}
|
|
@@ -24,16 +24,20 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
24
24
|
const child_process_1 = require("child_process");
|
|
25
25
|
const knex_1 = __importDefault(require("knex"));
|
|
26
26
|
const lodash_1 = require("lodash");
|
|
27
|
+
const api_1 = require("../api");
|
|
27
28
|
const base_model_1 = require("../database/base-model");
|
|
28
|
-
const db_1 = require("../database/db");
|
|
29
29
|
const smd_manager_1 = require("../smd/smd-manager");
|
|
30
30
|
const types_1 = require("../types/types");
|
|
31
31
|
class FixtureManager {
|
|
32
32
|
constructor(usingTables) {
|
|
33
33
|
this.usingTables = usingTables;
|
|
34
|
+
this._tdb = null;
|
|
35
|
+
this._fdb = null;
|
|
36
|
+
this.tdb = (0, knex_1.default)(api_1.Sonamu.dbConfig.test);
|
|
37
|
+
this.fdb = (0, knex_1.default)(api_1.Sonamu.dbConfig.fixture_local);
|
|
34
38
|
if (process.env.NODE_ENV === "test") {
|
|
35
39
|
beforeAll(() => __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
yield
|
|
40
|
+
yield api_1.Sonamu.init();
|
|
37
41
|
}));
|
|
38
42
|
beforeEach(() => __awaiter(this, void 0, void 0, function* () {
|
|
39
43
|
yield this.cleanAndSeed();
|
|
@@ -44,50 +48,46 @@ class FixtureManager {
|
|
|
44
48
|
}));
|
|
45
49
|
}
|
|
46
50
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return this.config;
|
|
59
|
-
});
|
|
51
|
+
set tdb(tdb) {
|
|
52
|
+
this._tdb = tdb;
|
|
53
|
+
}
|
|
54
|
+
get tdb() {
|
|
55
|
+
return this._tdb;
|
|
56
|
+
}
|
|
57
|
+
set fdb(fdb) {
|
|
58
|
+
this._fdb = fdb;
|
|
59
|
+
}
|
|
60
|
+
get fdb() {
|
|
61
|
+
return this._fdb;
|
|
60
62
|
}
|
|
61
63
|
cleanAndSeed() {
|
|
62
64
|
var e_1, _a;
|
|
63
65
|
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
const { tdb, fdb, knexfile } = yield this.init();
|
|
65
|
-
// console.time("FIXTURE-CleanAndSeed");
|
|
66
66
|
let tableNames = [];
|
|
67
67
|
if (this.usingTables === undefined) {
|
|
68
|
-
const [tables] = yield tdb.raw("SHOW TABLE STATUS WHERE Engine IS NOT NULL");
|
|
68
|
+
const [tables] = yield this.tdb.raw("SHOW TABLE STATUS WHERE Engine IS NOT NULL");
|
|
69
69
|
tableNames = tables.map((tableInfo) => tableInfo["Name"]);
|
|
70
70
|
}
|
|
71
71
|
else {
|
|
72
72
|
tableNames = this.usingTables;
|
|
73
73
|
}
|
|
74
|
-
yield tdb.raw(`SET FOREIGN_KEY_CHECKS = 0`);
|
|
74
|
+
yield this.tdb.raw(`SET FOREIGN_KEY_CHECKS = 0`);
|
|
75
75
|
try {
|
|
76
76
|
for (var tableNames_1 = __asyncValues(tableNames), tableNames_1_1; tableNames_1_1 = yield tableNames_1.next(), !tableNames_1_1.done;) {
|
|
77
77
|
let tableName = tableNames_1_1.value;
|
|
78
78
|
if (tableName == "migrations") {
|
|
79
79
|
continue;
|
|
80
80
|
}
|
|
81
|
-
const [[fdbChecksumRow]] = yield fdb.raw(`CHECKSUM TABLE ${tableName}`);
|
|
81
|
+
const [[fdbChecksumRow]] = yield this.fdb.raw(`CHECKSUM TABLE ${tableName}`);
|
|
82
82
|
const fdbChecksum = fdbChecksumRow["Checksum"];
|
|
83
|
-
const [[tdbChecksumRow]] = yield tdb.raw(`CHECKSUM TABLE ${tableName}`);
|
|
83
|
+
const [[tdbChecksumRow]] = yield this.tdb.raw(`CHECKSUM TABLE ${tableName}`);
|
|
84
84
|
const tdbChecksum = tdbChecksumRow["Checksum"];
|
|
85
85
|
if (fdbChecksum !== tdbChecksum) {
|
|
86
|
-
yield tdb(tableName).truncate();
|
|
87
|
-
const rawQuery = `INSERT INTO ${
|
|
88
|
-
SELECT * FROM ${
|
|
89
|
-
.database}.${tableName}`;
|
|
90
|
-
yield tdb.raw(rawQuery);
|
|
86
|
+
yield this.tdb(tableName).truncate();
|
|
87
|
+
const rawQuery = `INSERT INTO ${api_1.Sonamu.dbConfig.test.connection.database}.${tableName}
|
|
88
|
+
SELECT * FROM ${api_1.Sonamu.dbConfig.fixture_local
|
|
89
|
+
.connection.database}.${tableName}`;
|
|
90
|
+
yield this.tdb.raw(rawQuery);
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
}
|
|
@@ -98,7 +98,7 @@ class FixtureManager {
|
|
|
98
98
|
}
|
|
99
99
|
finally { if (e_1) throw e_1.error; }
|
|
100
100
|
}
|
|
101
|
-
yield tdb.raw(`SET FOREIGN_KEY_CHECKS = 1`);
|
|
101
|
+
yield this.tdb.raw(`SET FOREIGN_KEY_CHECKS = 1`);
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
104
|
// TODO: 추후 작업
|
|
@@ -131,9 +131,8 @@ class FixtureManager {
|
|
|
131
131
|
}
|
|
132
132
|
sync() {
|
|
133
133
|
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
-
const
|
|
135
|
-
const
|
|
136
|
-
const [tables] = yield fdb.raw("SHOW TABLE STATUS WHERE Engine IS NOT NULL");
|
|
134
|
+
const frdb = (0, knex_1.default)(api_1.Sonamu.dbConfig.fixture_remote);
|
|
135
|
+
const [tables] = yield this.fdb.raw("SHOW TABLE STATUS WHERE Engine IS NOT NULL");
|
|
137
136
|
const tableNames = tables.map((table) => table.Name);
|
|
138
137
|
console.log(chalk_1.default.magenta("SYNC..."));
|
|
139
138
|
yield Promise.all(tableNames.map((tableName) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -141,9 +140,9 @@ class FixtureManager {
|
|
|
141
140
|
return;
|
|
142
141
|
}
|
|
143
142
|
const remoteChecksum = yield this.getChecksum(frdb, tableName);
|
|
144
|
-
const localChecksum = yield this.getChecksum(fdb, tableName);
|
|
143
|
+
const localChecksum = yield this.getChecksum(this.fdb, tableName);
|
|
145
144
|
if (remoteChecksum !== localChecksum) {
|
|
146
|
-
yield fdb.transaction((transaction) => __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
yield this.fdb.transaction((transaction) => __awaiter(this, void 0, void 0, function* () {
|
|
147
146
|
yield transaction.raw(`SET FOREIGN_KEY_CHECKS = 0`);
|
|
148
147
|
yield transaction(tableName).truncate();
|
|
149
148
|
const rows = yield frdb(tableName);
|
|
@@ -184,7 +183,6 @@ class FixtureManager {
|
|
|
184
183
|
}
|
|
185
184
|
getImportQueries(smdId, field, id) {
|
|
186
185
|
return __awaiter(this, void 0, void 0, function* () {
|
|
187
|
-
const { knexfile } = yield this.init();
|
|
188
186
|
console.log({ smdId, field, id });
|
|
189
187
|
const smd = smd_manager_1.SMDManager.get(smdId);
|
|
190
188
|
const wdb = base_model_1.BaseModel.getDB("w");
|
|
@@ -194,9 +192,9 @@ class FixtureManager {
|
|
|
194
192
|
throw new Error(`${smdId}#${id} row를 찾을 수 없습니다.`);
|
|
195
193
|
}
|
|
196
194
|
// 픽스쳐DB, 실DB
|
|
197
|
-
const fixtureDatabase =
|
|
195
|
+
const fixtureDatabase = api_1.Sonamu.dbConfig.fixture_remote.connection
|
|
198
196
|
.database;
|
|
199
|
-
const realDatabase =
|
|
197
|
+
const realDatabase = api_1.Sonamu.dbConfig.production_master.connection
|
|
200
198
|
.database;
|
|
201
199
|
const selfQuery = `INSERT IGNORE INTO \`${fixtureDatabase}\`.\`${smd.table}\` (SELECT * FROM \`${realDatabase}\`.\`${smd.table}\` WHERE \`id\` = ${id})`;
|
|
202
200
|
const args = Object.entries(smd.relations)
|
|
@@ -237,12 +235,8 @@ class FixtureManager {
|
|
|
237
235
|
}
|
|
238
236
|
destory() {
|
|
239
237
|
return __awaiter(this, void 0, void 0, function* () {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
const { tdb, fdb } = yield this.init();
|
|
244
|
-
yield tdb.destroy();
|
|
245
|
-
yield fdb.destroy();
|
|
238
|
+
yield this.tdb.destroy();
|
|
239
|
+
yield this.fdb.destroy();
|
|
246
240
|
});
|
|
247
241
|
}
|
|
248
242
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture-manager.js","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAyC;AACzC,gDAAkC;AAClC,mCAA8B;AAC9B,uDAAmD;AACnD,
|
|
1
|
+
{"version":3,"file":"fixture-manager.js","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/utils.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUhE;AACD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,EAAE,CAAC,CAWhD;AACD,wBAAsB,eAAe,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUhE;AACD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,EAAE,CAAC,CAWhD;AACD,wBAAsB,eAAe,oBAGpC;AAED,wBAAsB,eAAe,oBAepC"}
|
package/dist/utils/utils.js
CHANGED
|
@@ -35,7 +35,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
35
35
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
36
|
};
|
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.findAppRootPath = exports.importMultiple = exports.globAsync = void 0;
|
|
38
|
+
exports.findApiRootPath = exports.findAppRootPath = exports.importMultiple = exports.globAsync = void 0;
|
|
39
39
|
const path_1 = __importDefault(require("path"));
|
|
40
40
|
const glob_1 = __importDefault(require("glob"));
|
|
41
41
|
const fs_1 = require("fs");
|
|
@@ -66,19 +66,29 @@ function importMultiple(filePaths) {
|
|
|
66
66
|
}
|
|
67
67
|
exports.importMultiple = importMultiple;
|
|
68
68
|
function findAppRootPath() {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const apiRootPath = yield findApiRootPath();
|
|
71
|
+
return apiRootPath.split(path_1.default.sep).slice(0, -1).join(path_1.default.sep);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
exports.findAppRootPath = findAppRootPath;
|
|
75
|
+
function findApiRootPath() {
|
|
69
76
|
return __awaiter(this, void 0, void 0, function* () {
|
|
70
77
|
if (require.main === undefined) {
|
|
71
78
|
throw new Error("Cannot find AppRoot using Sonamu");
|
|
72
79
|
}
|
|
73
80
|
let dir = path_1.default.dirname(require.main.path);
|
|
81
|
+
if (dir.includes("/.yarn/")) {
|
|
82
|
+
dir = dir.split("/.yarn/")[0];
|
|
83
|
+
}
|
|
74
84
|
do {
|
|
75
85
|
if ((0, fs_1.existsSync)(path_1.default.join(dir, "/package.json"))) {
|
|
76
|
-
return dir.split(path_1.default.sep).
|
|
86
|
+
return dir.split(path_1.default.sep).join(path_1.default.sep);
|
|
77
87
|
}
|
|
78
88
|
dir = dir.split(path_1.default.sep).slice(0, -1).join(path_1.default.sep);
|
|
79
89
|
} while (dir.split(path_1.default.sep).length > 1);
|
|
80
90
|
throw new Error("Cannot find AppRoot using Sonamu");
|
|
81
91
|
});
|
|
82
92
|
}
|
|
83
|
-
exports.
|
|
93
|
+
exports.findApiRootPath = findApiRootPath;
|
|
84
94
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,gDAAwB;AACxB,2BAAgC;AAEhC,SAAgB,SAAS,CAAC,WAAmB;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAA,cAAI,EAAC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC7C,IAAI,GAAG,EAAE;gBACP,MAAM,CAAC,GAAG,CAAC,CAAC;aACb;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAVD,8BAUC;AACD,SAAsB,cAAc,CAClC,SAAmB;;QAEnB,OAAO,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,GAAG,CAAC,CAAO,QAAQ,EAAE,EAAE;YAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,cAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,wDAAa,UAAU,GAAC,CAAC;YAC1C,OAAO;gBACL,QAAQ;gBACR,QAAQ;aACT,CAAC;QACJ,CAAC,CAAA,CAAC,CACH,CAAC;IACJ,CAAC;CAAA;AAbD,wCAaC;AACD,SAAsB,eAAe;;QACnC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;SACrD;QACD,IAAI,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,GAAG;YACD,IAAI,IAAA,eAAU,EAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE;gBAC/C,OAAO,GAAG,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,gDAAwB;AACxB,2BAAgC;AAEhC,SAAgB,SAAS,CAAC,WAAmB;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAA,cAAI,EAAC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC7C,IAAI,GAAG,EAAE;gBACP,MAAM,CAAC,GAAG,CAAC,CAAC;aACb;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAVD,8BAUC;AACD,SAAsB,cAAc,CAClC,SAAmB;;QAEnB,OAAO,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,GAAG,CAAC,CAAO,QAAQ,EAAE,EAAE;YAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,cAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,wDAAa,UAAU,GAAC,CAAC;YAC1C,OAAO;gBACL,QAAQ;gBACR,QAAQ;aACT,CAAC;QACJ,CAAC,CAAA,CAAC,CACH,CAAC;IACJ,CAAC;CAAA;AAbD,wCAaC;AACD,SAAsB,eAAe;;QACnC,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;QAC5C,OAAO,WAAW,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;CAAA;AAHD,0CAGC;AAED,SAAsB,eAAe;;QACnC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;SACrD;QACD,IAAI,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC3B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,GAAG;YACD,IAAI,IAAA,eAAU,EAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE;gBAC/C,OAAO,GAAG,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC;aAC3C;YACD,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC;SACvD,QAAQ,GAAG,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QACzC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;CAAA;AAfD,0CAeC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -19,9 +19,7 @@
|
|
|
19
19
|
"type": "git",
|
|
20
20
|
"url": "https://github.com/ping-alive/sonamu.git"
|
|
21
21
|
},
|
|
22
|
-
"bin":
|
|
23
|
-
"sonamu": "./dist/bin/cli.js"
|
|
24
|
-
},
|
|
22
|
+
"bin": "./dist/bin/cli.js",
|
|
25
23
|
"dependencies": {
|
|
26
24
|
"chalk": "^4.1.2",
|
|
27
25
|
"dotenv": "^16.0.2",
|
|
@@ -36,6 +34,7 @@
|
|
|
36
34
|
"mysql2": "^2.3.3",
|
|
37
35
|
"prompts": "^2.4.2",
|
|
38
36
|
"qs": "^6.11.0",
|
|
37
|
+
"tsicli": "^1.0.5",
|
|
39
38
|
"uuid": "^8.3.2",
|
|
40
39
|
"zod": "^3.18.0"
|
|
41
40
|
},
|
|
@@ -58,5 +57,10 @@
|
|
|
58
57
|
"ts-jest": "^28.0.8",
|
|
59
58
|
"typescript": "^4.8.2"
|
|
60
59
|
},
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"fastify": "^4.5.3",
|
|
62
|
+
"knex": "^2.3.0",
|
|
63
|
+
"mysql2": "^2.3.3"
|
|
64
|
+
},
|
|
61
65
|
"packageManager": "yarn@3.2.3"
|
|
62
66
|
}
|
package/src/api/index.ts
CHANGED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
|
|
3
|
+
import { IncomingMessage, Server, ServerResponse } from "http";
|
|
4
|
+
import { ZodError } from "zod";
|
|
5
|
+
import { getZodObjectFromApi } from "./code-converters";
|
|
6
|
+
import { Context } from "./context";
|
|
7
|
+
import { BadRequestException } from "../exceptions/so-exceptions";
|
|
8
|
+
import { SMDManager } from "../smd/smd-manager";
|
|
9
|
+
import { fastifyCaster } from "./caster";
|
|
10
|
+
import { ApiParamType } from "../types/types";
|
|
11
|
+
import { Syncer } from "../syncer/syncer";
|
|
12
|
+
import { isLocal } from "../utils/controller";
|
|
13
|
+
import { DB, SonamuDBConfig } from "../database/db";
|
|
14
|
+
import { BaseModel } from "../database/base-model";
|
|
15
|
+
import { findApiRootPath } from "../utils/utils";
|
|
16
|
+
import path from "path";
|
|
17
|
+
import { existsSync, readFileSync } from "fs";
|
|
18
|
+
|
|
19
|
+
export type SonamuConfig = {
|
|
20
|
+
api: {
|
|
21
|
+
dir: string;
|
|
22
|
+
};
|
|
23
|
+
sync: {
|
|
24
|
+
targets: string[];
|
|
25
|
+
};
|
|
26
|
+
route: {
|
|
27
|
+
prefix: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
type SonamuFastifyConfig = {
|
|
31
|
+
contextProvider: (
|
|
32
|
+
defaultContext: Pick<Context, "headers" | "reply">,
|
|
33
|
+
request: FastifyRequest,
|
|
34
|
+
reply: FastifyReply
|
|
35
|
+
) => Context;
|
|
36
|
+
};
|
|
37
|
+
class SonamuClass {
|
|
38
|
+
public isInitialized: boolean = false;
|
|
39
|
+
|
|
40
|
+
private _apiRootPath: string | null = null;
|
|
41
|
+
set apiRootPath(apiRootPath: string) {
|
|
42
|
+
this._apiRootPath = apiRootPath;
|
|
43
|
+
}
|
|
44
|
+
get apiRootPath(): string {
|
|
45
|
+
if (this._apiRootPath === null) {
|
|
46
|
+
throw new Error("Sonamu has not been initialized");
|
|
47
|
+
}
|
|
48
|
+
return this._apiRootPath!;
|
|
49
|
+
}
|
|
50
|
+
get appRootPath(): string {
|
|
51
|
+
return this.apiRootPath.split(path.sep).slice(0, -1).join(path.sep);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private _dbConfig: SonamuDBConfig | null = null;
|
|
55
|
+
set dbConfig(dbConfig: SonamuDBConfig) {
|
|
56
|
+
this._dbConfig = dbConfig;
|
|
57
|
+
}
|
|
58
|
+
get dbConfig(): SonamuDBConfig {
|
|
59
|
+
if (this._dbConfig === null) {
|
|
60
|
+
throw new Error("Sonamu has not been initialized");
|
|
61
|
+
}
|
|
62
|
+
return this._dbConfig!;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private _syncer: Syncer | null = null;
|
|
66
|
+
set syncer(syncer: Syncer) {
|
|
67
|
+
this._syncer = syncer;
|
|
68
|
+
}
|
|
69
|
+
get syncer(): Syncer {
|
|
70
|
+
if (this._syncer === null) {
|
|
71
|
+
throw new Error("Sonamu has not been initialized");
|
|
72
|
+
}
|
|
73
|
+
return this._syncer!;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private _config: SonamuConfig | null = null;
|
|
77
|
+
set config(config: SonamuConfig) {
|
|
78
|
+
this._config = config;
|
|
79
|
+
}
|
|
80
|
+
get config(): SonamuConfig {
|
|
81
|
+
if (this._config === null) {
|
|
82
|
+
throw new Error("Sonamu has not been initialized");
|
|
83
|
+
}
|
|
84
|
+
return this._config;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async init() {
|
|
88
|
+
if (this.isInitialized) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
console.time(chalk.cyan("Sonamu.init"));
|
|
92
|
+
|
|
93
|
+
this.apiRootPath = await findApiRootPath();
|
|
94
|
+
const configPath = path.join(this.apiRootPath, "sonamu.config.json");
|
|
95
|
+
if (existsSync(configPath) === false) {
|
|
96
|
+
throw new Error(`Cannot find sonamu.config.json in ${configPath}`);
|
|
97
|
+
}
|
|
98
|
+
this.config = JSON.parse(
|
|
99
|
+
readFileSync(configPath).toString()
|
|
100
|
+
) as SonamuConfig;
|
|
101
|
+
|
|
102
|
+
// DB 로드
|
|
103
|
+
this.dbConfig = await DB.readKnexfile();
|
|
104
|
+
console.log(chalk.green("DB Config Loaded!"));
|
|
105
|
+
|
|
106
|
+
// SMD 로드
|
|
107
|
+
await SMDManager.autoload();
|
|
108
|
+
|
|
109
|
+
// Syncer
|
|
110
|
+
this.syncer = new Syncer();
|
|
111
|
+
|
|
112
|
+
// Autoload: SMD / Models / Types / APIs
|
|
113
|
+
await this.syncer.autoloadModels();
|
|
114
|
+
await this.syncer.autoloadTypes();
|
|
115
|
+
await this.syncer.autoloadApis();
|
|
116
|
+
|
|
117
|
+
if (isLocal()) {
|
|
118
|
+
await this.syncer.sync();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
this.isInitialized = true;
|
|
122
|
+
console.timeEnd(chalk.cyan("Sonamu.init"));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async withFastify(
|
|
126
|
+
server: FastifyInstance<Server, IncomingMessage, ServerResponse>,
|
|
127
|
+
config: SonamuFastifyConfig
|
|
128
|
+
) {
|
|
129
|
+
if (this.isInitialized === false) {
|
|
130
|
+
await this.init();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 전체 라우팅 리스트
|
|
134
|
+
server.get(
|
|
135
|
+
`${this.config.route.prefix}/routes`,
|
|
136
|
+
async (_request, _reply): Promise<any> => {
|
|
137
|
+
return this.syncer.apis;
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// Healthcheck API
|
|
142
|
+
server.get(
|
|
143
|
+
`${this.config.route.prefix}/healthcheck`,
|
|
144
|
+
async (_request, _reply): Promise<string> => {
|
|
145
|
+
return "ok";
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
// API 라우팅 등록
|
|
150
|
+
this.syncer.apis.map((api) => {
|
|
151
|
+
// model
|
|
152
|
+
if (this.syncer.models[api.modelName] === undefined) {
|
|
153
|
+
throw new Error(`정의되지 않은 모델에 접근 ${api.modelName}`);
|
|
154
|
+
}
|
|
155
|
+
const model = this.syncer.models[api.modelName];
|
|
156
|
+
|
|
157
|
+
// 파라미터 정보로 zod 스키마 빌드
|
|
158
|
+
const ReqType = getZodObjectFromApi(api, this.syncer.types);
|
|
159
|
+
|
|
160
|
+
// route
|
|
161
|
+
server.route({
|
|
162
|
+
method: api.options.httpMethod!,
|
|
163
|
+
url: this.config.route.prefix + api.path,
|
|
164
|
+
handler: async (request, reply): Promise<unknown> => {
|
|
165
|
+
const which = api.options.httpMethod === "GET" ? "query" : "body";
|
|
166
|
+
let reqBody: {
|
|
167
|
+
[key: string]: unknown;
|
|
168
|
+
};
|
|
169
|
+
try {
|
|
170
|
+
reqBody = fastifyCaster(ReqType).parse(request[which] ?? {});
|
|
171
|
+
} catch (e) {
|
|
172
|
+
if (e instanceof ZodError) {
|
|
173
|
+
// TODO: BadRequest 에러 핸들링 (ZodError issues를 humanize하여 출력하는 로직 필요)
|
|
174
|
+
throw new BadRequestException(
|
|
175
|
+
`${(e as ZodError).issues[0].message}`,
|
|
176
|
+
e.errors
|
|
177
|
+
);
|
|
178
|
+
} else {
|
|
179
|
+
throw e;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const result = await (model as any)[api.methodName].apply(
|
|
184
|
+
model,
|
|
185
|
+
api.parameters.map((param) => {
|
|
186
|
+
// Context 인젝션
|
|
187
|
+
if (ApiParamType.isContext(param.type)) {
|
|
188
|
+
return config.contextProvider(
|
|
189
|
+
{
|
|
190
|
+
headers: request.headers,
|
|
191
|
+
reply,
|
|
192
|
+
},
|
|
193
|
+
request,
|
|
194
|
+
reply
|
|
195
|
+
);
|
|
196
|
+
} else {
|
|
197
|
+
return reqBody[param.name];
|
|
198
|
+
}
|
|
199
|
+
})
|
|
200
|
+
);
|
|
201
|
+
reply.type(api.options.contentType ?? "application/json");
|
|
202
|
+
return result;
|
|
203
|
+
},
|
|
204
|
+
}); // END server.route
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async destroy(): Promise<void> {
|
|
209
|
+
await BaseModel.destroy();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export const Sonamu = new SonamuClass();
|