sonamu 0.5.7 → 0.7.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 (529) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +13 -2
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +71 -2
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +258 -2
  44. package/dist/api/config.d.ts +90 -0
  45. package/dist/api/config.d.ts.map +1 -0
  46. package/dist/api/config.js +25 -0
  47. package/dist/api/context.d.ts +4 -2
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +3 -2
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +235 -2
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +9 -2
  56. package/dist/api/sonamu.d.ts +10 -24
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +514 -2
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +6 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +15 -2
  65. package/dist/bin/cli.js +519 -2
  66. package/dist/bin/hot-hook-register.d.ts +11 -0
  67. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  68. package/dist/bin/hot-hook-register.js +21 -0
  69. package/dist/bin/loader-register.d.ts +2 -0
  70. package/dist/bin/loader-register.d.ts.map +1 -0
  71. package/dist/bin/loader-register.js +34 -0
  72. package/dist/database/_batch_update.d.ts +5 -3
  73. package/dist/database/_batch_update.d.ts.map +1 -1
  74. package/dist/database/_batch_update.js +95 -2
  75. package/dist/database/base-model.d.ts +96 -10
  76. package/dist/database/base-model.d.ts.map +1 -1
  77. package/dist/database/base-model.js +390 -2
  78. package/dist/database/base-model.types.d.ts +93 -0
  79. package/dist/database/base-model.types.d.ts.map +1 -0
  80. package/dist/database/base-model.types.js +10 -0
  81. package/dist/database/code-generator.d.ts +1 -1
  82. package/dist/database/code-generator.d.ts.map +1 -1
  83. package/dist/database/code-generator.js +54 -2
  84. package/dist/database/db.d.ts +6 -21
  85. package/dist/database/db.d.ts.map +1 -1
  86. package/dist/database/db.js +129 -2
  87. package/dist/database/puri-subset.test-d.js +81 -0
  88. package/dist/database/puri-subset.types.d.ts +123 -0
  89. package/dist/database/puri-subset.types.d.ts.map +1 -0
  90. package/dist/database/puri-subset.types.js +16 -0
  91. package/dist/database/puri-wrapper.d.ts +13 -11
  92. package/dist/database/puri-wrapper.d.ts.map +1 -1
  93. package/dist/database/puri-wrapper.js +109 -2
  94. package/dist/database/puri.d.ts +41 -23
  95. package/dist/database/puri.d.ts.map +1 -1
  96. package/dist/database/puri.js +601 -2
  97. package/dist/database/puri.types.d.ts +25 -6
  98. package/dist/database/puri.types.d.ts.map +1 -1
  99. package/dist/database/puri.types.js +6 -2
  100. package/dist/database/transaction-context.d.ts +1 -1
  101. package/dist/database/transaction-context.d.ts.map +1 -1
  102. package/dist/database/transaction-context.js +14 -2
  103. package/dist/database/upsert-builder.d.ts +9 -3
  104. package/dist/database/upsert-builder.d.ts.map +1 -1
  105. package/dist/database/upsert-builder.js +365 -2
  106. package/dist/entity/entity-manager.d.ts +167 -2
  107. package/dist/entity/entity-manager.d.ts.map +1 -1
  108. package/dist/entity/entity-manager.js +130 -2
  109. package/dist/entity/entity.d.ts +5 -3
  110. package/dist/entity/entity.d.ts.map +1 -1
  111. package/dist/entity/entity.js +750 -2
  112. package/dist/exceptions/error-handler.d.ts +1 -1
  113. package/dist/exceptions/error-handler.d.ts.map +1 -1
  114. package/dist/exceptions/error-handler.js +29 -2
  115. package/dist/exceptions/so-exceptions.d.ts +1 -1
  116. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  117. package/dist/exceptions/so-exceptions.js +85 -2
  118. package/dist/file-storage/driver.d.ts +1 -1
  119. package/dist/file-storage/driver.d.ts.map +1 -1
  120. package/dist/file-storage/driver.js +79 -2
  121. package/dist/file-storage/file-storage.js +75 -2
  122. package/dist/index.d.ts +18 -9
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +34 -2
  125. package/dist/migration/code-generation.d.ts +1 -1
  126. package/dist/migration/code-generation.d.ts.map +1 -1
  127. package/dist/migration/code-generation.js +614 -2
  128. package/dist/migration/migration-set.d.ts +2 -10
  129. package/dist/migration/migration-set.d.ts.map +1 -1
  130. package/dist/migration/migration-set.js +213 -2
  131. package/dist/migration/migrator.d.ts +24 -82
  132. package/dist/migration/migrator.d.ts.map +1 -1
  133. package/dist/migration/migrator.js +330 -2
  134. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  135. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  136. package/dist/migration/postgresql-schema-reader.js +245 -0
  137. package/dist/migration/types.d.ts +6 -38
  138. package/dist/migration/types.d.ts.map +1 -1
  139. package/dist/migration/types.js +3 -2
  140. package/dist/naite/messaging-types.d.ts +43 -0
  141. package/dist/naite/messaging-types.d.ts.map +1 -0
  142. package/dist/naite/messaging-types.js +7 -0
  143. package/dist/naite/naite-reporter.d.ts +41 -0
  144. package/dist/naite/naite-reporter.d.ts.map +1 -0
  145. package/dist/naite/naite-reporter.js +102 -0
  146. package/dist/naite/naite.d.ts +95 -0
  147. package/dist/naite/naite.d.ts.map +1 -0
  148. package/dist/naite/naite.js +316 -0
  149. package/dist/stream/index.js +3 -2
  150. package/dist/stream/sse.d.ts +2 -2
  151. package/dist/stream/sse.d.ts.map +1 -1
  152. package/dist/stream/sse.js +38 -2
  153. package/dist/syncer/api-parser.d.ts +10 -0
  154. package/dist/syncer/api-parser.d.ts.map +1 -0
  155. package/dist/syncer/api-parser.js +240 -0
  156. package/dist/syncer/checksum.d.ts +21 -0
  157. package/dist/syncer/checksum.d.ts.map +1 -0
  158. package/dist/syncer/checksum.js +98 -0
  159. package/dist/syncer/code-generator.d.ts +20 -0
  160. package/dist/syncer/code-generator.d.ts.map +1 -0
  161. package/dist/syncer/code-generator.js +161 -0
  162. package/dist/syncer/entity-operations.d.ts +17 -0
  163. package/dist/syncer/entity-operations.d.ts.map +1 -0
  164. package/dist/syncer/entity-operations.js +59 -0
  165. package/dist/syncer/file-patterns.d.ts +29 -0
  166. package/dist/syncer/file-patterns.d.ts.map +1 -0
  167. package/dist/syncer/file-patterns.js +38 -0
  168. package/dist/syncer/index.d.ts +6 -0
  169. package/dist/syncer/index.d.ts.map +1 -1
  170. package/dist/syncer/index.js +9 -2
  171. package/dist/syncer/module-loader.d.ts +35 -0
  172. package/dist/syncer/module-loader.d.ts.map +1 -0
  173. package/dist/syncer/module-loader.js +87 -0
  174. package/dist/syncer/syncer.d.ts +98 -106
  175. package/dist/syncer/syncer.d.ts.map +1 -1
  176. package/dist/syncer/syncer.js +422 -2
  177. package/dist/template/entity-converter.d.ts +14 -0
  178. package/dist/template/entity-converter.d.ts.map +1 -0
  179. package/dist/template/entity-converter.js +108 -0
  180. package/dist/template/helpers.d.ts +23 -0
  181. package/dist/template/helpers.d.ts.map +1 -0
  182. package/dist/template/helpers.js +64 -0
  183. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  184. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  185. package/dist/template/implementations/entity.template.js +86 -0
  186. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
  187. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  188. package/dist/template/implementations/generated.template.js +249 -0
  189. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
  190. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  191. package/dist/template/implementations/generated_http.template.js +131 -0
  192. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
  193. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  194. package/dist/template/implementations/generated_sso.template.js +134 -0
  195. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  196. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  197. package/dist/template/implementations/init_types.template.js +38 -0
  198. package/dist/template/implementations/model.template.d.ts +17 -0
  199. package/dist/template/implementations/model.template.d.ts.map +1 -0
  200. package/dist/template/implementations/model.template.js +181 -0
  201. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  202. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  203. package/dist/template/implementations/model_test.template.js +35 -0
  204. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  205. package/dist/template/implementations/service.template.d.ts.map +1 -0
  206. package/dist/template/implementations/service.template.js +201 -0
  207. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  208. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  209. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  210. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  211. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  212. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  213. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  214. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  215. package/dist/template/implementations/view_enums_select.template.js +55 -0
  216. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  217. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  218. package/dist/template/implementations/view_form.template.js +337 -0
  219. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  220. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  221. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  222. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  223. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  224. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  225. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  226. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  227. package/dist/template/implementations/view_list.template.js +475 -0
  228. package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
  229. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  230. package/dist/template/implementations/view_list_columns.template.js +49 -0
  231. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  232. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  233. package/dist/template/implementations/view_search_input.template.js +64 -0
  234. package/dist/template/index.d.ts +7 -0
  235. package/dist/template/index.d.ts.map +1 -0
  236. package/dist/template/index.js +8 -0
  237. package/dist/template/template-manager.d.ts +56 -0
  238. package/dist/template/template-manager.d.ts.map +1 -0
  239. package/dist/template/template-manager.js +125 -0
  240. package/dist/template/template-types.d.ts +16 -0
  241. package/dist/template/template-types.d.ts.map +1 -0
  242. package/dist/template/template-types.js +7 -0
  243. package/dist/template/template.d.ts +49 -0
  244. package/dist/template/template.d.ts.map +1 -0
  245. package/dist/template/template.js +60 -0
  246. package/dist/template/zod-converter.d.ts +51 -0
  247. package/dist/template/zod-converter.d.ts.map +1 -0
  248. package/dist/template/zod-converter.js +449 -0
  249. package/dist/testing/_relation-graph.d.ts +1 -1
  250. package/dist/testing/_relation-graph.d.ts.map +1 -1
  251. package/dist/testing/_relation-graph.js +89 -2
  252. package/dist/testing/fixture-manager.d.ts +42 -11
  253. package/dist/testing/fixture-manager.d.ts.map +1 -1
  254. package/dist/testing/fixture-manager.js +623 -2
  255. package/dist/types/types.d.ts +747 -143
  256. package/dist/types/types.d.ts.map +1 -1
  257. package/dist/types/types.js +546 -2
  258. package/dist/typings/knex.d.js +3 -2
  259. package/dist/utils/async-utils.d.ts +7 -0
  260. package/dist/utils/async-utils.d.ts.map +1 -1
  261. package/dist/utils/async-utils.js +57 -2
  262. package/dist/utils/console-util.d.ts +2 -0
  263. package/dist/utils/console-util.d.ts.map +1 -0
  264. package/dist/utils/console-util.js +6 -0
  265. package/dist/utils/controller.d.ts +1 -0
  266. package/dist/utils/controller.d.ts.map +1 -1
  267. package/dist/utils/controller.js +29 -2
  268. package/dist/utils/esm-utils.d.ts +39 -0
  269. package/dist/utils/esm-utils.d.ts.map +1 -0
  270. package/dist/utils/esm-utils.js +49 -0
  271. package/dist/utils/formatter.d.ts +3 -0
  272. package/dist/utils/formatter.d.ts.map +1 -0
  273. package/dist/utils/formatter.js +110 -0
  274. package/dist/utils/fs-utils.d.ts +1 -1
  275. package/dist/utils/fs-utils.d.ts.map +1 -1
  276. package/dist/utils/fs-utils.js +17 -2
  277. package/dist/utils/lodash-able.d.ts.map +1 -1
  278. package/dist/utils/lodash-able.js +6 -2
  279. package/dist/utils/model.js +22 -2
  280. package/dist/utils/object-utils.d.ts +44 -0
  281. package/dist/utils/object-utils.d.ts.map +1 -0
  282. package/dist/utils/object-utils.js +191 -0
  283. package/dist/utils/path-utils.d.ts +89 -0
  284. package/dist/utils/path-utils.d.ts.map +1 -0
  285. package/dist/utils/path-utils.js +60 -0
  286. package/dist/utils/process-utils.d.ts +13 -0
  287. package/dist/utils/process-utils.d.ts.map +1 -0
  288. package/dist/utils/process-utils.js +36 -0
  289. package/dist/utils/sql-parser.d.ts +5 -1
  290. package/dist/utils/sql-parser.d.ts.map +1 -1
  291. package/dist/utils/sql-parser.js +46 -2
  292. package/dist/utils/type-utils.d.ts +23 -0
  293. package/dist/utils/type-utils.d.ts.map +1 -0
  294. package/dist/utils/type-utils.js +45 -0
  295. package/dist/utils/utils.d.ts +10 -7
  296. package/dist/utils/utils.d.ts.map +1 -1
  297. package/dist/utils/utils.js +72 -2
  298. package/dist/utils/zod-error.d.ts +1 -1
  299. package/dist/utils/zod-error.d.ts.map +1 -1
  300. package/dist/utils/zod-error.js +19 -2
  301. package/package.json +65 -27
  302. package/src/ai/agents/agent.ts +87 -0
  303. package/src/ai/agents/index.ts +2 -0
  304. package/src/ai/agents/types.ts +47 -0
  305. package/src/ai/index.ts +1 -0
  306. package/src/ai/providers/rtzr/api.ts +37 -0
  307. package/src/ai/providers/rtzr/error.ts +34 -0
  308. package/src/ai/providers/rtzr/index.ts +4 -0
  309. package/src/ai/providers/rtzr/model.ts +201 -0
  310. package/src/ai/providers/rtzr/options.ts +49 -0
  311. package/src/ai/providers/rtzr/provider.ts +91 -0
  312. package/src/ai/providers/rtzr/utils.ts +127 -0
  313. package/src/api/base-frame.ts +4 -2
  314. package/src/api/caster.ts +17 -23
  315. package/src/api/code-converters.ts +178 -535
  316. package/src/api/config.ts +125 -0
  317. package/src/api/context.ts +7 -17
  318. package/src/api/decorators.ts +176 -46
  319. package/src/api/index.ts +2 -2
  320. package/src/api/sonamu.ts +190 -167
  321. package/src/api/validator.ts +83 -0
  322. package/src/bin/build-config.ts +8 -1
  323. package/src/bin/cli.ts +258 -124
  324. package/src/bin/hot-hook-register.ts +22 -0
  325. package/src/bin/loader-register.ts +38 -0
  326. package/src/database/_batch_update.ts +46 -31
  327. package/src/database/base-model.ts +390 -182
  328. package/src/database/base-model.types.ts +155 -0
  329. package/src/database/code-generator.ts +13 -32
  330. package/src/database/db.ts +40 -96
  331. package/src/database/puri-subset.test-d.ts +471 -0
  332. package/src/database/puri-subset.types.ts +195 -0
  333. package/src/database/puri-wrapper.ts +58 -67
  334. package/src/database/puri.ts +229 -148
  335. package/src/database/puri.types.ts +76 -30
  336. package/src/database/transaction-context.ts +1 -1
  337. package/src/database/upsert-builder.ts +262 -132
  338. package/src/entity/entity-manager.ts +48 -36
  339. package/src/entity/entity.ts +330 -248
  340. package/src/exceptions/error-handler.ts +3 -3
  341. package/src/exceptions/so-exceptions.ts +11 -11
  342. package/src/file-storage/driver.ts +5 -5
  343. package/src/file-storage/file-storage.ts +2 -2
  344. package/src/index.ts +18 -10
  345. package/src/migration/code-generation.ts +185 -172
  346. package/src/migration/migration-set.ts +80 -293
  347. package/src/migration/migrator.ts +199 -571
  348. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  349. package/src/migration/postgresql-schema-reader.ts +310 -0
  350. package/src/migration/types.ts +6 -39
  351. package/src/naite/messaging-types.ts +51 -0
  352. package/src/naite/naite-reporter.ts +128 -0
  353. package/src/naite/naite.ts +415 -0
  354. package/src/shared/web.shared.ts.txt +20 -24
  355. package/src/stream/sse.ts +5 -5
  356. package/src/syncer/api-parser.ts +282 -0
  357. package/src/syncer/checksum.ts +140 -0
  358. package/src/syncer/code-generator.ts +198 -0
  359. package/src/syncer/entity-operations.ts +65 -0
  360. package/src/syncer/file-patterns.ts +56 -0
  361. package/src/syncer/index.ts +6 -0
  362. package/src/syncer/module-loader.ts +128 -0
  363. package/src/syncer/syncer.ts +389 -1453
  364. package/src/template/entity-converter.ts +114 -0
  365. package/src/template/helpers.ts +81 -0
  366. package/src/{templates → template/implementations}/entity.template.ts +7 -7
  367. package/src/{templates → template/implementations}/generated.template.ts +101 -101
  368. package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
  369. package/src/template/implementations/generated_sso.template.ts +151 -0
  370. package/src/{templates → template/implementations}/init_types.template.ts +5 -7
  371. package/src/{templates → template/implementations}/model.template.ts +52 -43
  372. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  373. package/src/{templates → template/implementations}/service.template.ts +66 -82
  374. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  375. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
  376. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  377. package/src/{templates → template/implementations}/view_form.template.ts +40 -83
  378. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  379. package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
  380. package/src/{templates → template/implementations}/view_list.template.ts +60 -152
  381. package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
  382. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  383. package/src/template/index.ts +6 -0
  384. package/src/template/template-manager.ts +166 -0
  385. package/src/template/template-types.ts +16 -0
  386. package/src/template/template.ts +105 -0
  387. package/src/template/zod-converter.ts +525 -0
  388. package/src/testing/_relation-graph.ts +18 -11
  389. package/src/testing/fixture-manager.ts +472 -359
  390. package/src/types/types.ts +553 -308
  391. package/src/typings/knex.d.ts +7 -9
  392. package/src/utils/async-utils.ts +23 -10
  393. package/src/utils/console-util.ts +4 -0
  394. package/src/utils/controller.ts +3 -0
  395. package/src/utils/esm-utils.ts +59 -0
  396. package/src/utils/formatter.ts +109 -0
  397. package/src/utils/fs-utils.ts +1 -1
  398. package/src/utils/lodash-able.ts +1 -4
  399. package/src/utils/object-utils.ts +217 -0
  400. package/src/utils/path-utils.ts +99 -0
  401. package/src/utils/process-utils.ts +46 -0
  402. package/src/utils/sql-parser.ts +23 -5
  403. package/src/utils/type-utils.ts +83 -0
  404. package/src/utils/utils.ts +66 -43
  405. package/src/utils/zod-error.ts +3 -4
  406. package/dist/api/base-frame.js.map +0 -1
  407. package/dist/api/caster.js.map +0 -1
  408. package/dist/api/code-converters.js.map +0 -1
  409. package/dist/api/context.js.map +0 -1
  410. package/dist/api/decorators.js.map +0 -1
  411. package/dist/api/index.js.map +0 -1
  412. package/dist/api/sonamu.js.map +0 -1
  413. package/dist/bin/build-config.js.map +0 -1
  414. package/dist/bin/cli-wrapper.d.ts +0 -3
  415. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  416. package/dist/bin/cli-wrapper.js +0 -3
  417. package/dist/bin/cli-wrapper.js.map +0 -1
  418. package/dist/bin/cli.js.map +0 -1
  419. package/dist/database/_batch_update.js.map +0 -1
  420. package/dist/database/base-model.js.map +0 -1
  421. package/dist/database/code-generator.js.map +0 -1
  422. package/dist/database/db.js.map +0 -1
  423. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  424. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  425. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
  426. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  427. package/dist/database/puri-wrapper.js.map +0 -1
  428. package/dist/database/puri.js.map +0 -1
  429. package/dist/database/puri.types.js.map +0 -1
  430. package/dist/database/transaction-context.js.map +0 -1
  431. package/dist/database/upsert-builder.js.map +0 -1
  432. package/dist/entity/entity-manager.js.map +0 -1
  433. package/dist/entity/entity-utils.d.ts +0 -61
  434. package/dist/entity/entity-utils.d.ts.map +0 -1
  435. package/dist/entity/entity-utils.js +0 -2
  436. package/dist/entity/entity-utils.js.map +0 -1
  437. package/dist/entity/entity.js.map +0 -1
  438. package/dist/exceptions/error-handler.js.map +0 -1
  439. package/dist/exceptions/so-exceptions.js.map +0 -1
  440. package/dist/file-storage/driver.js.map +0 -1
  441. package/dist/file-storage/file-storage.js.map +0 -1
  442. package/dist/index.js.map +0 -1
  443. package/dist/migration/code-generation.js.map +0 -1
  444. package/dist/migration/migration-set.js.map +0 -1
  445. package/dist/migration/migrator.js.map +0 -1
  446. package/dist/migration/types.js.map +0 -1
  447. package/dist/stream/index.js.map +0 -1
  448. package/dist/stream/sse.js.map +0 -1
  449. package/dist/syncer/index.js.map +0 -1
  450. package/dist/syncer/syncer.js.map +0 -1
  451. package/dist/templates/base-template.d.ts +0 -13
  452. package/dist/templates/base-template.d.ts.map +0 -1
  453. package/dist/templates/base-template.js +0 -2
  454. package/dist/templates/base-template.js.map +0 -1
  455. package/dist/templates/entity.template.d.ts.map +0 -1
  456. package/dist/templates/entity.template.js +0 -2
  457. package/dist/templates/entity.template.js.map +0 -1
  458. package/dist/templates/generated.template.d.ts.map +0 -1
  459. package/dist/templates/generated.template.js +0 -2
  460. package/dist/templates/generated.template.js.map +0 -1
  461. package/dist/templates/generated_http.template.d.ts.map +0 -1
  462. package/dist/templates/generated_http.template.js +0 -2
  463. package/dist/templates/generated_http.template.js.map +0 -1
  464. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  465. package/dist/templates/generated_sso.template.js +0 -2
  466. package/dist/templates/generated_sso.template.js.map +0 -1
  467. package/dist/templates/index.d.ts +0 -2
  468. package/dist/templates/index.d.ts.map +0 -1
  469. package/dist/templates/index.js +0 -2
  470. package/dist/templates/index.js.map +0 -1
  471. package/dist/templates/init_types.template.d.ts.map +0 -1
  472. package/dist/templates/init_types.template.js +0 -2
  473. package/dist/templates/init_types.template.js.map +0 -1
  474. package/dist/templates/model.template.d.ts +0 -17
  475. package/dist/templates/model.template.d.ts.map +0 -1
  476. package/dist/templates/model.template.js +0 -2
  477. package/dist/templates/model.template.js.map +0 -1
  478. package/dist/templates/model_test.template.d.ts.map +0 -1
  479. package/dist/templates/model_test.template.js +0 -2
  480. package/dist/templates/model_test.template.js.map +0 -1
  481. package/dist/templates/service.template.d.ts.map +0 -1
  482. package/dist/templates/service.template.js +0 -2
  483. package/dist/templates/service.template.js.map +0 -1
  484. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  485. package/dist/templates/view_enums_buttonset.template.js +0 -2
  486. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  487. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  488. package/dist/templates/view_enums_dropdown.template.js +0 -2
  489. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  490. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  491. package/dist/templates/view_enums_select.template.js +0 -2
  492. package/dist/templates/view_enums_select.template.js.map +0 -1
  493. package/dist/templates/view_form.template.d.ts.map +0 -1
  494. package/dist/templates/view_form.template.js +0 -2
  495. package/dist/templates/view_form.template.js.map +0 -1
  496. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  497. package/dist/templates/view_id_all_select.template.js +0 -2
  498. package/dist/templates/view_id_all_select.template.js.map +0 -1
  499. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  500. package/dist/templates/view_id_async_select.template.js +0 -2
  501. package/dist/templates/view_id_async_select.template.js.map +0 -1
  502. package/dist/templates/view_list.template.d.ts.map +0 -1
  503. package/dist/templates/view_list.template.js +0 -2
  504. package/dist/templates/view_list.template.js.map +0 -1
  505. package/dist/templates/view_list_columns.template.d.ts +0 -17
  506. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  507. package/dist/templates/view_list_columns.template.js +0 -2
  508. package/dist/templates/view_list_columns.template.js.map +0 -1
  509. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  510. package/dist/templates/view_search_input.template.js +0 -2
  511. package/dist/templates/view_search_input.template.js.map +0 -1
  512. package/dist/testing/_relation-graph.js.map +0 -1
  513. package/dist/testing/fixture-manager.js.map +0 -1
  514. package/dist/types/types.js.map +0 -1
  515. package/dist/typings/knex.d.js.map +0 -1
  516. package/dist/utils/async-utils.js.map +0 -1
  517. package/dist/utils/controller.js.map +0 -1
  518. package/dist/utils/fs-utils.js.map +0 -1
  519. package/dist/utils/lodash-able.js.map +0 -1
  520. package/dist/utils/model.js.map +0 -1
  521. package/dist/utils/sql-parser.js.map +0 -1
  522. package/dist/utils/utils.js.map +0 -1
  523. package/dist/utils/zod-error.js.map +0 -1
  524. package/src/bin/cli-wrapper.ts +0 -75
  525. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  526. package/src/entity/entity-utils.ts +0 -291
  527. package/src/templates/base-template.ts +0 -19
  528. package/src/templates/generated_sso.template.ts +0 -138
  529. package/src/templates/index.ts +0 -1
@@ -1,2 +1,365 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get UpsertBuilder(){return UpsertBuilder},get isRefField(){return isRefField}});var _crypto=require("crypto");var _lodash=/*#__PURE__*/_interop_require_default(require("lodash"));var _entitymanager=require("../entity/entity-manager");var _utils=require("../utils/utils");var _batch_update=require("./_batch_update");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 _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}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 _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}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 _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function _object_without_properties(source,excluded){if(source==null)return{};var target=_object_without_properties_loose(source,excluded);var key,i;if(Object.getOwnPropertySymbols){var sourceSymbolKeys=Object.getOwnPropertySymbols(source);for(i=0;i<sourceSymbolKeys.length;i++){key=sourceSymbolKeys[i];if(excluded.indexOf(key)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(source,key))continue;target[key]=source[key]}}return target}function _object_without_properties_loose(source,excluded){if(source==null)return{};var target={};var sourceKeys=Object.keys(source);var key,i;for(i=0;i<sourceKeys.length;i++){key=sourceKeys[i];if(excluded.indexOf(key)>=0)continue;target[key]=source[key]}return target}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 _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _type_of(obj){"@swc/helpers - typeof";return obj&&typeof Symbol!=="undefined"&&obj.constructor===Symbol?"symbol":typeof obj}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)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function isRefField(field){return field!==undefined&&field!==null&&field.of!==undefined&&field.uuid!==undefined}var UpsertBuilder=/*#__PURE__*/function(){"use strict";function UpsertBuilder(){_class_call_check(this,UpsertBuilder);_define_property(this,"tables",void 0);this.tables=new Map}_create_class(UpsertBuilder,[{key:"getTable",value:function getTable(tableName){var table=this.tables.get(tableName);if(table===undefined){var tableSpec=function(){try{return _entitymanager.EntityManager.getTableSpec(tableName)}catch(e){return null}}();var _tableSpec_uniqueIndexes;this.tables.set(tableName,{references:new Set,rows:[],uniqueIndexes:(_tableSpec_uniqueIndexes=tableSpec===null||tableSpec===void 0?void 0:tableSpec.uniqueIndexes)!==null&&_tableSpec_uniqueIndexes!==void 0?_tableSpec_uniqueIndexes:[],uniquesMap:new Map})}return this.tables.get(tableName)}},{key:"hasTable",value:function hasTable(tableName){return this.tables.has(tableName)}},{key:"register",value:function register(tableName,row){var table=this.getTable(tableName);var uniqueKeys=table.uniqueIndexes.map(function(unqIndex){var uniqueKeyArray=unqIndex.columns.map(function(unqCol){var val=row[unqCol];if(isRefField(val)){return val.uuid}else{var _row_unqCol;return(_row_unqCol=row[unqCol])!==null&&_row_unqCol!==void 0?_row_unqCol:(0,_crypto.randomUUID)()}});if(uniqueKeyArray.length===0){return null}return uniqueKeyArray.join("---delimiter--")}).filter(_utils.nonNullable);var uuid=function(){if(uniqueKeys.length>0){var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=uniqueKeys[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var uniqueKey=_step.value;if(table.uniquesMap.has(uniqueKey)){return table.uniquesMap.get(uniqueKey)}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}}return(0,_crypto.randomUUID)()}();if(uniqueKeys.length>0){var _iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;try{for(var _iterator=uniqueKeys[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var uniqueKey=_step.value;table.uniquesMap.set(uniqueKey,uuid)}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}}row=Object.keys(row).reduce(function(r,rowKey){var rowValue=row[rowKey];if(isRefField(rowValue)){var _rowValue;var _use;(_use=(_rowValue=rowValue).use)!==null&&_use!==void 0?_use:_rowValue.use="id";table.references.add(rowValue.of+"."+rowValue.use);r[rowKey]=rowValue}else if((typeof rowValue==="undefined"?"undefined":_type_of(rowValue))==="object"&&!_instanceof(rowValue,Date)){r[rowKey]=rowValue===null?null:JSON.stringify(rowValue)}else{r[rowKey]=rowValue}return r},{});table.rows.push(_object_spread({uuid:uuid},row));var _row_uuid;return{of:tableName,uuid:(_row_uuid=row.uuid)!==null&&_row_uuid!==void 0?_row_uuid:uuid}}},{key:"upsert",value:function upsert(wdb,tableName,chunkSize){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.upsertOrInsert(wdb,tableName,"upsert",chunkSize)]})}).call(this)}},{key:"insertOnly",value:function insertOnly(wdb,tableName,chunkSize){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.upsertOrInsert(wdb,tableName,"insert",chunkSize)]})}).call(this)}},{key:"upsertOrInsert",value:function upsertOrInsert(wdb,tableName,mode,chunkSize){return _async_to_generator(function(){var table,_Array_from_reduce,references,refTables,extractFields,groups,_groups_normal,normalRows,_groups_selfRef,selfRefRows,chunks,uuidMap,_iteratorNormalCompletion,_didIteratorError,_iteratorError,_iterator,_step,chunk,q,uuids,upsertedRows,err,allIds,_allIds,selfRefIds;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(this.hasTable(tableName)===false){return[2,[]]}table=this.tables.get(tableName);if(table===undefined){throw new Error("존재하지 않는 테이블 ".concat(tableName,"에 upsert 요청"))}else if(table.rows.length===0){throw new Error("".concat(tableName,"에 upsert 할 데이터가 없습니다."))}if(table.rows.some(function(row){return Object.entries(row).some(function(param){var _param=_sliced_to_array(param,2),value=_param[1];return isRefField(value)&&value.of!==tableName})})){throw new Error("".concat(tableName," 해결되지 않은 참조가 있습니다."))}_Array_from_reduce=Array.from(this.tables).reduce(function(r,param){var _param=_sliced_to_array(param,2),table=_param[1];var reference=Array.from(table.references.values()).find(function(ref){return ref.includes(tableName+".")});if(reference){r.references.push(reference);r.refTables.push(table)}return r},{references:[],refTables:[]}),references=_Array_from_reduce.references,refTables=_Array_from_reduce.refTables;extractFields=_lodash.default.uniq(references).map(function(reference){return reference.split(".")[1]});groups=_lodash.default.groupBy(table.rows,function(row){return Object.entries(row).some(function(param){var _param=_sliced_to_array(param,2),value=_param[1];return isRefField(value)})?"selfRef":"normal"});normalRows=(_groups_normal=groups.normal)!==null&&_groups_normal!==void 0?_groups_normal:[];selfRefRows=(_groups_selfRef=groups.selfRef)!==null&&_groups_selfRef!==void 0?_groups_selfRef:[];chunks=chunkSize?_lodash.default.chunk(normalRows,chunkSize):[normalRows];uuidMap=new Map;_iteratorNormalCompletion=true,_didIteratorError=false,_iteratorError=undefined;_state.label=1;case 1:_state.trys.push([1,10,11,12]);_iterator=chunks[Symbol.iterator]();_state.label=2;case 2:if(!!(_iteratorNormalCompletion=(_step=_iterator.next()).done))return[3,9];chunk=_step.value;q=wdb.insert(chunk).into(tableName);if(!(mode==="insert"))return[3,4];return[4,q];case 3:_state.sent();return[3,6];case 4:if(!(mode==="upsert"))return[3,6];return[4,q.onDuplicateUpdate.apply(q,Object.keys(normalRows[0]))];case 5:_state.sent();_state.label=6;case 6:uuids=chunk.map(function(row){return row.uuid});return[4,wdb(tableName).select(_lodash.default.uniq(["uuid","id"].concat(_to_consumable_array(extractFields)))).whereIn("uuid",uuids)];case 7:upsertedRows=_state.sent();upsertedRows.forEach(function(row){uuidMap.set(row.uuid,row)});_state.label=8;case 8:_iteratorNormalCompletion=true;return[3,2];case 9:return[3,12];case 10:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,12];case 11:try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}return[7];case 12:refTables.map(function(table){table.rows=table.rows.map(function(row){Object.keys(row).map(function(key){var prop=row[key];if(isRefField(prop)&&prop.of===tableName){var parent=uuidMap.get(prop.uuid);if(parent===undefined){console.error(prop);throw new Error("존재하지 않는 uuid ".concat(prop.uuid," -- in ").concat(tableName))}var _prop_use;row[key]=parent[(_prop_use=prop.use)!==null&&_prop_use!==void 0?_prop_use:"id"]}});return row})});allIds=Array.from(uuidMap.values()).map(function(row){return row.id});if(!(selfRefRows.length>0))return[3,14];table.rows=selfRefRows;return[4,this.upsert(wdb,tableName,chunkSize)];case 13:selfRefIds=_state.sent();(_allIds=allIds).push.apply(_allIds,_to_consumable_array(selfRefIds));return[3,15];case 14:table.rows=[];table.references.clear();table.uniquesMap.clear();_state.label=15;case 15:return[2,allIds]}})}).call(this)}},{key:"updateBatch",value:function updateBatch(wdb,tableName,options){return _async_to_generator(function(){var table,_options_where,whereColumns,rows;return _ts_generator(this,function(_state){switch(_state.label){case 0:options=_lodash.default.defaults(options,{chunkSize:500,where:"id"});if(this.hasTable(tableName)===false){return[2]}table=this.tables.get(tableName);if(table.rows.length===0){return[2]}whereColumns=Array.isArray(options.where)?options.where:[(_options_where=options.where)!==null&&_options_where!==void 0?_options_where:"id"];rows=table.rows.map(function(_row){var uuid=_row.uuid,row=_object_without_properties(_row,["uuid"]);return row});return[4,(0,_batch_update.batchUpdate)(wdb,tableName,whereColumns,rows,options.chunkSize)];case 1:_state.sent();table.rows=[];table.references.clear();table.uniquesMap.clear();return[2]}})}).call(this)}}]);return UpsertBuilder}();
2
- //# sourceMappingURL=upsert-builder.js.map
1
+ import { randomUUID } from "crypto";
2
+ import { unique } from "radashi";
3
+ import { EntityManager } from "../entity/entity-manager.js";
4
+ import { Naite } from "../naite/naite.js";
5
+ import { assertDefined, chunk, nonNullable } from "../utils/utils.js";
6
+ import { batchUpdate } from "./_batch_update.js";
7
+ export function isRefField(field) {
8
+ return field !== undefined && field !== null && field?.of !== undefined && field?.uuid !== undefined;
9
+ }
10
+ export class UpsertBuilder {
11
+ tables;
12
+ constructor(){
13
+ this.tables = new Map();
14
+ }
15
+ getTable(tableName) {
16
+ const table = this.tables.get(tableName);
17
+ if (table) {
18
+ return table;
19
+ }
20
+ const tableSpec = (()=>{
21
+ try {
22
+ return EntityManager.getTableSpec(tableName);
23
+ } catch {
24
+ return null;
25
+ }
26
+ })();
27
+ const tableData = {
28
+ references: new Set(),
29
+ rows: [],
30
+ uniqueIndexes: tableSpec?.uniqueIndexes ?? [],
31
+ uniquesMap: new Map()
32
+ };
33
+ this.tables.set(tableName, tableData);
34
+ return tableData;
35
+ }
36
+ hasTable(tableName) {
37
+ return this.tables.has(tableName);
38
+ }
39
+ register(tableName, row) {
40
+ const table = this.getTable(tableName);
41
+ // 해당 테이블의 unique 인덱스를 순회하며 키 생성
42
+ const uniqueKeys = table.uniqueIndexes.map((unqIndex)=>{
43
+ const uniqueKeyArray = unqIndex.columns.map((unqCol)=>{
44
+ const val = row[unqCol];
45
+ if (isRefField(val)) {
46
+ return val.uuid;
47
+ } else {
48
+ return row[unqCol] ?? randomUUID(); // nullable인 경우 uuid로 랜덤값 삽입
49
+ }
50
+ });
51
+ // 값이 모두 null인 경우 키 생성 패스
52
+ if (uniqueKeyArray.length === 0) {
53
+ return null;
54
+ }
55
+ return uniqueKeyArray.join("---delimiter--");
56
+ }).filter(nonNullable);
57
+ // uuid 생성 로직
58
+ const { uuid, isReused } = (()=>{
59
+ // 키를 순회하여 이미 존재하는 키가 있는지 확인
60
+ if (uniqueKeys.length > 0) {
61
+ for (const uniqueKey of uniqueKeys){
62
+ if (table.uniquesMap.has(uniqueKey)) {
63
+ return {
64
+ uuid: assertDefined(table.uniquesMap.get(uniqueKey), "Unique key not found"),
65
+ isReused: true
66
+ };
67
+ }
68
+ }
69
+ }
70
+ // 찾을 수 없는 경우 생성
71
+ return {
72
+ uuid: randomUUID(),
73
+ isReused: false
74
+ };
75
+ })();
76
+ // 모든 유니크키에 대해 유니크맵에 uuid 저장
77
+ if (uniqueKeys.length > 0) {
78
+ for (const uniqueKey of uniqueKeys){
79
+ table.uniquesMap.set(uniqueKey, uuid);
80
+ }
81
+ }
82
+ // 이 테이블에 사용된 RefField를 순회하여, 현재 테이블 정보에 어떤 필드를 참조하는지 추가
83
+ // 이 정보를 나중에 치환할 때 사용
84
+ row = Object.fromEntries(Object.entries(row).map(([rowKey, rowValue])=>{
85
+ if (isRefField(rowValue)) {
86
+ rowValue.use ??= "id";
87
+ table.references.add(`${rowValue.of}.${rowValue.use}`);
88
+ return [
89
+ rowKey,
90
+ rowValue
91
+ ];
92
+ } else if (typeof rowValue === "object" && !(rowValue instanceof Date)) {
93
+ // object인 경우 JSON으로 변환
94
+ return [
95
+ rowKey,
96
+ rowValue === null ? null : JSON.stringify(rowValue)
97
+ ];
98
+ } else {
99
+ return [
100
+ rowKey,
101
+ rowValue
102
+ ];
103
+ }
104
+ }));
105
+ table.rows.push({
106
+ uuid,
107
+ ...row
108
+ });
109
+ const result = {
110
+ of: tableName,
111
+ uuid: row.uuid ?? uuid
112
+ };
113
+ Naite.t("puri:ub-register", {
114
+ tableName,
115
+ uuid: result.uuid,
116
+ isUuidReused: isReused,
117
+ row
118
+ });
119
+ return result;
120
+ }
121
+ async upsert(wdb, tableName, chunkSize) {
122
+ return this.upsertOrInsert(wdb, tableName, "upsert", chunkSize);
123
+ }
124
+ async insertOnly(wdb, tableName, chunkSize) {
125
+ return this.upsertOrInsert(wdb, tableName, "insert", chunkSize);
126
+ }
127
+ async upsertOrInsert(wdb, tableName, mode, chunkSize) {
128
+ if (this.hasTable(tableName) === false) {
129
+ return [];
130
+ }
131
+ const table = this.tables.get(tableName);
132
+ if (table === undefined) {
133
+ throw new Error(`존재하지 않는 테이블 ${tableName}에 upsert 요청`);
134
+ } else if (table.rows.length === 0) {
135
+ throw new Error(`${tableName}에 upsert 할 데이터가 없습니다.`);
136
+ }
137
+ if (table.rows.some((row)=>Object.entries(row).some(([, value])=>isRefField(value) && value.of !== tableName))) {
138
+ throw new Error(`${tableName} 해결되지 않은 참조가 있습니다.`);
139
+ }
140
+ // 전체 테이블 순회하여 현재 테이블 참조하는 모든 테이블 추출
141
+ const { references, refTables } = Array.from(this.tables).reduce((r, [, table])=>{
142
+ const reference = Array.from(table.references.values()).find((ref)=>ref.includes(`${tableName}.`));
143
+ if (reference) {
144
+ r.references.push(reference);
145
+ r.refTables.push(table);
146
+ }
147
+ return r;
148
+ }, {
149
+ references: [],
150
+ refTables: []
151
+ });
152
+ const extractFields = unique(references).map((reference)=>reference.split(".")[1]).filter((field)=>field !== undefined);
153
+ // 의존성 순서에 따라 레벨별 그룹화 (자기 참조가 없으면 Level 0 하나)
154
+ const { levels, hasCircular } = this.buildInsertLevels(table.rows, tableName);
155
+ if (hasCircular) {
156
+ throw new Error(`${tableName}에 순환 자기 참조가 있습니다.`);
157
+ }
158
+ // upsert 모드일 때 유니크 인덱스가 없으면 에러
159
+ if (mode === "upsert" && table.uniqueIndexes.length === 0) {
160
+ throw new Error(`${tableName}에 unique index가 정의되지 않아 upsert를 할 수 없습니다.`);
161
+ }
162
+ const uuidMap = new Map();
163
+ const allIds = [];
164
+ // 레벨별로 순차 처리
165
+ for (const levelRows of levels){
166
+ // 이전 레벨에서 얻은 ID로 자기 참조 해결
167
+ const resolvedRows = levelRows.map((row)=>{
168
+ const resolved = {
169
+ ...row
170
+ };
171
+ for (const [key, value] of Object.entries(row)){
172
+ if (isRefField(value) && value.of === tableName) {
173
+ const parent = uuidMap.get(value.uuid);
174
+ if (!parent) throw new Error(`존재하지 않는 uuid ${value.uuid} -- in ${tableName}`);
175
+ resolved[key] = parent[value.use ?? "id"];
176
+ Naite.t("puri:ub-ref-resolved", {
177
+ tableName,
178
+ field: key,
179
+ from: {
180
+ of: value.of,
181
+ uuid: value.uuid,
182
+ use: value.use ?? "id"
183
+ },
184
+ to: resolved[key]
185
+ });
186
+ }
187
+ }
188
+ return resolved;
189
+ });
190
+ // 현재 레벨 upsert
191
+ const levelChunks = chunkSize ? chunk(resolvedRows, chunkSize) : [
192
+ resolvedRows
193
+ ];
194
+ const selectFields = unique([
195
+ "uuid",
196
+ "id",
197
+ ...extractFields
198
+ ]);
199
+ for (const dataChunk of levelChunks){
200
+ if (dataChunk.length === 0) continue;
201
+ let resultRows;
202
+ if (mode === "insert") {
203
+ // INSERT 모드
204
+ await wdb.insert(dataChunk).into(tableName);
205
+ const uuids = dataChunk.map((r)=>r.uuid);
206
+ resultRows = await wdb(tableName).select(selectFields).whereIn("uuid", uuids);
207
+ } else {
208
+ // UPSERT 모드 (uniqueIndexes 이미 체크됨)
209
+ const conflictColumns = table.uniqueIndexes[0].columns;
210
+ const updateColumns = Object.keys(dataChunk[0]).filter((col)=>col !== "uuid" && !conflictColumns.includes(col));
211
+ // RETURNING으로 결과 받기
212
+ const query = wdb.insert(dataChunk).into(tableName).onConflict(conflictColumns);
213
+ // updateColumns가 비어있으면 ignore(), 아니면 merge()
214
+ if (updateColumns.length === 0) {
215
+ resultRows = await query.ignore().returning(selectFields);
216
+ } else {
217
+ resultRows = await query.merge(updateColumns).returning(selectFields);
218
+ }
219
+ }
220
+ // 양쪽 모드 공통 처리
221
+ for (const row of resultRows){
222
+ uuidMap.set(row.uuid, row);
223
+ allIds.push(row.id);
224
+ }
225
+ }
226
+ }
227
+ // 해당 테이블 참조를 실제 밸류로 변경
228
+ for (const table of refTables){
229
+ table.rows = table.rows.map((row)=>{
230
+ for (const key of Object.keys(row)){
231
+ const prop = row[key];
232
+ if (isRefField(prop) && prop.of === tableName) {
233
+ const parent = uuidMap.get(prop.uuid);
234
+ if (!parent) {
235
+ console.error(prop);
236
+ throw new Error(`존재하지 않는 uuid ${prop.uuid} -- in ${tableName}`);
237
+ }
238
+ const resolvedValue = parent[prop.use ?? "id"];
239
+ row[key] = resolvedValue;
240
+ Naite.t("puri:ub-ref-resolved", {
241
+ tableName,
242
+ field: key,
243
+ from: {
244
+ of: prop.of,
245
+ uuid: prop.uuid,
246
+ use: prop.use ?? "id"
247
+ },
248
+ to: resolvedValue
249
+ });
250
+ }
251
+ }
252
+ return row;
253
+ });
254
+ }
255
+ // 해당 테이블의 데이터 초기화
256
+ table.rows = [];
257
+ table.references.clear();
258
+ table.uniquesMap.clear();
259
+ Naite.t("puri:ub-upserted", {
260
+ tableName,
261
+ mode,
262
+ rowCount: allIds.length,
263
+ returnedIds: allIds
264
+ });
265
+ return allIds;
266
+ }
267
+ async updateBatch(wdb, tableName, options) {
268
+ options = {
269
+ ...options,
270
+ chunkSize: options?.chunkSize ?? 500,
271
+ where: options?.where ?? "id"
272
+ };
273
+ if (this.hasTable(tableName) === false) {
274
+ return;
275
+ }
276
+ const table = this.tables.get(tableName);
277
+ if (!table) {
278
+ throw new Error(`등록되지 않은 테이블 ${tableName}에 updateBatch 요청`);
279
+ } else if (table.rows.length === 0) {
280
+ return;
281
+ }
282
+ const whereColumns = Array.isArray(options.where) ? options.where : [
283
+ options.where ?? "id"
284
+ ];
285
+ const rows = table.rows.map((_row)=>{
286
+ const { uuid: _, ...row } = _row; // uuid 제외
287
+ return row;
288
+ });
289
+ await batchUpdate(wdb, tableName, whereColumns, rows, options.chunkSize);
290
+ Naite.t("puri:ub-batch-updated", {
291
+ tableName,
292
+ rowCount: rows.length,
293
+ whereColumns
294
+ });
295
+ // updateBatch 완료 후 처리된 데이터 제거
296
+ table.rows = [];
297
+ table.references.clear();
298
+ table.uniquesMap.clear();
299
+ }
300
+ // ============================================================================
301
+ // Private Helpers
302
+ // ============================================================================
303
+ /**
304
+ * rows를 의존성 순서에 따라 레벨별로 그룹화
305
+ * - 자기 참조 없는 경우 : 모든 rows가 Level 0
306
+ * - 자기 참조 있는 경우 : 자기 참조 관계를 위상 정렬하여 레벨별로 그룹화
307
+ */ buildInsertLevels(rows, tableName) {
308
+ // 1. 자기 참조가 없으면 한 레벨로 처리
309
+ const hasSelfRef = rows.flatMap((row)=>Object.values(row)).some((value)=>isRefField(value) && value.of === tableName);
310
+ if (!hasSelfRef) return {
311
+ levels: [
312
+ rows
313
+ ],
314
+ hasCircular: false
315
+ };
316
+ // 2. uuid → row 매핑 (중복 uuid 방지)
317
+ const rowByUuid = new Map();
318
+ for (const row of rows){
319
+ const uuid = row.uuid;
320
+ if (!uuid) throw new Error(`buildInsertLevels: uuid가 없는 row -- in ${tableName}`);
321
+ rowByUuid.set(uuid, row);
322
+ }
323
+ let pending = Array.from(rowByUuid.values());
324
+ const levels = [];
325
+ const inserted = new Set();
326
+ // 3. 레벨별 분류
327
+ while(pending.length > 0){
328
+ const currentLevel = [];
329
+ const nextPending = [];
330
+ for (const row of pending){
331
+ // 이 row가 참조하는 자기 참조들
332
+ const selfRefs = Object.values(row).filter((value)=>isRefField(value) && value.of === tableName);
333
+ // 참조하는 모든 uuid가 이미 inserted에 있어야 이번 레벨에 포함
334
+ const canInsert = selfRefs.every((ref)=>{
335
+ if (!rowByUuid.has(ref.uuid)) {
336
+ throw new Error(`존재하지 않는 uuid ${ref.uuid} -- in ${tableName}`);
337
+ }
338
+ return inserted.has(ref.uuid);
339
+ });
340
+ if (canInsert) {
341
+ currentLevel.push(row);
342
+ } else {
343
+ nextPending.push(row);
344
+ }
345
+ }
346
+ // 순환 참조 감지
347
+ if (currentLevel.length === 0) return {
348
+ levels: [],
349
+ hasCircular: true
350
+ };
351
+ // 레벨 확정 + inserted 갱신
352
+ levels.push(currentLevel);
353
+ for (const row of currentLevel){
354
+ inserted.add(row.uuid);
355
+ }
356
+ pending = nextPending;
357
+ }
358
+ return {
359
+ levels,
360
+ hasCircular: false
361
+ };
362
+ }
363
+ }
364
+
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIGNodW5rLCBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgYmF0Y2hVcGRhdGUsIHR5cGUgUm93V2l0aElkIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IHsgbmFtZT86IHN0cmluZzsgY29sdW1uczogc3RyaW5nW10gfVtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNSZWZGaWVsZChmaWVsZDogdW5rbm93bik6IGZpZWxkIGlzIFVCUmVmIHtcbiAgcmV0dXJuIChcbiAgICBmaWVsZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZmllbGQgIT09IG51bGwgJiZcbiAgICAoZmllbGQgYXMgVUJSZWYpPy5vZiAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8udXVpZCAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBVcHNlcnRCdWlsZGVyIHtcbiAgdGFibGVzOiBNYXA8c3RyaW5nLCBUYWJsZURhdGE+O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRhYmxlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldFRhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVEYXRhIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlU3BlYyA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXRUYWJsZVNwZWModGFibGVOYW1lKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgY29uc3QgdGFibGVEYXRhID0ge1xuICAgICAgcmVmZXJlbmNlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICByb3dzOiBbXSxcbiAgICAgIHVuaXF1ZUluZGV4ZXM6IHRhYmxlU3BlYz8udW5pcXVlSW5kZXhlcyA/PyBbXSxcbiAgICAgIHVuaXF1ZXNNYXA6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCksXG4gICAgfTtcbiAgICB0aGlzLnRhYmxlcy5zZXQodGFibGVOYW1lLCB0YWJsZURhdGEpO1xuICAgIHJldHVybiB0YWJsZURhdGE7XG4gIH1cblxuICBoYXNUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlcy5oYXModGFibGVOYW1lKTtcbiAgfVxuXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHJvdzoge1xuICAgICAgW2tleSBpbiBUXT86IFVCUmVmIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IG51bGwgfCBvYmplY3QgfCB1bmtub3duO1xuICAgIH0sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2V0VGFibGUodGFibGVOYW1lKTtcblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZggdW5pcXVlIOyduOuNseyKpOulvCDsiJztmoztlZjrqbAg7YKkIOyDneyEsVxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPSB0YWJsZS51bmlxdWVJbmRleGVzXG4gICAgICAubWFwKCh1bnFJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1bmlxdWVLZXlBcnJheSA9IHVucUluZGV4LmNvbHVtbnMubWFwKCh1bnFDb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSByb3dbdW5xQ29sIGFzIGtleW9mIHR5cGVvZiByb3ddO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwudXVpZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1t1bnFDb2wgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gcmFuZG9tVVVJRCgpOyAvLyBudWxsYWJsZeyduCDqsr3smrAgdXVpZOuhnCDrnpzrjaTqsJIg7IK97J6FXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDqsJLsnbQg66qo65GQIG51bGzsnbgg6rK97JqwIO2CpCDsg53shLEg7Yyo7IqkXG4gICAgICAgIGlmICh1bmlxdWVLZXlBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pcXVlS2V5QXJyYXkuam9pbihcIi0tLWRlbGltaXRlci0tXCIpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgLy8gdXVpZCDsg53shLEg66Gc7KeBXG4gICAgY29uc3QgeyB1dWlkLCBpc1JldXNlZCB9ID0gKCgpID0+IHtcbiAgICAgIC8vIO2CpOulvCDsiJztmoztlZjsl6wg7J2066+4IOyhtOyerO2VmOuKlCDtgqTqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXNNYXAuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGFzc2VydERlZmluZWQodGFibGUudW5pcXVlc01hcC5nZXQodW5pcXVlS2V5KSwgXCJVbmlxdWUga2V5IG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICAgICAgaXNSZXVzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDssL7snYQg7IiYIOyXhuuKlCDqsr3smrAg7IOd7ISxXG4gICAgICByZXR1cm4geyB1dWlkOiByYW5kb21VVUlEKCksIGlzUmV1c2VkOiBmYWxzZSB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyDrqqjrk6Ag7Jyg64uI7YGs7YKk7JeQIOuMgO2VtCDsnKDri4jtgazrp7Xsl5AgdXVpZCDsoIDsnqVcbiAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgIHRhYmxlLnVuaXF1ZXNNYXAuc2V0KHVuaXF1ZUtleSwgdXVpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7J20IO2FjOydtOu4lOyXkCDsgqzsmqnrkJwgUmVmRmllbGTrpbwg7Iic7ZqM7ZWY7JesLCDtmITsnqwg7YWM7J2067iUIOygleuztOyXkCDslrTrlqQg7ZWE65Oc66W8IOywuOyhsO2VmOuKlOyngCDstpTqsIBcbiAgICAvLyDsnbQg7KCV67O066W8IOuCmOykkeyXkCDsuZjtmZjtlaAg65WMIOyCrOyaqVxuICAgIHJvdyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykubWFwKChbcm93S2V5LCByb3dWYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVmRmllbGQocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUudXNlID8/PSBcImlkXCI7XG4gICAgICAgICAgdGFibGUucmVmZXJlbmNlcy5hZGQoYCR7cm93VmFsdWUub2Z9LiR7cm93VmFsdWUudXNlfWApO1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiICYmICEocm93VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgIC8vIG9iamVjdOyduCDqsr3smrAgSlNPTuycvOuhnCDrs4DtmZhcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWUgPT09IG51bGwgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkocm93VmFsdWUpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApIGFzIHsgW2tleSBpbiBUXT86IHVua25vd24gfTtcblxuICAgIHRhYmxlLnJvd3MucHVzaCh7XG4gICAgICB1dWlkLFxuICAgICAgLi4ucm93LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBVQlJlZiA9IHtcbiAgICAgIG9mOiB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiAocm93IGFzIHsgdXVpZD86IHN0cmluZyB9KS51dWlkID8/IHV1aWQsXG4gICAgfTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZ2lzdGVyXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IHJlc3VsdC51dWlkLFxuICAgICAgaXNVdWlkUmV1c2VkOiBpc1JldXNlZCxcbiAgICAgIHJvdyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyB1cHNlcnQod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG4gIGFzeW5jIGluc2VydE9ubHkod2RiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZywgY2h1bmtTaXplPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcImluc2VydFwiLCBjaHVua1NpemUpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0T3JJbnNlcnQoXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIG1vZGU6IFwidXBzZXJ0XCIgfCBcImluc2VydFwiLFxuICAgIGNodW5rU2l6ZT86IG51bWJlcixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVwc2VydCDtlaAg642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YWJsZS5yb3dzLnNvbWUoKHJvdykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5zb21lKChbLCB2YWx1ZV0pID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mICE9PSB0YWJsZU5hbWUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX0g7ZW06rKw65CY7KeAIOyViuydgCDssLjsobDqsIAg7J6I7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIOyghOyytCDthYzsnbTruJQg7Iic7ZqM7ZWY7JesIO2YhOyerCDthYzsnbTruJQg7LC47KGw7ZWY64qUIOuqqOuToCDthYzsnbTruJQg7LaU7LacXG4gICAgY29uc3QgeyByZWZlcmVuY2VzLCByZWZUYWJsZXMgfSA9IEFycmF5LmZyb20odGhpcy50YWJsZXMpLnJlZHVjZShcbiAgICAgIChyLCBbLCB0YWJsZV0pID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gQXJyYXkuZnJvbSh0YWJsZS5yZWZlcmVuY2VzLnZhbHVlcygpKS5maW5kKChyZWYpID0+XG4gICAgICAgICAgcmVmLmluY2x1ZGVzKGAke3RhYmxlTmFtZX0uYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICByLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICAgIHIucmVmVGFibGVzLnB1c2godGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZWZlcmVuY2VzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmVmVGFibGVzOiBbXSBhcyBUYWJsZURhdGFbXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBleHRyYWN0RmllbGRzID0gdW5pcXVlKHJlZmVyZW5jZXMpXG4gICAgICAubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5zcGxpdChcIi5cIilbMV0pXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhCDqt7jro7ntmZQgKOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IExldmVsIDAg7ZWY64KYKVxuICAgIGNvbnN0IHsgbGV2ZWxzLCBoYXNDaXJjdWxhciB9ID0gdGhpcy5idWlsZEluc2VydExldmVscyh0YWJsZS5yb3dzLCB0YWJsZU5hbWUpO1xuXG4gICAgaWYgKGhhc0NpcmN1bGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfeyXkCDsiJztmZgg7J6Q6riwIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8gdXBzZXJ0IOuqqOuTnOydvCDrlYwg7Jyg64uI7YGsIOyduOuNseyKpOqwgCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgaWYgKG1vZGUgPT09IFwidXBzZXJ0XCIgJiYgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVuaXF1ZSBpbmRleOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWEIHVwc2VydOulvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1dWlkTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgY29uc3QgYWxsSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGNvbnN0IGxldmVsUm93cyBvZiBsZXZlbHMpIHtcbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNodW5rKHJlc29sdmVkUm93cywgY2h1bmtTaXplKSA6IFtyZXNvbHZlZFJvd3NdO1xuICAgICAgY29uc3Qgc2VsZWN0RmllbGRzID0gdW5pcXVlKFtcInV1aWRcIiwgXCJpZFwiLCAuLi5leHRyYWN0RmllbGRzXSk7XG5cbiAgICAgIGZvciAoY29uc3QgZGF0YUNodW5rIG9mIGxldmVsQ2h1bmtzKSB7XG4gICAgICAgIGlmIChkYXRhQ2h1bmsubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyB1dWlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IHVua25vd24gfVtdO1xuXG4gICAgICAgIGlmIChtb2RlID09PSBcImluc2VydFwiKSB7XG4gICAgICAgICAgLy8gSU5TRVJUIOuqqOuTnFxuICAgICAgICAgIGF3YWl0IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSk7XG5cbiAgICAgICAgICBjb25zdCB1dWlkcyA9IGRhdGFDaHVuay5tYXAoKHIpID0+IHIudXVpZCk7XG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgICAgICAuc2VsZWN0KHNlbGVjdEZpZWxkcylcbiAgICAgICAgICAgIC53aGVyZUluKFwidXVpZFwiLCB1dWlkcyBhcyByZWFkb25seSBzdHJpbmdbXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnCAodW5pcXVlSW5kZXhlcyDsnbTrr7gg7LK07YGs65CoKVxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0Q29sdW1ucyA9IHRhYmxlLnVuaXF1ZUluZGV4ZXNbMF0uY29sdW1ucztcbiAgICAgICAgICBjb25zdCB1cGRhdGVDb2x1bW5zID0gT2JqZWN0LmtleXMoZGF0YUNodW5rWzBdKS5maWx0ZXIoXG4gICAgICAgICAgICAoY29sKSA9PiBjb2wgIT09IFwidXVpZFwiICYmICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUkVUVVJOSU5H7Jy866GcIOqysOqzvCDrsJvquLBcbiAgICAgICAgICBjb25zdCBxdWVyeSA9IHdkYi5pbnNlcnQoZGF0YUNodW5rKS5pbnRvKHRhYmxlTmFtZSkub25Db25mbGljdChjb25mbGljdENvbHVtbnMpO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojsnLzrqbQgaWdub3JlKCksIOyVhOuLiOuptCBtZXJnZSgpXG4gICAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHRSb3dzID0gYXdhaXQgcXVlcnkuaWdub3JlKCkucmV0dXJuaW5nKHNlbGVjdEZpZWxkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCBxdWVyeS5tZXJnZSh1cGRhdGVDb2x1bW5zKS5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDslpHsqr0g66qo65OcIOqzte2GtSDsspjrpqxcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0Um93cykge1xuICAgICAgICAgIHV1aWRNYXAuc2V0KHJvdy51dWlkLCByb3cpO1xuICAgICAgICAgIGFsbElkcy5wdXNoKHJvdy5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZgg642w7J207YSwIOy0iOq4sO2ZlFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItdXBzZXJ0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHJvd0NvdW50OiBhbGxJZHMubGVuZ3RoLFxuICAgICAgcmV0dXJuZWRJZHM6IGFsbElkcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxJZHM7XG4gIH1cblxuICBhc3luYyB1cGRhdGVCYXRjaChcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgICAgIHdoZXJlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjaHVua1NpemU6IG9wdGlvbnM/LmNodW5rU2l6ZSA/PyA1MDAsXG4gICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmUgPz8gXCJpZFwiLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg65Ox66Gd65CY7KeAIOyViuydgCDthYzsnbTruJQgJHt0YWJsZU5hbWV97JeQIHVwZGF0ZUJhdGNoIOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNvbHVtbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMud2hlcmUpID8gb3B0aW9ucy53aGVyZSA6IFtvcHRpb25zLndoZXJlID8/IFwiaWRcIl07XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKChfcm93KSA9PiB7XG4gICAgICBjb25zdCB7IHV1aWQ6IF8sIC4uLnJvdyB9ID0gX3JvdzsgLy8gdXVpZCDsoJzsmbhcbiAgICAgIHJldHVybiByb3cgYXMgUm93V2l0aElkPHN0cmluZz47XG4gICAgfSk7XG5cbiAgICBhd2FpdCBiYXRjaFVwZGF0ZSh3ZGIsIHRhYmxlTmFtZSwgd2hlcmVDb2x1bW5zLCByb3dzLCBvcHRpb25zLmNodW5rU2l6ZSk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1iYXRjaC11cGRhdGVkXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgIHdoZXJlQ29sdW1ucyxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUJhdGNoIOyZhOujjCDtm4Qg7LKY66as65CcIOuNsOydtO2EsCDsoJzqsbBcbiAgICB0YWJsZS5yb3dzID0gW107XG4gICAgdGFibGUucmVmZXJlbmNlcy5jbGVhcigpO1xuICAgIHRhYmxlLnVuaXF1ZXNNYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJ1bmlxdWUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJhc3NlcnREZWZpbmVkIiwiY2h1bmsiLCJub25OdWxsYWJsZSIsImJhdGNoVXBkYXRlIiwiaXNSZWZGaWVsZCIsImZpZWxkIiwidW5kZWZpbmVkIiwib2YiLCJ1dWlkIiwiVXBzZXJ0QnVpbGRlciIsInRhYmxlcyIsIk1hcCIsImdldFRhYmxlIiwidGFibGVOYW1lIiwidGFibGUiLCJnZXQiLCJ0YWJsZVNwZWMiLCJnZXRUYWJsZVNwZWMiLCJ0YWJsZURhdGEiLCJyZWZlcmVuY2VzIiwiU2V0Iiwicm93cyIsInVuaXF1ZUluZGV4ZXMiLCJ1bmlxdWVzTWFwIiwic2V0IiwiaGFzVGFibGUiLCJoYXMiLCJyZWdpc3RlciIsInJvdyIsInVuaXF1ZUtleXMiLCJtYXAiLCJ1bnFJbmRleCIsInVuaXF1ZUtleUFycmF5IiwiY29sdW1ucyIsInVucUNvbCIsInZhbCIsImxlbmd0aCIsImpvaW4iLCJmaWx0ZXIiLCJpc1JldXNlZCIsInVuaXF1ZUtleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInJvd0tleSIsInJvd1ZhbHVlIiwidXNlIiwiYWRkIiwiRGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIiwicmVzdWx0IiwidCIsImlzVXVpZFJldXNlZCIsInVwc2VydCIsIndkYiIsImNodW5rU2l6ZSIsInVwc2VydE9ySW5zZXJ0IiwiaW5zZXJ0T25seSIsIm1vZGUiLCJFcnJvciIsInNvbWUiLCJ2YWx1ZSIsInJlZlRhYmxlcyIsIkFycmF5IiwiZnJvbSIsInJlZHVjZSIsInIiLCJyZWZlcmVuY2UiLCJ2YWx1ZXMiLCJmaW5kIiwicmVmIiwiaW5jbHVkZXMiLCJleHRyYWN0RmllbGRzIiwic3BsaXQiLCJsZXZlbHMiLCJoYXNDaXJjdWxhciIsImJ1aWxkSW5zZXJ0TGV2ZWxzIiwidXVpZE1hcCIsImFsbElkcyIsImxldmVsUm93cyIsInJlc29sdmVkUm93cyIsInJlc29sdmVkIiwia2V5IiwicGFyZW50IiwidG8iLCJsZXZlbENodW5rcyIsInNlbGVjdEZpZWxkcyIsImRhdGFDaHVuayIsInJlc3VsdFJvd3MiLCJpbnNlcnQiLCJpbnRvIiwidXVpZHMiLCJzZWxlY3QiLCJ3aGVyZUluIiwiY29uZmxpY3RDb2x1bW5zIiwidXBkYXRlQ29sdW1ucyIsImtleXMiLCJjb2wiLCJxdWVyeSIsIm9uQ29uZmxpY3QiLCJpZ25vcmUiLCJyZXR1cm5pbmciLCJtZXJnZSIsImlkIiwicHJvcCIsImNvbnNvbGUiLCJlcnJvciIsInJlc29sdmVkVmFsdWUiLCJjbGVhciIsInJvd0NvdW50IiwicmV0dXJuZWRJZHMiLCJ1cGRhdGVCYXRjaCIsIm9wdGlvbnMiLCJ3aGVyZSIsIndoZXJlQ29sdW1ucyIsImlzQXJyYXkiLCJfcm93IiwiXyIsImhhc1NlbGZSZWYiLCJmbGF0TWFwIiwicm93QnlVdWlkIiwicGVuZGluZyIsImluc2VydGVkIiwiY3VycmVudExldmVsIiwibmV4dFBlbmRpbmciLCJzZWxmUmVmcyIsImNhbkluc2VydCIsImV2ZXJ5Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsU0FBUztBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0MsYUFBYSxFQUFFQyxLQUFLLEVBQUVDLFdBQVcsUUFBUSxvQkFBaUI7QUFD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
@@ -1,5 +1,6 @@
1
+ import { type EntityJson } from "../types/types";
2
+ import type { AbsolutePath } from "../utils/path-utils";
1
3
  import { Entity } from "./entity";
2
- import { EntityJson } from "../types/types";
3
4
  export type EntityNamesRecord = Record<"fs" | "fsPlural" | "camel" | "camelPlural" | "capital" | "capitalPlural" | "upper" | "constant", string>;
4
5
  type TableSpec = {
5
6
  name: string;
@@ -13,7 +14,165 @@ declare class EntityManagerClass {
13
14
  modulePaths: Map<string, string>;
14
15
  private tableSpecs;
15
16
  isAutoloaded: boolean;
16
- autoload(doSilent?: boolean): Promise<void>;
17
+ autoload(_?: boolean): Promise<void>;
18
+ schemaValidate(json: unknown): import("zod").ZodError<{
19
+ id: string;
20
+ title: string;
21
+ table: string;
22
+ props: ({
23
+ type: "boolean" | "date" | "integer" | "integer[]" | "bigInteger" | "bigInteger[]" | "boolean[]" | "date[]" | "uuid" | "uuid[]";
24
+ name: string;
25
+ desc?: string | undefined;
26
+ nullable?: boolean | undefined;
27
+ toFilter?: true | undefined;
28
+ dbDefault?: string | number | boolean | undefined;
29
+ } | {
30
+ type: "string";
31
+ name: string;
32
+ length?: number | undefined;
33
+ desc?: string | undefined;
34
+ nullable?: boolean | undefined;
35
+ toFilter?: true | undefined;
36
+ dbDefault?: string | number | boolean | undefined;
37
+ } | {
38
+ type: "string[]";
39
+ name: string;
40
+ length?: number | undefined;
41
+ desc?: string | undefined;
42
+ nullable?: boolean | undefined;
43
+ toFilter?: true | undefined;
44
+ dbDefault?: string | number | boolean | undefined;
45
+ } | {
46
+ type: "enum";
47
+ id: string;
48
+ name: string;
49
+ desc?: string | undefined;
50
+ nullable?: boolean | undefined;
51
+ toFilter?: true | undefined;
52
+ dbDefault?: string | number | boolean | undefined;
53
+ } | {
54
+ type: "enum[]";
55
+ id: string;
56
+ name: string;
57
+ desc?: string | undefined;
58
+ nullable?: boolean | undefined;
59
+ toFilter?: true | undefined;
60
+ dbDefault?: string | number | boolean | undefined;
61
+ } | {
62
+ type: "number";
63
+ name: string;
64
+ numberType?: "numeric" | "real" | "double precision" | undefined;
65
+ precision?: number | undefined;
66
+ scale?: number | undefined;
67
+ desc?: string | undefined;
68
+ nullable?: boolean | undefined;
69
+ toFilter?: true | undefined;
70
+ dbDefault?: string | number | boolean | undefined;
71
+ } | {
72
+ type: "number[]";
73
+ name: string;
74
+ numberType?: "numeric" | "real" | "double precision" | undefined;
75
+ precision?: number | undefined;
76
+ scale?: number | undefined;
77
+ desc?: string | undefined;
78
+ nullable?: boolean | undefined;
79
+ toFilter?: true | undefined;
80
+ dbDefault?: string | number | boolean | undefined;
81
+ } | {
82
+ type: "numeric";
83
+ name: string;
84
+ precision?: number | undefined;
85
+ scale?: number | undefined;
86
+ desc?: string | undefined;
87
+ nullable?: boolean | undefined;
88
+ toFilter?: true | undefined;
89
+ dbDefault?: string | number | boolean | undefined;
90
+ } | {
91
+ type: "numeric[]";
92
+ name: string;
93
+ precision?: number | undefined;
94
+ scale?: number | undefined;
95
+ desc?: string | undefined;
96
+ nullable?: boolean | undefined;
97
+ toFilter?: true | undefined;
98
+ dbDefault?: string | number | boolean | undefined;
99
+ } | {
100
+ type: "json";
101
+ id: string;
102
+ name: string;
103
+ desc?: string | undefined;
104
+ nullable?: boolean | undefined;
105
+ toFilter?: true | undefined;
106
+ dbDefault?: string | number | boolean | undefined;
107
+ } | {
108
+ type: "virtual";
109
+ id: string;
110
+ name: string;
111
+ desc?: string | undefined;
112
+ nullable?: boolean | undefined;
113
+ toFilter?: true | undefined;
114
+ dbDefault?: string | number | boolean | undefined;
115
+ } | {
116
+ relationType: "BelongsToOne";
117
+ type: "relation";
118
+ with: string;
119
+ name: string;
120
+ customJoinClause?: string | undefined;
121
+ useConstraint?: boolean | undefined;
122
+ onUpdate?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
123
+ onDelete?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
124
+ desc?: string | undefined;
125
+ nullable?: boolean | undefined;
126
+ toFilter?: true | undefined;
127
+ dbDefault?: string | number | boolean | undefined;
128
+ } | {
129
+ relationType: "HasMany";
130
+ joinColumn: string;
131
+ type: "relation";
132
+ with: string;
133
+ name: string;
134
+ fromColumn?: string | undefined;
135
+ desc?: string | undefined;
136
+ nullable?: boolean | undefined;
137
+ toFilter?: true | undefined;
138
+ dbDefault?: string | number | boolean | undefined;
139
+ } | {
140
+ relationType: "ManyToMany";
141
+ joinTable: string;
142
+ onUpdate: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT";
143
+ onDelete: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT";
144
+ type: "relation";
145
+ with: string;
146
+ name: string;
147
+ desc?: string | undefined;
148
+ nullable?: boolean | undefined;
149
+ toFilter?: true | undefined;
150
+ dbDefault?: string | number | boolean | undefined;
151
+ } | {
152
+ relationType: "OneToOne";
153
+ type: "relation";
154
+ with: string;
155
+ name: string;
156
+ customJoinClause?: string | undefined;
157
+ hasJoinColumn?: boolean | undefined;
158
+ useConstraint?: boolean | undefined;
159
+ onUpdate?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
160
+ onDelete?: "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT" | undefined;
161
+ desc?: string | undefined;
162
+ nullable?: boolean | undefined;
163
+ toFilter?: true | undefined;
164
+ dbDefault?: string | number | boolean | undefined;
165
+ })[];
166
+ indexes: {
167
+ type: "index" | "unique" | "fulltext";
168
+ columns: string[];
169
+ name?: string | undefined;
170
+ parser?: "built-in" | "ngram" | undefined;
171
+ }[];
172
+ subsets: Record<string, string[]>;
173
+ enums: Record<string, Record<string, string>>;
174
+ parentId?: string | undefined;
175
+ }> | null;
17
176
  reload(doSilent?: boolean): Promise<void>;
18
177
  register(json: EntityJson): Promise<void>;
19
178
  get(entityId: string): Entity;
@@ -26,6 +185,12 @@ declare class EntityManagerClass {
26
185
  setTableSpec(tableSpec: TableSpec): void;
27
186
  getTableSpec(key: string): TableSpec;
28
187
  getNamesFromId(entityId: string): EntityNamesRecord;
188
+ /**
189
+ * EntityId는 Model을 제외한 PascalCase 이름입니다. (ex. "User")
190
+ * @param filePath
191
+ * @returns
192
+ */
193
+ getEntityIdFromPath(filePath: AbsolutePath): string;
29
194
  }
30
195
  export declare const EntityManager: EntityManagerClass;
31
196
  export {};