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,697 +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 __importDefault = (this && this.__importDefault) || function (mod) {
35
- return (mod && mod.__esModule) ? mod : { "default": mod };
36
- };
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.Entity = void 0;
39
- const lodash_1 = __importDefault(require("lodash"));
40
- const entity_manager_1 = require("./entity-manager");
41
- const types_1 = require("../types/types");
42
- const inflection_1 = __importDefault(require("inflection"));
43
- const path_1 = __importDefault(require("path"));
44
- const fs_extra_1 = __importDefault(require("fs-extra"));
45
- const zod_1 = require("zod");
46
- const sonamu_1 = require("../api/sonamu");
47
- const prettier_1 = __importDefault(require("prettier"));
48
- const utils_1 = require("../utils/utils");
49
- class Entity {
50
- constructor({ id, parentId, table, title, props, indexes, subsets, enums, }) {
51
- this.types = {};
52
- this.enums = {};
53
- this.enumLabels = {};
54
- // id
55
- this.id = id;
56
- this.parentId = parentId;
57
- this.title = title !== null && title !== void 0 ? title : this.id;
58
- this.table = table !== null && table !== void 0 ? table : inflection_1.default.underscore(inflection_1.default.pluralize(id));
59
- // props
60
- if (props) {
61
- this.props = props.map((prop) => {
62
- if ((0, types_1.isEnumProp)(prop)) {
63
- if (prop.id.includes("$Model")) {
64
- prop.id = prop.id.replace("$Model", id);
65
- }
66
- }
67
- return prop;
68
- });
69
- this.propsDict = props.reduce((result, prop) => {
70
- return Object.assign(Object.assign({}, result), { [prop.name]: prop });
71
- }, {});
72
- // relations
73
- this.relations = props
74
- .filter((prop) => (0, types_1.isRelationProp)(prop))
75
- .reduce((result, prop) => {
76
- return Object.assign(Object.assign({}, result), { [prop.name]: prop });
77
- }, {});
78
- }
79
- else {
80
- this.props = [];
81
- this.propsDict = {};
82
- this.relations = {};
83
- }
84
- // indexes
85
- this.indexes = indexes !== null && indexes !== void 0 ? indexes : [];
86
- // subsets
87
- this.subsets = subsets !== null && subsets !== void 0 ? subsets : {};
88
- // enums
89
- this.enumLabels = enums !== null && enums !== void 0 ? enums : {};
90
- this.enums = Object.fromEntries(Object.entries(this.enumLabels).map(([key, enumLabel]) => {
91
- return [
92
- key,
93
- zod_1.z.enum(Object.keys(enumLabel)),
94
- ];
95
- }));
96
- // names
97
- this.names = {
98
- parentFs: inflection_1.default
99
- .dasherize(inflection_1.default.underscore(parentId !== null && parentId !== void 0 ? parentId : id))
100
- .toLowerCase(),
101
- fs: inflection_1.default.dasherize(inflection_1.default.underscore(id)).toLowerCase(),
102
- module: id,
103
- };
104
- this.registerModulePaths();
105
- this.registerTableSpecs();
106
- }
107
- /*
108
- subset SELECT/JOIN/LOADER 결과 리턴
109
- */
110
- getSubsetQuery(subsetKey) {
111
- const subset = this.subsets[subsetKey];
112
- const result = this.resolveSubsetQuery("", subset);
113
- return result;
114
- }
115
- /*
116
- */
117
- resolveSubsetQuery(prefix, fields, isAlreadyOuterJoined = false) {
118
- // prefix 치환 (prefix는 ToOneRelation이 복수로 붙은 경우 모두 __로 변경됨)
119
- prefix = prefix.replace(/\./g, "__");
120
- // 서브셋을 1뎁스만 분리하여 그룹핑
121
- const subsetGroup = lodash_1.default.groupBy(fields, (field) => {
122
- if (field.includes(".")) {
123
- const [rel] = field.split(".");
124
- return rel;
125
- }
126
- else {
127
- return "";
128
- }
129
- });
130
- const result = Object.keys(subsetGroup).reduce((r, groupKey) => {
131
- var _a;
132
- const fields = subsetGroup[groupKey];
133
- // 현재 테이블 필드셋은 select, virtual에 추가하고 리턴
134
- if (groupKey === "") {
135
- const realFields = fields.filter((field) => !(0, types_1.isVirtualProp)(this.propsDict[field]));
136
- const virtualFields = fields.filter((field) => (0, types_1.isVirtualProp)(this.propsDict[field]));
137
- if (prefix === "") {
138
- // 현재 테이블인 경우
139
- r.select = r.select.concat(realFields.map((field) => `${this.table}.${field}`));
140
- r.virtual = r.virtual.concat(virtualFields);
141
- }
142
- else {
143
- // 넘어온 테이블인 경우
144
- r.select = r.select.concat(realFields.map((field) => `${prefix}.${field} as ${prefix}__${field}`));
145
- }
146
- return r;
147
- }
148
- const relation = this.relations[groupKey];
149
- if (relation === undefined) {
150
- throw new Error(`존재하지 않는 relation 참조 ${groupKey}`);
151
- }
152
- const relEntity = entity_manager_1.EntityManager.get(relation.with);
153
- if ((0, types_1.isOneToOneRelationProp)(relation) ||
154
- (0, types_1.isBelongsToOneRelationProp)(relation)) {
155
- // -One Relation: JOIN 으로 처리
156
- const relFields = fields.map((field) => field.split(".").slice(1).join("."));
157
- // -One Relation에서 id 필드만 참조하는 경우 릴레이션 넘기지 않고 리턴
158
- if (relFields.length === 1 && relFields[0] === "id") {
159
- if (prefix === "") {
160
- r.select = r.select.concat(`${this.table}.${groupKey}_id`);
161
- }
162
- else {
163
- r.select = r.select.concat(`${prefix}.${groupKey}_id as ${prefix}__${groupKey}_id`);
164
- }
165
- return r;
166
- }
167
- // innerOrOuter
168
- const innerOrOuter = (() => {
169
- var _a;
170
- if (isAlreadyOuterJoined) {
171
- return "outer";
172
- }
173
- if ((0, types_1.isOneToOneRelationProp)(relation)) {
174
- if (relation.hasJoinColumn === true &&
175
- ((_a = relation.nullable) !== null && _a !== void 0 ? _a : false) === false) {
176
- return "inner";
177
- }
178
- else {
179
- return "outer";
180
- }
181
- }
182
- else {
183
- if (relation.nullable) {
184
- return "outer";
185
- }
186
- else {
187
- return "inner";
188
- }
189
- }
190
- })();
191
- const relSubsetQuery = relEntity.resolveSubsetQuery(`${prefix !== "" ? prefix + "." : ""}${groupKey}`, relFields, innerOrOuter === "outer");
192
- r.select = r.select.concat(relSubsetQuery.select);
193
- r.virtual = r.virtual.concat(relSubsetQuery.virtual);
194
- const joinAs = prefix === "" ? groupKey : prefix + "__" + groupKey;
195
- const fromTable = prefix === "" ? this.table : prefix;
196
- let joinClause;
197
- if (relation.customJoinClause) {
198
- joinClause = {
199
- custom: relation.customJoinClause,
200
- };
201
- }
202
- else {
203
- let from, to;
204
- if ((0, types_1.isOneToOneRelationProp)(relation)) {
205
- if (relation.hasJoinColumn) {
206
- from = `${fromTable}.${relation.name}_id`;
207
- to = `${joinAs}.id`;
208
- }
209
- else {
210
- from = `${fromTable}.id`;
211
- to = `${joinAs}.${inflection_1.default.underscore(this.names.fs.replace(/\-/g, "_"))}_id`;
212
- }
213
- }
214
- else {
215
- from = `${fromTable}.${relation.name}_id`;
216
- to = `${joinAs}.id`;
217
- }
218
- joinClause = {
219
- from,
220
- to,
221
- };
222
- }
223
- r.joins.push(Object.assign({ as: joinAs, join: innerOrOuter, table: relEntity.table }, joinClause));
224
- // BelongsToOne 밑에 HasMany가 붙은 경우
225
- if (relSubsetQuery.loaders.length > 0) {
226
- const convertedLoaders = relSubsetQuery.loaders.map((loader) => {
227
- const newAs = [groupKey, loader.as].join("__");
228
- return {
229
- as: newAs,
230
- table: loader.table,
231
- manyJoin: loader.manyJoin,
232
- oneJoins: loader.oneJoins,
233
- select: loader.select,
234
- loaders: loader.loaders,
235
- };
236
- });
237
- r.loaders = [...r.loaders, ...convertedLoaders];
238
- }
239
- r.joins = r.joins.concat(relSubsetQuery.joins);
240
- }
241
- else if ((0, types_1.isHasManyRelationProp)(relation) ||
242
- (0, types_1.isManyToManyRelationProp)(relation)) {
243
- // -Many Relation: Loader 로 처리
244
- const relFields = fields.map((field) => field.split(".").slice(1).join("."));
245
- const relSubsetQuery = relEntity.resolveSubsetQuery("", relFields);
246
- let manyJoin;
247
- if ((0, types_1.isHasManyRelationProp)(relation)) {
248
- const fromCol = (_a = relation === null || relation === void 0 ? void 0 : relation.fromColumn) !== null && _a !== void 0 ? _a : "id";
249
- manyJoin = {
250
- fromTable: this.table,
251
- fromCol,
252
- idField: prefix === "" ? `${fromCol}` : `${prefix}__${fromCol}`,
253
- toTable: relEntity.table,
254
- toCol: relation.joinColumn,
255
- };
256
- }
257
- else if ((0, types_1.isManyToManyRelationProp)(relation)) {
258
- const [table1, table2] = relation.joinTable.split("__");
259
- const throughTables = (() => {
260
- // 동일 테이블 릴레이션인 경우
261
- if (this.table === relEntity.table) {
262
- if (table1 === this.table) {
263
- return {
264
- fromCol: `${inflection_1.default.singularize(table1)}_id`,
265
- toCol: `${inflection_1.default.singularize(table2)}_id`,
266
- };
267
- }
268
- else {
269
- return {
270
- fromCol: `${inflection_1.default.singularize(table2)}_id`,
271
- toCol: `${inflection_1.default.singularize(table1)}_id`,
272
- };
273
- }
274
- }
275
- else {
276
- // 서로 다른 테이블인 경우 릴레이션 테이블 유지
277
- return {
278
- fromCol: `${inflection_1.default.singularize(this.table)}_id`,
279
- toCol: `${inflection_1.default.singularize(relEntity.table)}_id`,
280
- };
281
- }
282
- })();
283
- manyJoin = {
284
- fromTable: this.table,
285
- fromCol: "id",
286
- idField: prefix === "" ? `id` : `${prefix}__id`,
287
- through: Object.assign({ table: relation.joinTable }, throughTables),
288
- toTable: relEntity.table,
289
- toCol: "id",
290
- };
291
- }
292
- else {
293
- throw new Error();
294
- }
295
- r.loaders.push({
296
- as: groupKey,
297
- table: relEntity.table,
298
- manyJoin,
299
- oneJoins: relSubsetQuery.joins,
300
- select: relSubsetQuery.select,
301
- loaders: relSubsetQuery.loaders,
302
- });
303
- }
304
- return r;
305
- }, {
306
- select: [],
307
- virtual: [],
308
- joins: [],
309
- loaders: [],
310
- });
311
- return result;
312
- }
313
- /*
314
- FieldExpr[] 을 EntityPropNode[] 로 변환
315
- */
316
- fieldExprsToPropNodes(fieldExprs, entity = this) {
317
- const groups = fieldExprs.reduce((result, fieldExpr) => {
318
- var _a;
319
- let key, value, elseExpr;
320
- if (fieldExpr.includes(".")) {
321
- [key, ...elseExpr] = fieldExpr.split(".");
322
- value = elseExpr.join(".");
323
- }
324
- else {
325
- key = "";
326
- value = fieldExpr;
327
- }
328
- result[key] = ((_a = result[key]) !== null && _a !== void 0 ? _a : []).concat(value);
329
- return result;
330
- }, {});
331
- return Object.keys(groups)
332
- .map((key) => {
333
- const group = groups[key];
334
- // 일반 prop 처리
335
- if (key === "") {
336
- return group.map((propName) => {
337
- // uuid 개별 처리
338
- if (propName === "uuid") {
339
- return {
340
- nodeType: "plain",
341
- prop: {
342
- type: "string",
343
- name: "uuid",
344
- length: 128,
345
- },
346
- children: [],
347
- };
348
- }
349
- const prop = entity.props.find((p) => p.name === propName);
350
- if (prop === undefined) {
351
- console.log({ propName, groups });
352
- throw new Error(`${entity.id} -- 잘못된 FieldExpr ${propName}`);
353
- }
354
- return {
355
- nodeType: "plain",
356
- prop,
357
- children: [],
358
- };
359
- });
360
- }
361
- // relation prop 처리
362
- const prop = entity.propsDict[key];
363
- if (!(0, types_1.isRelationProp)(prop)) {
364
- throw new Error(`잘못된 FieldExpr ${key}.${group[0]}`);
365
- }
366
- const relEntity = entity_manager_1.EntityManager.get(prop.with);
367
- // relation -One 에 id 필드 하나인 경우
368
- if ((0, types_1.isBelongsToOneRelationProp)(prop) || (0, types_1.isOneToOneRelationProp)(prop)) {
369
- if (group.length == 1 && (group[0] === "id" || group[0] == "id?")) {
370
- // id 하나만 있는지 체크해서, 하나만 있으면 상위 prop으로 id를 리턴
371
- const idProp = relEntity.propsDict.id;
372
- return {
373
- nodeType: "plain",
374
- prop: Object.assign(Object.assign({}, idProp), { name: key + "_id", nullable: prop.nullable }),
375
- children: [],
376
- };
377
- }
378
- }
379
- // -One 그외의 경우 object로 리턴
380
- // -Many의 경우 array로 리턴
381
- // Recursive 로 뎁스 처리
382
- const children = this.fieldExprsToPropNodes(group, relEntity);
383
- const nodeType = (0, types_1.isBelongsToOneRelationProp)(prop) || (0, types_1.isOneToOneRelationProp)(prop)
384
- ? "object"
385
- : "array";
386
- return {
387
- prop,
388
- children,
389
- nodeType,
390
- };
391
- })
392
- .flat();
393
- }
394
- getFieldExprs(prefix = "", maxDepth = 3, froms = []) {
395
- return this.props
396
- .map((prop) => {
397
- const propName = [prefix, prop.name].filter((v) => v !== "").join(".");
398
- if (propName === prefix) {
399
- return null;
400
- }
401
- if ((0, types_1.isRelationProp)(prop)) {
402
- if (maxDepth < 0) {
403
- return null;
404
- }
405
- if (froms.includes(prop.with)) {
406
- // 역방향 relation인 경우 제외
407
- return null;
408
- }
409
- // 정방향 relation인 경우 recursive 콜
410
- const relMd = entity_manager_1.EntityManager.get(prop.with);
411
- return relMd.getFieldExprs(propName, maxDepth - 1, [
412
- ...froms,
413
- this.id,
414
- ]);
415
- }
416
- return propName;
417
- })
418
- .flat()
419
- .filter((f) => f !== null);
420
- }
421
- getTableColumns() {
422
- return this.props
423
- .map((prop) => {
424
- if (prop.type === "relation") {
425
- if (prop.relationType === "BelongsToOne" ||
426
- (prop.relationType === "OneToOne" && prop.hasJoinColumn === true)) {
427
- return `${prop.name}_id`;
428
- }
429
- else {
430
- return null;
431
- }
432
- }
433
- return prop.name;
434
- })
435
- .filter(utils_1.nonNullable);
436
- }
437
- registerModulePaths() {
438
- const basePath = `${this.names.parentFs}`;
439
- // base-scheme
440
- entity_manager_1.EntityManager.setModulePath(`${this.id}BaseSchema`, `sonamu.generated`);
441
- // subset
442
- if (Object.keys(this.subsets).length > 0) {
443
- entity_manager_1.EntityManager.setModulePath(`${this.id}SubsetKey`, `sonamu.generated`);
444
- entity_manager_1.EntityManager.setModulePath(`${this.id}SubsetMapping`, `sonamu.generated`);
445
- Object.keys(this.subsets).map((subsetKey) => {
446
- entity_manager_1.EntityManager.setModulePath(`${this.id}Subset${subsetKey.toUpperCase()}`, `sonamu.generated`);
447
- });
448
- }
449
- // enums
450
- Object.keys(this.enumLabels).map((enumId) => {
451
- entity_manager_1.EntityManager.setModulePath(enumId, `sonamu.generated`);
452
- });
453
- // types
454
- const typesModulePath = `${basePath}/${this.names.parentFs}.types`;
455
- const typesFileDistPath = path_1.default.join(sonamu_1.Sonamu.apiRootPath, `dist/application/${typesModulePath}.js`);
456
- if (fs_extra_1.default.existsSync(typesFileDistPath)) {
457
- const importPath = path_1.default.relative(__dirname, typesFileDistPath);
458
- Promise.resolve(`${importPath}`).then(s => __importStar(require(s))).then((t) => {
459
- this.types = Object.keys(t).reduce((result, key) => {
460
- entity_manager_1.EntityManager.setModulePath(key, typesModulePath);
461
- return Object.assign(Object.assign({}, result), { [key]: t[key] });
462
- }, {});
463
- });
464
- }
465
- }
466
- registerTableSpecs() {
467
- const uniqueIndexes = this.indexes.filter((idx) => idx.type === "unique");
468
- entity_manager_1.EntityManager.setTableSpec({
469
- name: this.table,
470
- uniqueIndexes,
471
- });
472
- }
473
- toJson() {
474
- return {
475
- id: this.id,
476
- parentId: this.parentId,
477
- table: this.table,
478
- title: this.title,
479
- props: this.props,
480
- indexes: this.indexes,
481
- subsets: this.subsets,
482
- enums: this.enumLabels,
483
- };
484
- }
485
- save() {
486
- return __awaiter(this, void 0, void 0, function* () {
487
- // sort: subsets
488
- const subsetRows = this.getSubsetRows();
489
- this.subsets = Object.fromEntries(Object.entries(this.subsets).map(([subsetKey]) => {
490
- return [
491
- subsetKey,
492
- this.subsetRowsToSubsetFields(subsetRows, subsetKey),
493
- ];
494
- }));
495
- // save
496
- const jsonPath = path_1.default.join(sonamu_1.Sonamu.apiRootPath, `src/application/${this.names.parentFs}/${this.names.fs}.entity.json`);
497
- const json = this.toJson();
498
- fs_extra_1.default.writeFileSync(jsonPath, yield prettier_1.default.format(JSON.stringify(json), {
499
- parser: "json",
500
- }));
501
- // reload
502
- yield entity_manager_1.EntityManager.register(json);
503
- });
504
- }
505
- getSubsetRows(_subsets, prefixes = []) {
506
- if (prefixes.length > 10) {
507
- return [];
508
- }
509
- const subsets = _subsets !== null && _subsets !== void 0 ? _subsets : this.subsets;
510
- const subsetKeys = Object.keys(subsets);
511
- const allFields = lodash_1.default.uniq(subsetKeys.map((key) => subsets[key]).flat());
512
- return this.props.map((prop) => {
513
- if (prop.type === "relation" &&
514
- allFields.find((f) => f.startsWith([...prefixes, prop.name].join(".") + "."))) {
515
- const relEntity = entity_manager_1.EntityManager.get(prop.with);
516
- const children = relEntity.getSubsetRows(subsets, [
517
- ...prefixes,
518
- `${prop.name}`,
519
- ]);
520
- return {
521
- field: prop.name,
522
- children,
523
- relationEntity: prop.with,
524
- prefixes,
525
- isOpen: children.length > 0,
526
- has: Object.fromEntries(subsetKeys.map((subsetKey) => {
527
- return [
528
- subsetKey,
529
- children.every((child) => child.has[subsetKey] === true),
530
- ];
531
- })),
532
- };
533
- }
534
- return {
535
- field: prop.name,
536
- children: [],
537
- relationEntity: prop.type === "relation" ? prop.with : undefined,
538
- prefixes,
539
- has: Object.fromEntries(subsetKeys.map((subsetKey) => {
540
- const subsetFields = subsets[subsetKey];
541
- const has = subsetFields.some((f) => {
542
- const field = [...prefixes, prop.name].join(".");
543
- return f === field || f.startsWith(field + ".");
544
- });
545
- return [subsetKey, has];
546
- })),
547
- };
548
- });
549
- }
550
- subsetRowsToSubsetFields(subsetRows, subsetKey) {
551
- return subsetRows
552
- .map((subsetRow) => {
553
- if (subsetRow.children.length > 0) {
554
- return this.subsetRowsToSubsetFields(subsetRow.children, subsetKey);
555
- }
556
- else if (subsetRow.has[subsetKey]) {
557
- return subsetRow.prefixes.concat(subsetRow.field).join(".");
558
- }
559
- else {
560
- return null;
561
- }
562
- })
563
- .filter(utils_1.nonNullable)
564
- .flat();
565
- }
566
- createProp(prop, at) {
567
- return __awaiter(this, void 0, void 0, function* () {
568
- if (!at) {
569
- this.props.push(prop);
570
- }
571
- else {
572
- this.props.splice(at, 0, prop);
573
- }
574
- yield this.save();
575
- });
576
- }
577
- analyzeSubsetField(subsetField) {
578
- const arr = subsetField.split(".");
579
- let entityId = this.id;
580
- const result = [];
581
- for (let i = 0; i < arr.length; i++) {
582
- const propName = arr[i];
583
- result.push({
584
- entityId,
585
- propName,
586
- });
587
- const prop = entity_manager_1.EntityManager.get(entityId).props.find((p) => p.name === propName);
588
- if (!prop) {
589
- throw new Error(`${entityId}의 잘못된 서브셋키 ${subsetField}`);
590
- }
591
- if ((0, types_1.isRelationProp)(prop)) {
592
- entityId = prop.with;
593
- }
594
- }
595
- return result;
596
- }
597
- modifyProp(newProp, at) {
598
- return __awaiter(this, void 0, void 0, function* () {
599
- // 이전 프롭 이름 저장
600
- const oldName = this.props[at].name;
601
- // 저장할 엔티티
602
- const entities = [this];
603
- // 이름이 바뀐 경우
604
- if (oldName !== newProp.name) {
605
- // 전체 엔티티에서 현재 수정된 프롭을 참조하고 있는 모든 서브셋필드 찾아서 수정
606
- const allEntityIds = entity_manager_1.EntityManager.getAllIds();
607
- for (const relEntityId of allEntityIds) {
608
- const relEntity = entity_manager_1.EntityManager.get(relEntityId);
609
- const relEntitySubsetKeys = Object.keys(relEntity.subsets);
610
- for (const subsetKey of relEntitySubsetKeys) {
611
- const subset = relEntity.subsets[subsetKey];
612
- // 서브셋 필드를 순회하며, 엔티티-프롭 단위로 분석한 후 현재 엔티티-프롭과 일치하는 경우 수정 처리
613
- const modifiedSubsetFields = subset.map((subsetField) => {
614
- const analyzed = relEntity.analyzeSubsetField(subsetField);
615
- const modified = analyzed.map((a) => a.propName === oldName && a.entityId === this.id
616
- ? Object.assign(Object.assign({}, a), { propName: newProp.name }) : a);
617
- // 분석한 필드를 다시 서브셋 필드로 복구
618
- return modified.map((a) => a.propName).join(".");
619
- });
620
- if (subset.join(",") !== modifiedSubsetFields.join(",")) {
621
- relEntity.subsets[subsetKey] = modifiedSubsetFields;
622
- entities.push(relEntity);
623
- }
624
- }
625
- }
626
- }
627
- // 프롭 수정
628
- this.props[at] = newProp;
629
- yield Promise.all(entities.map((entity) => __awaiter(this, void 0, void 0, function* () { return entity.save(); })));
630
- });
631
- }
632
- delProp(at) {
633
- return __awaiter(this, void 0, void 0, function* () {
634
- // 이전 프롭 이름 저장
635
- const oldName = this.props[at].name;
636
- // 저장할 엔티티
637
- const entities = [this];
638
- // 전체 엔티티에서 현재 삭제된 프롭을 참조하고 있는 모든 서브셋필드 찾아서 제외
639
- const allEntityIds = entity_manager_1.EntityManager.getAllIds();
640
- for (const relEntityId of allEntityIds) {
641
- const relEntity = entity_manager_1.EntityManager.get(relEntityId);
642
- const relEntitySubsetKeys = Object.keys(relEntity.subsets);
643
- for (const subsetKey of relEntitySubsetKeys) {
644
- const subset = relEntity.subsets[subsetKey];
645
- // 서브셋 필드를 순회하며, 엔티티-프롭 단위로 분석한 후 현재 엔티티-프롭과 일치하는 경우 이후의 필드를 제외
646
- const modifiedSubsetFields = subset
647
- .map((subsetField) => {
648
- const analyzed = relEntity.analyzeSubsetField(subsetField);
649
- if (analyzed.find((a) => a.propName === oldName && a.entityId === this.id)) {
650
- return null;
651
- }
652
- else {
653
- return subsetField;
654
- }
655
- })
656
- .filter(utils_1.nonNullable);
657
- if (subset.join(",") !== modifiedSubsetFields.join(",")) {
658
- relEntity.subsets[subsetKey] = modifiedSubsetFields;
659
- entities.push(relEntity);
660
- }
661
- }
662
- }
663
- // 프롭 삭제
664
- this.props.splice(at, 1);
665
- yield Promise.all(entities.map((entity) => __awaiter(this, void 0, void 0, function* () { return entity.save(); })));
666
- });
667
- }
668
- getEntityIdFromSubsetField(subsetField) {
669
- if (subsetField.includes(".") === false) {
670
- return this.id;
671
- }
672
- // 서브셋 필드의 마지막은 프롭이므로 제외
673
- const arr = subsetField.split(".").slice(0, -1);
674
- // 서브셋 필드를 내려가면서 마지막으로 relation된 엔티티를 찾음
675
- const lastEntityId = arr.reduce((entityId, field) => {
676
- const relProp = entity_manager_1.EntityManager.get(entityId).props.find((p) => p.name === field);
677
- if (!relProp || relProp.type !== "relation") {
678
- console.debug({ arr, thisId: this.id, entityId, field });
679
- throw new Error(`잘못된 서브셋키 ${subsetField}`);
680
- }
681
- return relProp.with;
682
- }, this.id);
683
- return lastEntityId;
684
- }
685
- moveProp(at, to) {
686
- return __awaiter(this, void 0, void 0, function* () {
687
- const prop = this.props[at];
688
- const newProps = [...this.props];
689
- newProps.splice(to, 0, prop);
690
- newProps.splice(at < to ? at : at + 1, 1);
691
- this.props = newProps;
692
- yield this.save();
693
- });
694
- }
695
- }
696
- exports.Entity = Entity;
697
- //# sourceMappingURL=entity.js.map