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.
Files changed (76) hide show
  1. package/.pnp.cjs +13 -0
  2. package/dist/api/index.d.ts +1 -1
  3. package/dist/api/index.d.ts.map +1 -1
  4. package/dist/api/index.js +1 -1
  5. package/dist/api/index.js.map +1 -1
  6. package/dist/api/init.d.ts +35 -5
  7. package/dist/api/init.d.ts.map +1 -1
  8. package/dist/api/init.js +142 -79
  9. package/dist/api/init.js.map +1 -1
  10. package/dist/api/sonamu.d.ts +42 -0
  11. package/dist/api/sonamu.d.ts.map +1 -0
  12. package/dist/api/sonamu.js +175 -0
  13. package/dist/api/sonamu.js.map +1 -0
  14. package/dist/bin/cli.js +152 -67
  15. package/dist/bin/cli.js.map +1 -1
  16. package/dist/database/db.d.ts +1 -3
  17. package/dist/database/db.d.ts.map +1 -1
  18. package/dist/database/db.js +12 -23
  19. package/dist/database/db.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/smd/migrator.d.ts +0 -5
  25. package/dist/smd/migrator.d.ts.map +1 -1
  26. package/dist/smd/migrator.js +18 -19
  27. package/dist/smd/migrator.js.map +1 -1
  28. package/dist/smd/smd-manager.js +2 -2
  29. package/dist/smd/smd-manager.js.map +1 -1
  30. package/dist/smd/smd.d.ts.map +1 -1
  31. package/dist/smd/smd.js +4 -5
  32. package/dist/smd/smd.js.map +1 -1
  33. package/dist/syncer/syncer.d.ts +8 -12
  34. package/dist/syncer/syncer.d.ts.map +1 -1
  35. package/dist/syncer/syncer.js +43 -43
  36. package/dist/syncer/syncer.js.map +1 -1
  37. package/dist/templates/generated_http.template.js +2 -2
  38. package/dist/templates/generated_http.template.js.map +1 -1
  39. package/dist/templates/init_enums.template.js +1 -1
  40. package/dist/templates/init_generated.template.d.ts.map +1 -1
  41. package/dist/templates/init_generated.template.js +8 -1
  42. package/dist/templates/init_generated.template.js.map +1 -1
  43. package/dist/templates/service.template.d.ts +1 -1
  44. package/dist/templates/service.template.d.ts.map +1 -1
  45. package/dist/templates/service.template.js +3 -2
  46. package/dist/templates/service.template.js.map +1 -1
  47. package/dist/templates/smd.template.js +2 -2
  48. package/dist/templates/smd.template.js.map +1 -1
  49. package/dist/templates/view_form.template.d.ts +2 -2
  50. package/dist/templates/view_list.template.d.ts +2 -2
  51. package/dist/testing/fixture-manager.d.ts +6 -7
  52. package/dist/testing/fixture-manager.d.ts.map +1 -1
  53. package/dist/testing/fixture-manager.js +35 -41
  54. package/dist/testing/fixture-manager.js.map +1 -1
  55. package/dist/utils/utils.d.ts +1 -0
  56. package/dist/utils/utils.d.ts.map +1 -1
  57. package/dist/utils/utils.js +13 -3
  58. package/dist/utils/utils.js.map +1 -1
  59. package/package.json +8 -4
  60. package/src/api/index.ts +1 -1
  61. package/src/api/sonamu.ts +212 -0
  62. package/src/bin/cli.ts +159 -70
  63. package/src/database/db.ts +15 -27
  64. package/src/index.ts +1 -1
  65. package/src/smd/migrator.ts +18 -31
  66. package/src/smd/smd-manager.ts +3 -3
  67. package/src/smd/smd.ts +10 -9
  68. package/src/syncer/syncer.ts +49 -68
  69. package/src/templates/generated_http.template.ts +2 -2
  70. package/src/templates/init_enums.template.ts +1 -1
  71. package/src/templates/init_generated.template.ts +8 -1
  72. package/src/templates/service.template.ts +6 -5
  73. package/src/templates/smd.template.ts +2 -2
  74. package/src/testing/fixture-manager.ts +44 -53
  75. package/src/utils/utils.ts +9 -1
  76. package/src/api/init.ts +0 -129
package/.pnp.cjs CHANGED
@@ -62,6 +62,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
62
62
  ["qs", "npm:6.11.0"],\
63
63
  ["source-map-support", "npm:0.5.21"],\
64
64
  ["ts-jest", "virtual:4f0316c76b384a8421df072012eb837a6300b9a5670bff4df3dc0e7311fb233135ca0caeff48740f668ff78d6cdf9585f6ec35f903c4a6fa6a5853ed2b050977#npm:28.0.8"],\
65
+ ["tsicli", "npm:1.0.5"],\
65
66
  ["typescript", "patch:typescript@npm%3A4.8.2#~builtin<compat/typescript>::version=4.8.2&hash=a1c5e5"],\
66
67
  ["uuid", "npm:8.3.2"],\
67
68
  ["zod", "npm:3.18.0"]\
@@ -5154,6 +5155,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
5154
5155
  ["qs", "npm:6.11.0"],\
5155
5156
  ["source-map-support", "npm:0.5.21"],\
5156
5157
  ["ts-jest", "virtual:4f0316c76b384a8421df072012eb837a6300b9a5670bff4df3dc0e7311fb233135ca0caeff48740f668ff78d6cdf9585f6ec35f903c4a6fa6a5853ed2b050977#npm:28.0.8"],\
5158
+ ["tsicli", "npm:1.0.5"],\
5157
5159
  ["typescript", "patch:typescript@npm%3A4.8.2#~builtin<compat/typescript>::version=4.8.2&hash=a1c5e5"],\
5158
5160
  ["uuid", "npm:8.3.2"],\
5159
5161
  ["zod", "npm:3.18.0"]\
@@ -5526,6 +5528,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
5526
5528
  "linkType": "HARD"\
5527
5529
  }]\
5528
5530
  ]],\
5531
+ ["tsicli", [\
5532
+ ["npm:1.0.5", {\
5533
+ "packageLocation": "./.yarn/cache/tsicli-npm-1.0.5-1ca6da571f-9ac2236ecf.zip/node_modules/tsicli/",\
5534
+ "packageDependencies": [\
5535
+ ["tsicli", "npm:1.0.5"],\
5536
+ ["chalk", "npm:4.1.2"],\
5537
+ ["prompts", "npm:2.4.2"]\
5538
+ ],\
5539
+ "linkType": "HARD"\
5540
+ }]\
5541
+ ]],\
5529
5542
  ["type-detect", [\
5530
5543
  ["npm:4.0.8", {\
5531
5544
  "packageLocation": "./.yarn/cache/type-detect-npm-4.0.8-8d8127b901-62b5628bff.zip/node_modules/type-detect/",\
@@ -2,5 +2,5 @@ export * from "./caster";
2
2
  export * from "./code-converters";
3
3
  export * from "./context";
4
4
  export * from "./decorators";
5
- export * from "./init";
5
+ export * from "./sonamu";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
package/dist/api/index.js CHANGED
@@ -18,5 +18,5 @@ __exportStar(require("./caster"), exports);
18
18
  __exportStar(require("./code-converters"), exports);
19
19
  __exportStar(require("./context"), exports);
20
20
  __exportStar(require("./decorators"), exports);
21
- __exportStar(require("./init"), exports);
21
+ __exportStar(require("./sonamu"), exports);
22
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,oDAAkC;AAClC,4CAA0B;AAC1B,+CAA6B;AAC7B,yCAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,oDAAkC;AAClC,4CAA0B;AAC1B,+CAA6B;AAC7B,2CAAyB"}
@@ -2,11 +2,41 @@
2
2
  import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
3
3
  import { IncomingMessage, Server, ServerResponse } from "http";
4
4
  import { Context } from "./context";
5
- export declare type SonamuInitConfig = {
6
- prefix: string;
7
- syncTargets: string[];
5
+ import { Syncer } from "../syncer/syncer";
6
+ import { SonamuDBConfig } from "../database/db";
7
+ export declare type SonamuConfig = {
8
+ api: {
9
+ dir: string;
10
+ };
11
+ sync: {
12
+ targets: string[];
13
+ };
14
+ route: {
15
+ prefix: string;
16
+ };
17
+ };
18
+ declare type SonamuFastifyConfig = {
8
19
  contextProvider: (defaultContext: Pick<Context, "headers" | "reply">, request: FastifyRequest, reply: FastifyReply) => Context;
9
20
  };
10
- export declare function init(server: FastifyInstance<Server, IncomingMessage, ServerResponse>, config: SonamuInitConfig): Promise<void>;
11
- export declare function destroy(): Promise<void>;
21
+ declare class SonamuClass {
22
+ isInitialized: boolean;
23
+ private _apiRootPath;
24
+ set apiRootPath(apiRootPath: string);
25
+ get apiRootPath(): string;
26
+ get appRootPath(): string;
27
+ private _dbConfig;
28
+ set dbConfig(dbConfig: SonamuDBConfig);
29
+ get dbConfig(): SonamuDBConfig;
30
+ private _syncer;
31
+ set syncer(syncer: Syncer);
32
+ get syncer(): Syncer;
33
+ private _config;
34
+ set config(config: SonamuConfig);
35
+ get config(): SonamuConfig;
36
+ init(): Promise<void>;
37
+ withFastify(server: FastifyInstance<Server, IncomingMessage, ServerResponse>, config: SonamuFastifyConfig): Promise<void>;
38
+ destroy(): Promise<void>;
39
+ }
40
+ export declare const Sonamu: SonamuClass;
41
+ export {};
12
42
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,oBAAY,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,CACf,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,EAClD,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC;CACd,CAAC;AACF,wBAAsB,IAAI,CACxB,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,EAChE,MAAM,EAAE,gBAAgB,iBAiGzB;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAM,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMpD,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AACF,aAAK,mBAAmB,GAAG;IACzB,eAAe,EAAE,CACf,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,EAClD,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC;CACd,CAAC;AACF,cAAM,WAAW;IACR,aAAa,EAAE,OAAO,CAAS;IAEtC,OAAO,CAAC,YAAY,CAAuB;IAC3C,IAAI,WAAW,CAAC,WAAW,EAAE,MAAM,EAElC;IACD,IAAI,WAAW,IAAI,MAAM,CAKxB;IACD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,SAAS,CAA+B;IAChD,IAAI,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAEpC;IACD,IAAI,QAAQ,IAAI,cAAc,CAK7B;IAED,OAAO,CAAC,OAAO,CAAuB;IACtC,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAExB;IACD,IAAI,MAAM,IAAI,MAAM,CAKnB;IAED,OAAO,CAAC,OAAO,CAA6B;IAC5C,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,EAE9B;IACD,IAAI,MAAM,IAAI,YAAY,CAKzB;IAEK,IAAI;IAsCJ,WAAW,CACf,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,EAChE,MAAM,EAAE,mBAAmB;IAiFvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AACD,eAAO,MAAM,MAAM,aAAoB,CAAC"}
package/dist/api/init.js CHANGED
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.destroy = exports.init = void 0;
15
+ exports.Sonamu = void 0;
16
16
  const chalk_1 = __importDefault(require("chalk"));
17
17
  const zod_1 = require("zod");
18
18
  const code_converters_1 = require("./code-converters");
@@ -25,88 +25,151 @@ const controller_1 = require("../utils/controller");
25
25
  const db_1 = require("../database/db");
26
26
  const base_model_1 = require("../database/base-model");
27
27
  const utils_1 = require("../utils/utils");
28
- function init(server, config) {
29
- return __awaiter(this, void 0, void 0, function* () {
30
- // 전체 라우팅 리스트
31
- server.get(`${config.prefix}/routes`, (_request, _reply) => __awaiter(this, void 0, void 0, function* () {
32
- return apis;
33
- }));
34
- // Healthcheck API
35
- server.get(`${config.prefix}/healthcheck`, (_request, _reply) => __awaiter(this, void 0, void 0, function* () {
36
- return "ok";
37
- }));
38
- // Syncer
39
- const appRootPath = yield (0, utils_1.findAppRootPath)();
40
- const syncer = syncer_1.Syncer.getInstance({
41
- appRootPath: appRootPath,
42
- targets: config.syncTargets,
43
- });
44
- // DB 설정파일 확인
45
- yield db_1.DB.readKnexfile();
46
- console.log(chalk_1.default.green("DB Config Loaded!"));
47
- // Autoload: SMD / Models / Types / APIs
48
- console.time(chalk_1.default.cyan("autoload&sync:"));
49
- yield smd_manager_1.SMDManager.autoload();
50
- const importedModels = yield syncer.autoloadModels(appRootPath);
51
- const references = yield syncer.autoloadTypes(appRootPath);
52
- const apis = yield syncer.autoloadApis(appRootPath);
53
- if ((0, controller_1.isLocal)()) {
54
- yield syncer.sync();
28
+ const path_1 = __importDefault(require("path"));
29
+ const fs_1 = require("fs");
30
+ class SonamuClass {
31
+ constructor() {
32
+ this.isInitialized = false;
33
+ this._apiRootPath = null;
34
+ this._dbConfig = null;
35
+ this._syncer = null;
36
+ this._config = null;
37
+ }
38
+ set apiRootPath(apiRootPath) {
39
+ this._apiRootPath = apiRootPath;
40
+ }
41
+ get apiRootPath() {
42
+ if (this._apiRootPath === null) {
43
+ throw new Error("Sonamu has not been initialized");
44
+ }
45
+ return this._apiRootPath;
46
+ }
47
+ get appRootPath() {
48
+ return this.apiRootPath.split(path_1.default.sep).slice(0, -1).join(path_1.default.sep);
49
+ }
50
+ set dbConfig(dbConfig) {
51
+ this._dbConfig = dbConfig;
52
+ }
53
+ get dbConfig() {
54
+ if (this._dbConfig === null) {
55
+ throw new Error("Sonamu has not been initialized");
56
+ }
57
+ return this._dbConfig;
58
+ }
59
+ set syncer(syncer) {
60
+ this._syncer = syncer;
61
+ }
62
+ get syncer() {
63
+ if (this._syncer === null) {
64
+ throw new Error("Sonamu has not been initialized");
65
+ }
66
+ return this._syncer;
67
+ }
68
+ set config(config) {
69
+ this._config = config;
70
+ }
71
+ get config() {
72
+ if (this._config === null) {
73
+ throw new Error("Sonamu has not been initialized");
55
74
  }
56
- console.timeEnd(chalk_1.default.cyan("autoload&sync:"));
57
- // API 라우팅 등록
58
- apis.map((api) => {
59
- // model
60
- if (importedModels[api.modelName] === undefined) {
61
- throw new Error(`정의되지 않은 모델에 접근 ${api.modelName}`);
75
+ return this._config;
76
+ }
77
+ init() {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ if (this.isInitialized) {
80
+ return;
62
81
  }
63
- const model = importedModels[api.modelName];
64
- // 파라미터 정보로 zod 스키마 빌드
65
- const ReqType = (0, code_converters_1.getZodObjectFromApi)(api, references);
66
- // route
67
- server.route({
68
- method: api.options.httpMethod,
69
- url: config.prefix + api.path,
70
- handler: (request, reply) => __awaiter(this, void 0, void 0, function* () {
71
- var _a, _b;
72
- const which = api.options.httpMethod === "GET" ? "query" : "body";
73
- let reqBody;
74
- try {
75
- reqBody = (0, caster_1.fastifyCaster)(ReqType).parse((_a = request[which]) !== null && _a !== void 0 ? _a : {});
76
- }
77
- catch (e) {
78
- if (e instanceof zod_1.ZodError) {
79
- // TODO: BadRequest 에러 핸들링 (ZodError issues를 humanize하여 출력하는 로직 필요)
80
- throw new so_exceptions_1.BadRequestException(`${e.issues[0].message}`, e.errors);
81
- }
82
- else {
83
- throw e;
84
- }
85
- }
86
- const result = yield model[api.methodName].apply(model, api.parameters.map((param) => {
87
- // Context 인젝션
88
- if (types_1.ApiParamType.isContext(param.type)) {
89
- return config.contextProvider({
90
- headers: request.headers,
91
- reply,
92
- }, request, reply);
82
+ this.apiRootPath = yield (0, utils_1.findApiRootPath)();
83
+ const configPath = path_1.default.join(this.apiRootPath, "sonamu.config.json");
84
+ if ((0, fs_1.existsSync)(configPath) === false) {
85
+ throw new Error(`Cannot find sonamu.config.json in ${configPath}`);
86
+ }
87
+ this.config = JSON.parse((0, fs_1.readFileSync)(configPath).toString());
88
+ // DB 로드
89
+ this.dbConfig = yield db_1.DB.readKnexfile();
90
+ console.log(chalk_1.default.green("DB Config Loaded!"));
91
+ // SMD 로드
92
+ yield smd_manager_1.SMDManager.autoload();
93
+ // Syncer & Autoload: SMD / Models / Types / APIs
94
+ console.time(chalk_1.default.cyan("autoload&sync:"));
95
+ yield smd_manager_1.SMDManager.autoload();
96
+ this.syncer = new syncer_1.Syncer();
97
+ yield this.syncer.autoloadModels();
98
+ yield this.syncer.autoloadTypes();
99
+ yield this.syncer.autoloadApis();
100
+ if ((0, controller_1.isLocal)()) {
101
+ yield this.syncer.sync();
102
+ }
103
+ console.timeEnd(chalk_1.default.cyan("autoload&sync:"));
104
+ this.isInitialized = true;
105
+ });
106
+ }
107
+ withFastify(server, config) {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ if (this.isInitialized === false) {
110
+ yield this.init();
111
+ }
112
+ // 전체 라우팅 리스트
113
+ server.get(`${this.config.route.prefix}/routes`, (_request, _reply) => __awaiter(this, void 0, void 0, function* () {
114
+ return this.syncer.apis;
115
+ }));
116
+ // Healthcheck API
117
+ server.get(`${this.config.route.prefix}/healthcheck`, (_request, _reply) => __awaiter(this, void 0, void 0, function* () {
118
+ return "ok";
119
+ }));
120
+ // API 라우팅 등록
121
+ this.syncer.apis.map((api) => {
122
+ // model
123
+ if (this.syncer.models[api.modelName] === undefined) {
124
+ throw new Error(`정의되지 않은 모델에 접근 ${api.modelName}`);
125
+ }
126
+ const model = this.syncer.models[api.modelName];
127
+ // 파라미터 정보로 zod 스키마 빌드
128
+ const ReqType = (0, code_converters_1.getZodObjectFromApi)(api, this.syncer.types);
129
+ // route
130
+ server.route({
131
+ method: api.options.httpMethod,
132
+ url: this.config.route.prefix + api.path,
133
+ handler: (request, reply) => __awaiter(this, void 0, void 0, function* () {
134
+ var _a, _b;
135
+ const which = api.options.httpMethod === "GET" ? "query" : "body";
136
+ let reqBody;
137
+ try {
138
+ reqBody = (0, caster_1.fastifyCaster)(ReqType).parse((_a = request[which]) !== null && _a !== void 0 ? _a : {});
93
139
  }
94
- else {
95
- return reqBody[param.name];
140
+ catch (e) {
141
+ if (e instanceof zod_1.ZodError) {
142
+ // TODO: BadRequest 에러 핸들링 (ZodError issues를 humanize하여 출력하는 로직 필요)
143
+ throw new so_exceptions_1.BadRequestException(`${e.issues[0].message}`, e.errors);
144
+ }
145
+ else {
146
+ throw e;
147
+ }
96
148
  }
97
- }));
98
- reply.type((_b = api.options.contentType) !== null && _b !== void 0 ? _b : "application/json");
99
- return result;
100
- }),
101
- }); // END server.route
149
+ const result = yield model[api.methodName].apply(model, api.parameters.map((param) => {
150
+ // Context 인젝션
151
+ if (types_1.ApiParamType.isContext(param.type)) {
152
+ return config.contextProvider({
153
+ headers: request.headers,
154
+ reply,
155
+ }, request, reply);
156
+ }
157
+ else {
158
+ return reqBody[param.name];
159
+ }
160
+ }));
161
+ reply.type((_b = api.options.contentType) !== null && _b !== void 0 ? _b : "application/json");
162
+ return result;
163
+ }),
164
+ }); // END server.route
165
+ });
102
166
  });
103
- });
104
- }
105
- exports.init = init;
106
- function destroy() {
107
- return __awaiter(this, void 0, void 0, function* () {
108
- yield base_model_1.BaseModel.destroy();
109
- });
167
+ }
168
+ destroy() {
169
+ return __awaiter(this, void 0, void 0, function* () {
170
+ yield base_model_1.BaseModel.destroy();
171
+ });
172
+ }
110
173
  }
111
- exports.destroy = destroy;
174
+ exports.Sonamu = new SonamuClass();
112
175
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/api/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /// <reference types="node" />
2
+ import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
3
+ import { IncomingMessage, Server, ServerResponse } from "http";
4
+ import { Context } from "./context";
5
+ import { Syncer } from "../syncer/syncer";
6
+ import { SonamuDBConfig } from "../database/db";
7
+ export declare type SonamuConfig = {
8
+ api: {
9
+ dir: string;
10
+ };
11
+ sync: {
12
+ targets: string[];
13
+ };
14
+ route: {
15
+ prefix: string;
16
+ };
17
+ };
18
+ declare type SonamuFastifyConfig = {
19
+ contextProvider: (defaultContext: Pick<Context, "headers" | "reply">, request: FastifyRequest, reply: FastifyReply) => Context;
20
+ };
21
+ declare class SonamuClass {
22
+ isInitialized: boolean;
23
+ private _apiRootPath;
24
+ set apiRootPath(apiRootPath: string);
25
+ get apiRootPath(): string;
26
+ get appRootPath(): string;
27
+ private _dbConfig;
28
+ set dbConfig(dbConfig: SonamuDBConfig);
29
+ get dbConfig(): SonamuDBConfig;
30
+ private _syncer;
31
+ set syncer(syncer: Syncer);
32
+ get syncer(): Syncer;
33
+ private _config;
34
+ set config(config: SonamuConfig);
35
+ get config(): SonamuConfig;
36
+ init(): Promise<void>;
37
+ withFastify(server: FastifyInstance<Server, IncomingMessage, ServerResponse>, config: SonamuFastifyConfig): Promise<void>;
38
+ destroy(): Promise<void>;
39
+ }
40
+ export declare const Sonamu: SonamuClass;
41
+ export {};
42
+ //# sourceMappingURL=sonamu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAM,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMpD,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AACF,aAAK,mBAAmB,GAAG;IACzB,eAAe,EAAE,CACf,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,EAClD,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC;CACd,CAAC;AACF,cAAM,WAAW;IACR,aAAa,EAAE,OAAO,CAAS;IAEtC,OAAO,CAAC,YAAY,CAAuB;IAC3C,IAAI,WAAW,CAAC,WAAW,EAAE,MAAM,EAElC;IACD,IAAI,WAAW,IAAI,MAAM,CAKxB;IACD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,SAAS,CAA+B;IAChD,IAAI,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAEpC;IACD,IAAI,QAAQ,IAAI,cAAc,CAK7B;IAED,OAAO,CAAC,OAAO,CAAuB;IACtC,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAExB;IACD,IAAI,MAAM,IAAI,MAAM,CAKnB;IAED,OAAO,CAAC,OAAO,CAA6B;IAC5C,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,EAE9B;IACD,IAAI,MAAM,IAAI,YAAY,CAKzB;IAEK,IAAI;IAsCJ,WAAW,CACf,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,EAChE,MAAM,EAAE,mBAAmB;IAiFvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AACD,eAAO,MAAM,MAAM,aAAoB,CAAC"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Sonamu = void 0;
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const zod_1 = require("zod");
18
+ const code_converters_1 = require("./code-converters");
19
+ const so_exceptions_1 = require("../exceptions/so-exceptions");
20
+ const smd_manager_1 = require("../smd/smd-manager");
21
+ const caster_1 = require("./caster");
22
+ const types_1 = require("../types/types");
23
+ const syncer_1 = require("../syncer/syncer");
24
+ const controller_1 = require("../utils/controller");
25
+ const db_1 = require("../database/db");
26
+ const base_model_1 = require("../database/base-model");
27
+ const utils_1 = require("../utils/utils");
28
+ const path_1 = __importDefault(require("path"));
29
+ const fs_1 = require("fs");
30
+ class SonamuClass {
31
+ constructor() {
32
+ this.isInitialized = false;
33
+ this._apiRootPath = null;
34
+ this._dbConfig = null;
35
+ this._syncer = null;
36
+ this._config = null;
37
+ }
38
+ set apiRootPath(apiRootPath) {
39
+ this._apiRootPath = apiRootPath;
40
+ }
41
+ get apiRootPath() {
42
+ if (this._apiRootPath === null) {
43
+ throw new Error("Sonamu has not been initialized");
44
+ }
45
+ return this._apiRootPath;
46
+ }
47
+ get appRootPath() {
48
+ return this.apiRootPath.split(path_1.default.sep).slice(0, -1).join(path_1.default.sep);
49
+ }
50
+ set dbConfig(dbConfig) {
51
+ this._dbConfig = dbConfig;
52
+ }
53
+ get dbConfig() {
54
+ if (this._dbConfig === null) {
55
+ throw new Error("Sonamu has not been initialized");
56
+ }
57
+ return this._dbConfig;
58
+ }
59
+ set syncer(syncer) {
60
+ this._syncer = syncer;
61
+ }
62
+ get syncer() {
63
+ if (this._syncer === null) {
64
+ throw new Error("Sonamu has not been initialized");
65
+ }
66
+ return this._syncer;
67
+ }
68
+ set config(config) {
69
+ this._config = config;
70
+ }
71
+ get config() {
72
+ if (this._config === null) {
73
+ throw new Error("Sonamu has not been initialized");
74
+ }
75
+ return this._config;
76
+ }
77
+ init() {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ if (this.isInitialized) {
80
+ return;
81
+ }
82
+ console.time(chalk_1.default.cyan("Sonamu.init"));
83
+ this.apiRootPath = yield (0, utils_1.findApiRootPath)();
84
+ const configPath = path_1.default.join(this.apiRootPath, "sonamu.config.json");
85
+ if ((0, fs_1.existsSync)(configPath) === false) {
86
+ throw new Error(`Cannot find sonamu.config.json in ${configPath}`);
87
+ }
88
+ this.config = JSON.parse((0, fs_1.readFileSync)(configPath).toString());
89
+ // DB 로드
90
+ this.dbConfig = yield db_1.DB.readKnexfile();
91
+ console.log(chalk_1.default.green("DB Config Loaded!"));
92
+ // SMD 로드
93
+ yield smd_manager_1.SMDManager.autoload();
94
+ // Syncer
95
+ this.syncer = new syncer_1.Syncer();
96
+ // Autoload: SMD / Models / Types / APIs
97
+ yield this.syncer.autoloadModels();
98
+ yield this.syncer.autoloadTypes();
99
+ yield this.syncer.autoloadApis();
100
+ if ((0, controller_1.isLocal)()) {
101
+ yield this.syncer.sync();
102
+ }
103
+ this.isInitialized = true;
104
+ console.timeEnd(chalk_1.default.cyan("Sonamu.init"));
105
+ });
106
+ }
107
+ withFastify(server, config) {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ if (this.isInitialized === false) {
110
+ yield this.init();
111
+ }
112
+ // 전체 라우팅 리스트
113
+ server.get(`${this.config.route.prefix}/routes`, (_request, _reply) => __awaiter(this, void 0, void 0, function* () {
114
+ return this.syncer.apis;
115
+ }));
116
+ // Healthcheck API
117
+ server.get(`${this.config.route.prefix}/healthcheck`, (_request, _reply) => __awaiter(this, void 0, void 0, function* () {
118
+ return "ok";
119
+ }));
120
+ // API 라우팅 등록
121
+ this.syncer.apis.map((api) => {
122
+ // model
123
+ if (this.syncer.models[api.modelName] === undefined) {
124
+ throw new Error(`정의되지 않은 모델에 접근 ${api.modelName}`);
125
+ }
126
+ const model = this.syncer.models[api.modelName];
127
+ // 파라미터 정보로 zod 스키마 빌드
128
+ const ReqType = (0, code_converters_1.getZodObjectFromApi)(api, this.syncer.types);
129
+ // route
130
+ server.route({
131
+ method: api.options.httpMethod,
132
+ url: this.config.route.prefix + api.path,
133
+ handler: (request, reply) => __awaiter(this, void 0, void 0, function* () {
134
+ var _a, _b;
135
+ const which = api.options.httpMethod === "GET" ? "query" : "body";
136
+ let reqBody;
137
+ try {
138
+ reqBody = (0, caster_1.fastifyCaster)(ReqType).parse((_a = request[which]) !== null && _a !== void 0 ? _a : {});
139
+ }
140
+ catch (e) {
141
+ if (e instanceof zod_1.ZodError) {
142
+ // TODO: BadRequest 에러 핸들링 (ZodError issues를 humanize하여 출력하는 로직 필요)
143
+ throw new so_exceptions_1.BadRequestException(`${e.issues[0].message}`, e.errors);
144
+ }
145
+ else {
146
+ throw e;
147
+ }
148
+ }
149
+ const result = yield model[api.methodName].apply(model, api.parameters.map((param) => {
150
+ // Context 인젝션
151
+ if (types_1.ApiParamType.isContext(param.type)) {
152
+ return config.contextProvider({
153
+ headers: request.headers,
154
+ reply,
155
+ }, request, reply);
156
+ }
157
+ else {
158
+ return reqBody[param.name];
159
+ }
160
+ }));
161
+ reply.type((_b = api.options.contentType) !== null && _b !== void 0 ? _b : "application/json");
162
+ return result;
163
+ }),
164
+ }); // END server.route
165
+ });
166
+ });
167
+ }
168
+ destroy() {
169
+ return __awaiter(this, void 0, void 0, function* () {
170
+ yield base_model_1.BaseModel.destroy();
171
+ });
172
+ }
173
+ }
174
+ exports.Sonamu = new SonamuClass();
175
+ //# sourceMappingURL=sonamu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonamu.js","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"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"}