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
@@ -0,0 +1,10 @@
1
+ /**
2
+ * BaseModel 타입 시스템
3
+ *
4
+ * BaseModelClass에서 사용하는 타입 유틸리티들.
5
+ * Enhancer, SubsetQuery 교집합 등 Model 계층에서 필요한 타입 정의.
6
+ */ /**
7
+ * executeSubsetQuery 반환 타입
8
+ */ export { };
9
+
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZU1vZGVsIO2DgOyehSDsi5zsiqTthZxcbiAqXG4gKiBCYXNlTW9kZWxDbGFzc+yXkOyEnCDsgqzsmqntlZjripQg7YOA7J6FIOycoO2LuOumrO2LsOuTpC5cbiAqIEVuaGFuY2VyLCBTdWJzZXRRdWVyeSDqtZDsp5Htlakg65OxIE1vZGVsIOqzhOy4teyXkOyEnCDtlYTsmpTtlZwg7YOA7J6FIOygleydmC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlTdWJzZXRGbiB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFB1cmkg7YWM7J2067iUIOy2lOy2nCDsnKDti7jrpqzti7Bcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQdXJpIOyduOyKpO2EtOyKpOyXkOyEnCBUVGFibGVzIO2DgOyehSDstpTstpxcbiAqL1xuZXhwb3J0IHR5cGUgRXh0cmFjdFB1cmlUYWJsZXM8VD4gPSBUIGV4dGVuZHMgUHVyaTxhbnksIGluZmVyIFRUYWJsZXMsIGFueT4gPyBUVGFibGVzIDogbmV2ZXI7XG5cbi8qKlxuICogU3Vic2V0UXVlcmllc+yXkOyEnCDrqqjrk6AgVFRhYmxlc+ydmCDsnKDri4jsmKgg7LaU7LacXG4gKiBnZXRTdWJzZXRRdWVyaWVz7J2YIHFiIO2DgOyehSDsoJXsnZjsl5Ag7IKs7JqpXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPixcbj4gPSBFeHRyYWN0UHVyaVRhYmxlczxSZXR1cm5UeXBlPFRTdWJzZXRRdWVyaWVzW1RTdWJzZXRLZXldPj47XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFN1YnNldCDqtZDsp5Htlakg6rOE7IKwIChvblN1YnNldCDrqZTshJzrk5zsmqkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog65GQIFB1cmnsnZgg7YWM7J2067iUIOq1kOynke2VqeydhCDqsIDsp4Qg7IOI66Gc7Jq0IFB1cmkg7IOd7ISxXG4gKi9cbnR5cGUgTWVyZ2VQdXJpVGFibGVzPEEsIEIsIFRBID0gRXh0cmFjdFB1cmlUYWJsZXM8QT4sIFRCID0gRXh0cmFjdFB1cmlUYWJsZXM8Qj4+ID0gUHVyaTxcbiAgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIFBpY2s8VEEsIEV4dHJhY3Q8a2V5b2YgVEEsIGtleW9mIFRCPj4sXG4gIGFueVxuPjtcblxuLyoqXG4gKiDshJzruIzshYsg7YKkIOuwsOyXtOydhCDsiJztmoztlZjrqbAg7YWM7J2067iUIOq1kOynke2VqSBQdXJpIOqzhOyCsFxuICpcbiAqIG9uU3Vic2V0KFsnQScsICdQJ10p7JmAIOqwmeydtCDsl6zrn6wgc3Vic2V07J2EIOyngOygle2WiOydhCDrlYwsXG4gKiDqs7XthrXsnLzroZwg7IKs7JqpIOqwgOuKpe2VnCDthYzsnbTruJTrp4wg7Y+s7ZWo65CcIFB1cmkg7YOA7J6FIOuwmO2ZmFxuICovXG5leHBvcnQgdHlwZSBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uPFxuICBLZXlzIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10sXG4gIFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogYW55KSA9PiBhbnk+LFxuPiA9IEtleXMgZXh0ZW5kcyBbaW5mZXIgSGVhZCBleHRlbmRzIHN0cmluZywgLi4uaW5mZXIgVGFpbCBleHRlbmRzIHN0cmluZ1tdXVxuICA/IFRhaWwgZXh0ZW5kcyBbXVxuICAgID8gUmV0dXJuVHlwZTxRdWVyaWVzW0hlYWRdPlxuICAgIDogTWVyZ2VQdXJpVGFibGVzPFJldHVyblR5cGU8UXVlcmllc1tIZWFkXT4sIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248VGFpbCwgUXVlcmllcz4+XG4gIDogbmV2ZXI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuaGFuY2VyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog64uo7J28IEVuaGFuY2VyIO2VqOyImCDtg4DsnoVcbiAqIGNvbXB1dGVkIOqysOqzvOulvCDrsJvslYQg7LWc7KKFIG1hcHBpbmcg7YOA7J6F7Jy866GcIOuzgO2ZmFxuICovXG5leHBvcnQgdHlwZSBFbmhhbmNlckZuPFRDb21wdXRlZCwgVE1hcHBpbmc+ID0gKHJvdzogVENvbXB1dGVkKSA9PiBUTWFwcGluZyB8IFByb21pc2U8VE1hcHBpbmc+O1xuXG4vKipcbiAqIEVuaGFuY2Vy6rCAIO2VhOyImOyduCBTdWJzZXRLZXkg7LaU7LacXG4gKlxuICogQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5Ag7ZWg64u5IOu2iOqwgOuKpe2VmOuptCDtlbTri7kgS+uKlCDtlYTsiJhcbiAqICjspoksIHZpcnR1YWwg7ZWE65OcIOuTsSDstpTqsIAg67OA7ZmY7J20IO2VhOyalO2VnCDqsr3smrApXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVkRW5oYW5jZXJLZXlzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4+ID0ge1xuICBbSyBpbiBUU3Vic2V0S2V5XTogVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLO1xufVtUU3Vic2V0S2V5XTtcblxuLyoqXG4gKiBFbmhhbmNlciDqsJ3ssrQg7YOA7J6FIOygleydmFxuICpcbiAqIC0gQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5AgYXNzaWduYWJsZe2VmOuptCDihpIgZW5oYW5jZXIg7ISg7YOd7KCBXG4gKiAtIOq3uOugh+yngCDslYrsnLzrqbQg4oaSIGVuaGFuY2VyIO2VhOyImFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyB2aXJ0dWFsIO2VhOuTnCBlbXBsb3llZV9jb3VudOqwgCDsnojripQg6rK97JqwXG4gKiB0eXBlIENvbXB1dGVkID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVxuICogdHlwZSBNYXBwaW5nID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtcGxveWVlX2NvdW50OiBudW1iZXIgfVxuICogLy8g4oaSIEVuaGFuY2VyIO2VhOyImCAoZW1wbG95ZWVfY291bnQg6rOE7IKwIO2VhOyalClcbiAqL1xuZXhwb3J0IHR5cGUgRW5oYW5jZXJNYXA8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIC8vIENvbXB1dGVk6rCAIE1hcHBpbmfsl5Ag7Zi47ZmY65CY66m0IOyEoO2DneyggVxuICBbSyBpbiBUU3Vic2V0S2V5IGFzIFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IEsgOiBuZXZlcl0/OiBFbmhhbmNlckZuPFxuICAgIFRDb21wdXRlZFJlc3VsdHNbS10sXG4gICAgVFN1YnNldE1hcHBpbmdbS11cbiAgPjtcbn0gJiB7XG4gIC8vIO2YuO2ZmOuQmOyngCDslYrsnLzrqbQg7ZWE7IiYXG4gIFtLIGluIFRTdWJzZXRLZXkgYXMgVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLXTogRW5oYW5jZXJGbjxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzW0tdLFxuICAgIFRTdWJzZXRNYXBwaW5nW0tdXG4gID47XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBleGVjdXRlU3Vic2V0UXVlcnlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBleGVjdXRlU3Vic2V0UXVlcnkg6riw67O4IO2MjOudvOuvuO2EsFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlCYXNlUGFyYW1zPFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBzdWJzZXQ6IFRTdWJzZXRLZXk7XG4gIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICBwYXJhbXM6IHtcbiAgICBudW0/OiBudW1iZXI7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiO1xuICB9O1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIGV4ZWN1dGVTdWJzZXRRdWVyeSDtjIzrnbzrr7jthLAgKEVuaGFuY2VyIO2PrO2VqClcbiAqXG4gKiBSZXF1aXJlZEVuaGFuY2VyS2V5c+qwgCDsl4bsnLzrqbQgZW5oYW5jZXJzIOyEoO2DneyggSwg7J6I7Jy866m0IO2VhOyImFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlQYXJhbXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVCBleHRlbmRzIFRTdWJzZXRLZXksXG4+ID0gRXhlY3V0ZVN1YnNldFF1ZXJ5QmFzZVBhcmFtczxUPiAmXG4gIChbUmVxdWlyZWRFbmhhbmNlcktleXM8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+XSBleHRlbmRzIFtuZXZlcl1cbiAgICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgICA6IHsgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz4gfSk7XG5cbi8qKlxuICogZXhlY3V0ZVN1YnNldFF1ZXJ5IOuwmO2ZmCDtg4DsnoVcbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0PFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFQgZXh0ZW5kcyBzdHJpbmcsXG4+ID0ge1xuICByb3dzOiBUU3Vic2V0TWFwcGluZ1tUXVtdO1xuICB0b3RhbDogbnVtYmVyO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Q0FLQyxHQTRJRDs7Q0FFQyxHQUNELFdBTUUifQ==
@@ -1,4 +1,4 @@
1
- import { MigrationColumn, MigrationIndex } from "../types/types";
1
+ import type { MigrationColumn, MigrationIndex } from "../types/types";
2
2
  export declare class CodeGenerator {
3
3
  getAlterColumnsTo(entityColumns: MigrationColumn[], dbColumns: MigrationColumn[]): {
4
4
  add: MigrationColumn[];
@@ -1 +1 @@
1
- {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjE,qBAAa,aAAa;IACxB,iBAAiB,CACf,aAAa,EAAE,eAAe,EAAE,EAChC,SAAS,EAAE,eAAe,EAAE;aAGf,eAAe,EAAE;cAChB,eAAe,EAAE;eAChB,eAAe,EAAE;;IAiClC,iBAAiB,CACf,aAAa,EAAE,cAAc,EAAE,EAC/B,SAAS,EAAE,cAAc,EAAE;aAId,cAAc,EAAE;cACf,cAAc,EAAE;;CAmBjC"}
1
+ {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGtE,qBAAa,aAAa;IACxB,iBAAiB,CAAC,aAAa,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;aAEjE,eAAe,EAAE;cAChB,eAAe,EAAE;eAChB,eAAe,EAAE;;IAuBlC,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;aAG/D,cAAc,EAAE;cACf,cAAc,EAAE;;CAejC"}
@@ -1,2 +1,54 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"CodeGenerator",{enumerable:true,get:function(){return CodeGenerator}});var _lodash=/*#__PURE__*/_interop_require_default(require("lodash"));var _fastdeepequal=/*#__PURE__*/_interop_require_default(require("fast-deep-equal"));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 _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}var CodeGenerator=/*#__PURE__*/function(){"use strict";function CodeGenerator(){_class_call_check(this,CodeGenerator)}_create_class(CodeGenerator,[{key:"getAlterColumnsTo",value:function getAlterColumnsTo(entityColumns,dbColumns){var columnsTo={add:[],drop:[],alter:[]};var extraColumns={db:_lodash.default.differenceBy(dbColumns,entityColumns,function(col){return col.name}),entity:_lodash.default.differenceBy(entityColumns,dbColumns,function(col){return col.name})};if(extraColumns.entity.length>0){columnsTo.add=columnsTo.add.concat(extraColumns.entity)}if(extraColumns.db.length>0){columnsTo.drop=columnsTo.drop.concat(extraColumns.db)}var sameDbColumns=_lodash.default.intersectionBy(dbColumns,entityColumns,function(col){return col.name});var sameMdColumns=_lodash.default.intersectionBy(entityColumns,dbColumns,function(col){return col.name});columnsTo.alter=_lodash.default.differenceWith(sameDbColumns,sameMdColumns,function(a,b){return(0,_fastdeepequal.default)(a,b)});return columnsTo}},{key:"getAlterIndexesTo",value:function getAlterIndexesTo(entityIndexes,dbIndexes){var indexesTo={add:[],drop:[]};var extraIndexes={db:_lodash.default.differenceBy(dbIndexes,entityIndexes,function(col){return[col.type,col.columns.join("-")].join("//")}),entity:_lodash.default.differenceBy(entityIndexes,dbIndexes,function(col){return[col.type,col.columns.join("-")].join("//")})};if(extraIndexes.entity.length>0){indexesTo.add=indexesTo.add.concat(extraIndexes.entity)}if(extraIndexes.db.length>0){indexesTo.drop=indexesTo.drop.concat(extraIndexes.db)}return indexesTo}}]);return CodeGenerator}();
2
- //# sourceMappingURL=code-generator.js.map
1
+ import equal from "fast-deep-equal";
2
+ import { diff } from "radashi";
3
+ import { differenceWith, intersectionBy } from "../utils/utils.js";
4
+ export class CodeGenerator {
5
+ getAlterColumnsTo(entityColumns, dbColumns) {
6
+ const columnsTo = {
7
+ add: [],
8
+ drop: [],
9
+ alter: []
10
+ };
11
+ // 컬럼명 기준 비교
12
+ const extraColumns = {
13
+ db: diff(dbColumns, entityColumns, (col)=>col.name),
14
+ entity: diff(entityColumns, dbColumns, (col)=>col.name)
15
+ };
16
+ if (extraColumns.entity.length > 0) {
17
+ columnsTo.add = columnsTo.add.concat(extraColumns.entity);
18
+ }
19
+ if (extraColumns.db.length > 0) {
20
+ columnsTo.drop = columnsTo.drop.concat(extraColumns.db);
21
+ }
22
+ // 동일 컬럼명의 세부 필드 비교
23
+ const sameDbColumns = intersectionBy(dbColumns, entityColumns, (col)=>col.name);
24
+ const sameMdColumns = intersectionBy(entityColumns, dbColumns, (col)=>col.name);
25
+ columnsTo.alter = differenceWith(sameDbColumns, sameMdColumns, (a, b)=>equal(a, b));
26
+ return columnsTo;
27
+ }
28
+ getAlterIndexesTo(entityIndexes, dbIndexes) {
29
+ // 인덱스 비교
30
+ const indexesTo = {
31
+ add: [],
32
+ drop: []
33
+ };
34
+ const extraIndexes = {
35
+ db: diff(dbIndexes, entityIndexes, (col)=>[
36
+ col.type,
37
+ col.columns.join("-")
38
+ ].join("//")),
39
+ entity: diff(entityIndexes, dbIndexes, (col)=>[
40
+ col.type,
41
+ col.columns.join("-")
42
+ ].join("//"))
43
+ };
44
+ if (extraIndexes.entity.length > 0) {
45
+ indexesTo.add = indexesTo.add.concat(extraIndexes.entity);
46
+ }
47
+ if (extraIndexes.db.length > 0) {
48
+ indexesTo.drop = indexesTo.drop.concat(extraIndexes.db);
49
+ }
50
+ return indexesTo;
51
+ }
52
+ }
53
+
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9jb2RlLWdlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IE1pZ3JhdGlvbkNvbHVtbiwgTWlncmF0aW9uSW5kZXggfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29kZUdlbmVyYXRvciB7XG4gIGdldEFsdGVyQ29sdW1uc1RvKGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLCBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdKSB7XG4gICAgY29uc3QgY29sdW1uc1RvID0ge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgICAgYWx0ZXI6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIH07XG5cbiAgICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICAgIGNvbnN0IGV4dHJhQ29sdW1ucyA9IHtcbiAgICAgIGRiOiBkaWZmKGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpLFxuICAgICAgZW50aXR5OiBkaWZmKGVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpLFxuICAgIH07XG4gICAgaWYgKGV4dHJhQ29sdW1ucy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgICAgY29sdW1uc1RvLmFkZCA9IGNvbHVtbnNUby5hZGQuY29uY2F0KGV4dHJhQ29sdW1ucy5lbnRpdHkpO1xuICAgIH1cbiAgICBpZiAoZXh0cmFDb2x1bW5zLmRiLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbHVtbnNUby5kcm9wID0gY29sdW1uc1RvLmRyb3AuY29uY2F0KGV4dHJhQ29sdW1ucy5kYik7XG4gICAgfVxuXG4gICAgLy8g64+Z7J28IOy7rOufvOuqheydmCDshLjrtoAg7ZWE65OcIOu5hOq1kFxuICAgIGNvbnN0IHNhbWVEYkNvbHVtbnMgPSBpbnRlcnNlY3Rpb25CeShkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcbiAgICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gICAgY29sdW1uc1RvLmFsdGVyID0gZGlmZmVyZW5jZVdpdGgoc2FtZURiQ29sdW1ucywgc2FtZU1kQ29sdW1ucywgKGEsIGIpID0+IGVxdWFsKGEsIGIpKTtcblxuICAgIHJldHVybiBjb2x1bW5zVG87XG4gIH1cblxuICBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgICAvLyDsnbjrjbHsiqQg67mE6rWQXG4gICAgY29uc3QgaW5kZXhlc1RvID0ge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgICAgZHJvcDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgICB9O1xuICAgIGNvbnN0IGV4dHJhSW5kZXhlcyA9IHtcbiAgICAgIGRiOiBkaWZmKGRiSW5kZXhlcywgZW50aXR5SW5kZXhlcywgKGNvbCkgPT4gW2NvbC50eXBlLCBjb2wuY29sdW1ucy5qb2luKFwiLVwiKV0uam9pbihcIi8vXCIpKSxcbiAgICAgIGVudGl0eTogZGlmZihlbnRpdHlJbmRleGVzLCBkYkluZGV4ZXMsIChjb2wpID0+IFtjb2wudHlwZSwgY29sLmNvbHVtbnMuam9pbihcIi1cIildLmpvaW4oXCIvL1wiKSksXG4gICAgfTtcbiAgICBpZiAoZXh0cmFJbmRleGVzLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgICBpbmRleGVzVG8uYWRkID0gaW5kZXhlc1RvLmFkZC5jb25jYXQoZXh0cmFJbmRleGVzLmVudGl0eSk7XG4gICAgfVxuICAgIGlmIChleHRyYUluZGV4ZXMuZGIubGVuZ3RoID4gMCkge1xuICAgICAgaW5kZXhlc1RvLmRyb3AgPSBpbmRleGVzVG8uZHJvcC5jb25jYXQoZXh0cmFJbmRleGVzLmRiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXhlc1RvO1xuICB9XG59XG4iXSwibmFtZXMiOlsiZXF1YWwiLCJkaWZmIiwiZGlmZmVyZW5jZVdpdGgiLCJpbnRlcnNlY3Rpb25CeSIsIkNvZGVHZW5lcmF0b3IiLCJnZXRBbHRlckNvbHVtbnNUbyIsImVudGl0eUNvbHVtbnMiLCJkYkNvbHVtbnMiLCJjb2x1bW5zVG8iLCJhZGQiLCJkcm9wIiwiYWx0ZXIiLCJleHRyYUNvbHVtbnMiLCJkYiIsImNvbCIsIm5hbWUiLCJlbnRpdHkiLCJsZW5ndGgiLCJjb25jYXQiLCJzYW1lRGJDb2x1bW5zIiwic2FtZU1kQ29sdW1ucyIsImEiLCJiIiwiZ2V0QWx0ZXJJbmRleGVzVG8iLCJlbnRpdHlJbmRleGVzIiwiZGJJbmRleGVzIiwiaW5kZXhlc1RvIiwiZXh0cmFJbmRleGVzIiwidHlwZSIsImNvbHVtbnMiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLGtCQUFrQjtBQUNwQyxTQUFTQyxJQUFJLFFBQVEsVUFBVTtBQUUvQixTQUFTQyxjQUFjLEVBQUVDLGNBQWMsUUFBUSxvQkFBaUI7QUFFaEUsT0FBTyxNQUFNQztJQUNYQyxrQkFBa0JDLGFBQWdDLEVBQUVDLFNBQTRCLEVBQUU7UUFDaEYsTUFBTUMsWUFBWTtZQUNoQkMsS0FBSyxFQUFFO1lBQ1BDLE1BQU0sRUFBRTtZQUNSQyxPQUFPLEVBQUU7UUFDWDtRQUVBLFlBQVk7UUFDWixNQUFNQyxlQUFlO1lBQ25CQyxJQUFJWixLQUFLTSxXQUFXRCxlQUFlLENBQUNRLE1BQVFBLElBQUlDLElBQUk7WUFDcERDLFFBQVFmLEtBQUtLLGVBQWVDLFdBQVcsQ0FBQ08sTUFBUUEsSUFBSUMsSUFBSTtRQUMxRDtRQUNBLElBQUlILGFBQWFJLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENULFVBQVVDLEdBQUcsR0FBR0QsVUFBVUMsR0FBRyxDQUFDUyxNQUFNLENBQUNOLGFBQWFJLE1BQU07UUFDMUQ7UUFDQSxJQUFJSixhQUFhQyxFQUFFLENBQUNJLE1BQU0sR0FBRyxHQUFHO1lBQzlCVCxVQUFVRSxJQUFJLEdBQUdGLFVBQVVFLElBQUksQ0FBQ1EsTUFBTSxDQUFDTixhQUFhQyxFQUFFO1FBQ3hEO1FBRUEsbUJBQW1CO1FBQ25CLE1BQU1NLGdCQUFnQmhCLGVBQWVJLFdBQVdELGVBQWUsQ0FBQ1EsTUFBUUEsSUFBSUMsSUFBSTtRQUNoRixNQUFNSyxnQkFBZ0JqQixlQUFlRyxlQUFlQyxXQUFXLENBQUNPLE1BQVFBLElBQUlDLElBQUk7UUFDaEZQLFVBQVVHLEtBQUssR0FBR1QsZUFBZWlCLGVBQWVDLGVBQWUsQ0FBQ0MsR0FBR0MsSUFBTXRCLE1BQU1xQixHQUFHQztRQUVsRixPQUFPZDtJQUNUO0lBRUFlLGtCQUFrQkMsYUFBK0IsRUFBRUMsU0FBMkIsRUFBRTtRQUM5RSxTQUFTO1FBQ1QsTUFBTUMsWUFBWTtZQUNoQmpCLEtBQUssRUFBRTtZQUNQQyxNQUFNLEVBQUU7UUFDVjtRQUNBLE1BQU1pQixlQUFlO1lBQ25CZCxJQUFJWixLQUFLd0IsV0FBV0QsZUFBZSxDQUFDVixNQUFRO29CQUFDQSxJQUFJYyxJQUFJO29CQUFFZCxJQUFJZSxPQUFPLENBQUNDLElBQUksQ0FBQztpQkFBSyxDQUFDQSxJQUFJLENBQUM7WUFDbkZkLFFBQVFmLEtBQUt1QixlQUFlQyxXQUFXLENBQUNYLE1BQVE7b0JBQUNBLElBQUljLElBQUk7b0JBQUVkLElBQUllLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDO2lCQUFLLENBQUNBLElBQUksQ0FBQztRQUN6RjtRQUNBLElBQUlILGFBQWFYLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENTLFVBQVVqQixHQUFHLEdBQUdpQixVQUFVakIsR0FBRyxDQUFDUyxNQUFNLENBQUNTLGFBQWFYLE1BQU07UUFDMUQ7UUFDQSxJQUFJVyxhQUFhZCxFQUFFLENBQUNJLE1BQU0sR0FBRyxHQUFHO1lBQzlCUyxVQUFVaEIsSUFBSSxHQUFHZ0IsVUFBVWhCLElBQUksQ0FBQ1EsTUFBTSxDQUFDUyxhQUFhZCxFQUFFO1FBQ3hEO1FBRUEsT0FBT2E7SUFDVDtBQUNGIn0=
@@ -1,44 +1,29 @@
1
- export type DBPreset = "w" | "r";
2
- import { Knex } from "knex";
3
1
  import { AsyncLocalStorage } from "async_hooks";
2
+ import { type Knex } from "knex";
3
+ import type { SonamuConfig } from "../api/config";
4
4
  import { TransactionContext } from "./transaction-context";
5
- type MySQLConfig = Omit<Knex.Config, "connection"> & {
6
- connection?: Knex.MySql2ConnectionConfig;
7
- };
8
- export type SonamuDBBaseConfig = {
9
- database: string;
10
- defaultOptions?: MySQLConfig;
11
- environments?: {
12
- development?: MySQLConfig;
13
- development_slave?: MySQLConfig;
14
- production?: MySQLConfig;
15
- production_slave?: MySQLConfig;
16
- remote_fixture?: MySQLConfig;
17
- };
18
- };
5
+ export type DBPreset = "w" | "r";
19
6
  export type SonamuDBConfig = {
20
7
  development_master: Knex.Config;
21
8
  development_slave: Knex.Config;
22
9
  test: Knex.Config;
23
- fixture_local: Knex.Config;
24
10
  fixture_remote: Knex.Config;
25
11
  production_master: Knex.Config;
26
12
  production_slave: Knex.Config;
27
13
  };
28
- declare class DBClass {
14
+ export declare class DBClass {
29
15
  private wdb?;
30
16
  private rdb?;
31
17
  transactionStorage: AsyncLocalStorage<TransactionContext>;
32
18
  runWithTransaction<T>(callback: () => Promise<T>): Promise<T>;
33
19
  getTransactionContext(): TransactionContext;
34
- readKnexfile(): Promise<SonamuDBConfig>;
35
20
  getDB(which: DBPreset): Knex;
36
21
  destroy(): Promise<void>;
37
- private generateDBConfig;
22
+ generateDBConfig(config: SonamuConfig["database"]): SonamuDBConfig;
38
23
  testTransaction: Knex.Transaction | null;
39
24
  createTestTransaction(): Promise<Knex.Transaction>;
40
25
  clearTestTransaction(): Promise<void>;
26
+ getTestConnection(): Promise<Knex>;
41
27
  }
42
28
  export declare const DB: DBClass;
43
- export {};
44
29
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AACjC,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,KAAK,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG;IACnD,UAAU,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAE/B,QAAQ,EAAE,MAAM,CAAC;IAGjB,cAAc,CAAC,EAAE,WAAW,CAAC;IAG7B,YAAY,CAAC,EAAE;QACb,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,iBAAiB,CAAC,EAAE,WAAW,CAAC;QAChC,UAAU,CAAC,EAAE,WAAW,CAAC;QACzB,gBAAgB,CAAC,EAAE,WAAW,CAAC;QAC/B,cAAc,CAAC,EAAE,WAAW,CAAC;KAC9B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC;IAChC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;IAClB,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC;IAC3B,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC;CAC/B,CAAC;AAEF,cAAM,OAAO;IACX,OAAO,CAAC,GAAG,CAAC,CAAO;IACnB,OAAO,CAAC,GAAG,CAAC,CAAO;IAEZ,kBAAkB,wCAA+C;IAEjE,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7D,qBAAqB,IAAI,kBAAkB;IAI5C,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAmB7C,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAoDtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,OAAO,CAAC,gBAAgB;IAiFjB,eAAe,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAQ;IACjD,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAKlD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAI5C;AACD,eAAO,MAAM,EAAE,SAAgB,CAAC"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGvC,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AAEjC,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC;IAChC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC;CAC/B,CAAC;AAEF,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAC,CAAO;IACnB,OAAO,CAAC,GAAG,CAAC,CAAO;IAEZ,kBAAkB,wCAA+C;IAEjE,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7D,qBAAqB,IAAI,kBAAkB;IAIlD,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAiDtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,cAAc;IAiElE,eAAe,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAQ;IACjD,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAKlD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIzC;AACD,eAAO,MAAM,EAAE,SAAgB,CAAC"}
@@ -1,2 +1,129 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"DB",{enumerable:true,get:function(){return DB}});var _knex=/*#__PURE__*/_interop_require_default(require("knex"));var _path=/*#__PURE__*/_interop_require_default(require("path"));var _lodash=/*#__PURE__*/_interop_require_default(require("lodash"));var _api=require("../api");var _soexceptions=require("../exceptions/so-exceptions");var _async_hooks=require("async_hooks");var _transactioncontext=require("./transaction-context");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 _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}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 ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}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}}}var DBClass=/*#__PURE__*/function(){"use strict";function DBClass(){_class_call_check(this,DBClass);_define_property(this,"wdb",void 0);_define_property(this,"rdb",void 0);_define_property(this,"transactionStorage",new _async_hooks.AsyncLocalStorage);_define_property(this,"testTransaction",null)}_create_class(DBClass,[{key:"runWithTransaction",value:function runWithTransaction(callback){return this.transactionStorage.run(new _transactioncontext.TransactionContext,callback)}},{key:"getTransactionContext",value:function getTransactionContext(){var _this_transactionStorage_getStore;return(_this_transactionStorage_getStore=this.transactionStorage.getStore())!==null&&_this_transactionStorage_getStore!==void 0?_this_transactionStorage_getStore:new _transactioncontext.TransactionContext}},{key:"readKnexfile",value:function readKnexfile(){return _async_to_generator(function(){var dbConfigPath,_knexfileModule_default,knexfileModule,_knexfileModule_default_default,_ref,config,e;return _ts_generator(this,function(_state){switch(_state.label){case 0:dbConfigPath=_path.default.join(_api.Sonamu.apiRootPath,"/dist/configs/db.js");_state.label=1;case 1:_state.trys.push([1,3,,4]);return[4,Promise.resolve(dbConfigPath).then(function(p){return /*#__PURE__*/_interop_require_wildcard(require(p))})];case 2:knexfileModule=_state.sent();config=(_ref=(_knexfileModule_default_default=(_knexfileModule_default=knexfileModule.default)===null||_knexfileModule_default===void 0?void 0:_knexfileModule_default.default)!==null&&_knexfileModule_default_default!==void 0?_knexfileModule_default_default:knexfileModule.default)!==null&&_ref!==void 0?_ref:knexfileModule;return[2,this.generateDBConfig(config)];case 3:e=_state.sent();return[3,4];case 4:throw new _soexceptions.ServiceUnavailableException("다음 경로에서 DB설정 파일을 찾을 수 없습니다: ".concat(dbConfigPath,". 먼저 빌드(yarn build)를 수행해주세요."))}})}).call(this)}},{key:"getDB",value:function getDB(which){var dbConfig=_api.Sonamu.dbConfig;if(process.env.NODE_ENV==="test"){if(this.testTransaction){return this.testTransaction}else if(this.wdb){return this.wdb}else{this["wdb"]=(0,_knex.default)(_object_spread_props(_object_spread({},dbConfig["test"]),{pool:{min:1,max:1}}));return this["wdb"]}}var instanceName=which==="w"?"wdb":"rdb";if(!this[instanceName]){var config;var _process_env_NODE_ENV;switch((_process_env_NODE_ENV=process.env.NODE_ENV)!==null&&_process_env_NODE_ENV!==void 0?_process_env_NODE_ENV:"development"){case"development":case"staging":var _dbConfig_development_slave;config=which==="w"?dbConfig["development_master"]:(_dbConfig_development_slave=dbConfig["development_slave"])!==null&&_dbConfig_development_slave!==void 0?_dbConfig_development_slave:dbConfig["development_master"];break;case"production":var _dbConfig_production_slave;config=which==="w"?dbConfig["production_master"]:(_dbConfig_production_slave=dbConfig["production_slave"])!==null&&_dbConfig_production_slave!==void 0?_dbConfig_production_slave:dbConfig["production_master"];break;default:throw new Error("현재 ENV ".concat(process.env.NODE_ENV,"에는 설정 가능한 DB설정이 없습니다."))}this[instanceName]=(0,_knex.default)(config)}return this[instanceName]}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!(this.wdb!==undefined))return[3,2];return[4,this.wdb.destroy()];case 1:_state.sent();this.wdb=undefined;_state.label=2;case 2:if(!(this.rdb!==undefined))return[3,4];return[4,this.rdb.destroy()];case 3:_state.sent();this.rdb=undefined;_state.label=4;case 4:return[2]}})}).call(this)}},{key:"generateDBConfig",value:function generateDBConfig(config){var _config_defaultOptions,_config_defaultOptions1,_config_defaultOptions2,_config_environments,_config_environments1,_config_environments2,_config_environments3,_config_environments4;var defaultKnexConfig=_lodash.default.merge({client:"mysql2",pool:{min:1,max:5},migrations:{extension:"js",directory:"./dist/migrations"},connection:_object_spread({database:config.database},(_config_defaultOptions=config.defaultOptions)===null||_config_defaultOptions===void 0?void 0:_config_defaultOptions.connection)},config.defaultOptions);var test=_lodash.default.merge({},defaultKnexConfig,{connection:_object_spread({database:"".concat(config.database,"_test")},(_config_defaultOptions1=config.defaultOptions)===null||_config_defaultOptions1===void 0?void 0:_config_defaultOptions1.connection)});var fixture_local=_lodash.default.merge({},defaultKnexConfig,{connection:_object_spread({database:"".concat(config.database,"_fixture_local")},(_config_defaultOptions2=config.defaultOptions)===null||_config_defaultOptions2===void 0?void 0:_config_defaultOptions2.connection)});var devMasterOptions=(_config_environments=config.environments)===null||_config_environments===void 0?void 0:_config_environments.development;var devSlaveOptions=(_config_environments1=config.environments)===null||_config_environments1===void 0?void 0:_config_environments1.development_slave;var development_master=_lodash.default.merge({},defaultKnexConfig,devMasterOptions);var development_slave=_lodash.default.merge({},defaultKnexConfig,devMasterOptions,devSlaveOptions);var fixture_remote=_lodash.default.merge({},defaultKnexConfig,devMasterOptions,{connection:{database:"".concat(config.database,"_fixture_remote")}},(_config_environments2=config.environments)===null||_config_environments2===void 0?void 0:_config_environments2.remote_fixture);var _config_environments_production;var prodMasterOptions=(_config_environments_production=(_config_environments3=config.environments)===null||_config_environments3===void 0?void 0:_config_environments3.production)!==null&&_config_environments_production!==void 0?_config_environments_production:{};var _config_environments_production_slave;var prodSlaveOptions=(_config_environments_production_slave=(_config_environments4=config.environments)===null||_config_environments4===void 0?void 0:_config_environments4.production_slave)!==null&&_config_environments_production_slave!==void 0?_config_environments_production_slave:{};var production_master=_lodash.default.merge({},defaultKnexConfig,prodMasterOptions);var production_slave=_lodash.default.merge({},defaultKnexConfig,prodMasterOptions,prodSlaveOptions);return{test:test,fixture_local:fixture_local,fixture_remote:fixture_remote,development_master:development_master,development_slave:development_slave,production_master:production_master,production_slave:production_slave}}},{key:"createTestTransaction",value:function createTestTransaction(){return _async_to_generator(function(){var db,_;return _ts_generator(this,function(_state){switch(_state.label){case 0:db=this.getDB("w");_=this;return[4,db.transaction()];case 1:_.testTransaction=_state.sent();return[2,this.testTransaction]}})}).call(this)}},{key:"clearTestTransaction",value:function clearTestTransaction(){return _async_to_generator(function(){var _this_testTransaction;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_this_testTransaction=this.testTransaction)===null||_this_testTransaction===void 0?void 0:_this_testTransaction.rollback()];case 1:_state.sent();this.testTransaction=null;return[2]}})}).call(this)}}]);return DBClass}();var DB=new DBClass;
2
- //# sourceMappingURL=db.js.map
1
+ import { AsyncLocalStorage } from "async_hooks";
2
+ import knex from "knex";
3
+ import { assign } from "radashi";
4
+ import { Sonamu } from "../api/index.js";
5
+ import { TransactionContext } from "./transaction-context.js";
6
+ export class DBClass {
7
+ wdb;
8
+ rdb;
9
+ transactionStorage = new AsyncLocalStorage();
10
+ runWithTransaction(callback) {
11
+ return this.transactionStorage.run(new TransactionContext(), callback);
12
+ }
13
+ getTransactionContext() {
14
+ return this.transactionStorage.getStore() ?? new TransactionContext();
15
+ }
16
+ getDB(which) {
17
+ const dbConfig = Sonamu.dbConfig;
18
+ // 테스트 트랜잭션 격리
19
+ if (process.env.NODE_ENV === "test") {
20
+ if (this.testTransaction) {
21
+ return this.testTransaction;
22
+ } else if (this.wdb) {
23
+ return this.wdb;
24
+ } else {
25
+ this.wdb = knex({
26
+ ...dbConfig.test,
27
+ // 단일 풀
28
+ pool: {
29
+ min: 1,
30
+ max: 1
31
+ }
32
+ });
33
+ return this.wdb;
34
+ }
35
+ }
36
+ const instanceName = which === "w" ? "wdb" : "rdb";
37
+ if (!this[instanceName]) {
38
+ let config;
39
+ switch(process.env.NODE_ENV ?? "development"){
40
+ case "development":
41
+ case "staging":
42
+ config = which === "w" ? dbConfig.development_master : dbConfig.development_slave ?? dbConfig.development_master;
43
+ break;
44
+ case "production":
45
+ config = which === "w" ? dbConfig.production_master : dbConfig.production_slave ?? dbConfig.production_master;
46
+ break;
47
+ default:
48
+ throw new Error(`현재 ENV ${process.env.NODE_ENV}에는 설정 가능한 DB설정이 없습니다.`);
49
+ }
50
+ this[instanceName] = knex(config);
51
+ }
52
+ return this[instanceName];
53
+ }
54
+ async destroy() {
55
+ if (this.wdb !== undefined) {
56
+ await this.wdb.destroy();
57
+ this.wdb = undefined;
58
+ }
59
+ if (this.rdb !== undefined) {
60
+ await this.rdb.destroy();
61
+ this.rdb = undefined;
62
+ }
63
+ }
64
+ generateDBConfig(config) {
65
+ const defaultKnexConfig = assign({
66
+ client: "pg",
67
+ pool: {
68
+ min: 1,
69
+ max: 5
70
+ },
71
+ migrations: {
72
+ directory: "./src/migrations"
73
+ },
74
+ connection: {
75
+ database: config.name,
76
+ ...config.defaultOptions?.connection
77
+ }
78
+ }, config.defaultOptions);
79
+ // 로컬 환경 설정
80
+ const test = assign(defaultKnexConfig, {
81
+ connection: {
82
+ database: `${config.name}_test`,
83
+ ...config.defaultOptions?.connection
84
+ }
85
+ });
86
+ // 개발 환경 설정
87
+ const devMasterOptions = config.environments?.development;
88
+ const devSlaveOptions = config.environments?.development_slave;
89
+ const development_master = assign(defaultKnexConfig, devMasterOptions ?? {});
90
+ const development_slave = assign(assign(defaultKnexConfig, devMasterOptions ?? {}), devSlaveOptions ?? {});
91
+ // NOTE: fixture remote는 default connection의 DB를 override해선 안됨.
92
+ const fixture_remote = assign(assign(assign(defaultKnexConfig, devMasterOptions ?? {}), {
93
+ connection: {
94
+ database: `${config.name}_fixture_remote`
95
+ }
96
+ }), config.environments?.remote_fixture ?? {});
97
+ // 프로덕션 환경 설정
98
+ const prodMasterOptions = config.environments?.production ?? {};
99
+ const prodSlaveOptions = config.environments?.production_slave ?? {};
100
+ const production_master = assign(defaultKnexConfig, prodMasterOptions);
101
+ const production_slave = assign(assign(defaultKnexConfig, prodMasterOptions), prodSlaveOptions ?? {});
102
+ return {
103
+ test,
104
+ fixture_remote,
105
+ development_master,
106
+ development_slave,
107
+ production_master,
108
+ production_slave
109
+ };
110
+ }
111
+ // Test 환경에서 트랜잭션 사용
112
+ testTransaction = null;
113
+ async createTestTransaction() {
114
+ const db = this.getDB("w");
115
+ this.testTransaction = await db.transaction();
116
+ return this.testTransaction;
117
+ }
118
+ async clearTestTransaction() {
119
+ await this.testTransaction?.rollback();
120
+ this.testTransaction = null;
121
+ }
122
+ async getTestConnection() {
123
+ const db = this.getDB("w");
124
+ return db;
125
+ }
126
+ }
127
+ export const DB = new DBClass();
128
+
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9kYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29uZmlnLCBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHJhbnNhY3Rpb24tY29udGV4dFwiO1xuXG5leHBvcnQgdHlwZSBEQlByZXNldCA9IFwid1wiIHwgXCJyXCI7XG5cbmV4cG9ydCB0eXBlIFNvbmFtdURCQ29uZmlnID0ge1xuICBkZXZlbG9wbWVudF9tYXN0ZXI6IEtuZXguQ29uZmlnO1xuICBkZXZlbG9wbWVudF9zbGF2ZTogS25leC5Db25maWc7XG4gIHRlc3Q6IEtuZXguQ29uZmlnO1xuICBmaXh0dXJlX3JlbW90ZTogS25leC5Db25maWc7XG4gIHByb2R1Y3Rpb25fbWFzdGVyOiBLbmV4LkNvbmZpZztcbiAgcHJvZHVjdGlvbl9zbGF2ZTogS25leC5Db25maWc7XG59O1xuXG5leHBvcnQgY2xhc3MgREJDbGFzcyB7XG4gIHByaXZhdGUgd2RiPzogS25leDtcbiAgcHJpdmF0ZSByZGI/OiBLbmV4O1xuXG4gIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VHJhbnNhY3Rpb25Db250ZXh0PigpO1xuXG4gIHB1YmxpYyBydW5XaXRoVHJhbnNhY3Rpb248VD4oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UucnVuKG5ldyBUcmFuc2FjdGlvbkNvbnRleHQoKSwgY2FsbGJhY2spO1xuICB9XG5cbiAgcHVibGljIGdldFRyYW5zYWN0aW9uQ29udGV4dCgpOiBUcmFuc2FjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU3RvcmFnZS5nZXRTdG9yZSgpID8/IG5ldyBUcmFuc2FjdGlvbkNvbnRleHQoKTtcbiAgfVxuXG4gIGdldERCKHdoaWNoOiBEQlByZXNldCk6IEtuZXgge1xuICAgIGNvbnN0IGRiQ29uZmlnID0gU29uYW11LmRiQ29uZmlnO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2KuOuenOyereyFmCDqsqnrpqxcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBpZiAodGhpcy50ZXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndkYikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZGI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndkYiA9IGtuZXgoe1xuICAgICAgICAgIC4uLmRiQ29uZmlnLnRlc3QsXG4gICAgICAgICAgLy8g64uo7J28IO2SgFxuICAgICAgICAgIHBvb2w6IHtcbiAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2RiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IHdoaWNoID09PSBcIndcIiA/IFwid2RiXCIgOiBcInJkYlwiO1xuXG4gICAgaWYgKCF0aGlzW2luc3RhbmNlTmFtZV0pIHtcbiAgICAgIGxldCBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgICAgc3dpdGNoIChwcm9jZXNzLmVudi5OT0RFX0VOViA/PyBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgY2FzZSBcImRldmVsb3BtZW50XCI6XG4gICAgICAgIGNhc2UgXCJzdGFnaW5nXCI6XG4gICAgICAgICAgY29uZmlnID1cbiAgICAgICAgICAgIHdoaWNoID09PSBcIndcIlxuICAgICAgICAgICAgICA/IGRiQ29uZmlnLmRldmVsb3BtZW50X21hc3RlclxuICAgICAgICAgICAgICA6IChkYkNvbmZpZy5kZXZlbG9wbWVudF9zbGF2ZSA/PyBkYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicHJvZHVjdGlvblwiOlxuICAgICAgICAgIGNvbmZpZyA9XG4gICAgICAgICAgICB3aGljaCA9PT0gXCJ3XCJcbiAgICAgICAgICAgICAgPyBkYkNvbmZpZy5wcm9kdWN0aW9uX21hc3RlclxuICAgICAgICAgICAgICA6IChkYkNvbmZpZy5wcm9kdWN0aW9uX3NsYXZlID8/IGRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2YhOyerCBFTlYgJHtwcm9jZXNzLmVudi5OT0RFX0VOVn3sl5DripQg7ISk7KCVIOqwgOuKpe2VnCBEQuyEpOygleydtCDsl4bsirXri4jri6QuYCk7XG4gICAgICB9XG4gICAgICB0aGlzW2luc3RhbmNlTmFtZV0gPSBrbmV4KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbaW5zdGFuY2VOYW1lXTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2RiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2RiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMud2RiID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5yZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlREJDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0S25leENvbmZpZzogUGFydGlhbDxEYXRhYmFzZUNvbmZpZz4gPSBhc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGNsaWVudDogXCJwZ1wiLFxuICAgICAgICBwb29sOiB7XG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1heDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgbWlncmF0aW9uczoge1xuICAgICAgICAgIGRpcmVjdG9yeTogXCIuL3NyYy9taWdyYXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICBkYXRhYmFzZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgLi4uY29uZmlnLmRlZmF1bHRPcHRpb25zPy5jb25uZWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZy5kZWZhdWx0T3B0aW9ucyxcbiAgICApO1xuXG4gICAgLy8g66Gc7LusIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCB0ZXN0OiBEYXRhYmFzZUNvbmZpZyA9IGFzc2lnbihkZWZhdWx0S25leENvbmZpZywge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLm5hbWV9X3Rlc3RgLFxuICAgICAgICAuLi5jb25maWcuZGVmYXVsdE9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g6rCc67CcIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCBkZXZNYXN0ZXJPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8uZGV2ZWxvcG1lbnQ7XG4gICAgY29uc3QgZGV2U2xhdmVPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8uZGV2ZWxvcG1lbnRfc2xhdmU7XG4gICAgY29uc3QgZGV2ZWxvcG1lbnRfbWFzdGVyID0gYXNzaWduKGRlZmF1bHRLbmV4Q29uZmlnLCBkZXZNYXN0ZXJPcHRpb25zID8/IHt9KTtcbiAgICBjb25zdCBkZXZlbG9wbWVudF9zbGF2ZSA9IGFzc2lnbihcbiAgICAgIGFzc2lnbihkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyA/PyB7fSksXG4gICAgICBkZXZTbGF2ZU9wdGlvbnMgPz8ge30sXG4gICAgKTtcbiAgICAvLyBOT1RFOiBmaXh0dXJlIHJlbW90ZeuKlCBkZWZhdWx0IGNvbm5lY3Rpb27snZggRELrpbwgb3ZlcnJpZGXtlbTshKAg7JWI65CoLlxuICAgIGNvbnN0IGZpeHR1cmVfcmVtb3RlID0gYXNzaWduKFxuICAgICAgYXNzaWduKGFzc2lnbihkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyA/PyB7fSksIHtcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIGRhdGFiYXNlOiBgJHtjb25maWcubmFtZX1fZml4dHVyZV9yZW1vdGVgLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBjb25maWcuZW52aXJvbm1lbnRzPy5yZW1vdGVfZml4dHVyZSA/PyB7fSxcbiAgICApO1xuXG4gICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCBwcm9kTWFzdGVyT3B0aW9ucyA9IGNvbmZpZy5lbnZpcm9ubWVudHM/LnByb2R1Y3Rpb24gPz8ge307XG4gICAgY29uc3QgcHJvZFNsYXZlT3B0aW9ucyA9IGNvbmZpZy5lbnZpcm9ubWVudHM/LnByb2R1Y3Rpb25fc2xhdmUgPz8ge307XG4gICAgY29uc3QgcHJvZHVjdGlvbl9tYXN0ZXIgPSBhc3NpZ24oZGVmYXVsdEtuZXhDb25maWcsIHByb2RNYXN0ZXJPcHRpb25zKTtcbiAgICBjb25zdCBwcm9kdWN0aW9uX3NsYXZlID0gYXNzaWduKFxuICAgICAgYXNzaWduKGRlZmF1bHRLbmV4Q29uZmlnLCBwcm9kTWFzdGVyT3B0aW9ucyksXG4gICAgICBwcm9kU2xhdmVPcHRpb25zID8/IHt9LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdCxcbiAgICAgIGZpeHR1cmVfcmVtb3RlLFxuICAgICAgZGV2ZWxvcG1lbnRfbWFzdGVyLFxuICAgICAgZGV2ZWxvcG1lbnRfc2xhdmUsXG4gICAgICBwcm9kdWN0aW9uX21hc3RlcixcbiAgICAgIHByb2R1Y3Rpb25fc2xhdmUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRlc3Qg7ZmY6rK97JeQ7IScIO2KuOuenOyereyFmCDsgqzsmqlcbiAgcHVibGljIHRlc3RUcmFuc2FjdGlvbjogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsO1xuICBhc3luYyBjcmVhdGVUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTxLbmV4LlRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwid1wiKTtcbiAgICB0aGlzLnRlc3RUcmFuc2FjdGlvbiA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICB9XG4gIGFzeW5jIGNsZWFyVGVzdFRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudGVzdFRyYW5zYWN0aW9uPy5yb2xsYmFjaygpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gbnVsbDtcbiAgfVxuICBhc3luYyBnZXRUZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPEtuZXg+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIHJldHVybiBkYjtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IERCID0gbmV3IERCQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJBc3luY0xvY2FsU3RvcmFnZSIsImtuZXgiLCJhc3NpZ24iLCJTb25hbXUiLCJUcmFuc2FjdGlvbkNvbnRleHQiLCJEQkNsYXNzIiwid2RiIiwicmRiIiwidHJhbnNhY3Rpb25TdG9yYWdlIiwicnVuV2l0aFRyYW5zYWN0aW9uIiwiY2FsbGJhY2siLCJydW4iLCJnZXRUcmFuc2FjdGlvbkNvbnRleHQiLCJnZXRTdG9yZSIsImdldERCIiwid2hpY2giLCJkYkNvbmZpZyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInRlc3RUcmFuc2FjdGlvbiIsInRlc3QiLCJwb29sIiwibWluIiwibWF4IiwiaW5zdGFuY2VOYW1lIiwiY29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwiZGV2ZWxvcG1lbnRfc2xhdmUiLCJwcm9kdWN0aW9uX21hc3RlciIsInByb2R1Y3Rpb25fc2xhdmUiLCJFcnJvciIsImRlc3Ryb3kiLCJ1bmRlZmluZWQiLCJnZW5lcmF0ZURCQ29uZmlnIiwiZGVmYXVsdEtuZXhDb25maWciLCJjbGllbnQiLCJtaWdyYXRpb25zIiwiZGlyZWN0b3J5IiwiY29ubmVjdGlvbiIsImRhdGFiYXNlIiwibmFtZSIsImRlZmF1bHRPcHRpb25zIiwiZGV2TWFzdGVyT3B0aW9ucyIsImVudmlyb25tZW50cyIsImRldmVsb3BtZW50IiwiZGV2U2xhdmVPcHRpb25zIiwiZml4dHVyZV9yZW1vdGUiLCJyZW1vdGVfZml4dHVyZSIsInByb2RNYXN0ZXJPcHRpb25zIiwicHJvZHVjdGlvbiIsInByb2RTbGF2ZU9wdGlvbnMiLCJjcmVhdGVUZXN0VHJhbnNhY3Rpb24iLCJkYiIsInRyYW5zYWN0aW9uIiwiY2xlYXJUZXN0VHJhbnNhY3Rpb24iLCJyb2xsYmFjayIsImdldFRlc3RDb25uZWN0aW9uIiwiREIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGlCQUFpQixRQUFRLGNBQWM7QUFDaEQsT0FBT0MsVUFBeUIsT0FBTztBQUN2QyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFFaEMsU0FBU0Msa0JBQWtCLFFBQVEsMkJBQXdCO0FBYTNELE9BQU8sTUFBTUM7SUFDSEMsSUFBVztJQUNYQyxJQUFXO0lB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
@@ -0,0 +1,81 @@
1
+ import { describe, expectTypeOf, it } from "vitest";
2
+ describe("Hydrate", ()=>{
3
+ it("flat 객체를 그대로 유지한다 (__ 없는 경우)", ()=>{
4
+ const result = {};
5
+ expectTypeOf(result).toEqualTypeOf();
6
+ });
7
+ it("단일 depth의 __ 키를 중첩 객체로 변환한다", ()=>{
8
+ const result = {};
9
+ expectTypeOf(result).toEqualTypeOf();
10
+ });
11
+ it("다중 depth의 __ 키를 재귀적으로 중첩 객체로 변환한다", ()=>{
12
+ const result = {};
13
+ expectTypeOf(result).toEqualTypeOf();
14
+ });
15
+ it("여러 관계를 동시에 처리한다", ()=>{
16
+ const result = {};
17
+ expectTypeOf(result).toEqualTypeOf();
18
+ });
19
+ it("빈 객체를 처리한다", ()=>{
20
+ const result = {};
21
+ expectTypeOf(result).toEqualTypeOf();
22
+ });
23
+ it("nullable 필드가 있는 중첩 객체를 처리한다", ()=>{
24
+ const result = {};
25
+ expectTypeOf(result).toEqualTypeOf();
26
+ });
27
+ it("동일한 prefix를 가진 여러 필드를 올바르게 그룹화한다", ()=>{
28
+ const result = {};
29
+ expectTypeOf(result).toEqualTypeOf();
30
+ });
31
+ });
32
+ describe("LoadersResult", ()=>{
33
+ it("단일 로더의 결과 타입을 생성한다", ()=>{
34
+ const result = {};
35
+ expectTypeOf(result).toHaveProperty("posts");
36
+ expectTypeOf(result).toEqualTypeOf();
37
+ });
38
+ it("중첩 로더를 처리한다", ()=>{
39
+ const result = {};
40
+ expectTypeOf(result).toHaveProperty("posts");
41
+ expectTypeOf(result).toEqualTypeOf();
42
+ });
43
+ it("여러 로더를 처리한다", ()=>{
44
+ const result = {};
45
+ expectTypeOf(result).toHaveProperty("projects");
46
+ expectTypeOf(result).toHaveProperty("employees");
47
+ expectTypeOf(result).toHaveProperty("department");
48
+ expectTypeOf(result).toEqualTypeOf();
49
+ });
50
+ });
51
+ describe("InferAllSubsets", ()=>{
52
+ describe("서브셋이 하나인 경우", ()=>{
53
+ it("로더 없이 기본 Subset 결과를 추론한다", ()=>{
54
+ const result = {};
55
+ expectTypeOf(result).toHaveProperty("A");
56
+ expectTypeOf(result.A).toEqualTypeOf();
57
+ expectTypeOf(result.A.department.company).toEqualTypeOf();
58
+ });
59
+ it("로더를 포함한 Subset 결과를 추론한다", ()=>{
60
+ const result = {};
61
+ expectTypeOf(result).toHaveProperty("A");
62
+ expectTypeOf(result).toEqualTypeOf();
63
+ });
64
+ it("중첩 로더를 포함한 Subset 결과를 추론한다", ()=>{
65
+ const result = {};
66
+ expectTypeOf(result).toEqualTypeOf();
67
+ });
68
+ });
69
+ describe("서브셋이 여러 개인 경우", ()=>{
70
+ it("로더 없이 기본 Subset 결과를 추론한다", ()=>{
71
+ const result = {};
72
+ expectTypeOf(result).toEqualTypeOf();
73
+ });
74
+ it("로더를 포함한 Subset 결과를 추론한다", ()=>{
75
+ const result = {};
76
+ expectTypeOf(result).toEqualTypeOf();
77
+ });
78
+ });
79
+ });
80
+
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXN1YnNldC50ZXN0LWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdFR5cGVPZiwgaXQgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IEh5ZHJhdGUsIEluZmVyQWxsU3Vic2V0cywgTG9hZGVyc1Jlc3VsdCB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbnR5cGUgTW9ja1B1cmk8VD4gPSBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBhbnksIFQ+O1xuXG5kZXNjcmliZShcIkh5ZHJhdGVcIiwgKCkgPT4ge1xuICBpdChcImZsYXQg6rCd7LK066W8IOq3uOuMgOuhnCDsnKDsp4DtlZzri6QgKF9fIOyXhuuKlCDqsr3smrApXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8SHlkcmF0ZTxJbnB1dD4+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64uo7J28IGRlcHRo7J2YIF9fIO2CpOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHsgaWQ6IG51bWJlcjsgdXNlcl9fbmFtZTogc3RyaW5nOyB1c2VyX19lbWFpbDogc3RyaW5nIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64uk7KSRIGRlcHRo7J2YIF9fIO2CpOulvCDsnqzqt4DsoIHsnLzroZwg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcl9fcHJvZmlsZV9fYmlvOiBzdHJpbmc7XG4gICAgICB1c2VyX19wcm9maWxlX19hdmF0YXI6IHN0cmluZztcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZztcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHByb2ZpbGU6IHsgYmlvOiBzdHJpbmc7IGF2YXRhcjogc3RyaW5nIH07XG4gICAgICB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi7Jes65+sIOq0gOqzhOulvCDrj5nsi5zsl5Ag7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0ge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX2lkOiBudW1iZXI7XG4gICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICBwb3N0X19pZDogbnVtYmVyO1xuICAgICAgcG9zdF9fdGl0bGU6IHN0cmluZztcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIHBvc3Q6IHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZyB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi67mIIOqwneyytOulvCDsspjrpqztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7fTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e30+KCk7XG4gIH0pO1xuXG4gIGl0KFwibnVsbGFibGUg7ZWE65Oc6rCAIOyeiOuKlCDspJHssqkg6rCd7LK066W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19pZDogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXI6IHsgaWQ6IG51bWJlciB8IG51bGw7IG5hbWU6IHN0cmluZyB8IG51bGwgfTtcbiAgICB9PigpO1xuICB9KTtcblxuICBpdChcIuuPmeydvO2VnCBwcmVmaXjrpbwg6rCA7KeEIOyXrOufrCDtlYTrk5zrpbwg7Jis67CU66W06rKMIOq3uOujue2ZlO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19pZDogbnVtYmVyO1xuICAgICAgdXNlcl9fbmFtZTogc3RyaW5nO1xuICAgICAgdXNlcl9jb3VudDogbnVtYmVyO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgdXNlcl9jb3VudDogbnVtYmVyO1xuICAgIH0+KCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiTG9hZGVyc1Jlc3VsdFwiLCAoKSA9PiB7XG4gIGl0KFwi64uo7J28IOuhnOuNlOydmCDqsrDqs7wg7YOA7J6F7J2EIOyDneyEse2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBNb2NrTG9hZGVyUWIgPSAoXG4gICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuXG4gICAgdHlwZSBMb2FkZXJzID0gW1xuICAgICAge1xuICAgICAgICBhczogXCJwb3N0c1wiO1xuICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICBxYjogTW9ja0xvYWRlclFiO1xuICAgICAgfSxcbiAgICBdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInBvc3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8eyBwb3N0czogeyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nIH1bXSB9PigpO1xuICB9KTtcblxuICBpdChcIuykkeyyqSDroZzrjZTrpbwg7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIENvbW1lbnRMb2FkZXJRYiA9IChcbiAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IGNvbnRlbnQ6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgUG9zdExvYWRlclFiID0gKFxuICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgTG9hZGVycyA9IFtcbiAgICAgIHtcbiAgICAgICAgYXM6IFwicG9zdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IFBvc3RMb2FkZXJRYjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcImNvbW1lbnRzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IENvbW1lbnRMb2FkZXJRYjtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICBdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInBvc3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgcG9zdHM6IHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZzsgY29tbWVudHM6IHsgaWQ6IG51bWJlcjsgY29udGVudDogc3RyaW5nIH1bXSB9W107XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLsl6zrn6wg66Gc642U66W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBQcm9qZWN0TG9hZGVyID0ge1xuICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICBxYjogKFxuICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgIH07XG4gICAgdHlwZSBEZXBhcnRtZW50TG9hZGVyID0ge1xuICAgICAgYXM6IFwiZGVwYXJ0bWVudFwiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGNvbXBhbnlfbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgIH07XG4gICAgdHlwZSBFbXBsb3llZUxvYWRlciA9IHtcbiAgICAgIGFzOiBcImVtcGxveWVlc1wiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBlbXBsb3llZV9udW1iZXI6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIGxvYWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFzOiBcInVzZXJcIjtcbiAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgIHFiOiAoXG4gICAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH07XG5cbiAgICB0eXBlIExvYWRlcnMgPSBbUHJvamVjdExvYWRlciwgRGVwYXJ0bWVudExvYWRlciwgRW1wbG95ZWVMb2FkZXJdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInByb2plY3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwiZW1wbG95ZWVzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwiZGVwYXJ0bWVudFwiKTtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIHByb2plY3RzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W107XG4gICAgICBkZXBhcnRtZW50OiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgY29tcGFueV9uYW1lOiBzdHJpbmcgfVtdO1xuICAgICAgZW1wbG95ZWVzOiB7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGVtcGxveWVlX251bWJlcjogc3RyaW5nO1xuICAgICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9W107XG4gICAgICB9W107XG4gICAgfT4oKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJJbmZlckFsbFN1YnNldHNcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcIuyEnOu4jOyFi+ydtCDtlZjrgpjsnbgg6rK97JqwXCIsICgpID0+IHtcbiAgICBpdChcIuuhnOuNlCDsl4bsnbQg6riw67O4IFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICAgIHVzZXJfX2VtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9fY29tcGFueV9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJBXCIpO1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdC5BKS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgdXNlcjogeyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgICAgICAgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmc7IGNvbXBhbnk6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgIH0+KCk7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0LkEuZGVwYXJ0bWVudC5jb21wYW55KS50b0VxdWFsVHlwZU9mPHsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIuuhnOuNlOulvCDtj6ztlajtlZwgU3Vic2V0IOqysOqzvOulvCDstpTroaDtlZzri6RcIiwgKCkgPT4ge1xuICAgICAgLy8gU3Vic2V0UXVlcnlcbiAgICAgIHR5cGUgU3Vic2V0Rm5BID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGNvbXBhbnlfX2lkOiBudW1iZXI7XG4gICAgICAgIGNvbXBhbnlfX25hbWU6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9faWQ6IG51bWJlcjtcbiAgICAgICAgZGVwYXJ0bWVudF9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIENvbXBhbnlEZXBhcnRtZW50c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiY29tcGFueV9fZGVwYXJ0bWVudHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiY29tcGFueV9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIH07XG4gICAgICB0eXBlIERlcGFydG1lbnRQcm9qZWN0c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiZGVwYXJ0bWVudF9fcHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiZGVwYXJ0bWVudF9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICB9O1xuICAgICAgdHlwZSBMb2FkZXJRdWVyaWVzID0ge1xuICAgICAgICBBOiBbQ29tcGFueURlcGFydG1lbnRzTG9hZGVyLCBEZXBhcnRtZW50UHJvamVjdHNMb2FkZXJdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJBXCIpO1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGNvbXBhbnk6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBkZXBhcnRtZW50czogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdIH07XG4gICAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHByb2plY3RzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfVtdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLspJHssqkg66Gc642U66W8IO2PrO2VqO2VnCBTdWJzZXQg6rKw6rO866W8IOy2lOuhoO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICAvLyBTdWJzZXRRdWVyeVxuICAgICAgdHlwZSBTdWJzZXRGbkEgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgY29tcGFueV9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIENvbXBhbnlEZXBhcnRtZW50c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiY29tcGFueV9fZGVwYXJ0bWVudHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiY29tcGFueV9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcInByb2plY3RzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IChcbiAgICAgICAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH07XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtDb21wYW55RGVwYXJ0bWVudHNMb2FkZXJdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGRlcGFydG1lbnRzOiB7XG4gICAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgcHJvamVjdHM6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9W107XG4gICAgICAgICAgICB9W107XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwi7ISc67iM7IWL7J20IOyXrOufrCDqsJzsnbgg6rK97JqwXCIsICgpID0+IHtcbiAgICBpdChcIuuhnOuNlCDsl4bsnbQg6riw67O4IFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW107XG4gICAgICAgIFA6IFtdO1xuICAgICAgICBTUzogW107XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQTogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgUDogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgU1M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLroZzrjZTrpbwg7Y+s7ZWo7ZWcIFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgUHJvamVjdExvYWRlciA9IHtcbiAgICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgIGxvYWRlcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhczogXCJ0YWdzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IChcbiAgICAgICAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfTtcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW1Byb2plY3RMb2FkZXJdO1xuICAgICAgICBQOiBbXTtcbiAgICAgICAgU1M6IFtdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICBlbWFpbDogc3RyaW5nO1xuICAgICAgICAgIGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH07XG4gICAgICAgICAgcHJvamVjdHM6IHtcbiAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgICAgIHRhZ3M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXTtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICAgIFA6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBkZXBhcnRtZW50OiB7IG5hbWU6IHN0cmluZyB9IH07XG4gICAgICAgIFNTOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImV4cGVjdFR5cGVPZiIsIml0IiwicmVzdWx0IiwidG9FcXVhbFR5cGVPZiIsInRvSGF2ZVByb3BlcnR5IiwiQSIsImRlcGFydG1lbnQiLCJjb21wYW55Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLFlBQVksRUFBRUMsRUFBRSxRQUFRLFNBQVM7QUFRcERGLFNBQVMsV0FBVztJQUNsQkUsR0FBRyxnQ0FBZ0M7UUFJakMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBQ3BDO0lBRUFGLEdBQUcsK0JBQStCO1FBSWhDLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUlwQztJQUVBRixHQUFHLHFDQUFxQztRQVN0QyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFPcEM7SUFFQUYsR0FBRyxtQkFBbUI7UUFVcEIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBS3BDO0lBRUFGLEdBQUcsY0FBYztRQUlmLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUNwQztJQUVBRixHQUFHLCtCQUErQjtRQVFoQyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFJcEM7SUFFQUYsR0FBRyxvQ0FBb0M7UUFTckMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBS3BDO0FBQ0Y7QUFFQUosU0FBUyxpQkFBaUI7SUFDeEJFLEdBQUcsc0JBQXNCO1FBZXZCLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRQyxhQUFhO0lBQ3BDO0lBRUFGLEdBQUcsZUFBZTtRQTJCaEIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7SUFHcEM7SUFFQUYsR0FBRyxlQUFlO1FBdUNoQixNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztRQUNwQ0osYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7SUFTcEM7QUFDRjtBQUVBSixTQUFTLG1CQUFtQjtJQUMxQkEsU0FBUyxlQUFlO1FBQ3RCRSxHQUFHLDRCQUE0QjtZQXFCN0IsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7WUFDcENKLGFBQWFFLE9BQU9HLENBQUMsRUFBRUYsYUFBYTtZQUtwQ0gsYUFBYUUsT0FBT0csQ0FBQyxDQUFDQyxVQUFVLENBQUNDLE9BQU8sRUFBRUosYUFBYTtRQUN6RDtRQUVBRixHQUFHLDJCQUEyQjtZQXFDNUIsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7WUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7UUFXcEM7UUFFQUYsR0FBRyw4QkFBOEI7WUFvQy9CLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQWFwQztJQUNGO0lBRUFKLFNBQVMsaUJBQWlCO1FBQ3hCRSxHQUFHLDRCQUE0QjtZQW1DN0IsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBS3BDO1FBRUFGLEdBQUcsMkJBQTJCO1lBcUQ1QixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFnQnBDO0lBQ0Y7QUFDRiJ9
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Puri Subset 타입 시스템
3
+ *
4
+ * SubsetQuery와 LoaderQuery를 기반으로 최종 결과 타입을 추론하는 타입 유틸리티들.
5
+ * 핵심 개념:
6
+ * - SubsetQuery: 기본 쿼리 (join, select)
7
+ * - LoaderQuery: 1:N, N:M 관계 데이터 로딩
8
+ * - Hydrate: flat한 결과를 중첩 객체로 변환 (예: user__name → { user: { name } })
9
+ */
10
+ import type { DatabaseSchemaExtend } from "../types/types";
11
+ import type { Puri } from "./puri";
12
+ import type { Expand } from "./puri.types";
13
+ import type { PuriWrapper } from "./puri-wrapper";
14
+ /**
15
+ * SubsetQuery 함수 시그니처
16
+ * PuriWrapper를 받아 Puri 쿼리 빌더를 반환
17
+ */
18
+ export type PuriSubsetFn = (qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => Puri<any, any, any>;
19
+ /**
20
+ * Puri 인스턴스에서 TResult 타입 추출
21
+ */
22
+ export type ExtractPuriResult<T> = T extends Puri<any, any, infer R> ? R : never;
23
+ /**
24
+ * Loader 쿼리 빌더 함수 시그니처
25
+ * @param qbWrapper - Puri 래퍼
26
+ * @param fromIds - 부모 레코드 ID 배열
27
+ */
28
+ export type PuriLoaderQbFn = (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[]) => Puri<any, any, any>;
29
+ /**
30
+ * 단일 Loader 정의
31
+ * 1:N 또는 N:M 관계 데이터를 로드하는 설정
32
+ */
33
+ export type GenericPuriLoader = {
34
+ /** 결과 객체에서 사용할 필드명 */
35
+ as: string;
36
+ /** 부모 레코드와 연결할 참조 필드명 */
37
+ refId: string;
38
+ /** 데이터 로딩 쿼리 빌더 */
39
+ qb: PuriLoaderQbFn;
40
+ /** 중첩 로더 (재귀적 로딩 지원) */
41
+ loaders?: GenericPuriLoader[];
42
+ };
43
+ /**
44
+ * 모델별 Loader 쿼리 컬렉션
45
+ * 각 SubsetKey에 대해 Loader 배열을 정의
46
+ */
47
+ export type PuriLoaderQueries<TSubsetKey extends string> = Record<TSubsetKey, GenericPuriLoader[]>;
48
+ /**
49
+ * 구분자(__) 앞부분 추출
50
+ * @example ExtractHead<"user__name"> = "user"
51
+ */
52
+ type ExtractHead<K extends string> = K extends `${infer Head}__${string}` ? Head : never;
53
+ /**
54
+ * 구분자(__) 뒷부분 추출
55
+ * @example ExtractTail<"user__profile__name", "user"> = "profile__name"
56
+ */
57
+ type ExtractTail<K extends string, Head extends string> = K extends `${Head}__${infer Tail}` ? Tail : never;
58
+ /**
59
+ * Flat 객체를 중첩 객체로 변환
60
+ *
61
+ * 런타임 hydrate 함수와 동일한 동작을 타입 레벨에서 구현.
62
+ * `__`로 구분된 키를 중첩 객체 구조로 변환.
63
+ *
64
+ * @example
65
+ * type Input = { id: number; user__name: string; user__profile__bio: string }
66
+ * type Output = Hydrate<Input>
67
+ * // { id: number; user: { name: string; profile: { bio: string } } }
68
+ */
69
+ export type Hydrate<T> = Expand<HydrateInner<T>>;
70
+ type HydrateInner<T> = {
71
+ [K in keyof T as K extends `${string}__${string}` ? never : K]: T[K];
72
+ } & {
73
+ [K in ExtractHead<keyof T & string>]: Expand<HydrateInner<{
74
+ [P in keyof T as P extends `${K}__${string}` ? ExtractTail<P & string, K> : never]: T[P];
75
+ }>>;
76
+ };
77
+ /**
78
+ * Loader 쿼리 함수에서 결과 타입 추출 (refId 제외, Hydrate 적용)
79
+ */
80
+ type ExtractLoaderResult<TLoaderQb> = TLoaderQb extends PuriLoaderQbFn ? Expand<Hydrate<Omit<ExtractPuriResult<ReturnType<TLoaderQb>>, "refId">>> : never;
81
+ /**
82
+ * Loader 배열에서 결과 객체 타입 빌드 (재귀적으로 중첩 loader 처리)
83
+ *
84
+ * @example
85
+ * type Loaders = [
86
+ * { as: "employees"; refId: "id"; qb: ...; loaders: [{ as: "projects"; ... }] }
87
+ * ]
88
+ * type Result = LoadersResult<Loaders>
89
+ * // { employees: Array<{ ...employee fields; projects: Array<...> }> }
90
+ */
91
+ export type LoadersResult<TLoaders extends GenericPuriLoader[]> = Expand<{
92
+ [L in TLoaders[number] as L["as"]]: WithLoaders<ExtractLoaderResult<L["qb"]>, L["loaders"]>[];
93
+ }>;
94
+ /**
95
+ * 기본 결과와 Loader 결과 병합
96
+ */
97
+ type WithLoaders<TBase, TLoaders> = TLoaders extends GenericPuriLoader[] ? Expand<TBase & LoadersResult<TLoaders>> : TBase;
98
+ /**
99
+ * 단일 Subset 함수 + Loader에서 최종 결과 타입 추론
100
+ */
101
+ type InferSubsetWithLoaders<TSubsetFn extends (...args: any) => Puri<any, any, any>, TLoaders extends GenericPuriLoader[] | undefined = undefined> = Expand<Hydrate<WithLoaders<ExtractPuriResult<ReturnType<TSubsetFn>>, TLoaders>>>;
102
+ /**
103
+ * 전체 SubsetQueries + LoaderQueries 객체에서 전체 결과 맵 생성
104
+ *
105
+ * @template TSubsetMap - Subset 함수들의 모음 객체
106
+ * @template TLoaderMap - Loader 배열들의 모음 객체
107
+ *
108
+ * @example
109
+ * type Result = InferAllSubsets<
110
+ * { A: () => Puri<...>, P: () => Puri<...> },
111
+ * { A: [...loaders], P: [] }
112
+ * >
113
+ * // { A: InferredTypeA; P: InferredTypeP }
114
+ */
115
+ export type InferAllSubsets<TSubsetMap extends Record<string, (...args: any) => any>, TLoaderMap extends Partial<Record<string, GenericPuriLoader[]>>> = {
116
+ [K in keyof TSubsetMap]: InferSubsetWithLoaders<TSubsetMap[K], K extends keyof TLoaderMap ? TLoaderMap[K] : undefined>;
117
+ };
118
+ /**
119
+ * Knex QueryBuilder에서 clear 가능한 statement 목록
120
+ */
121
+ export type ClearStatements = "with" | "select" | "columns" | "hintComments" | "where" | "union" | "using" | "join" | "group" | "order" | "having" | "limit" | "offset" | "counter" | "counters";
122
+ export {};
123
+ //# sourceMappingURL=puri-subset.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puri-subset.types.d.ts","sourceRoot":"","sources":["../../src/database/puri-subset.types.ts"],"names":[],"mappings":"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"}