sonamu 0.5.7 → 0.6.0

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 (358) hide show
  1. package/dist/api/base-frame.js +12 -2
  2. package/dist/api/caster.js +66 -2
  3. package/dist/api/code-converters.js +489 -2
  4. package/dist/api/config.d.ts +76 -0
  5. package/dist/api/config.d.ts.map +1 -0
  6. package/dist/api/config.js +32 -0
  7. package/dist/api/context.d.ts +1 -0
  8. package/dist/api/context.d.ts.map +1 -1
  9. package/dist/api/context.js +3 -2
  10. package/dist/api/decorators.d.ts.map +1 -1
  11. package/dist/api/decorators.js +142 -2
  12. package/dist/api/index.js +9 -2
  13. package/dist/api/sonamu.d.ts +8 -22
  14. package/dist/api/sonamu.d.ts.map +1 -1
  15. package/dist/api/sonamu.js +482 -2
  16. package/dist/bin/build-config.d.ts +2 -1
  17. package/dist/bin/build-config.d.ts.map +1 -1
  18. package/dist/bin/build-config.js +12 -2
  19. package/dist/bin/cli-wrapper.js +71 -2
  20. package/dist/bin/cli.js +418 -2
  21. package/dist/bin/hot-hook-register.d.ts +11 -0
  22. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  23. package/dist/bin/hot-hook-register.js +21 -0
  24. package/dist/database/_batch_update.js +78 -2
  25. package/dist/database/base-model.js +247 -2
  26. package/dist/database/code-generator.js +53 -2
  27. package/dist/database/db.d.ts +2 -16
  28. package/dist/database/db.d.ts.map +1 -1
  29. package/dist/database/db.js +132 -2
  30. package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
  31. package/dist/database/puri-wrapper.js +109 -2
  32. package/dist/database/puri.d.ts +23 -16
  33. package/dist/database/puri.d.ts.map +1 -1
  34. package/dist/database/puri.js +539 -2
  35. package/dist/database/puri.types.d.ts +8 -3
  36. package/dist/database/puri.types.d.ts.map +1 -1
  37. package/dist/database/puri.types.js +3 -2
  38. package/dist/database/transaction-context.js +14 -2
  39. package/dist/database/upsert-builder.js +215 -2
  40. package/dist/entity/entity-manager.d.ts +3 -1
  41. package/dist/entity/entity-manager.d.ts.map +1 -1
  42. package/dist/entity/entity-manager.js +114 -2
  43. package/dist/entity/entity-utils.js +210 -2
  44. package/dist/entity/entity.d.ts.map +1 -1
  45. package/dist/entity/entity.js +651 -2
  46. package/dist/exceptions/error-handler.js +29 -2
  47. package/dist/exceptions/so-exceptions.js +85 -2
  48. package/dist/file-storage/driver.js +79 -2
  49. package/dist/file-storage/file-storage.js +75 -2
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +28 -2
  53. package/dist/migration/code-generation.js +558 -2
  54. package/dist/migration/migration-set.js +364 -2
  55. package/dist/migration/migrator.d.ts +0 -9
  56. package/dist/migration/migrator.d.ts.map +1 -1
  57. package/dist/migration/migrator.js +510 -2
  58. package/dist/migration/types.js +3 -2
  59. package/dist/naite/naite.d.ts +12 -0
  60. package/dist/naite/naite.d.ts.map +1 -0
  61. package/dist/naite/naite.js +72 -0
  62. package/dist/stream/index.js +3 -2
  63. package/dist/stream/sse.js +38 -2
  64. package/dist/syncer/api-parser.d.ts +20 -0
  65. package/dist/syncer/api-parser.d.ts.map +1 -0
  66. package/dist/syncer/api-parser.js +229 -0
  67. package/dist/syncer/checksum.d.ts +21 -0
  68. package/dist/syncer/checksum.d.ts.map +1 -0
  69. package/dist/syncer/checksum.js +98 -0
  70. package/dist/syncer/code-generator.d.ts +20 -0
  71. package/dist/syncer/code-generator.d.ts.map +1 -0
  72. package/dist/syncer/code-generator.js +141 -0
  73. package/dist/syncer/entity-operations.d.ts +17 -0
  74. package/dist/syncer/entity-operations.d.ts.map +1 -0
  75. package/dist/syncer/entity-operations.js +58 -0
  76. package/dist/syncer/file-patterns.d.ts +29 -0
  77. package/dist/syncer/file-patterns.d.ts.map +1 -0
  78. package/dist/syncer/file-patterns.js +38 -0
  79. package/dist/syncer/index.d.ts +6 -0
  80. package/dist/syncer/index.d.ts.map +1 -1
  81. package/dist/syncer/index.js +9 -2
  82. package/dist/syncer/module-loader.d.ts +35 -0
  83. package/dist/syncer/module-loader.d.ts.map +1 -0
  84. package/dist/syncer/module-loader.js +82 -0
  85. package/dist/syncer/syncer.d.ts +93 -108
  86. package/dist/syncer/syncer.d.ts.map +1 -1
  87. package/dist/syncer/syncer.js +375 -2
  88. package/dist/template/entity-converter.d.ts +14 -0
  89. package/dist/template/entity-converter.d.ts.map +1 -0
  90. package/dist/template/entity-converter.js +101 -0
  91. package/dist/template/helpers.d.ts +23 -0
  92. package/dist/template/helpers.d.ts.map +1 -0
  93. package/dist/template/helpers.js +64 -0
  94. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  95. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  96. package/dist/template/implementations/entity.template.js +87 -0
  97. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
  98. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  99. package/dist/template/implementations/generated.template.js +232 -0
  100. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
  101. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  102. package/dist/template/implementations/generated_http.template.js +131 -0
  103. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
  104. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  105. package/dist/template/implementations/generated_sso.template.js +105 -0
  106. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  107. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  108. package/dist/template/implementations/init_types.template.js +38 -0
  109. package/dist/template/implementations/model.template.d.ts +17 -0
  110. package/dist/template/implementations/model.template.d.ts.map +1 -0
  111. package/dist/template/implementations/model.template.js +171 -0
  112. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  113. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  114. package/dist/template/implementations/model_test.template.js +35 -0
  115. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  116. package/dist/template/implementations/service.template.d.ts.map +1 -0
  117. package/dist/template/implementations/service.template.js +193 -0
  118. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  119. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  120. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  121. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  122. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  123. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  124. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  125. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  126. package/dist/template/implementations/view_enums_select.template.js +55 -0
  127. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  128. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  129. package/dist/template/implementations/view_form.template.js +337 -0
  130. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  131. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  132. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  133. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  134. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  135. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  136. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  137. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  138. package/dist/template/implementations/view_list.template.js +465 -0
  139. package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  141. package/dist/template/implementations/view_list_columns.template.js +49 -0
  142. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  143. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  144. package/dist/template/implementations/view_search_input.template.js +64 -0
  145. package/dist/template/index.d.ts +5 -0
  146. package/dist/template/index.d.ts.map +1 -0
  147. package/dist/template/index.js +6 -0
  148. package/dist/template/template.d.ts +39 -0
  149. package/dist/template/template.d.ts.map +1 -0
  150. package/dist/template/template.js +47 -0
  151. package/dist/template/zod-converter.d.ts +18 -0
  152. package/dist/template/zod-converter.d.ts.map +1 -0
  153. package/dist/template/zod-converter.js +166 -0
  154. package/dist/testing/_relation-graph.js +80 -2
  155. package/dist/testing/fixture-manager.d.ts.map +1 -1
  156. package/dist/testing/fixture-manager.js +521 -2
  157. package/dist/types/types.d.ts +39 -40
  158. package/dist/types/types.d.ts.map +1 -1
  159. package/dist/types/types.js +289 -2
  160. package/dist/typings/knex.d.js +3 -2
  161. package/dist/utils/async-utils.d.ts +7 -0
  162. package/dist/utils/async-utils.d.ts.map +1 -1
  163. package/dist/utils/async-utils.js +57 -2
  164. package/dist/utils/console-util.d.ts +2 -0
  165. package/dist/utils/console-util.d.ts.map +1 -0
  166. package/dist/utils/console-util.js +6 -0
  167. package/dist/utils/controller.js +26 -2
  168. package/dist/utils/esm-utils.d.ts +45 -0
  169. package/dist/utils/esm-utils.d.ts.map +1 -0
  170. package/dist/utils/esm-utils.js +56 -0
  171. package/dist/utils/fs-utils.js +17 -2
  172. package/dist/utils/lodash-able.js +6 -2
  173. package/dist/utils/model.js +22 -2
  174. package/dist/utils/path-utils.d.ts +89 -0
  175. package/dist/utils/path-utils.d.ts.map +1 -0
  176. package/dist/utils/path-utils.js +60 -0
  177. package/dist/utils/process-utils.d.ts +13 -0
  178. package/dist/utils/process-utils.d.ts.map +1 -0
  179. package/dist/utils/process-utils.js +36 -0
  180. package/dist/utils/sql-parser.js +35 -2
  181. package/dist/utils/utils.d.ts +4 -7
  182. package/dist/utils/utils.d.ts.map +1 -1
  183. package/dist/utils/utils.js +33 -2
  184. package/dist/utils/zod-error.d.ts.map +1 -1
  185. package/dist/utils/zod-error.js +19 -2
  186. package/package.json +21 -8
  187. package/src/api/code-converters.ts +2 -2
  188. package/src/api/config.ts +142 -0
  189. package/src/api/context.ts +1 -0
  190. package/src/api/decorators.ts +1 -0
  191. package/src/api/sonamu.ts +81 -67
  192. package/src/bin/build-config.ts +2 -1
  193. package/src/bin/cli-wrapper.ts +10 -3
  194. package/src/bin/cli.ts +108 -56
  195. package/src/bin/hot-hook-register.ts +22 -0
  196. package/src/database/base-model.ts +1 -1
  197. package/src/database/code-generator.ts +1 -1
  198. package/src/database/db.ts +10 -52
  199. package/src/database/puri.ts +78 -53
  200. package/src/database/puri.types.ts +18 -5
  201. package/src/database/upsert-builder.ts +1 -1
  202. package/src/entity/entity-manager.ts +19 -15
  203. package/src/entity/entity.ts +4 -3
  204. package/src/index.ts +2 -0
  205. package/src/migration/code-generation.ts +1 -1
  206. package/src/migration/migration-set.ts +1 -1
  207. package/src/migration/migrator.ts +23 -152
  208. package/src/naite/naite.ts +70 -0
  209. package/src/syncer/api-parser.ts +299 -0
  210. package/src/syncer/checksum.ts +152 -0
  211. package/src/syncer/code-generator.ts +202 -0
  212. package/src/syncer/entity-operations.ts +68 -0
  213. package/src/syncer/file-patterns.ts +56 -0
  214. package/src/syncer/index.ts +6 -0
  215. package/src/syncer/module-loader.ts +125 -0
  216. package/src/syncer/syncer.ts +363 -1420
  217. package/src/template/entity-converter.ts +123 -0
  218. package/src/template/helpers.ts +84 -0
  219. package/src/{templates → template/implementations}/entity.template.ts +4 -4
  220. package/src/{templates → template/implementations}/generated.template.ts +9 -9
  221. package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
  222. package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
  223. package/src/{templates → template/implementations}/init_types.template.ts +4 -4
  224. package/src/{templates → template/implementations}/model.template.ts +9 -9
  225. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  226. package/src/{templates → template/implementations}/service.template.ts +19 -11
  227. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  228. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
  229. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  230. package/src/{templates → template/implementations}/view_form.template.ts +11 -13
  231. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  232. package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
  233. package/src/{templates → template/implementations}/view_list.template.ts +13 -64
  234. package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
  235. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  236. package/src/template/index.ts +4 -0
  237. package/src/template/template.ts +86 -0
  238. package/src/template/zod-converter.ts +219 -0
  239. package/src/testing/fixture-manager.ts +8 -1
  240. package/src/types/types.ts +38 -61
  241. package/src/utils/async-utils.ts +17 -0
  242. package/src/utils/console-util.ts +4 -0
  243. package/src/utils/esm-utils.ts +69 -0
  244. package/src/utils/path-utils.ts +102 -0
  245. package/src/utils/process-utils.ts +46 -0
  246. package/src/utils/sql-parser.ts +1 -1
  247. package/src/utils/utils.ts +14 -40
  248. package/src/utils/zod-error.ts +0 -1
  249. package/dist/api/base-frame.js.map +0 -1
  250. package/dist/api/caster.js.map +0 -1
  251. package/dist/api/code-converters.js.map +0 -1
  252. package/dist/api/context.js.map +0 -1
  253. package/dist/api/decorators.js.map +0 -1
  254. package/dist/api/index.js.map +0 -1
  255. package/dist/api/sonamu.js.map +0 -1
  256. package/dist/bin/build-config.js.map +0 -1
  257. package/dist/bin/cli-wrapper.js.map +0 -1
  258. package/dist/bin/cli.js.map +0 -1
  259. package/dist/database/_batch_update.js.map +0 -1
  260. package/dist/database/base-model.js.map +0 -1
  261. package/dist/database/code-generator.js.map +0 -1
  262. package/dist/database/db.js.map +0 -1
  263. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  264. package/dist/database/puri-wrapper.js.map +0 -1
  265. package/dist/database/puri.js.map +0 -1
  266. package/dist/database/puri.types.js.map +0 -1
  267. package/dist/database/transaction-context.js.map +0 -1
  268. package/dist/database/upsert-builder.js.map +0 -1
  269. package/dist/entity/entity-manager.js.map +0 -1
  270. package/dist/entity/entity-utils.js.map +0 -1
  271. package/dist/entity/entity.js.map +0 -1
  272. package/dist/exceptions/error-handler.js.map +0 -1
  273. package/dist/exceptions/so-exceptions.js.map +0 -1
  274. package/dist/file-storage/driver.js.map +0 -1
  275. package/dist/file-storage/file-storage.js.map +0 -1
  276. package/dist/index.js.map +0 -1
  277. package/dist/migration/code-generation.js.map +0 -1
  278. package/dist/migration/migration-set.js.map +0 -1
  279. package/dist/migration/migrator.js.map +0 -1
  280. package/dist/migration/types.js.map +0 -1
  281. package/dist/stream/index.js.map +0 -1
  282. package/dist/stream/sse.js.map +0 -1
  283. package/dist/syncer/index.js.map +0 -1
  284. package/dist/syncer/syncer.js.map +0 -1
  285. package/dist/templates/base-template.d.ts +0 -13
  286. package/dist/templates/base-template.d.ts.map +0 -1
  287. package/dist/templates/base-template.js +0 -2
  288. package/dist/templates/base-template.js.map +0 -1
  289. package/dist/templates/entity.template.d.ts.map +0 -1
  290. package/dist/templates/entity.template.js +0 -2
  291. package/dist/templates/entity.template.js.map +0 -1
  292. package/dist/templates/generated.template.d.ts.map +0 -1
  293. package/dist/templates/generated.template.js +0 -2
  294. package/dist/templates/generated.template.js.map +0 -1
  295. package/dist/templates/generated_http.template.d.ts.map +0 -1
  296. package/dist/templates/generated_http.template.js +0 -2
  297. package/dist/templates/generated_http.template.js.map +0 -1
  298. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  299. package/dist/templates/generated_sso.template.js +0 -2
  300. package/dist/templates/generated_sso.template.js.map +0 -1
  301. package/dist/templates/index.d.ts +0 -2
  302. package/dist/templates/index.d.ts.map +0 -1
  303. package/dist/templates/index.js +0 -2
  304. package/dist/templates/index.js.map +0 -1
  305. package/dist/templates/init_types.template.d.ts.map +0 -1
  306. package/dist/templates/init_types.template.js +0 -2
  307. package/dist/templates/init_types.template.js.map +0 -1
  308. package/dist/templates/model.template.d.ts +0 -17
  309. package/dist/templates/model.template.d.ts.map +0 -1
  310. package/dist/templates/model.template.js +0 -2
  311. package/dist/templates/model.template.js.map +0 -1
  312. package/dist/templates/model_test.template.d.ts.map +0 -1
  313. package/dist/templates/model_test.template.js +0 -2
  314. package/dist/templates/model_test.template.js.map +0 -1
  315. package/dist/templates/service.template.d.ts.map +0 -1
  316. package/dist/templates/service.template.js +0 -2
  317. package/dist/templates/service.template.js.map +0 -1
  318. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  319. package/dist/templates/view_enums_buttonset.template.js +0 -2
  320. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  321. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  322. package/dist/templates/view_enums_dropdown.template.js +0 -2
  323. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  324. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  325. package/dist/templates/view_enums_select.template.js +0 -2
  326. package/dist/templates/view_enums_select.template.js.map +0 -1
  327. package/dist/templates/view_form.template.d.ts.map +0 -1
  328. package/dist/templates/view_form.template.js +0 -2
  329. package/dist/templates/view_form.template.js.map +0 -1
  330. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  331. package/dist/templates/view_id_all_select.template.js +0 -2
  332. package/dist/templates/view_id_all_select.template.js.map +0 -1
  333. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  334. package/dist/templates/view_id_async_select.template.js +0 -2
  335. package/dist/templates/view_id_async_select.template.js.map +0 -1
  336. package/dist/templates/view_list.template.d.ts.map +0 -1
  337. package/dist/templates/view_list.template.js +0 -2
  338. package/dist/templates/view_list.template.js.map +0 -1
  339. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  340. package/dist/templates/view_list_columns.template.js +0 -2
  341. package/dist/templates/view_list_columns.template.js.map +0 -1
  342. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  343. package/dist/templates/view_search_input.template.js +0 -2
  344. package/dist/templates/view_search_input.template.js.map +0 -1
  345. package/dist/testing/_relation-graph.js.map +0 -1
  346. package/dist/testing/fixture-manager.js.map +0 -1
  347. package/dist/types/types.js.map +0 -1
  348. package/dist/typings/knex.d.js.map +0 -1
  349. package/dist/utils/async-utils.js.map +0 -1
  350. package/dist/utils/controller.js.map +0 -1
  351. package/dist/utils/fs-utils.js.map +0 -1
  352. package/dist/utils/lodash-able.js.map +0 -1
  353. package/dist/utils/model.js.map +0 -1
  354. package/dist/utils/sql-parser.js.map +0 -1
  355. package/dist/utils/utils.js.map +0 -1
  356. package/dist/utils/zod-error.js.map +0 -1
  357. package/src/templates/base-template.ts +0 -19
  358. package/src/templates/index.ts +0 -1
@@ -0,0 +1,64 @@
1
+ import { EntityManager } from "../../entity/entity-manager.js";
2
+ import { Template } from "../template.js";
3
+ export class Template__view_search_input extends Template {
4
+ constructor(){
5
+ super("view_search_input");
6
+ }
7
+ getTargetAndPath(names) {
8
+ return {
9
+ target: "web/src/components",
10
+ path: `${names.fs}/${names.capital}SearchInput.tsx`
11
+ };
12
+ }
13
+ render({ entityId }) {
14
+ const names = EntityManager.getNamesFromId(entityId);
15
+ return {
16
+ ...this.getTargetAndPath(names),
17
+ body: `
18
+ import React from "react";
19
+ import { useState } from "react";
20
+ import { DropdownProps, Input, InputProps } from "semantic-ui-react";
21
+ import { ${names.capital}SearchFieldDropdown } from "src/components/${names.fs}/${names.capital}SearchFieldDropdown";
22
+
23
+ export function ${names.capital}SearchInput({
24
+ input: { value: inputValue, onChange: inputOnChange, ...inputProps },
25
+ dropdown: dropdownProps,
26
+ }: {
27
+ input: InputProps;
28
+ dropdown: DropdownProps;
29
+ }) {
30
+ const [keyword, setKeyword] = useState<string>(inputValue ?? '');
31
+
32
+ const handleKeyDown = (e: { key: string }) => {
33
+ if (inputOnChange && e.key === 'Enter') {
34
+ inputOnChange(e as any, {
35
+ value: keyword,
36
+ });
37
+ }
38
+ };
39
+
40
+ return (
41
+ <Input
42
+ size="small"
43
+ placeholder="검색..."
44
+ style={{ margin: 0 }}
45
+ label={<${names.capital}SearchFieldDropdown {...dropdownProps} />}
46
+ labelPosition="left"
47
+ action={{
48
+ icon: 'search',
49
+ onClick: () => handleKeyDown({ key: 'Enter' }),
50
+ }}
51
+ {...inputProps}
52
+ value={keyword}
53
+ onChange={(e, { value }) => setKeyword(value)}
54
+ onKeyDown={handleKeyDown}
55
+ />
56
+ );
57
+ }
58
+ `.trim(),
59
+ importKeys: []
60
+ };
61
+ }
62
+ }
63
+
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19zZWFyY2hfaW5wdXQudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fdmlld19zZWFyY2hfaW5wdXQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwidmlld19zZWFyY2hfaW5wdXRcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9jb21wb25lbnRzXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0LnRzeGAsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfc2VhcmNoX2lucHV0XCJdKSB7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IERyb3Bkb3duUHJvcHMsIElucHV0LCBJbnB1dFByb3BzIH0gZnJvbSBcInNlbWFudGljLXVpLXJlYWN0XCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGREcm9wZG93biB9IGZyb20gXCJzcmMvY29tcG9uZW50cy8ke25hbWVzLmZzfS8ke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGREcm9wZG93blwiO1xuXG5leHBvcnQgZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0KHtcbiAgaW5wdXQ6IHsgdmFsdWU6IGlucHV0VmFsdWUsIG9uQ2hhbmdlOiBpbnB1dE9uQ2hhbmdlLCAuLi5pbnB1dFByb3BzIH0sXG4gIGRyb3Bkb3duOiBkcm9wZG93blByb3BzLFxufToge1xuICBpbnB1dDogSW5wdXRQcm9wcztcbiAgZHJvcGRvd246IERyb3Bkb3duUHJvcHM7XG59KSB7XG4gIGNvbnN0IFtrZXl3b3JkLCBzZXRLZXl3b3JkXSA9IHVzZVN0YXRlPHN0cmluZz4oaW5wdXRWYWx1ZSA/PyAnJyk7XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiB7IGtleTogc3RyaW5nIH0pID0+IHtcbiAgICBpZiAoaW5wdXRPbkNoYW5nZSAmJiBlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgaW5wdXRPbkNoYW5nZShlIGFzIGFueSwge1xuICAgICAgICB2YWx1ZToga2V5d29yZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxJbnB1dFxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwi6rKA7IOJLi4uXCJcbiAgICAgIHN0eWxlPXt7IG1hcmdpbjogMCB9fVxuICAgICAgbGFiZWw9ezwke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGREcm9wZG93biB7Li4uZHJvcGRvd25Qcm9wc30gLz59XG4gICAgICBsYWJlbFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICBhY3Rpb249e3tcbiAgICAgICAgaWNvbjogJ3NlYXJjaCcsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUtleURvd24oeyBrZXk6ICdFbnRlcicgfSksXG4gICAgICB9fVxuICAgICAgey4uLmlucHV0UHJvcHN9XG4gICAgICB2YWx1ZT17a2V5d29yZH1cbiAgICAgIG9uQ2hhbmdlPXsoZSwgeyB2YWx1ZSB9KSA9PiBzZXRLZXl3b3JkKHZhbHVlKX1cbiAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAvPlxuICApO1xufVxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsIlRlbXBsYXRlIiwiVGVtcGxhdGVfX3ZpZXdfc2VhcmNoX2lucHV0IiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwidGFyZ2V0IiwicGF0aCIsImZzIiwiY2FwaXRhbCIsInJlbmRlciIsImVudGl0eUlkIiwiZ2V0TmFtZXNGcm9tSWQiLCJib2R5IiwidHJpbSIsImltcG9ydEtleXMiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLGFBQWEsUUFBMkIsaUNBQThCO0FBQy9FLFNBQVNDLFFBQVEsUUFBUSxpQkFBYztBQUV2QyxPQUFPLE1BQU1DLG9DQUFvQ0Q7SUFDL0MsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFFLGlCQUFpQkMsS0FBd0IsRUFBRTtRQUN6QyxPQUFPO1lBQ0xDLFFBQVE7WUFDUkMsTUFBTSxHQUFHRixNQUFNRyxFQUFFLENBQUMsQ0FBQyxFQUFFSCxNQUFNSSxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQ3JEO0lBQ0Y7SUFFQUMsT0FBTyxFQUFFQyxRQUFRLEVBQXdDLEVBQUU7UUFDekQsTUFBTU4sUUFBUUosY0FBY1csY0FBYyxDQUFDRDtRQUUzQyxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUNQLGdCQUFnQixDQUFDQyxNQUFNO1lBQy9CUSxNQUFNLENBQUM7Ozs7U0FJSixFQUFFUixNQUFNSSxPQUFPLENBQUMsMkNBQTJDLEVBQUVKLE1BQU1HLEVBQUUsQ0FBQyxDQUFDLEVBQUVILE1BQU1JLE9BQU8sQ0FBQzs7Z0JBRWhGLEVBQUVKLE1BQU1JLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQXNCbEIsRUFBRUosTUFBTUksT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7O01BYXhCLENBQUMsQ0FBQ0ssSUFBSTtZQUNOQyxZQUFZLEVBQUU7UUFDaEI7SUFDRjtBQUNGIn0=
@@ -0,0 +1,5 @@
1
+ export * from "./template";
2
+ export * from "./helpers";
3
+ export * from "./entity-converter";
4
+ export * from "./zod-converter";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./template.js";
2
+ export * from "./helpers.js";
3
+ export * from "./entity-converter.js";
4
+ export * from "./zod-converter.js";
5
+
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi90ZW1wbGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGVscGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5LWNvbnZlcnRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vem9kLWNvbnZlcnRlclwiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZ0JBQWE7QUFDM0IsY0FBYyxlQUFZO0FBQzFCLGNBQWMsd0JBQXFCO0FBQ25DLGNBQWMscUJBQWtCIn0=
@@ -0,0 +1,39 @@
1
+ import { TemplateKey, TemplateOptions } from "../types/types";
2
+ import { EntityNamesRecord } from "../entity/entity-manager";
3
+ export type RenderedTemplate = {
4
+ target: string;
5
+ path: string;
6
+ body: string;
7
+ importKeys: string[];
8
+ customHeaders?: string[];
9
+ preTemplates?: {
10
+ key: TemplateKey;
11
+ options: TemplateOptions[TemplateKey];
12
+ }[];
13
+ };
14
+ /**
15
+ * 템플릿을 나타내는 베이스 클래스입니다.
16
+ */
17
+ export declare abstract class Template {
18
+ key: TemplateKey;
19
+ private static templates;
20
+ constructor(key: TemplateKey);
21
+ /**
22
+ * 템플릿 구현체가 있는 디렉토리의 모든 템플릿을 로드합니다.
23
+ * 템플릿이 필요(Template.find)해지기 전에 최소 한 번 호출해주셔야 합니다.
24
+ */
25
+ static autoload(): Promise<void>;
26
+ /**
27
+ * 템플릿 **인스턴스**를 key로 찾아옵니다.
28
+ * 만약 템플릿이 로드(loadAll)되지 않았거나 찾는 템플릿이 없다면 에러를 던집니다.
29
+ * @param key
30
+ * @returns
31
+ */
32
+ static find(key: TemplateKey): Template;
33
+ abstract render(options: TemplateOptions[TemplateKey], ...extra: unknown[]): RenderedTemplate | Promise<RenderedTemplate>;
34
+ abstract getTargetAndPath(names?: EntityNamesRecord, ...extra: unknown[]): {
35
+ target: string;
36
+ path: string;
37
+ };
38
+ }
39
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/template/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAK7D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE;QACb,GAAG,EAAE,WAAW,CAAC;QACjB,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;KACvC,EAAE,CAAC;CACL,CAAC;AAEF;;GAEG;AACH,8BAAsB,QAAQ;IAGT,GAAG,EAAE,WAAW;IAFnC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAyC;gBAE9C,GAAG,EAAE,WAAW;IAEnC;;;OAGG;WACiB,QAAQ;IA6B5B;;;;;OAKG;WACW,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ;aAQ9B,MAAM,CACpB,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,EACrC,GAAG,KAAK,EAAE,OAAO,EAAE,GAClB,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;aAE/B,gBAAgB,CAC9B,KAAK,CAAC,EAAE,iBAAiB,EACzB,GAAG,KAAK,EAAE,OAAO,EAAE,GAClB;QACD,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd;CACF"}
@@ -0,0 +1,47 @@
1
+ import { globAsync } from "../utils/async-utils.js";
2
+ import { importMembers } from "../utils/esm-utils.js";
3
+ import path from "path";
4
+ /**
5
+ * 템플릿을 나타내는 베이스 클래스입니다.
6
+ */ export class Template {
7
+ key;
8
+ static templates = new Map();
9
+ constructor(key){
10
+ this.key = key;
11
+ }
12
+ /**
13
+ * 템플릿 구현체가 있는 디렉토리의 모든 템플릿을 로드합니다.
14
+ * 템플릿이 필요(Template.find)해지기 전에 최소 한 번 호출해주셔야 합니다.
15
+ */ static async autoload() {
16
+ const templateFiles = await globAsync(// Sonamu의 코드베이스는 항상 빌드된 채로 dist 속에 머무르므로,
17
+ // 현재 파일을 기준으로 마찬가지로 dist 속에 있는 템플릿 구현체 js 파일들을 찾습니다.
18
+ path.join(import.meta.dirname, "implementations/*.template.js"));
19
+ for (const templateFile of templateFiles){
20
+ const templates = await importMembers(templateFile);
21
+ if (templates.length === 1 && typeof templates[0].value === "function" && templates[0].value.prototype instanceof Template) {
22
+ // 클래스의 인스턴스를 생성하여 등록
23
+ const instance = new templates[0].value();
24
+ this.templates.set(instance.key, instance);
25
+ } else {
26
+ throw new Error(`Template ${templateFile} should export only one class that extends Template`);
27
+ }
28
+ }
29
+ // console.log(
30
+ // chalk.gray(`[Loading] Loaded ${this.templates.size} templates.`)
31
+ // );
32
+ }
33
+ /**
34
+ * 템플릿 **인스턴스**를 key로 찾아옵니다.
35
+ * 만약 템플릿이 로드(loadAll)되지 않았거나 찾는 템플릿이 없다면 에러를 던집니다.
36
+ * @param key
37
+ * @returns
38
+ */ static find(key) {
39
+ const instance = this.templates.get(key);
40
+ if (!instance) {
41
+ throw new Error(`Template ${key} not found. It might be becasuse you tried to find a template before loading all templates. Did you call Template.loadAll()?`);
42
+ }
43
+ return instance;
44
+ }
45
+ }
46
+
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS90ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZUtleSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIFJlbmRlcmVkVGVtcGxhdGUgPSB7XG4gIHRhcmdldDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG4gIGN1c3RvbUhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgcHJlVGVtcGxhdGVzPzoge1xuICAgIGtleTogVGVtcGxhdGVLZXk7XG4gICAgb3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RlbXBsYXRlS2V5XTtcbiAgfVtdO1xufTtcblxuLyoqXG4gKiDthZztlIzrpr/snYQg64KY7YOA64K064qUIOuyoOydtOyKpCDtgbTrnpjsiqTsnoXri4jri6QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZW1wbGF0ZSB7XG4gIHByaXZhdGUgc3RhdGljIHRlbXBsYXRlczogTWFwPFRlbXBsYXRlS2V5LCBUZW1wbGF0ZT4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGtleTogVGVtcGxhdGVLZXkpIHt9XG5cbiAgLyoqXG4gICAqIO2FnO2UjOumvyDqtaztmITssrTqsIAg7J6I64qUIOuUlOugie2GoOumrOydmCDrqqjrk6Ag7YWc7ZSM66a/7J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAgICog7YWc7ZSM66a/7J20IO2VhOyalChUZW1wbGF0ZS5maW5kKe2VtOyngOq4sCDsoITsl5Ag7LWc7IaMIO2VnCDrsogg7Zi47Lac7ZW07KO87IWU7JW8IO2VqeuLiOuLpC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgYXV0b2xvYWQoKSB7XG4gICAgY29uc3QgdGVtcGxhdGVGaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhcbiAgICAgIC8vIFNvbmFtdeydmCDsvZTrk5zrsqDsnbTsiqTripQg7ZWt7IOBIOu5jOuTnOuQnCDssYTroZwgZGlzdCDsho3sl5Ag66i466y066W066+A66GcLFxuICAgICAgLy8g7ZiE7J6sIO2MjOydvOydhCDquLDspIDsnLzroZwg66eI7LCs6rCA7KeA66GcIGRpc3Qg7IaN7JeQIOyeiOuKlCDthZztlIzrpr8g6rWs7ZiE7LK0IGpzIO2MjOydvOuTpOydhCDssL7sirXri4jri6QuXG4gICAgICBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCJpbXBsZW1lbnRhdGlvbnMvKi50ZW1wbGF0ZS5qc1wiKVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHRlbXBsYXRlRmlsZSBvZiB0ZW1wbGF0ZUZpbGVzKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPGFueT4odGVtcGxhdGVGaWxlKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGVtcGxhdGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0eXBlb2YgdGVtcGxhdGVzWzBdLnZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgdGVtcGxhdGVzWzBdLnZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFRlbXBsYXRlXG4gICAgICApIHtcbiAgICAgICAgLy8g7YG0656Y7Iqk7J2YIOyduOyKpO2EtOyKpOulvCDsg53shLHtlZjsl6wg65Ox66GdXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRlbXBsYXRlc1swXS52YWx1ZSgpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlcy5zZXQoaW5zdGFuY2Uua2V5LCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlbXBsYXRlICR7dGVtcGxhdGVGaWxlfSBzaG91bGQgZXhwb3J0IG9ubHkgb25lIGNsYXNzIHRoYXQgZXh0ZW5kcyBUZW1wbGF0ZWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoYFtMb2FkaW5nXSBMb2FkZWQgJHt0aGlzLnRlbXBsYXRlcy5zaXplfSB0ZW1wbGF0ZXMuYClcbiAgICAvLyApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2FnO2UjOumvyAqKuyduOyKpO2EtOyKpCoq66W8IGtleeuhnCDssL7slYTsmLXri4jri6QuXG4gICAqIOunjOyVvSDthZztlIzrpr/snbQg66Gc65OcKGxvYWRBbGwp65CY7KeAIOyViuyVmOqxsOuCmCDssL7ripQg7YWc7ZSM66a/7J20IOyXhuuLpOuptCDsl5Drn6zrpbwg642Y7KeR64uI64ukLlxuICAgKiBAcGFyYW0ga2V5IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmluZChrZXk6IFRlbXBsYXRlS2V5KTogVGVtcGxhdGUge1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy50ZW1wbGF0ZXMuZ2V0KGtleSk7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW1wbGF0ZSAke2tleX0gbm90IGZvdW5kLiBJdCBtaWdodCBiZSBiZWNhc3VzZSB5b3UgdHJpZWQgdG8gZmluZCBhIHRlbXBsYXRlIGJlZm9yZSBsb2FkaW5nIGFsbCB0ZW1wbGF0ZXMuIERpZCB5b3UgY2FsbCBUZW1wbGF0ZS5sb2FkQWxsKCk/YCk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZW5kZXIoXG4gICAgb3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RlbXBsYXRlS2V5XSxcbiAgICAuLi5leHRyYTogdW5rbm93bltdXG4gICk6IFJlbmRlcmVkVGVtcGxhdGUgfCBQcm9taXNlPFJlbmRlcmVkVGVtcGxhdGU+O1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRUYXJnZXRBbmRQYXRoKFxuICAgIG5hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgLi4uZXh0cmE6IHVua25vd25bXVxuICApOiB7XG4gICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICB9O1xufVxuIl0sIm5hbWVzIjpbImdsb2JBc3luYyIsImltcG9ydE1lbWJlcnMiLCJwYXRoIiwiVGVtcGxhdGUiLCJ0ZW1wbGF0ZXMiLCJNYXAiLCJrZXkiLCJhdXRvbG9hZCIsInRlbXBsYXRlRmlsZXMiLCJqb2luIiwiZGlybmFtZSIsInRlbXBsYXRlRmlsZSIsImxlbmd0aCIsInZhbHVlIiwicHJvdG90eXBlIiwiaW5zdGFuY2UiLCJzZXQiLCJFcnJvciIsImZpbmQiLCJnZXQiXSwibWFwcGluZ3MiOiJBQUVBLFNBQVNBLFNBQVMsUUFBUSwwQkFBdUI7QUFDakQsU0FBU0MsYUFBYSxRQUFRLHdCQUFxQjtBQUNuRCxPQUFPQyxVQUFVLE9BQU87QUFjeEI7O0NBRUMsR0FDRCxPQUFPLE1BQWVDOztJQUNwQixPQUFlQyxZQUF3QyxJQUFJQyxNQUFNO0lBRWpFLFlBQVksQUFBT0MsR0FBZ0IsQ0FBRTthQUFsQkEsTUFBQUE7SUFBbUI7SUFFdEM7OztHQUdDLEdBQ0QsYUFBb0JDLFdBQVc7UUFDN0IsTUFBTUMsZ0JBQWdCLE1BQU1SLFVBQzFCLDBDQUEwQztRQUMxQyxxREFBcUQ7UUFDckRFLEtBQUtPLElBQUksQ0FBQyxZQUFZQyxPQUFPLEVBQUU7UUFHakMsS0FBSyxNQUFNQyxnQkFBZ0JILGNBQWU7WUFDeEMsTUFBTUosWUFBWSxNQUFNSCxjQUFtQlU7WUFDM0MsSUFDRVAsVUFBVVEsTUFBTSxLQUFLLEtBQ3JCLE9BQU9SLFNBQVMsQ0FBQyxFQUFFLENBQUNTLEtBQUssS0FBSyxjQUM5QlQsU0FBUyxDQUFDLEVBQUUsQ0FBQ1MsS0FBSyxDQUFDQyxTQUFTLFlBQVlYLFVBQ3hDO2dCQUNBLHFCQUFxQjtnQkFDckIsTUFBTVksV0FBVyxJQUFJWCxTQUFTLENBQUMsRUFBRSxDQUFDUyxLQUFLO2dCQUN2QyxJQUFJLENBQUNULFNBQVMsQ0FBQ1ksR0FBRyxDQUFDRCxTQUFTVCxHQUFHLEVBQUVTO1lBQ25DLE9BQU87Z0JBQ0wsTUFBTSxJQUFJRSxNQUNSLENBQUMsU0FBUyxFQUFFTixhQUFhLG1EQUFtRCxDQUFDO1lBRWpGO1FBQ0Y7SUFFQSxlQUFlO0lBQ2YscUVBQXFFO0lBQ3JFLEtBQUs7SUFDUDtJQUVBOzs7OztHQUtDLEdBQ0QsT0FBY08sS0FBS1osR0FBZ0IsRUFBWTtRQUM3QyxNQUFNUyxXQUFXLElBQUksQ0FBQ1gsU0FBUyxDQUFDZSxHQUFHLENBQUNiO1FBQ3BDLElBQUksQ0FBQ1MsVUFBVTtZQUNiLE1BQU0sSUFBSUUsTUFBTSxDQUFDLFNBQVMsRUFBRVgsSUFBSSw0SEFBNEgsQ0FBQztRQUMvSjtRQUNBLE9BQU9TO0lBQ1Q7QUFjRiJ9
@@ -0,0 +1,18 @@
1
+ import z from "zod";
2
+ import { EntityProp, RenderingNode } from "../types/types";
3
+ /**
4
+ * Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
5
+ * dist 디렉토리에서 ESM으로 import하여 가져옵니다.
6
+ */
7
+ export declare function getZodTypeById(zodTypeId: string): Promise<z.ZodTypeAny>;
8
+ /**
9
+ * Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
10
+ * 재귀적으로 중첩된 타입들을 처리합니다.
11
+ */
12
+ export declare function zodTypeToRenderingNode(zodType: z.ZodType<any>, baseKey?: string): RenderingNode;
13
+ /**
14
+ * EntityProp을 Zod 타입으로 변환합니다.
15
+ * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
16
+ */
17
+ export declare function propToZodType(prop: EntityProp): Promise<z.ZodTypeAny>;
18
+ //# sourceMappingURL=zod-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EACL,UAAU,EAoBV,aAAa,EACd,MAAM,gBAAgB,CAAC;AAOxB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAe7E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EACvB,OAAO,GAAE,MAAe,GACvB,aAAa,CA0Df;AA8CD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAmD3E"}
@@ -0,0 +1,166 @@
1
+ import z from "zod";
2
+ import { EntityManager } from "../entity/entity-manager.js";
3
+ import { isBelongsToOneRelationProp, isBigIntegerProp, isBooleanProp, isDateProp, isDateTimeProp, isDecimalProp, isDoubleProp, isEnumProp, isFloatProp, isIntegerProp, isJsonProp, isOneToOneRelationProp, isRelationProp, isStringProp, isTextProp, isTimeProp, isTimestampProp, isUuidProp, isVirtualProp } from "../types/types.js";
4
+ import path from "path";
5
+ import { createImportUrl } from "../utils/esm-utils.js";
6
+ import { Sonamu } from "../api/sonamu.js";
7
+ import inflection from "inflection";
8
+ import { getTextTypeLength } from "../api/index.js";
9
+ /**
10
+ * Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
11
+ * dist 디렉토리에서 ESM으로 import하여 가져옵니다.
12
+ */ export async function getZodTypeById(zodTypeId) {
13
+ const modulePath = EntityManager.getModulePath(zodTypeId);
14
+ const moduleAbsPath = path.join(Sonamu.apiRootPath, "dist", "application", modulePath + ".js");
15
+ const importUrl = createImportUrl(moduleAbsPath);
16
+ const imported = await import(importUrl);
17
+ if (!imported[zodTypeId]) {
18
+ throw new Error(`존재하지 않는 zodTypeId ${zodTypeId}`);
19
+ }
20
+ return imported[zodTypeId].describe(zodTypeId);
21
+ }
22
+ /**
23
+ * Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
24
+ * 재귀적으로 중첩된 타입들을 처리합니다.
25
+ */ export function zodTypeToRenderingNode(zodType, baseKey = "root") {
26
+ const def = {
27
+ name: baseKey,
28
+ label: inflection.camelize(baseKey, false),
29
+ zodType
30
+ };
31
+ if (zodType instanceof z.ZodObject) {
32
+ const columnKeys = Object.keys(zodType.shape);
33
+ const children = columnKeys.map((key)=>{
34
+ const innerType = zodType.shape[key];
35
+ return zodTypeToRenderingNode(innerType, key);
36
+ });
37
+ return {
38
+ ...def,
39
+ renderType: "object",
40
+ children
41
+ };
42
+ } else if (zodType instanceof z.ZodArray) {
43
+ const innerType = zodType.def.element;
44
+ if (innerType instanceof z.ZodString && baseKey.includes("images")) {
45
+ return {
46
+ ...def,
47
+ renderType: "array-images"
48
+ };
49
+ }
50
+ return {
51
+ ...def,
52
+ renderType: "array",
53
+ element: zodTypeToRenderingNode(innerType, baseKey)
54
+ };
55
+ } else if (zodType instanceof z.ZodUnion) {
56
+ const optionNodes = zodType.def.options.map((opt)=>zodTypeToRenderingNode(opt, baseKey));
57
+ // TODO: ZodUnion이 들어있는 경우 핸들링
58
+ return optionNodes[0];
59
+ } else if (zodType instanceof z.ZodOptional) {
60
+ return {
61
+ ...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
62
+ optional: true
63
+ };
64
+ } else if (zodType instanceof z.ZodNullable) {
65
+ return {
66
+ ...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
67
+ nullable: true
68
+ };
69
+ } else {
70
+ return {
71
+ ...def,
72
+ renderType: resolveRenderType(baseKey, zodType)
73
+ };
74
+ }
75
+ }
76
+ /**
77
+ * Zod 타입과 키 이름으로부터 적절한 RenderType을 결정합니다.
78
+ */ function resolveRenderType(key, zodType) {
79
+ if (zodType instanceof z.ZodDate) {
80
+ return "datetime";
81
+ } else if (zodType instanceof z.ZodString) {
82
+ if (key.includes("img") || key.includes("image")) {
83
+ return "string-image";
84
+ } else if (zodType.description === "SQLDateTimeString") {
85
+ return "string-datetime";
86
+ } else if (key.endsWith("date")) {
87
+ return "string-date";
88
+ } else {
89
+ return "string-plain";
90
+ }
91
+ } else if (zodType instanceof z.ZodNumber) {
92
+ if (key === "id") {
93
+ return "number-id";
94
+ } else if (key.endsWith("_id")) {
95
+ return "number-fk_id";
96
+ } else {
97
+ return "number-plain";
98
+ }
99
+ } else if (zodType instanceof z.ZodBoolean) {
100
+ return "boolean";
101
+ } else if (zodType instanceof z.ZodEnum) {
102
+ return "enums";
103
+ } else if (zodType instanceof z.ZodRecord) {
104
+ return "record";
105
+ } else if (zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown) {
106
+ return "string-plain";
107
+ } else if (zodType instanceof z.ZodUnion) {
108
+ return "string-plain";
109
+ } else if (zodType instanceof z.ZodLiteral) {
110
+ return "string-plain";
111
+ } else {
112
+ throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
113
+ }
114
+ }
115
+ /**
116
+ * EntityProp을 Zod 타입으로 변환합니다.
117
+ * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
118
+ */ export async function propToZodType(prop) {
119
+ let zodType = z.unknown();
120
+ if (isIntegerProp(prop)) {
121
+ zodType = z.number().int();
122
+ } else if (isBigIntegerProp(prop)) {
123
+ zodType = z.bigint();
124
+ } else if (isTextProp(prop)) {
125
+ zodType = z.string().max(getTextTypeLength(prop.textType));
126
+ } else if (isEnumProp(prop)) {
127
+ zodType = await getZodTypeById(prop.id);
128
+ } else if (isStringProp(prop)) {
129
+ zodType = z.string().max(prop.length);
130
+ } else if (isFloatProp(prop) || isDoubleProp(prop)) {
131
+ zodType = z.number();
132
+ } else if (isDecimalProp(prop)) {
133
+ zodType = z.string();
134
+ } else if (isBooleanProp(prop)) {
135
+ zodType = z.boolean();
136
+ } else if (isDateProp(prop)) {
137
+ zodType = z.string().length(10);
138
+ } else if (isTimeProp(prop)) {
139
+ zodType = z.string().length(8);
140
+ } else if (isDateTimeProp(prop)) {
141
+ zodType = z.date();
142
+ } else if (isTimestampProp(prop)) {
143
+ zodType = z.date();
144
+ } else if (isJsonProp(prop)) {
145
+ zodType = await getZodTypeById(prop.id);
146
+ } else if (isUuidProp(prop)) {
147
+ zodType = z.uuid();
148
+ } else if (isVirtualProp(prop)) {
149
+ zodType = await getZodTypeById(prop.id);
150
+ } else if (isRelationProp(prop)) {
151
+ if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
152
+ zodType = z.number().int();
153
+ }
154
+ } else {
155
+ throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
156
+ }
157
+ if (prop.unsigned) {
158
+ zodType = zodType.nonnegative();
159
+ }
160
+ if (prop.nullable) {
161
+ zodType = zodType.nullable();
162
+ }
163
+ return zodType;
164
+ }
165
+
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB6IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBFbnRpdHlQcm9wLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyUHJvcCxcbiAgaXNCb29sZWFuUHJvcCxcbiAgaXNEYXRlUHJvcCxcbiAgaXNEYXRlVGltZVByb3AsXG4gIGlzRGVjaW1hbFByb3AsXG4gIGlzRG91YmxlUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNGbG9hdFByb3AsXG4gIGlzSW50ZWdlclByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVGV4dFByb3AsXG4gIGlzVGltZVByb3AsXG4gIGlzVGltZXN0YW1wUHJvcCxcbiAgaXNVdWlkUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgUmVuZGVyaW5nTm9kZSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBnZXRUZXh0VHlwZUxlbmd0aCB9IGZyb20gXCIuLi9hcGlcIjtcblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIFwiZGlzdFwiLFxuICAgIFwiYXBwbGljYXRpb25cIixcbiAgICBtb2R1bGVQYXRoICsgXCIuanNcIlxuICApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlPGFueT4sXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU8YW55Pj4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoXG4gICAgICAob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSlcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgICh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleVxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5XG4gICAgICApLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKFxuICBrZXk6IHN0cmluZyxcbiAgem9kVHlwZTogei5ab2RUeXBlQW55XG4pOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc1RleHRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KGdldFRleHRUeXBlTGVuZ3RoKHByb3AudGV4dFR5cGUpKTtcbiAgfSBlbHNlIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAoaXNGbG9hdFByb3AocHJvcCkgfHwgaXNEb3VibGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNEZWNpbWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCgxMCk7XG4gIH0gZWxzZSBpZiAoaXNUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCg4KTtcbiAgfSBlbHNlIGlmIChpc0RhdGVUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc1RpbWVzdGFtcFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoXG4gICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cbiJdLCJuYW1lcyI6WyJ6IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyUHJvcCIsImlzQm9vbGVhblByb3AiLCJpc0RhdGVQcm9wIiwiaXNEYXRlVGltZVByb3AiLCJpc0RlY2ltYWxQcm9wIiwiaXNEb3VibGVQcm9wIiwiaXNFbnVtUHJvcCIsImlzRmxvYXRQcm9wIiwiaXNJbnRlZ2VyUHJvcCIsImlzSnNvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1N0cmluZ1Byb3AiLCJpc1RleHRQcm9wIiwiaXNUaW1lUHJvcCIsImlzVGltZXN0YW1wUHJvcCIsImlzVXVpZFByb3AiLCJpc1ZpcnR1YWxQcm9wIiwicGF0aCIsImNyZWF0ZUltcG9ydFVybCIsIlNvbmFtdSIsImluZmxlY3Rpb24iLCJnZXRUZXh0VHlwZUxlbmd0aCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsInpvZFR5cGUiLCJiYXNlS2V5IiwiZGVmIiwibmFtZSIsImxhYmVsIiwiY2FtZWxpemUiLCJab2RPYmplY3QiLCJjb2x1bW5LZXlzIiwiT2JqZWN0Iiwia2V5cyIsInNoYXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJrZXkiLCJpbm5lclR5cGUiLCJyZW5kZXJUeXBlIiwiWm9kQXJyYXkiLCJlbGVtZW50IiwiWm9kU3RyaW5nIiwiaW5jbHVkZXMiLCJab2RVbmlvbiIsIm9wdGlvbk5vZGVzIiwib3B0aW9ucyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsIm51bGxhYmxlIiwicmVzb2x2ZVJlbmRlclR5cGUiLCJab2REYXRlIiwiZGVzY3JpcHRpb24iLCJlbmRzV2l0aCIsIlpvZE51bWJlciIsIlpvZEJvb2xlYW4iLCJab2RFbnVtIiwiWm9kUmVjb3JkIiwiWm9kQW55IiwiWm9kVW5rbm93biIsIlpvZExpdGVyYWwiLCJ0eXBlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ1bmtub3duIiwibnVtYmVyIiwiaW50IiwiYmlnaW50Iiwic3RyaW5nIiwibWF4IiwidGV4dFR5cGUiLCJpZCIsImxlbmd0aCIsImJvb2xlYW4iLCJkYXRlIiwidXVpZCIsImhhc0pvaW5Db2x1bW4iLCJ1bnNpZ25lZCIsIm5vbm5lZ2F0aXZlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxPQUFPLE1BQU07QUFDcEIsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUVFQywwQkFBMEIsRUFDMUJDLGdCQUFnQixFQUNoQkMsYUFBYSxFQUNiQyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsYUFBYSxFQUNiQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsV0FBVyxFQUNYQyxhQUFhLEVBQ2JDLFVBQVUsRUFD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
@@ -1,2 +1,80 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"RelationGraph",{enumerable:true,get:function(){return RelationGraph}});var _entitymanager=require("../entity/entity-manager");var _types=require("../types/types");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}var RelationGraph=/*#__PURE__*/function(){"use strict";function RelationGraph(){_class_call_check(this,RelationGraph);_define_property(this,"graph",new Map)}_create_class(RelationGraph,[{key:"buildGraph",value:function buildGraph(fixtures){this.graph.clear();var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=fixtures[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var fixture=_step.value;this.graph.set(fixture.fixtureId,{fixtureId:fixture.fixtureId,entityId:fixture.entityId,related:new Set})}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}var _iteratorNormalCompletion1=true,_didIteratorError1=false,_iteratorError1=undefined;try{for(var _iterator1=fixtures[Symbol.iterator](),_step1;!(_iteratorNormalCompletion1=(_step1=_iterator1.next()).done);_iteratorNormalCompletion1=true){var fixture1=_step1.value;var node=this.graph.get(fixture1.fixtureId);var _iteratorNormalCompletion2=true,_didIteratorError2=false,_iteratorError2=undefined;try{for(var _iterator2=Object.entries(fixture1.columns)[Symbol.iterator](),_step2;!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=true){var _step_value=_sliced_to_array(_step2.value,2),column=_step_value[1];var prop=column.prop;if((0,_types.isRelationProp)(prop)){if((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn){var relatedFixtureId="".concat(prop.with,"#").concat(column.value);if(this.graph.has(relatedFixtureId)){node.related.add(relatedFixtureId)}}else if((0,_types.isManyToManyRelationProp)(prop)){var relatedIds=column.value;var _iteratorNormalCompletion3=true,_didIteratorError3=false,_iteratorError3=undefined;try{for(var _iterator3=relatedIds[Symbol.iterator](),_step3;!(_iteratorNormalCompletion3=(_step3=_iterator3.next()).done);_iteratorNormalCompletion3=true){var relatedId=_step3.value;var relatedFixtureId1="".concat(prop.with,"#").concat(relatedId);if(this.graph.has(relatedFixtureId1)){node.related.add(relatedFixtureId1);this.graph.get(relatedFixtureId1).related.add(fixture1.fixtureId)}}}catch(err){_didIteratorError3=true;_iteratorError3=err}finally{try{if(!_iteratorNormalCompletion3&&_iterator3.return!=null){_iterator3.return()}}finally{if(_didIteratorError3){throw _iteratorError3}}}}}}}catch(err){_didIteratorError2=true;_iteratorError2=err}finally{try{if(!_iteratorNormalCompletion2&&_iterator2.return!=null){_iterator2.return()}}finally{if(_didIteratorError2){throw _iteratorError2}}}}}catch(err){_didIteratorError1=true;_iteratorError1=err}finally{try{if(!_iteratorNormalCompletion1&&_iterator1.return!=null){_iterator1.return()}}finally{if(_didIteratorError1){throw _iteratorError1}}}}},{key:"getInsertionOrder",value:function getInsertionOrder(){var _this=this;var visited=new Set;var order=[];var tempVisited=new Set;var visit=function(fixtureId){if(visited.has(fixtureId))return;if(tempVisited.has(fixtureId)){console.warn("Circular dependency detected involving: ".concat(fixtureId));return}tempVisited.add(fixtureId);var node=_this.graph.get(fixtureId);var entity=_entitymanager.EntityManager.get(node.entityId);var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{var _loop=function(){var depId=_step.value;var depNode=_this.graph.get(depId);var relationProp=entity.props.find(function(prop){return(0,_types.isRelationProp)(prop)&&((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn)&&prop.with===depNode.entityId});if(relationProp&&!relationProp.nullable){visit(depId)}};for(var _iterator=node.related[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true)_loop()}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}tempVisited.delete(fixtureId);visited.add(fixtureId);order.push(fixtureId)};var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=this.graph.keys()[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var fixtureId=_step.value;visit(fixtureId)}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}var _iteratorNormalCompletion1=true,_didIteratorError1=false,_iteratorError1=undefined;try{for(var _iterator1=this.graph.keys()[Symbol.iterator](),_step1;!(_iteratorNormalCompletion1=(_step1=_iterator1.next()).done);_iteratorNormalCompletion1=true){var fixtureId1=_step1.value;if(!visited.has(fixtureId1)){order.push(fixtureId1)}}}catch(err){_didIteratorError1=true;_iteratorError1=err}finally{try{if(!_iteratorNormalCompletion1&&_iterator1.return!=null){_iterator1.return()}}finally{if(_didIteratorError1){throw _iteratorError1}}}return order}}]);return RelationGraph}();
2
- //# sourceMappingURL=_relation-graph.js.map
1
+ import { EntityManager } from "../entity/entity-manager.js";
2
+ import { isRelationProp, isBelongsToOneRelationProp, isOneToOneRelationProp, isManyToManyRelationProp } from "../types/types.js";
3
+ // 관계 그래프 처리를 별도 클래스로 분리
4
+ export class RelationGraph {
5
+ graph = new Map();
6
+ buildGraph(fixtures) {
7
+ this.graph.clear();
8
+ // 1. 노드 추가
9
+ for (const fixture of fixtures){
10
+ this.graph.set(fixture.fixtureId, {
11
+ fixtureId: fixture.fixtureId,
12
+ entityId: fixture.entityId,
13
+ related: new Set()
14
+ });
15
+ }
16
+ // 2. 의존성 추가
17
+ for (const fixture of fixtures){
18
+ const node = this.graph.get(fixture.fixtureId);
19
+ for (const [, column] of Object.entries(fixture.columns)){
20
+ const prop = column.prop;
21
+ if (isRelationProp(prop)) {
22
+ if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
23
+ const relatedFixtureId = `${prop.with}#${column.value}`;
24
+ if (this.graph.has(relatedFixtureId)) {
25
+ node.related.add(relatedFixtureId);
26
+ }
27
+ } else if (isManyToManyRelationProp(prop)) {
28
+ // ManyToMany 관계의 경우 양방향 의존성 추가
29
+ const relatedIds = column.value;
30
+ for (const relatedId of relatedIds){
31
+ const relatedFixtureId = `${prop.with}#${relatedId}`;
32
+ if (this.graph.has(relatedFixtureId)) {
33
+ node.related.add(relatedFixtureId);
34
+ this.graph.get(relatedFixtureId).related.add(fixture.fixtureId);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ getInsertionOrder() {
43
+ const visited = new Set();
44
+ const order = [];
45
+ const tempVisited = new Set();
46
+ const visit = (fixtureId)=>{
47
+ if (visited.has(fixtureId)) return;
48
+ if (tempVisited.has(fixtureId)) {
49
+ console.warn(`Circular dependency detected involving: ${fixtureId}`);
50
+ return;
51
+ }
52
+ tempVisited.add(fixtureId);
53
+ const node = this.graph.get(fixtureId);
54
+ const entity = EntityManager.get(node.entityId);
55
+ for (const depId of node.related){
56
+ const depNode = this.graph.get(depId);
57
+ // BelongsToOne 관계이면서 nullable이 아닌 경우 먼저 방문
58
+ const relationProp = entity.props.find((prop)=>isRelationProp(prop) && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) && prop.with === depNode.entityId);
59
+ if (relationProp && !relationProp.nullable) {
60
+ visit(depId);
61
+ }
62
+ }
63
+ tempVisited.delete(fixtureId);
64
+ visited.add(fixtureId);
65
+ order.push(fixtureId);
66
+ };
67
+ for (const fixtureId of this.graph.keys()){
68
+ visit(fixtureId);
69
+ }
70
+ // circular dependency로 인해 방문되지 않은 fixtureId 추가
71
+ for (const fixtureId of this.graph.keys()){
72
+ if (!visited.has(fixtureId)) {
73
+ order.push(fixtureId);
74
+ }
75
+ }
76
+ return order;
77
+ }
78
+ }
79
+
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbk5vZGUsIEVudGl0eVByb3AsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5cbi8vIOq0gOqzhCDqt7jrnpjtlIQg7LKY66as66W8IOuzhOuPhCDtgbTrnpjsiqTroZwg67aE66asXG5leHBvcnQgY2xhc3MgUmVsYXRpb25HcmFwaCB7XG4gIHByaXZhdGUgZ3JhcGg6IE1hcDxzdHJpbmcsIFJlbGF0aW9uTm9kZT4gPSBuZXcgTWFwKCk7XG5cbiAgYnVpbGRHcmFwaChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogdm9pZCB7XG4gICAgdGhpcy5ncmFwaC5jbGVhcigpO1xuXG4gICAgLy8gMS4g64W465OcIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgdGhpcy5ncmFwaC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHtcbiAgICAgICAgZml4dHVyZUlkOiBmaXh0dXJlLmZpeHR1cmVJZCxcbiAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgIHJlbGF0ZWQ6IG5ldyBTZXQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIOydmOyhtOyEsSDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLmdldChmaXh0dXJlLmZpeHR1cmVJZCkhO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3AgYXMgRW50aXR5UHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVsYXRlZC5hZGQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmFwaFxuICAgICAgICAgICAgICAgICAgLmdldChyZWxhdGVkRml4dHVyZUlkKSFcbiAgICAgICAgICAgICAgICAgIC5yZWxhdGVkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbnNlcnRpb25PcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRlbXBWaXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCB2aXNpdCA9IChmaXh0dXJlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHJldHVybjtcbiAgICAgIGlmICh0ZW1wVmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgaW52b2x2aW5nOiAke2ZpeHR1cmVJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmVJZCkhO1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQobm9kZS5lbnRpdHlJZCk7XG5cbiAgICAgIGZvciAoY29uc3QgZGVwSWQgb2Ygbm9kZS5yZWxhdGVkKSB7XG4gICAgICAgIGNvbnN0IGRlcE5vZGUgPSB0aGlzLmdyYXBoLmdldChkZXBJZCkhO1xuXG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSDqtIDqs4TsnbTrqbTshJwgbnVsbGFibGXsnbQg7JWE64uMIOqyveyasCDrqLzsoIAg67Cp66y4XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSAmJlxuICAgICAgICAgICAgcHJvcC53aXRoID09PSBkZXBOb2RlLmVudGl0eUlkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWxhdGlvblByb3AgJiYgIXJlbGF0aW9uUHJvcC5udWxsYWJsZSkge1xuICAgICAgICAgIHZpc2l0KGRlcElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5kZWxldGUoZml4dHVyZUlkKTtcbiAgICAgIHZpc2l0ZWQuYWRkKGZpeHR1cmVJZCk7XG4gICAgICBvcmRlci5wdXNoKGZpeHR1cmVJZCk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICB2aXNpdChmaXh0dXJlSWQpO1xuICAgIH1cblxuICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3nroZwg7J247ZW0IOuwqeusuOuQmOyngCDslYrsnYAgZml4dHVyZUlkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkVudGl0eU1hbmFnZXIiLCJpc1JlbGF0aW9uUHJvcCIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsIlJlbGF0aW9uR3JhcGgiLCJncmFwaCIsIk1hcCIsImJ1aWxkR3JhcGgiLCJmaXh0dXJlcyIsImNsZWFyIiwiZml4dHVyZSIsInNldCIsImZpeHR1cmVJZCIsImVudGl0eUlkIiwicmVsYXRlZCIsIlNldCIsIm5vZGUiLCJnZXQiLCJjb2x1bW4iLCJPYmplY3QiLCJlbnRyaWVzIiwiY29sdW1ucyIsInByb3AiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEZpeHR1cmVJZCIsIndpdGgiLCJ2YWx1ZSIsImhhcyIsImFkZCIsInJlbGF0ZWRJZHMiLCJyZWxhdGVkSWQiLCJnZXRJbnNlcnRpb25PcmRlciIsInZpc2l0ZWQiLCJvcmRlciIsInRlbXBWaXNpdGVkIiwidmlzaXQiLCJjb25zb2xlIiwid2FybiIsImVudGl0eSIsImRlcElkIiwiZGVwTm9kZSIsInJlbGF0aW9uUHJvcCIsInByb3BzIiwiZmluZCIsIm51bGxhYmxlIiwiZGVsZXRlIiwicHVzaCIsImtleXMiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FDRUMsY0FBYyxFQUNkQywwQkFBMEIsRUFDMUJDLHNCQUFzQixFQUN0QkMsd0JBQXdCLFFBQ25CLG9CQUFpQjtBQUV4Qix3QkFBd0I7QUFDeEIsT0FBTyxNQUFNQztJQUNIQyxRQUFtQyxJQUFJQyxNQUFNO0lBRXJEQyxXQUFXQyxRQUF5QixFQUFRO1FBQzFDLElBQUksQ0FBQ0gsS0FBSyxDQUFDSSxLQUFLO1FBRWhCLFdBQVc7UUFDWCxLQUFLLE1BQU1DLFdBQVdGLFNBQVU7WUFDOUIsSUFBSSxDQUFDSCxLQUFLLENBQUNNLEdBQUcsQ0FBQ0QsUUFBUUUsU0FBUyxFQUFFO2dCQUNoQ0EsV0FBV0YsUUFBUUUsU0FBUztnQkFDNUJDLFVBQVVILFFBQVFHLFFBQVE7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
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EAQrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAE5C,IAAI;IA0BE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;IAmEnC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;IAKvC,IAAI;IAgEV,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAwB7C,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IA8Ed,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB;IA0E/B,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAoFrB,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE;IAyD5B,OAAO,CAAC,iBAAiB;YA0BX,aAAa;YAiCb,yBAAyB;IAkDjC,gBAAgB,CAAC,IAAI,EAAE,MAAM;YAsBrB,oBAAoB;CAyCnC;AACD,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
1
+ {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EAQrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAE5C,IAAI;IA0BE,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;IAmEnC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;IAKvC,IAAI;IAgEV,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAwB7C,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IA8Ed,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB;IA6E/B,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAoFrB,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE;IA2D5B,OAAO,CAAC,iBAAiB;YA0BX,aAAa;YAmCb,yBAAyB;IAkDjC,gBAAgB,CAAC,IAAI,EAAE,MAAM;YAsBrB,oBAAoB;CAyCnC;AACD,eAAO,MAAM,cAAc,qBAA4B,CAAC"}