sonamu 0.2.38 → 0.2.40

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 (265) hide show
  1. package/dist/bin/cli-wrapper.d.mts +1 -0
  2. package/dist/bin/cli-wrapper.d.ts +0 -2
  3. package/dist/bin/cli-wrapper.js +26 -23
  4. package/dist/bin/cli-wrapper.js.map +1 -1
  5. package/dist/bin/cli-wrapper.mjs +34 -0
  6. package/dist/bin/cli-wrapper.mjs.map +1 -0
  7. package/dist/bin/cli.d.mts +2 -0
  8. package/dist/bin/cli.d.ts +2 -2
  9. package/dist/bin/cli.js +856 -407
  10. package/dist/bin/cli.js.map +1 -1
  11. package/dist/bin/cli.mjs +887 -0
  12. package/dist/bin/cli.mjs.map +1 -0
  13. package/dist/chunk-BPT5ZXMX.js +7444 -0
  14. package/dist/chunk-BPT5ZXMX.js.map +1 -0
  15. package/dist/chunk-JXJTFHF7.mjs +20 -0
  16. package/dist/chunk-JXJTFHF7.mjs.map +1 -0
  17. package/dist/chunk-OTFO46SP.mjs +7443 -0
  18. package/dist/chunk-OTFO46SP.mjs.map +1 -0
  19. package/dist/index.d.mts +1419 -0
  20. package/dist/index.d.ts +1419 -19
  21. package/dist/index.js +422 -32
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +427 -0
  24. package/dist/index.mjs.map +1 -0
  25. package/package.json +1 -1
  26. package/tsup.config.js +8 -0
  27. package/dist/api/caster.d.ts +0 -10
  28. package/dist/api/caster.d.ts.map +0 -1
  29. package/dist/api/caster.js +0 -81
  30. package/dist/api/caster.js.map +0 -1
  31. package/dist/api/code-converters.d.ts +0 -22
  32. package/dist/api/code-converters.d.ts.map +0 -1
  33. package/dist/api/code-converters.js +0 -507
  34. package/dist/api/code-converters.js.map +0 -1
  35. package/dist/api/context.d.ts +0 -11
  36. package/dist/api/context.d.ts.map +0 -1
  37. package/dist/api/context.js +0 -3
  38. package/dist/api/context.js.map +0 -1
  39. package/dist/api/decorators.d.ts +0 -29
  40. package/dist/api/decorators.d.ts.map +0 -1
  41. package/dist/api/decorators.js +0 -26
  42. package/dist/api/decorators.js.map +0 -1
  43. package/dist/api/index.d.ts +0 -6
  44. package/dist/api/index.d.ts.map +0 -1
  45. package/dist/api/index.js +0 -22
  46. package/dist/api/index.js.map +0 -1
  47. package/dist/api/init.d.ts +0 -42
  48. package/dist/api/init.d.ts.map +0 -1
  49. package/dist/api/init.js +0 -175
  50. package/dist/api/init.js.map +0 -1
  51. package/dist/api/sonamu.d.ts +0 -66
  52. package/dist/api/sonamu.d.ts.map +0 -1
  53. package/dist/api/sonamu.js +0 -204
  54. package/dist/api/sonamu.js.map +0 -1
  55. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  56. package/dist/bin/cli.d.ts.map +0 -1
  57. package/dist/database/_batch_update.d.ts +0 -15
  58. package/dist/database/_batch_update.d.ts.map +0 -1
  59. package/dist/database/_batch_update.js +0 -89
  60. package/dist/database/_batch_update.js.map +0 -1
  61. package/dist/database/base-model.d.ts +0 -39
  62. package/dist/database/base-model.d.ts.map +0 -1
  63. package/dist/database/base-model.js +0 -270
  64. package/dist/database/base-model.js.map +0 -1
  65. package/dist/database/db.d.ts +0 -21
  66. package/dist/database/db.d.ts.map +0 -1
  67. package/dist/database/db.js +0 -99
  68. package/dist/database/db.js.map +0 -1
  69. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  70. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  71. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -37
  72. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  73. package/dist/database/upsert-builder.d.ts +0 -34
  74. package/dist/database/upsert-builder.d.ts.map +0 -1
  75. package/dist/database/upsert-builder.js +0 -240
  76. package/dist/database/upsert-builder.js.map +0 -1
  77. package/dist/entity/entity-manager.d.ts +0 -32
  78. package/dist/entity/entity-manager.d.ts.map +0 -1
  79. package/dist/entity/entity-manager.js +0 -135
  80. package/dist/entity/entity-manager.js.map +0 -1
  81. package/dist/entity/entity-utils.d.ts +0 -61
  82. package/dist/entity/entity-utils.d.ts.map +0 -1
  83. package/dist/entity/entity-utils.js +0 -124
  84. package/dist/entity/entity-utils.js.map +0 -1
  85. package/dist/entity/entity.d.ts +0 -59
  86. package/dist/entity/entity.d.ts.map +0 -1
  87. package/dist/entity/entity.js +0 -697
  88. package/dist/entity/entity.js.map +0 -1
  89. package/dist/entity/migrator.d.ts +0 -143
  90. package/dist/entity/migrator.d.ts.map +0 -1
  91. package/dist/entity/migrator.js +0 -1434
  92. package/dist/entity/migrator.js.map +0 -1
  93. package/dist/entity/smd-utils.d.ts +0 -61
  94. package/dist/entity/smd-utils.d.ts.map +0 -1
  95. package/dist/entity/smd-utils.js +0 -121
  96. package/dist/entity/smd-utils.js.map +0 -1
  97. package/dist/exceptions/error-handler.d.ts +0 -3
  98. package/dist/exceptions/error-handler.d.ts.map +0 -1
  99. package/dist/exceptions/error-handler.js +0 -34
  100. package/dist/exceptions/error-handler.js.map +0 -1
  101. package/dist/exceptions/so-exceptions.d.ts +0 -48
  102. package/dist/exceptions/so-exceptions.d.ts.map +0 -1
  103. package/dist/exceptions/so-exceptions.js +0 -105
  104. package/dist/exceptions/so-exceptions.js.map +0 -1
  105. package/dist/index.d.ts.map +0 -1
  106. package/dist/smd/entity-manager.d.ts +0 -28
  107. package/dist/smd/entity-manager.d.ts.map +0 -1
  108. package/dist/smd/entity-manager.js +0 -119
  109. package/dist/smd/entity-manager.js.map +0 -1
  110. package/dist/smd/entity.d.ts +0 -40
  111. package/dist/smd/entity.d.ts.map +0 -1
  112. package/dist/smd/entity.js +0 -430
  113. package/dist/smd/entity.js.map +0 -1
  114. package/dist/smd/migrator.d.ts +0 -109
  115. package/dist/smd/migrator.d.ts.map +0 -1
  116. package/dist/smd/migrator.js +0 -1164
  117. package/dist/smd/migrator.js.map +0 -1
  118. package/dist/smd/smd-manager.d.ts +0 -28
  119. package/dist/smd/smd-manager.d.ts.map +0 -1
  120. package/dist/smd/smd-manager.js +0 -146
  121. package/dist/smd/smd-manager.js.map +0 -1
  122. package/dist/smd/smd-utils.d.ts +0 -61
  123. package/dist/smd/smd-utils.d.ts.map +0 -1
  124. package/dist/smd/smd-utils.js +0 -121
  125. package/dist/smd/smd-utils.js.map +0 -1
  126. package/dist/smd/smd.d.ts +0 -40
  127. package/dist/smd/smd.d.ts.map +0 -1
  128. package/dist/smd/smd.js +0 -429
  129. package/dist/smd/smd.js.map +0 -1
  130. package/dist/syncer/index.d.ts +0 -2
  131. package/dist/syncer/index.d.ts.map +0 -1
  132. package/dist/syncer/index.js +0 -18
  133. package/dist/syncer/index.js.map +0 -1
  134. package/dist/syncer/syncer.d.ts +0 -108
  135. package/dist/syncer/syncer.d.ts.map +0 -1
  136. package/dist/syncer/syncer.js +0 -1119
  137. package/dist/syncer/syncer.js.map +0 -1
  138. package/dist/templates/base-template.d.ts +0 -13
  139. package/dist/templates/base-template.d.ts.map +0 -1
  140. package/dist/templates/base-template.js +0 -10
  141. package/dist/templates/base-template.js.map +0 -1
  142. package/dist/templates/entity.template.d.ts +0 -17
  143. package/dist/templates/entity.template.d.ts.map +0 -1
  144. package/dist/templates/entity.template.js +0 -78
  145. package/dist/templates/entity.template.js.map +0 -1
  146. package/dist/templates/generated.template.d.ts +0 -27
  147. package/dist/templates/generated.template.d.ts.map +0 -1
  148. package/dist/templates/generated.template.js +0 -239
  149. package/dist/templates/generated.template.js.map +0 -1
  150. package/dist/templates/generated_http.template.d.ts +0 -24
  151. package/dist/templates/generated_http.template.d.ts.map +0 -1
  152. package/dist/templates/generated_http.template.js +0 -133
  153. package/dist/templates/generated_http.template.js.map +0 -1
  154. package/dist/templates/generated_sso.template.d.ts +0 -17
  155. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  156. package/dist/templates/generated_sso.template.js +0 -66
  157. package/dist/templates/generated_sso.template.js.map +0 -1
  158. package/dist/templates/index.d.ts +0 -2
  159. package/dist/templates/index.d.ts.map +0 -1
  160. package/dist/templates/index.js +0 -18
  161. package/dist/templates/index.js.map +0 -1
  162. package/dist/templates/init_enums.template.d.ts +0 -17
  163. package/dist/templates/init_enums.template.d.ts.map +0 -1
  164. package/dist/templates/init_enums.template.js +0 -54
  165. package/dist/templates/init_enums.template.js.map +0 -1
  166. package/dist/templates/init_generated.template.d.ts +0 -17
  167. package/dist/templates/init_generated.template.d.ts.map +0 -1
  168. package/dist/templates/init_generated.template.js +0 -46
  169. package/dist/templates/init_generated.template.js.map +0 -1
  170. package/dist/templates/init_types.template.d.ts +0 -17
  171. package/dist/templates/init_types.template.d.ts.map +0 -1
  172. package/dist/templates/init_types.template.js +0 -37
  173. package/dist/templates/init_types.template.js.map +0 -1
  174. package/dist/templates/model.template.d.ts +0 -17
  175. package/dist/templates/model.template.d.ts.map +0 -1
  176. package/dist/templates/model.template.js +0 -168
  177. package/dist/templates/model.template.js.map +0 -1
  178. package/dist/templates/model_test.template.d.ts +0 -17
  179. package/dist/templates/model_test.template.d.ts.map +0 -1
  180. package/dist/templates/model_test.template.js +0 -34
  181. package/dist/templates/model_test.template.js.map +0 -1
  182. package/dist/templates/service.template.d.ts +0 -28
  183. package/dist/templates/service.template.d.ts.map +0 -1
  184. package/dist/templates/service.template.js +0 -167
  185. package/dist/templates/service.template.js.map +0 -1
  186. package/dist/templates/smd.template.d.ts +0 -17
  187. package/dist/templates/smd.template.d.ts.map +0 -1
  188. package/dist/templates/smd.template.js +0 -49
  189. package/dist/templates/smd.template.js.map +0 -1
  190. package/dist/templates/view_enums_buttonset.template.d.ts +0 -17
  191. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  192. package/dist/templates/view_enums_buttonset.template.js +0 -30
  193. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  194. package/dist/templates/view_enums_dropdown.template.d.ts +0 -18
  195. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  196. package/dist/templates/view_enums_dropdown.template.js +0 -68
  197. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  198. package/dist/templates/view_enums_select.template.d.ts +0 -17
  199. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  200. package/dist/templates/view_enums_select.template.js +0 -54
  201. package/dist/templates/view_enums_select.template.js.map +0 -1
  202. package/dist/templates/view_form.template.d.ts +0 -74
  203. package/dist/templates/view_form.template.d.ts.map +0 -1
  204. package/dist/templates/view_form.template.js +0 -368
  205. package/dist/templates/view_form.template.js.map +0 -1
  206. package/dist/templates/view_id_all_select.template.d.ts +0 -17
  207. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  208. package/dist/templates/view_id_all_select.template.js +0 -30
  209. package/dist/templates/view_id_all_select.template.js.map +0 -1
  210. package/dist/templates/view_id_async_select.template.d.ts +0 -17
  211. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  212. package/dist/templates/view_id_async_select.template.js +0 -104
  213. package/dist/templates/view_id_async_select.template.js.map +0 -1
  214. package/dist/templates/view_list.template.d.ts +0 -86
  215. package/dist/templates/view_list.template.d.ts.map +0 -1
  216. package/dist/templates/view_list.template.js +0 -526
  217. package/dist/templates/view_list.template.js.map +0 -1
  218. package/dist/templates/view_list_columns.template.d.ts +0 -17
  219. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  220. package/dist/templates/view_list_columns.template.js +0 -47
  221. package/dist/templates/view_list_columns.template.js.map +0 -1
  222. package/dist/templates/view_search_input.template.d.ts +0 -17
  223. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  224. package/dist/templates/view_search_input.template.js +0 -63
  225. package/dist/templates/view_search_input.template.js.map +0 -1
  226. package/dist/testing/fixture-manager.d.ts +0 -18
  227. package/dist/testing/fixture-manager.d.ts.map +0 -1
  228. package/dist/testing/fixture-manager.js +0 -238
  229. package/dist/testing/fixture-manager.js.map +0 -1
  230. package/dist/types/smd.types.d.ts +0 -741
  231. package/dist/types/smd.types.d.ts.map +0 -1
  232. package/dist/types/smd.types.js +0 -292
  233. package/dist/types/smd.types.js.map +0 -1
  234. package/dist/types/types.d.ts +0 -721
  235. package/dist/types/types.d.ts.map +0 -1
  236. package/dist/types/types.js +0 -287
  237. package/dist/types/types.js.map +0 -1
  238. package/dist/ui/index.d.ts +0 -4
  239. package/dist/ui/index.d.ts.map +0 -1
  240. package/dist/ui/index.js +0 -14
  241. package/dist/ui/index.js.map +0 -1
  242. package/dist/ui/main.d.ts +0 -4
  243. package/dist/ui/main.d.ts.map +0 -1
  244. package/dist/ui/main.js +0 -15
  245. package/dist/ui/main.js.map +0 -1
  246. package/dist/utils/controller.d.ts +0 -9
  247. package/dist/utils/controller.d.ts.map +0 -1
  248. package/dist/utils/controller.js +0 -36
  249. package/dist/utils/controller.js.map +0 -1
  250. package/dist/utils/lodash-able.d.ts +0 -2
  251. package/dist/utils/lodash-able.d.ts.map +0 -1
  252. package/dist/utils/lodash-able.js +0 -9
  253. package/dist/utils/lodash-able.js.map +0 -1
  254. package/dist/utils/model.d.ts +0 -17
  255. package/dist/utils/model.d.ts.map +0 -1
  256. package/dist/utils/model.js +0 -23
  257. package/dist/utils/model.js.map +0 -1
  258. package/dist/utils/sql-parser.d.ts +0 -4
  259. package/dist/utils/sql-parser.d.ts.map +0 -1
  260. package/dist/utils/sql-parser.js +0 -40
  261. package/dist/utils/sql-parser.js.map +0 -1
  262. package/dist/utils/utils.d.ts +0 -9
  263. package/dist/utils/utils.d.ts.map +0 -1
  264. package/dist/utils/utils.js +0 -100
  265. package/dist/utils/utils.js.map +0 -1
@@ -1,1119 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- var __asyncValues = (this && this.__asyncValues) || function (o) {
35
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
36
- var m = o[Symbol.asyncIterator], i;
37
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
38
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
39
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
40
- };
41
- var __importDefault = (this && this.__importDefault) || function (mod) {
42
- return (mod && mod.__esModule) ? mod : { "default": mod };
43
- };
44
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.Syncer = void 0;
46
- const path_1 = __importStar(require("path"));
47
- const utils_1 = require("../utils/utils");
48
- const fs_extra_1 = __importDefault(require("fs-extra"));
49
- const crypto_1 = __importDefault(require("crypto"));
50
- const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
51
- const lodash_1 = __importDefault(require("lodash"));
52
- const inflection_1 = __importDefault(require("inflection"));
53
- const entity_manager_1 = require("../entity/entity-manager");
54
- const typescript_1 = __importDefault(require("typescript"));
55
- const types_1 = require("../types/types");
56
- const decorators_1 = require("../api/decorators");
57
- const zod_1 = require("zod");
58
- const chalk_1 = __importDefault(require("chalk"));
59
- const types_2 = require("../types/types");
60
- const so_exceptions_1 = require("../exceptions/so-exceptions");
61
- const lodash_able_1 = require("../utils/lodash-able");
62
- const code_converters_1 = require("../api/code-converters");
63
- const generated_template_1 = require("../templates/generated.template");
64
- const init_types_template_1 = require("../templates/init_types.template");
65
- const entity_template_1 = require("../templates/entity.template");
66
- const model_template_1 = require("../templates/model.template");
67
- const model_test_template_1 = require("../templates/model_test.template");
68
- const service_template_1 = require("../templates/service.template");
69
- const view_form_template_1 = require("../templates/view_form.template");
70
- const view_list_template_1 = require("../templates/view_list.template");
71
- const prettier_1 = __importDefault(require("prettier"));
72
- const view_id_all_select_template_1 = require("../templates/view_id_all_select.template");
73
- const view_id_async_select_template_1 = require("../templates/view_id_async_select.template");
74
- const view_enums_dropdown_template_1 = require("../templates/view_enums_dropdown.template");
75
- const view_enums_select_template_1 = require("../templates/view_enums_select.template");
76
- const view_enums_buttonset_template_1 = require("../templates/view_enums_buttonset.template");
77
- const view_search_input_template_1 = require("../templates/view_search_input.template");
78
- const view_list_columns_template_1 = require("../templates/view_list_columns.template");
79
- const generated_http_template_1 = require("../templates/generated_http.template");
80
- const sonamu_1 = require("../api/sonamu");
81
- const child_process_1 = require("child_process");
82
- const generated_sso_template_1 = require("../templates/generated_sso.template");
83
- class Syncer {
84
- get checksumsPath() {
85
- return path_1.default.join(sonamu_1.Sonamu.apiRootPath, "/.so-checksum");
86
- }
87
- constructor() {
88
- this.apis = [];
89
- this.types = {};
90
- this.models = {};
91
- this.resolveParamDec = (paramDec, index = 0) => {
92
- const name = paramDec.name;
93
- const type = this.resolveTypeNode(paramDec.type);
94
- if (name === undefined) {
95
- console.log({ name, type, paramDec });
96
- }
97
- return {
98
- name: name.escapedText ? name.escapedText.toString() : `nonameAt${index}`,
99
- type,
100
- optional: paramDec.optional === true,
101
- defaultDef: paramDec === null || paramDec === void 0 ? void 0 : paramDec.defaultDef,
102
- };
103
- };
104
- }
105
- sync() {
106
- var _a, _b, _c, _d;
107
- return __awaiter(this, void 0, void 0, function* () {
108
- const { targets } = sonamu_1.Sonamu.config.sync;
109
- // 트리거와 무관하게 shared 분배
110
- yield Promise.all(targets.map((target) => __awaiter(this, void 0, void 0, function* () {
111
- const srcCodePath = path_1.default
112
- .join(__dirname, `../shared/${target}.shared.ts.txt`)
113
- .replace("/dist/", "/src/");
114
- if (!fs_extra_1.default.existsSync(srcCodePath)) {
115
- return;
116
- }
117
- const dstCodePath = path_1.default.join(sonamu_1.Sonamu.appRootPath, target, "src/services/sonamu.shared.ts");
118
- const srcChecksum = yield this.getChecksumOfFile(srcCodePath);
119
- const dstChecksum = yield (() => __awaiter(this, void 0, void 0, function* () {
120
- if (fs_extra_1.default.existsSync(dstCodePath) === false) {
121
- return "";
122
- }
123
- return this.getChecksumOfFile(dstCodePath);
124
- }))();
125
- if (srcChecksum === dstChecksum) {
126
- return;
127
- }
128
- fs_extra_1.default.writeFileSync(dstCodePath, fs_extra_1.default.readFileSync(srcCodePath));
129
- })));
130
- // 현재 checksums
131
- let currentChecksums = yield this.getCurrentChecksums();
132
- // 이전 checksums
133
- const previousChecksums = yield this.getPreviousChecksums();
134
- // 비교
135
- const isSame = (0, fast_deep_equal_1.default)(currentChecksums, previousChecksums);
136
- if (isSame) {
137
- const msg = "Every files are synced!";
138
- const margin = (process.stdout.columns - msg.length) / 2;
139
- console.log(chalk_1.default.black.bgGreen(" ".repeat(margin) + msg + " ".repeat(margin)));
140
- return;
141
- }
142
- // 변경된 파일 찾기
143
- const diff = lodash_1.default.differenceWith(currentChecksums, previousChecksums, lodash_1.default.isEqual);
144
- const diffFiles = diff.map((r) => r.path);
145
- console.log("Changed Files: ", diffFiles);
146
- // 다른 부분 찾아 액션
147
- const diffGroups = lodash_1.default.groupBy(diffFiles, (r) => {
148
- const matched = r.match(/\.(model|types|functions|entity|generated)\.[tj]s/);
149
- return matched[1];
150
- });
151
- // 변경된 파일들을 타입별로 분리하여 각 타입별 액션 처리
152
- const diffTypes = Object.keys(diffGroups);
153
- // 트리거: entity, types
154
- // 액션: 스키마 생성
155
- if (diffTypes.includes("entity") || diffTypes.includes("types")) {
156
- console.log("// 액션: 스키마 생성");
157
- yield this.actionGenerateSchemas();
158
- // generated 싱크까지 동시에 처리 후 체크섬 갱신
159
- diffGroups["generated"] = lodash_1.default.uniq([
160
- ...((_a = diffGroups["generated"]) !== null && _a !== void 0 ? _a : []),
161
- "/src/application/sonamu.generated.ts",
162
- ]);
163
- diffTypes.push("generated");
164
- currentChecksums = yield this.getCurrentChecksums();
165
- }
166
- // 트리거: types, enums, generated 변경시
167
- // 액션: 파일 싱크 types, enums, generated
168
- if (diffTypes.includes("types") ||
169
- diffTypes.includes("functions") ||
170
- diffTypes.includes("generated")) {
171
- console.log("// 액션: 파일 싱크 types / functions / generated");
172
- const tsPaths = lodash_1.default.uniq([
173
- ...((_b = diffGroups["types"]) !== null && _b !== void 0 ? _b : []),
174
- ...((_c = diffGroups["functions"]) !== null && _c !== void 0 ? _c : []),
175
- ...((_d = diffGroups["generated"]) !== null && _d !== void 0 ? _d : []),
176
- ].map((p) => p.replace("/dist/", "/src/").replace(".js", ".ts")));
177
- yield this.actionSyncFilesToTargets(tsPaths);
178
- }
179
- // 트리거: model
180
- if (diffTypes.includes("model")) {
181
- const entityIds = this.getEntityIdFromPath(diffGroups["model"]);
182
- console.log("// 액션: 서비스 생성");
183
- yield this.actionGenerateServices(entityIds);
184
- console.log("// 액션: HTTP파일 생성");
185
- yield this.actionGenerateHttps(entityIds);
186
- }
187
- // 저장
188
- yield this.saveChecksums(currentChecksums);
189
- });
190
- }
191
- getEntityIdFromPath(filePaths) {
192
- return lodash_1.default.uniq(filePaths.map((p) => {
193
- const matched = p.match(/application\/(.+)\//);
194
- return inflection_1.default.camelize(matched[1].replace(/\-/g, "_"));
195
- }));
196
- }
197
- actionGenerateSchemas() {
198
- return __awaiter(this, void 0, void 0, function* () {
199
- return (yield Promise.all([
200
- this.generateTemplate("generated_sso", {}, { overwrite: true }),
201
- this.generateTemplate("generated", {}, { overwrite: true }),
202
- ]))
203
- .flat()
204
- .flat();
205
- });
206
- }
207
- actionGenerateServices(entityIds) {
208
- return __awaiter(this, void 0, void 0, function* () {
209
- return (yield Promise.all(entityIds.map((entityId) => __awaiter(this, void 0, void 0, function* () {
210
- return this.generateTemplate("service", {
211
- entityId,
212
- }, {
213
- overwrite: true,
214
- });
215
- }))))
216
- .flat()
217
- .flat();
218
- });
219
- }
220
- actionGenerateHttps(entityIds) {
221
- return __awaiter(this, void 0, void 0, function* () {
222
- return (yield Promise.all(entityIds.map((entityId) => __awaiter(this, void 0, void 0, function* () {
223
- return this.generateTemplate("generated_http", {
224
- entityId,
225
- }, {
226
- overwrite: true,
227
- });
228
- }))))
229
- .flat()
230
- .flat();
231
- });
232
- }
233
- copyFileWithReplaceCoreToShared(fromPath, toPath) {
234
- return __awaiter(this, void 0, void 0, function* () {
235
- if (!fs_extra_1.default.existsSync(fromPath)) {
236
- return;
237
- }
238
- const oldFileContent = fs_extra_1.default.readFileSync(fromPath).toString();
239
- const newFileContent = (() => {
240
- const nfc = oldFileContent.replace(/from "sonamu"/g, `from "src/services/sonamu.shared"`);
241
- if (toPath.includes("/web/")) {
242
- return nfc.replace(/from "lodash";/g, `from "lodash-es";`);
243
- }
244
- else {
245
- return nfc;
246
- }
247
- })();
248
- return fs_extra_1.default.writeFile(toPath, newFileContent);
249
- });
250
- }
251
- actionSyncFilesToTargets(tsPaths) {
252
- return __awaiter(this, void 0, void 0, function* () {
253
- const { targets } = sonamu_1.Sonamu.config.sync;
254
- const { dir: apiDir } = sonamu_1.Sonamu.config.api;
255
- const { appRootPath } = sonamu_1.Sonamu;
256
- return (yield Promise.all(targets.map((target) => __awaiter(this, void 0, void 0, function* () {
257
- return Promise.all(tsPaths.map((src) => __awaiter(this, void 0, void 0, function* () {
258
- const realSrc = sonamu_1.Sonamu.apiRootPath + src;
259
- const dst = realSrc
260
- .replace(`/${apiDir}/`, `/${target}/`)
261
- .replace("/application/", "/services/");
262
- const dir = (0, path_1.dirname)(dst);
263
- if (!fs_extra_1.default.existsSync(dir)) {
264
- fs_extra_1.default.mkdirSync(dir, { recursive: true });
265
- }
266
- console.log("COPIED ", chalk_1.default.blue(dst.replace(appRootPath + "/", "")));
267
- yield this.copyFileWithReplaceCoreToShared(realSrc, dst);
268
- return dst;
269
- })));
270
- })))).flat();
271
- });
272
- }
273
- getCurrentChecksums() {
274
- return __awaiter(this, void 0, void 0, function* () {
275
- const PatternGroup = {
276
- /* 원본 체크 */
277
- entity: sonamu_1.Sonamu.apiRootPath + "/src/application/**/*.entity.json",
278
- types: sonamu_1.Sonamu.apiRootPath + "/src/application/**/*.types.ts",
279
- generated: sonamu_1.Sonamu.apiRootPath + "/src/application/sonamu.generated.ts",
280
- functions: sonamu_1.Sonamu.apiRootPath + "/src/application/**/*.functions.ts",
281
- /* compiled-JS 체크 */
282
- model: sonamu_1.Sonamu.apiRootPath + "/dist/application/**/*.model.js",
283
- };
284
- const filePaths = (yield Promise.all(Object.entries(PatternGroup).map(([_fileType, pattern]) => __awaiter(this, void 0, void 0, function* () {
285
- return (0, utils_1.globAsync)(pattern);
286
- }))))
287
- .flat()
288
- .sort();
289
- const fileChecksums = yield Promise.all(filePaths.map((filePath) => __awaiter(this, void 0, void 0, function* () {
290
- return {
291
- path: filePath.substring(sonamu_1.Sonamu.apiRootPath.length),
292
- checksum: yield this.getChecksumOfFile(filePath),
293
- };
294
- })));
295
- return fileChecksums;
296
- });
297
- }
298
- getPreviousChecksums() {
299
- return __awaiter(this, void 0, void 0, function* () {
300
- if (fs_extra_1.default.existsSync(this.checksumsPath) === false) {
301
- return [];
302
- }
303
- const previousChecksums = (yield fs_extra_1.default.readJSON(this.checksumsPath));
304
- return previousChecksums;
305
- });
306
- }
307
- saveChecksums(checksums) {
308
- return __awaiter(this, void 0, void 0, function* () {
309
- yield fs_extra_1.default.writeJSON(this.checksumsPath, checksums, {
310
- spaces: 2,
311
- });
312
- console.debug("checksum saved", this.checksumsPath);
313
- });
314
- }
315
- getChecksumOfFile(filePath) {
316
- return __awaiter(this, void 0, void 0, function* () {
317
- return new Promise((resolve, reject) => {
318
- const hash = crypto_1.default.createHash("sha1");
319
- const input = fs_extra_1.default.createReadStream(filePath);
320
- input.on("error", reject);
321
- input.on("data", function (chunk) {
322
- hash.update(chunk);
323
- });
324
- input.on("close", function () {
325
- resolve(hash.digest("hex"));
326
- });
327
- });
328
- });
329
- }
330
- readApisFromFile(filePath) {
331
- return __awaiter(this, void 0, void 0, function* () {
332
- const sourceFile = typescript_1.default.createSourceFile(filePath, fs_extra_1.default.readFileSync(filePath).toString(), typescript_1.default.ScriptTarget.Latest);
333
- const methods = [];
334
- let modelName = "UnknownModel";
335
- let methodName = "unknownMethod";
336
- const visitor = (node) => {
337
- var _a;
338
- if (typescript_1.default.isClassDeclaration(node)) {
339
- if (node.name && typescript_1.default.isIdentifier(node.name)) {
340
- modelName = node.name.escapedText.toString().replace(/Class$/, "");
341
- }
342
- }
343
- if (typescript_1.default.isMethodDeclaration(node)) {
344
- if (typescript_1.default.isIdentifier(node.name)) {
345
- methodName = node.name.escapedText.toString();
346
- }
347
- const typeParameters = ((_a = node.typeParameters) !== null && _a !== void 0 ? _a : []).map((typeParam) => {
348
- const tp = typeParam;
349
- return {
350
- t: "type-param",
351
- id: tp.name.escapedText.toString(),
352
- constraint: tp.constraint
353
- ? this.resolveTypeNode(tp.constraint)
354
- : undefined,
355
- };
356
- });
357
- const parameters = node.parameters.map((paramDec, index) => {
358
- const defaultDef = this.printNode(paramDec.initializer, sourceFile);
359
- // 기본값이 있는 경우 paramDec.type가 undefined로 나옴
360
- return this.resolveParamDec({
361
- name: paramDec.name,
362
- type: paramDec.type,
363
- optional: paramDec.questionToken !== undefined ||
364
- paramDec.initializer !== undefined,
365
- defaultDef,
366
- }, index);
367
- });
368
- if (node.type === undefined) {
369
- throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
370
- }
371
- const returnType = this.resolveTypeNode(node.type);
372
- methods.push({
373
- modelName,
374
- methodName,
375
- typeParameters,
376
- parameters,
377
- returnType,
378
- });
379
- }
380
- typescript_1.default.forEachChild(node, visitor);
381
- };
382
- visitor(sourceFile);
383
- if (methods.length === 0) {
384
- return [];
385
- }
386
- // 현재 파일의 등록된 API 필터
387
- const currentModelApis = decorators_1.registeredApis.filter((api) => {
388
- return methods.find((method) => method.modelName === api.modelName &&
389
- method.methodName === api.methodName);
390
- });
391
- // 등록된 API에 현재 메소드 타입 정보 확장
392
- const extendedApis = currentModelApis.map((api) => {
393
- const foundMethod = methods.find((method) => method.modelName === api.modelName &&
394
- method.methodName === api.methodName);
395
- return Object.assign(Object.assign({}, api), { typeParameters: foundMethod.typeParameters, parameters: foundMethod.parameters, returnType: foundMethod.returnType });
396
- });
397
- return extendedApis;
398
- });
399
- }
400
- resolveTypeNode(typeNode) {
401
- var _a;
402
- switch (typeNode === null || typeNode === void 0 ? void 0 : typeNode.kind) {
403
- case typescript_1.default.SyntaxKind.AnyKeyword:
404
- return "any";
405
- case typescript_1.default.SyntaxKind.UnknownKeyword:
406
- return "unknown";
407
- case typescript_1.default.SyntaxKind.StringKeyword:
408
- return "string";
409
- case typescript_1.default.SyntaxKind.NumberKeyword:
410
- return "number";
411
- case typescript_1.default.SyntaxKind.BooleanKeyword:
412
- return "boolean";
413
- case typescript_1.default.SyntaxKind.UndefinedKeyword:
414
- return "undefined";
415
- case typescript_1.default.SyntaxKind.NullKeyword:
416
- return "null";
417
- case typescript_1.default.SyntaxKind.VoidKeyword:
418
- return "void";
419
- case typescript_1.default.SyntaxKind.LiteralType:
420
- const literal = typeNode.literal;
421
- if (typescript_1.default.isStringLiteral(literal)) {
422
- return {
423
- t: "string-literal",
424
- value: literal.text,
425
- };
426
- }
427
- else if (typescript_1.default.isNumericLiteral(literal)) {
428
- return {
429
- t: "numeric-literal",
430
- value: Number(literal.text),
431
- };
432
- }
433
- else {
434
- if (literal.kind === typescript_1.default.SyntaxKind.NullKeyword) {
435
- return "null";
436
- }
437
- else if (literal.kind === typescript_1.default.SyntaxKind.UndefinedKeyword) {
438
- return "undefined";
439
- }
440
- else if (literal.kind === typescript_1.default.SyntaxKind.TrueKeyword) {
441
- return "true";
442
- }
443
- else if (literal.kind === typescript_1.default.SyntaxKind.FalseKeyword) {
444
- return "false";
445
- }
446
- throw new Error("알 수 없는 리터럴");
447
- }
448
- case typescript_1.default.SyntaxKind.ArrayType:
449
- const arrNode = typeNode;
450
- return {
451
- t: "array",
452
- elementsType: this.resolveTypeNode(arrNode.elementType),
453
- };
454
- case typescript_1.default.SyntaxKind.TypeLiteral:
455
- const literalNode = typeNode;
456
- return {
457
- t: "object",
458
- props: literalNode.members.map((member) => {
459
- if (typescript_1.default.isIndexSignatureDeclaration(member)) {
460
- const res = this.resolveParamDec({
461
- name: member.parameters[0].name,
462
- type: member.parameters[0].type,
463
- });
464
- return this.resolveParamDec({
465
- name: {
466
- escapedText: `[${res.name}${res.optional ? "?" : ""}: ${res.type}]`,
467
- },
468
- type: member.type,
469
- });
470
- }
471
- else {
472
- return this.resolveParamDec({
473
- name: member.name,
474
- type: member.type,
475
- optional: member.questionToken !== undefined,
476
- });
477
- }
478
- }),
479
- };
480
- case typescript_1.default.SyntaxKind.TypeReference:
481
- return {
482
- t: "ref",
483
- id: typeNode.typeName.escapedText.toString(),
484
- args: (_a = typeNode.typeArguments) === null || _a === void 0 ? void 0 : _a.map((typeArg) => this.resolveTypeNode(typeArg)),
485
- };
486
- case typescript_1.default.SyntaxKind.UnionType:
487
- return {
488
- t: "union",
489
- types: typeNode.types.map((type) => this.resolveTypeNode(type)),
490
- };
491
- case typescript_1.default.SyntaxKind.IntersectionType:
492
- return {
493
- t: "intersection",
494
- types: typeNode.types.map((type) => this.resolveTypeNode(type)),
495
- };
496
- case typescript_1.default.SyntaxKind.IndexedAccessType:
497
- return {
498
- t: "indexed-access",
499
- object: this.resolveTypeNode(typeNode.objectType),
500
- index: this.resolveTypeNode(typeNode.indexType),
501
- };
502
- case typescript_1.default.SyntaxKind.TupleType:
503
- if (typescript_1.default.isTupleTypeNode(typeNode)) {
504
- return {
505
- t: "tuple-type",
506
- elements: typeNode.elements.map((elem) => this.resolveTypeNode(elem)),
507
- };
508
- }
509
- break;
510
- case undefined:
511
- throw new Error(`typeNode undefined`);
512
- }
513
- console.debug(typeNode);
514
- throw new Error(`알 수 없는 SyntaxKind ${typeNode.kind}`);
515
- }
516
- printNode(node, sourceFile) {
517
- if (node === undefined) {
518
- return undefined;
519
- }
520
- const printer = typescript_1.default.createPrinter({ newLine: typescript_1.default.NewLineKind.LineFeed });
521
- return printer.printNode(typescript_1.default.EmitHint.Unspecified, node, sourceFile);
522
- }
523
- autoloadApis() {
524
- return __awaiter(this, void 0, void 0, function* () {
525
- const pathPattern = path_1.default.join(sonamu_1.Sonamu.apiRootPath, "/src/application/**/*.model.ts");
526
- // console.debug(chalk.yellow(`autoload:APIs @ ${pathPattern}`));
527
- const filePaths = yield (0, utils_1.globAsync)(pathPattern);
528
- const result = yield Promise.all(filePaths.map((filePath) => this.readApisFromFile(filePath)));
529
- this.apis = result.flat();
530
- return this.apis;
531
- });
532
- }
533
- autoloadModels() {
534
- return __awaiter(this, void 0, void 0, function* () {
535
- const pathPattern = path_1.default.join(sonamu_1.Sonamu.apiRootPath, "dist/application/**/*.model.js");
536
- // console.debug(chalk.yellow(`autoload:models @ ${pathPattern}`));
537
- const filePaths = (yield (0, utils_1.globAsync)(pathPattern)).filter((path) => {
538
- // src 디렉터리 내에 있는 해당 파일이 존재할 경우에만 로드
539
- // 삭제된 파일이지만 dist에 남아있는 경우 BaseSchema undefined 에러 방지
540
- const srcPath = path.replace("/dist/", "/src/").replace(".js", ".ts");
541
- return fs_extra_1.default.existsSync(srcPath);
542
- });
543
- const modules = yield (0, utils_1.importMultiple)(filePaths);
544
- const functions = modules
545
- .map(({ imported }) => Object.entries(imported))
546
- .flat();
547
- this.models = Object.fromEntries(functions.filter(([name]) => name.endsWith("Model")));
548
- return this.models;
549
- });
550
- }
551
- autoloadTypes(doRefresh = false) {
552
- return __awaiter(this, void 0, void 0, function* () {
553
- if (!doRefresh && Object.keys(this.types).length > 0) {
554
- return this.types;
555
- }
556
- const pathPatterns = [
557
- path_1.default.join(sonamu_1.Sonamu.apiRootPath, "/dist/application/**/*.types.js"),
558
- path_1.default.join(sonamu_1.Sonamu.apiRootPath, "/dist/application/**/*.generated.js"),
559
- ];
560
- // console.debug(chalk.magenta(`autoload:types @ ${pathPatterns.join("\n")}`));
561
- const filePaths = (yield Promise.all(pathPatterns.map((pattern) => (0, utils_1.globAsync)(pattern))))
562
- .flat()
563
- .filter((path) => {
564
- // src 디렉터리 내에 있는 해당 파일이 존재할 경우에만 로드
565
- // 삭제된 파일이지만 dist에 남아있는 경우 BaseSchema undefined 에러 방지
566
- const srcPath = path.replace("/dist/", "/src/").replace(".js", ".ts");
567
- return fs_extra_1.default.existsSync(srcPath);
568
- });
569
- const modules = yield (0, utils_1.importMultiple)(filePaths, doRefresh);
570
- const functions = modules
571
- .map(({ imported }) => Object.entries(imported))
572
- .flat();
573
- this.types = Object.fromEntries(functions.filter(([, f]) => f instanceof zod_1.z.ZodType));
574
- return this.types;
575
- });
576
- }
577
- getTemplate(key) {
578
- if (key === "entity") {
579
- return new entity_template_1.Template__entity();
580
- }
581
- else if (key === "init_types") {
582
- return new init_types_template_1.Template__init_types();
583
- }
584
- else if (key === "generated") {
585
- return new generated_template_1.Template__generated();
586
- }
587
- else if (key === "generated_sso") {
588
- return new generated_sso_template_1.Template__generated_sso();
589
- }
590
- else if (key === "generated_http") {
591
- return new generated_http_template_1.Template__generated_http();
592
- }
593
- else if (key === "model") {
594
- return new model_template_1.Template__model();
595
- }
596
- else if (key === "model_test") {
597
- return new model_test_template_1.Template__model_test();
598
- }
599
- else if (key === "service") {
600
- return new service_template_1.Template__service();
601
- }
602
- else if (key === "view_list") {
603
- return new view_list_template_1.Template__view_list();
604
- }
605
- else if (key === "view_list_columns") {
606
- return new view_list_columns_template_1.Template__view_list_columns();
607
- }
608
- else if (key === "view_search_input") {
609
- return new view_search_input_template_1.Template__view_search_input();
610
- }
611
- else if (key === "view_form") {
612
- return new view_form_template_1.Template__view_form();
613
- }
614
- else if (key === "view_id_all_select") {
615
- return new view_id_all_select_template_1.Template__view_id_all_select();
616
- }
617
- else if (key === "view_id_async_select") {
618
- return new view_id_async_select_template_1.Template__view_id_async_select();
619
- }
620
- else if (key === "view_enums_select") {
621
- return new view_enums_select_template_1.Template__view_enums_select();
622
- }
623
- else if (key === "view_enums_dropdown") {
624
- return new view_enums_dropdown_template_1.Template__view_enums_dropdown();
625
- }
626
- else if (key === "view_enums_buttonset") {
627
- return new view_enums_buttonset_template_1.Template__view_enums_buttonset();
628
- }
629
- else {
630
- throw new so_exceptions_1.BadRequestException(`잘못된 템플릿 키 ${key}`);
631
- }
632
- }
633
- renderTemplate(key, options) {
634
- return __awaiter(this, void 0, void 0, function* () {
635
- const template = this.getTemplate(key);
636
- let extra = [];
637
- if (["service", "generated_http", "model", "view_list", "view_form"].includes(key)) {
638
- const entityId = options.entityId;
639
- if (key === "service" || key === "generated_http") {
640
- // service 필요 정보 (API 리스트)
641
- const entity = entity_manager_1.EntityManager.get(entityId);
642
- const modelTsPath = `${path_1.default.join(sonamu_1.Sonamu.apiRootPath, "/src/application")}/${entity.names.fs}/${entity.names.fs}.model.ts`;
643
- extra = [yield this.readApisFromFile(modelTsPath)];
644
- }
645
- else if (key === "view_list" || key === "model") {
646
- // view_list 필요 정보 (컬럼 노드, 리스트파라미터 노드)
647
- const columnsNode = yield this.getColumnsNode(entityId, "A");
648
- const listParamsZodType = yield this.getZodTypeById(`${entityId}ListParams`);
649
- const listParamsNode = this.zodTypeToRenderingNode(listParamsZodType);
650
- extra = [columnsNode, listParamsNode];
651
- }
652
- else if (key === "view_form") {
653
- // view_form 필요 정보 (세이브파라미터 노드)
654
- const saveParamsZodType = yield this.getZodTypeById(`${entityId}SaveParams`);
655
- const saveParamsNode = this.zodTypeToRenderingNode(saveParamsZodType);
656
- extra = [saveParamsNode];
657
- }
658
- }
659
- const rendered = yield template.render(options, ...extra);
660
- const resolved = yield this.resolveRenderedTemplate(key, rendered);
661
- let preTemplateResolved = [];
662
- if (rendered.preTemplates) {
663
- preTemplateResolved = (yield Promise.all(rendered.preTemplates.map(({ key, options }) => {
664
- return this.renderTemplate(key, options);
665
- }))).flat();
666
- }
667
- return [resolved, ...preTemplateResolved];
668
- });
669
- }
670
- resolveRenderedTemplate(key, result) {
671
- return __awaiter(this, void 0, void 0, function* () {
672
- const { target, path: filePath, body, importKeys, customHeaders } = result;
673
- // import 할 대상의 대상 path 추출
674
- const importDefs = importKeys
675
- .reduce((r, importKey) => {
676
- const modulePath = entity_manager_1.EntityManager.getModulePath(importKey);
677
- let importPath = modulePath;
678
- if (modulePath.includes("/") || modulePath.includes(".")) {
679
- importPath = (0, lodash_able_1.wrapIf)(path_1.default.relative(path_1.default.dirname(filePath), modulePath), (p) => [p.startsWith(".") === false, "./" + p]);
680
- }
681
- // 같은 파일에서 import 하는 경우 keys 로 나열 처리
682
- const existsOne = r.find((importDef) => importDef.from === importPath);
683
- if (existsOne) {
684
- existsOne.keys = lodash_1.default.uniq(existsOne.keys.concat(importKey));
685
- }
686
- else {
687
- r.push({
688
- keys: [importKey],
689
- from: importPath,
690
- });
691
- }
692
- return r;
693
- }, [])
694
- // 셀프 참조 방지
695
- .filter((importDef) => filePath.endsWith(importDef.from.replace("./", "") + ".ts") === false);
696
- // 커스텀 헤더 포함하여 헤더 생성
697
- const header = [
698
- ...(customHeaders !== null && customHeaders !== void 0 ? customHeaders : []),
699
- ...importDefs.map((importDef) => `import { ${importDef.keys.join(", ")} } from '${importDef.from}'`),
700
- ].join("\n");
701
- const formatted = yield (() => __awaiter(this, void 0, void 0, function* () {
702
- if (key === "generated_http") {
703
- return [header, body].join("\n\n");
704
- }
705
- else {
706
- return prettier_1.default.format([header, body].join("\n\n"), {
707
- parser: key === "entity" ? "json" : "typescript",
708
- });
709
- }
710
- }))();
711
- return {
712
- path: target + "/" + filePath,
713
- code: formatted,
714
- };
715
- });
716
- }
717
- writeCodeToPath(pathAndCode) {
718
- return __awaiter(this, void 0, void 0, function* () {
719
- const { targets } = sonamu_1.Sonamu.config.sync;
720
- const { appRootPath } = sonamu_1.Sonamu;
721
- const filePath = `${sonamu_1.Sonamu.appRootPath}/${pathAndCode.path}`;
722
- const dstFilePaths = lodash_1.default.uniq(targets.map((target) => filePath.replace("/:target/", `/${target}/`)));
723
- return yield Promise.all(dstFilePaths.map((dstFilePath) => __awaiter(this, void 0, void 0, function* () {
724
- const dir = path_1.default.dirname(dstFilePath);
725
- if (fs_extra_1.default.existsSync(dir) === false) {
726
- fs_extra_1.default.mkdirSync(dir, { recursive: true });
727
- }
728
- fs_extra_1.default.writeFileSync(dstFilePath, pathAndCode.code);
729
- console.log("GENERATED ", chalk_1.default.blue(dstFilePath.replace(appRootPath + "/", "")));
730
- return dstFilePath;
731
- })));
732
- });
733
- }
734
- generateTemplate(key, templateOptions, _generateOptions) {
735
- return __awaiter(this, void 0, void 0, function* () {
736
- const generateOptions = Object.assign({ overwrite: false }, _generateOptions);
737
- // 키 children
738
- const keys = [key];
739
- // 템플릿 렌더
740
- const pathAndCodes = (yield Promise.all(keys.map((key) => __awaiter(this, void 0, void 0, function* () {
741
- return yield this.renderTemplate(key, templateOptions);
742
- })))).flat();
743
- const filteredPathAndCodes = (() => {
744
- if (generateOptions.overwrite === true) {
745
- return pathAndCodes;
746
- }
747
- else {
748
- return pathAndCodes.filter((pathAndCode) => {
749
- const { targets } = sonamu_1.Sonamu.config.sync;
750
- const filePath = `${sonamu_1.Sonamu.appRootPath}/${pathAndCode.path}`;
751
- const dstFilePaths = targets.map((target) => filePath.replace("/:target/", `/${target}/`));
752
- return dstFilePaths.every((dstPath) => fs_extra_1.default.existsSync(dstPath) === false);
753
- });
754
- }
755
- })();
756
- if (filteredPathAndCodes.length === 0) {
757
- throw new so_exceptions_1.AlreadyProcessedException("이미 경로에 모든 파일이 존재합니다.");
758
- }
759
- return Promise.all(filteredPathAndCodes.map((pathAndCode) => this.writeCodeToPath(pathAndCode)));
760
- });
761
- }
762
- checkExistsGenCode(entityId, templateKey, enumId) {
763
- const { target, path: genPath } = this.getTemplate(templateKey).getTargetAndPath(entity_manager_1.EntityManager.getNamesFromId(entityId), enumId);
764
- const fullPath = path_1.default.join(sonamu_1.Sonamu.appRootPath, target, genPath);
765
- const subPath = path_1.default.join(target, genPath);
766
- return {
767
- subPath,
768
- fullPath,
769
- isExists: fs_extra_1.default.existsSync(fullPath),
770
- };
771
- }
772
- checkExists(entityId, enums) {
773
- const keys = types_2.TemplateKey.options;
774
- const names = entity_manager_1.EntityManager.getNamesFromId(entityId);
775
- const enumsKeys = Object.keys(enums).filter((name) => name !== names.constant);
776
- return keys.reduce((result, key) => {
777
- const tpl = this.getTemplate(key);
778
- if (key.startsWith("view_enums")) {
779
- enumsKeys.map((componentId) => {
780
- const { target, path: p } = tpl.getTargetAndPath(names, componentId);
781
- result[`${key}__${componentId}`] = fs_extra_1.default.existsSync(path_1.default.join(sonamu_1.Sonamu.appRootPath, target, p));
782
- });
783
- return result;
784
- }
785
- const { target, path: p } = tpl.getTargetAndPath(names);
786
- const { targets } = sonamu_1.Sonamu.config.sync;
787
- if (target.includes(":target")) {
788
- targets.map((t) => {
789
- result[`${key}__${t}`] = fs_extra_1.default.existsSync(path_1.default.join(sonamu_1.Sonamu.appRootPath, target.replace(":target", t), p));
790
- });
791
- }
792
- else {
793
- result[key] = fs_extra_1.default.existsSync(path_1.default.join(sonamu_1.Sonamu.appRootPath, target, p));
794
- }
795
- return result;
796
- }, {});
797
- }
798
- getZodTypeById(zodTypeId) {
799
- return __awaiter(this, void 0, void 0, function* () {
800
- const modulePath = entity_manager_1.EntityManager.getModulePath(zodTypeId);
801
- const moduleAbsPath = path_1.default.join(sonamu_1.Sonamu.apiRootPath, "dist", "application", modulePath + ".js");
802
- const importPath = "./" + path_1.default.relative(__dirname, moduleAbsPath);
803
- const imported = yield Promise.resolve(`${importPath}`).then(s => __importStar(require(s)));
804
- if (!imported[zodTypeId]) {
805
- throw new Error(`존재하지 않는 zodTypeId ${zodTypeId}`);
806
- }
807
- return imported[zodTypeId].describe(zodTypeId);
808
- });
809
- }
810
- propNodeToZodType(propNode) {
811
- var _a;
812
- return __awaiter(this, void 0, void 0, function* () {
813
- if (propNode.nodeType === "plain") {
814
- return this.propToZodType(propNode.prop);
815
- }
816
- else if (propNode.nodeType === "array") {
817
- if (propNode.prop === undefined) {
818
- throw new Error();
819
- }
820
- else if (propNode.children.length > 0) {
821
- return (yield this.propNodeToZodType(Object.assign(Object.assign({}, propNode), { nodeType: "object" }))).array();
822
- }
823
- else {
824
- const innerType = yield this.propToZodType(propNode.prop);
825
- if (propNode.prop.nullable === true) {
826
- return zod_1.z.array(innerType).nullable();
827
- }
828
- else {
829
- return zod_1.z.array(innerType);
830
- }
831
- }
832
- }
833
- else if (propNode.nodeType === "object") {
834
- const obj = yield propNode.children.reduce((promise, childPropNode) => __awaiter(this, void 0, void 0, function* () {
835
- const result = yield promise;
836
- result[childPropNode.prop.name] =
837
- yield this.propNodeToZodType(childPropNode);
838
- return result;
839
- }), {});
840
- if (((_a = propNode.prop) === null || _a === void 0 ? void 0 : _a.nullable) === true) {
841
- return zod_1.z.object(obj).nullable();
842
- }
843
- else {
844
- return zod_1.z.object(obj);
845
- }
846
- }
847
- else {
848
- throw Error;
849
- }
850
- });
851
- }
852
- propToZodType(prop) {
853
- return __awaiter(this, void 0, void 0, function* () {
854
- let zodType = zod_1.z.unknown();
855
- if ((0, types_1.isIntegerProp)(prop)) {
856
- zodType = zod_1.z.number().int();
857
- }
858
- else if ((0, types_1.isBigIntegerProp)(prop)) {
859
- zodType = zod_1.z.bigint();
860
- }
861
- else if ((0, types_1.isTextProp)(prop)) {
862
- zodType = zod_1.z.string().max((0, code_converters_1.getTextTypeLength)(prop.textType));
863
- }
864
- else if ((0, types_1.isEnumProp)(prop)) {
865
- zodType = yield this.getZodTypeById(prop.id);
866
- }
867
- else if ((0, types_1.isStringProp)(prop)) {
868
- zodType = zod_1.z.string().max(prop.length);
869
- }
870
- else if ((0, types_1.isFloatProp)(prop) || (0, types_1.isDoubleProp)(prop)) {
871
- zodType = zod_1.z.number();
872
- }
873
- else if ((0, types_1.isDecimalProp)(prop)) {
874
- zodType = zod_1.z.string();
875
- }
876
- else if ((0, types_1.isBooleanProp)(prop)) {
877
- zodType = zod_1.z.boolean();
878
- }
879
- else if ((0, types_1.isDateProp)(prop)) {
880
- zodType = zod_1.z.string().length(10);
881
- }
882
- else if ((0, types_1.isTimeProp)(prop)) {
883
- zodType = zod_1.z.string().length(8);
884
- }
885
- else if ((0, types_1.isDateTimeProp)(prop)) {
886
- zodType = types_1.SQLDateTimeString;
887
- }
888
- else if ((0, types_1.isTimestampProp)(prop)) {
889
- zodType = types_1.SQLDateTimeString;
890
- }
891
- else if ((0, types_1.isJsonProp)(prop)) {
892
- zodType = yield this.getZodTypeById(prop.id);
893
- }
894
- else if ((0, types_1.isUuidProp)(prop)) {
895
- zodType = zod_1.z.string().uuid();
896
- }
897
- else if ((0, types_1.isVirtualProp)(prop)) {
898
- zodType = yield this.getZodTypeById(prop.id);
899
- }
900
- else if ((0, types_1.isRelationProp)(prop)) {
901
- if ((0, types_1.isBelongsToOneRelationProp)(prop) ||
902
- ((0, types_1.isOneToOneRelationProp)(prop) && prop.hasJoinColumn)) {
903
- zodType = zod_1.z.number().int();
904
- }
905
- }
906
- else {
907
- throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
908
- }
909
- if (prop.unsigned) {
910
- zodType = zodType.nonnegative();
911
- }
912
- if (prop.nullable) {
913
- zodType = zodType.nullable();
914
- }
915
- return zodType;
916
- });
917
- }
918
- resolveRenderType(key, zodType) {
919
- if (zodType instanceof zod_1.z.ZodString) {
920
- if (key.includes("img") || key.includes("image")) {
921
- return "string-image";
922
- }
923
- else if (zodType.description === "SQLDateTimeString") {
924
- return "string-datetime";
925
- }
926
- else if (key.endsWith("date")) {
927
- return "string-date";
928
- }
929
- else {
930
- return "string-plain";
931
- }
932
- }
933
- else if (zodType instanceof zod_1.z.ZodNumber) {
934
- if (key === "id") {
935
- return "number-id";
936
- }
937
- else if (key.endsWith("_id")) {
938
- return "number-fk_id";
939
- }
940
- else {
941
- return "number-plain";
942
- }
943
- }
944
- else if (zodType instanceof zod_1.z.ZodBoolean) {
945
- return "boolean";
946
- }
947
- else if (zodType instanceof zod_1.z.ZodEnum) {
948
- return "enums";
949
- }
950
- else if (zodType instanceof zod_1.z.ZodRecord) {
951
- return "record";
952
- }
953
- else if (zodType instanceof zod_1.z.ZodAny || zodType instanceof zod_1.z.ZodUnknown) {
954
- return "string-plain";
955
- }
956
- else if (zodType instanceof zod_1.z.ZodUnion) {
957
- return "string-plain";
958
- }
959
- else if (zodType instanceof zod_1.z.ZodLiteral) {
960
- return "string-plain";
961
- }
962
- else {
963
- throw new Error(`타입 파싱 불가 ${key} ${zodType._def.typeName}`);
964
- }
965
- }
966
- zodTypeToRenderingNode(zodType, baseKey = "root") {
967
- const def = {
968
- name: baseKey,
969
- label: inflection_1.default.camelize(baseKey, false),
970
- zodType,
971
- };
972
- if (zodType instanceof zod_1.z.ZodObject) {
973
- const columnKeys = Object.keys(zodType.shape);
974
- const children = columnKeys.map((key) => {
975
- const innerType = zodType.shape[key];
976
- return this.zodTypeToRenderingNode(innerType, key);
977
- });
978
- return Object.assign(Object.assign({}, def), { renderType: "object", children });
979
- }
980
- else if (zodType instanceof zod_1.z.ZodArray) {
981
- const innerType = zodType._def.type;
982
- if (innerType instanceof zod_1.z.ZodString && baseKey.includes("images")) {
983
- return Object.assign(Object.assign({}, def), { renderType: "array-images" });
984
- }
985
- return Object.assign(Object.assign({}, def), { renderType: "array", element: this.zodTypeToRenderingNode(innerType, baseKey) });
986
- }
987
- else if (zodType instanceof zod_1.z.ZodUnion) {
988
- const optionNodes = zodType._def.options.map((opt) => this.zodTypeToRenderingNode(opt, baseKey));
989
- // TODO: ZodUnion이 들어있는 경우 핸들링
990
- return optionNodes[0];
991
- }
992
- else if (zodType instanceof zod_1.z.ZodOptional) {
993
- return Object.assign(Object.assign({}, this.zodTypeToRenderingNode(zodType._def.innerType, baseKey)), { optional: true });
994
- }
995
- else if (zodType instanceof zod_1.z.ZodNullable) {
996
- return Object.assign(Object.assign({}, this.zodTypeToRenderingNode(zodType._def.innerType, baseKey)), { nullable: true });
997
- }
998
- else {
999
- return Object.assign(Object.assign({}, def), { renderType: this.resolveRenderType(baseKey, zodType) });
1000
- }
1001
- }
1002
- getColumnsNode(entityId, subsetKey) {
1003
- return __awaiter(this, void 0, void 0, function* () {
1004
- const entity = yield entity_manager_1.EntityManager.get(entityId);
1005
- const subsetA = entity.subsets[subsetKey];
1006
- if (subsetA === undefined) {
1007
- throw new so_exceptions_1.ServiceUnavailableException("SubsetA 가 없습니다.");
1008
- }
1009
- const propNodes = entity.fieldExprsToPropNodes(subsetA);
1010
- const rootPropNode = {
1011
- nodeType: "object",
1012
- children: propNodes,
1013
- };
1014
- const columnsZodType = (yield this.propNodeToZodType(rootPropNode));
1015
- const columnsNode = this.zodTypeToRenderingNode(columnsZodType);
1016
- columnsNode.children = columnsNode.children.map((child) => {
1017
- if (child.renderType === "object") {
1018
- const pickedCol = child.children.find((cc) => ["title", "name"].includes(cc.name));
1019
- if (pickedCol) {
1020
- return Object.assign(Object.assign({}, child), { renderType: "object-pick", config: {
1021
- picked: pickedCol.name,
1022
- } });
1023
- }
1024
- else {
1025
- return child;
1026
- }
1027
- }
1028
- else if (child.renderType === "array" &&
1029
- child.element &&
1030
- child.element.renderType === "object") {
1031
- const pickedCol = child.element.children.find((cc) => ["title", "name"].includes(cc.name));
1032
- if (pickedCol) {
1033
- return Object.assign(Object.assign({}, child), { element: Object.assign(Object.assign({}, child.element), { renderType: "object-pick", config: {
1034
- picked: pickedCol.name,
1035
- } }) });
1036
- }
1037
- else {
1038
- return child;
1039
- }
1040
- }
1041
- return child;
1042
- });
1043
- return columnsNode;
1044
- });
1045
- }
1046
- createEntity(entityId, parentId, table, title) {
1047
- return __awaiter(this, void 0, void 0, function* () {
1048
- if (!/^[A-Z][a-zA-Z0-9]*$/.test(entityId)) {
1049
- throw new so_exceptions_1.BadRequestException("entityId는 CamelCase 형식이어야 합니다.");
1050
- }
1051
- yield this.generateTemplate("entity", {
1052
- entityId,
1053
- parentId,
1054
- table,
1055
- title,
1056
- });
1057
- // reload entities
1058
- yield entity_manager_1.EntityManager.reload();
1059
- // generate schemas
1060
- yield this.actionGenerateSchemas();
1061
- // generate types
1062
- if (parentId === undefined) {
1063
- yield this.generateTemplate("init_types", {
1064
- entityId,
1065
- });
1066
- }
1067
- });
1068
- }
1069
- delEntity(entityId) {
1070
- var _a, e_1, _b, _c;
1071
- return __awaiter(this, void 0, void 0, function* () {
1072
- const entity = entity_manager_1.EntityManager.get(entityId);
1073
- const delPaths = (() => {
1074
- if (entity.parentId) {
1075
- return [
1076
- `${sonamu_1.Sonamu.apiRootPath}/src/application/${entity.names.parentFs}/${entity.names.fs}.entity.json`,
1077
- ];
1078
- }
1079
- else {
1080
- return [
1081
- `${sonamu_1.Sonamu.apiRootPath}/src/application/${entity.names.fs}`,
1082
- `${sonamu_1.Sonamu.apiRootPath}/dist/application/${entity.names.fs}`,
1083
- ...sonamu_1.Sonamu.config.sync.targets
1084
- .map((target) => [
1085
- `${sonamu_1.Sonamu.appRootPath}/${target}/src/services/${entity.names.fs}`,
1086
- ])
1087
- .flat(),
1088
- ];
1089
- }
1090
- })(); // iife
1091
- try {
1092
- for (var _d = true, delPaths_1 = __asyncValues(delPaths), delPaths_1_1; delPaths_1_1 = yield delPaths_1.next(), _a = delPaths_1_1.done, !_a; _d = true) {
1093
- _c = delPaths_1_1.value;
1094
- _d = false;
1095
- const delPath = _c;
1096
- if (fs_extra_1.default.existsSync(delPath)) {
1097
- console.log(chalk_1.default.red(`DELETE ${delPath}`));
1098
- (0, child_process_1.execSync)(`rm -rf ${delPath}`);
1099
- }
1100
- else {
1101
- console.log(chalk_1.default.yellow(`NOT_EXISTS ${delPath}`));
1102
- }
1103
- }
1104
- }
1105
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
1106
- finally {
1107
- try {
1108
- if (!_d && !_a && (_b = delPaths_1.return)) yield _b.call(delPaths_1);
1109
- }
1110
- finally { if (e_1) throw e_1.error; }
1111
- }
1112
- // reload entities
1113
- yield entity_manager_1.EntityManager.reload();
1114
- return { delPaths };
1115
- });
1116
- }
1117
- }
1118
- exports.Syncer = Syncer;
1119
- //# sourceMappingURL=syncer.js.map