sonamu 0.5.7 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +13 -2
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +71 -2
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +258 -2
  44. package/dist/api/config.d.ts +90 -0
  45. package/dist/api/config.d.ts.map +1 -0
  46. package/dist/api/config.js +25 -0
  47. package/dist/api/context.d.ts +4 -2
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +3 -2
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +235 -2
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +9 -2
  56. package/dist/api/sonamu.d.ts +10 -24
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +514 -2
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +6 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +15 -2
  65. package/dist/bin/cli.js +519 -2
  66. package/dist/bin/hot-hook-register.d.ts +11 -0
  67. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  68. package/dist/bin/hot-hook-register.js +21 -0
  69. package/dist/bin/loader-register.d.ts +2 -0
  70. package/dist/bin/loader-register.d.ts.map +1 -0
  71. package/dist/bin/loader-register.js +34 -0
  72. package/dist/database/_batch_update.d.ts +5 -3
  73. package/dist/database/_batch_update.d.ts.map +1 -1
  74. package/dist/database/_batch_update.js +95 -2
  75. package/dist/database/base-model.d.ts +96 -10
  76. package/dist/database/base-model.d.ts.map +1 -1
  77. package/dist/database/base-model.js +390 -2
  78. package/dist/database/base-model.types.d.ts +93 -0
  79. package/dist/database/base-model.types.d.ts.map +1 -0
  80. package/dist/database/base-model.types.js +10 -0
  81. package/dist/database/code-generator.d.ts +1 -1
  82. package/dist/database/code-generator.d.ts.map +1 -1
  83. package/dist/database/code-generator.js +54 -2
  84. package/dist/database/db.d.ts +6 -21
  85. package/dist/database/db.d.ts.map +1 -1
  86. package/dist/database/db.js +129 -2
  87. package/dist/database/puri-subset.test-d.js +81 -0
  88. package/dist/database/puri-subset.types.d.ts +123 -0
  89. package/dist/database/puri-subset.types.d.ts.map +1 -0
  90. package/dist/database/puri-subset.types.js +16 -0
  91. package/dist/database/puri-wrapper.d.ts +13 -11
  92. package/dist/database/puri-wrapper.d.ts.map +1 -1
  93. package/dist/database/puri-wrapper.js +109 -2
  94. package/dist/database/puri.d.ts +41 -23
  95. package/dist/database/puri.d.ts.map +1 -1
  96. package/dist/database/puri.js +601 -2
  97. package/dist/database/puri.types.d.ts +25 -6
  98. package/dist/database/puri.types.d.ts.map +1 -1
  99. package/dist/database/puri.types.js +6 -2
  100. package/dist/database/transaction-context.d.ts +1 -1
  101. package/dist/database/transaction-context.d.ts.map +1 -1
  102. package/dist/database/transaction-context.js +14 -2
  103. package/dist/database/upsert-builder.d.ts +9 -3
  104. package/dist/database/upsert-builder.d.ts.map +1 -1
  105. package/dist/database/upsert-builder.js +365 -2
  106. package/dist/entity/entity-manager.d.ts +167 -2
  107. package/dist/entity/entity-manager.d.ts.map +1 -1
  108. package/dist/entity/entity-manager.js +130 -2
  109. package/dist/entity/entity.d.ts +5 -3
  110. package/dist/entity/entity.d.ts.map +1 -1
  111. package/dist/entity/entity.js +750 -2
  112. package/dist/exceptions/error-handler.d.ts +1 -1
  113. package/dist/exceptions/error-handler.d.ts.map +1 -1
  114. package/dist/exceptions/error-handler.js +29 -2
  115. package/dist/exceptions/so-exceptions.d.ts +1 -1
  116. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  117. package/dist/exceptions/so-exceptions.js +85 -2
  118. package/dist/file-storage/driver.d.ts +1 -1
  119. package/dist/file-storage/driver.d.ts.map +1 -1
  120. package/dist/file-storage/driver.js +79 -2
  121. package/dist/file-storage/file-storage.js +75 -2
  122. package/dist/index.d.ts +18 -9
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +34 -2
  125. package/dist/migration/code-generation.d.ts +1 -1
  126. package/dist/migration/code-generation.d.ts.map +1 -1
  127. package/dist/migration/code-generation.js +614 -2
  128. package/dist/migration/migration-set.d.ts +2 -10
  129. package/dist/migration/migration-set.d.ts.map +1 -1
  130. package/dist/migration/migration-set.js +213 -2
  131. package/dist/migration/migrator.d.ts +24 -82
  132. package/dist/migration/migrator.d.ts.map +1 -1
  133. package/dist/migration/migrator.js +330 -2
  134. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  135. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  136. package/dist/migration/postgresql-schema-reader.js +245 -0
  137. package/dist/migration/types.d.ts +6 -38
  138. package/dist/migration/types.d.ts.map +1 -1
  139. package/dist/migration/types.js +3 -2
  140. package/dist/naite/messaging-types.d.ts +43 -0
  141. package/dist/naite/messaging-types.d.ts.map +1 -0
  142. package/dist/naite/messaging-types.js +7 -0
  143. package/dist/naite/naite-reporter.d.ts +41 -0
  144. package/dist/naite/naite-reporter.d.ts.map +1 -0
  145. package/dist/naite/naite-reporter.js +102 -0
  146. package/dist/naite/naite.d.ts +95 -0
  147. package/dist/naite/naite.d.ts.map +1 -0
  148. package/dist/naite/naite.js +316 -0
  149. package/dist/stream/index.js +3 -2
  150. package/dist/stream/sse.d.ts +2 -2
  151. package/dist/stream/sse.d.ts.map +1 -1
  152. package/dist/stream/sse.js +38 -2
  153. package/dist/syncer/api-parser.d.ts +10 -0
  154. package/dist/syncer/api-parser.d.ts.map +1 -0
  155. package/dist/syncer/api-parser.js +240 -0
  156. package/dist/syncer/checksum.d.ts +21 -0
  157. package/dist/syncer/checksum.d.ts.map +1 -0
  158. package/dist/syncer/checksum.js +98 -0
  159. package/dist/syncer/code-generator.d.ts +20 -0
  160. package/dist/syncer/code-generator.d.ts.map +1 -0
  161. package/dist/syncer/code-generator.js +161 -0
  162. package/dist/syncer/entity-operations.d.ts +17 -0
  163. package/dist/syncer/entity-operations.d.ts.map +1 -0
  164. package/dist/syncer/entity-operations.js +59 -0
  165. package/dist/syncer/file-patterns.d.ts +29 -0
  166. package/dist/syncer/file-patterns.d.ts.map +1 -0
  167. package/dist/syncer/file-patterns.js +38 -0
  168. package/dist/syncer/index.d.ts +6 -0
  169. package/dist/syncer/index.d.ts.map +1 -1
  170. package/dist/syncer/index.js +9 -2
  171. package/dist/syncer/module-loader.d.ts +35 -0
  172. package/dist/syncer/module-loader.d.ts.map +1 -0
  173. package/dist/syncer/module-loader.js +87 -0
  174. package/dist/syncer/syncer.d.ts +98 -106
  175. package/dist/syncer/syncer.d.ts.map +1 -1
  176. package/dist/syncer/syncer.js +422 -2
  177. package/dist/template/entity-converter.d.ts +14 -0
  178. package/dist/template/entity-converter.d.ts.map +1 -0
  179. package/dist/template/entity-converter.js +108 -0
  180. package/dist/template/helpers.d.ts +23 -0
  181. package/dist/template/helpers.d.ts.map +1 -0
  182. package/dist/template/helpers.js +64 -0
  183. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  184. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  185. package/dist/template/implementations/entity.template.js +86 -0
  186. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
  187. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  188. package/dist/template/implementations/generated.template.js +249 -0
  189. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
  190. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  191. package/dist/template/implementations/generated_http.template.js +131 -0
  192. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
  193. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  194. package/dist/template/implementations/generated_sso.template.js +134 -0
  195. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  196. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  197. package/dist/template/implementations/init_types.template.js +38 -0
  198. package/dist/template/implementations/model.template.d.ts +17 -0
  199. package/dist/template/implementations/model.template.d.ts.map +1 -0
  200. package/dist/template/implementations/model.template.js +181 -0
  201. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  202. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  203. package/dist/template/implementations/model_test.template.js +35 -0
  204. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  205. package/dist/template/implementations/service.template.d.ts.map +1 -0
  206. package/dist/template/implementations/service.template.js +201 -0
  207. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  208. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  209. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  210. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  211. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  212. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  213. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  214. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  215. package/dist/template/implementations/view_enums_select.template.js +55 -0
  216. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  217. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  218. package/dist/template/implementations/view_form.template.js +337 -0
  219. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  220. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  221. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  222. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  223. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  224. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  225. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  226. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  227. package/dist/template/implementations/view_list.template.js +475 -0
  228. package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
  229. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  230. package/dist/template/implementations/view_list_columns.template.js +49 -0
  231. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  232. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  233. package/dist/template/implementations/view_search_input.template.js +64 -0
  234. package/dist/template/index.d.ts +7 -0
  235. package/dist/template/index.d.ts.map +1 -0
  236. package/dist/template/index.js +8 -0
  237. package/dist/template/template-manager.d.ts +56 -0
  238. package/dist/template/template-manager.d.ts.map +1 -0
  239. package/dist/template/template-manager.js +125 -0
  240. package/dist/template/template-types.d.ts +16 -0
  241. package/dist/template/template-types.d.ts.map +1 -0
  242. package/dist/template/template-types.js +7 -0
  243. package/dist/template/template.d.ts +49 -0
  244. package/dist/template/template.d.ts.map +1 -0
  245. package/dist/template/template.js +60 -0
  246. package/dist/template/zod-converter.d.ts +51 -0
  247. package/dist/template/zod-converter.d.ts.map +1 -0
  248. package/dist/template/zod-converter.js +449 -0
  249. package/dist/testing/_relation-graph.d.ts +1 -1
  250. package/dist/testing/_relation-graph.d.ts.map +1 -1
  251. package/dist/testing/_relation-graph.js +89 -2
  252. package/dist/testing/fixture-manager.d.ts +42 -11
  253. package/dist/testing/fixture-manager.d.ts.map +1 -1
  254. package/dist/testing/fixture-manager.js +623 -2
  255. package/dist/types/types.d.ts +747 -143
  256. package/dist/types/types.d.ts.map +1 -1
  257. package/dist/types/types.js +546 -2
  258. package/dist/typings/knex.d.js +3 -2
  259. package/dist/utils/async-utils.d.ts +7 -0
  260. package/dist/utils/async-utils.d.ts.map +1 -1
  261. package/dist/utils/async-utils.js +57 -2
  262. package/dist/utils/console-util.d.ts +2 -0
  263. package/dist/utils/console-util.d.ts.map +1 -0
  264. package/dist/utils/console-util.js +6 -0
  265. package/dist/utils/controller.d.ts +1 -0
  266. package/dist/utils/controller.d.ts.map +1 -1
  267. package/dist/utils/controller.js +29 -2
  268. package/dist/utils/esm-utils.d.ts +39 -0
  269. package/dist/utils/esm-utils.d.ts.map +1 -0
  270. package/dist/utils/esm-utils.js +49 -0
  271. package/dist/utils/formatter.d.ts +3 -0
  272. package/dist/utils/formatter.d.ts.map +1 -0
  273. package/dist/utils/formatter.js +110 -0
  274. package/dist/utils/fs-utils.d.ts +1 -1
  275. package/dist/utils/fs-utils.d.ts.map +1 -1
  276. package/dist/utils/fs-utils.js +17 -2
  277. package/dist/utils/lodash-able.d.ts.map +1 -1
  278. package/dist/utils/lodash-able.js +6 -2
  279. package/dist/utils/model.js +22 -2
  280. package/dist/utils/object-utils.d.ts +44 -0
  281. package/dist/utils/object-utils.d.ts.map +1 -0
  282. package/dist/utils/object-utils.js +191 -0
  283. package/dist/utils/path-utils.d.ts +89 -0
  284. package/dist/utils/path-utils.d.ts.map +1 -0
  285. package/dist/utils/path-utils.js +60 -0
  286. package/dist/utils/process-utils.d.ts +13 -0
  287. package/dist/utils/process-utils.d.ts.map +1 -0
  288. package/dist/utils/process-utils.js +36 -0
  289. package/dist/utils/sql-parser.d.ts +5 -1
  290. package/dist/utils/sql-parser.d.ts.map +1 -1
  291. package/dist/utils/sql-parser.js +46 -2
  292. package/dist/utils/type-utils.d.ts +23 -0
  293. package/dist/utils/type-utils.d.ts.map +1 -0
  294. package/dist/utils/type-utils.js +45 -0
  295. package/dist/utils/utils.d.ts +10 -7
  296. package/dist/utils/utils.d.ts.map +1 -1
  297. package/dist/utils/utils.js +72 -2
  298. package/dist/utils/zod-error.d.ts +1 -1
  299. package/dist/utils/zod-error.d.ts.map +1 -1
  300. package/dist/utils/zod-error.js +19 -2
  301. package/package.json +65 -27
  302. package/src/ai/agents/agent.ts +87 -0
  303. package/src/ai/agents/index.ts +2 -0
  304. package/src/ai/agents/types.ts +47 -0
  305. package/src/ai/index.ts +1 -0
  306. package/src/ai/providers/rtzr/api.ts +37 -0
  307. package/src/ai/providers/rtzr/error.ts +34 -0
  308. package/src/ai/providers/rtzr/index.ts +4 -0
  309. package/src/ai/providers/rtzr/model.ts +201 -0
  310. package/src/ai/providers/rtzr/options.ts +49 -0
  311. package/src/ai/providers/rtzr/provider.ts +91 -0
  312. package/src/ai/providers/rtzr/utils.ts +127 -0
  313. package/src/api/base-frame.ts +4 -2
  314. package/src/api/caster.ts +17 -23
  315. package/src/api/code-converters.ts +178 -535
  316. package/src/api/config.ts +125 -0
  317. package/src/api/context.ts +7 -17
  318. package/src/api/decorators.ts +176 -46
  319. package/src/api/index.ts +2 -2
  320. package/src/api/sonamu.ts +190 -167
  321. package/src/api/validator.ts +83 -0
  322. package/src/bin/build-config.ts +8 -1
  323. package/src/bin/cli.ts +258 -124
  324. package/src/bin/hot-hook-register.ts +22 -0
  325. package/src/bin/loader-register.ts +38 -0
  326. package/src/database/_batch_update.ts +46 -31
  327. package/src/database/base-model.ts +390 -182
  328. package/src/database/base-model.types.ts +155 -0
  329. package/src/database/code-generator.ts +13 -32
  330. package/src/database/db.ts +40 -96
  331. package/src/database/puri-subset.test-d.ts +471 -0
  332. package/src/database/puri-subset.types.ts +195 -0
  333. package/src/database/puri-wrapper.ts +58 -67
  334. package/src/database/puri.ts +229 -148
  335. package/src/database/puri.types.ts +76 -30
  336. package/src/database/transaction-context.ts +1 -1
  337. package/src/database/upsert-builder.ts +262 -132
  338. package/src/entity/entity-manager.ts +48 -36
  339. package/src/entity/entity.ts +330 -248
  340. package/src/exceptions/error-handler.ts +3 -3
  341. package/src/exceptions/so-exceptions.ts +11 -11
  342. package/src/file-storage/driver.ts +5 -5
  343. package/src/file-storage/file-storage.ts +2 -2
  344. package/src/index.ts +18 -10
  345. package/src/migration/code-generation.ts +185 -172
  346. package/src/migration/migration-set.ts +80 -293
  347. package/src/migration/migrator.ts +199 -571
  348. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  349. package/src/migration/postgresql-schema-reader.ts +310 -0
  350. package/src/migration/types.ts +6 -39
  351. package/src/naite/messaging-types.ts +51 -0
  352. package/src/naite/naite-reporter.ts +128 -0
  353. package/src/naite/naite.ts +415 -0
  354. package/src/shared/web.shared.ts.txt +20 -24
  355. package/src/stream/sse.ts +5 -5
  356. package/src/syncer/api-parser.ts +282 -0
  357. package/src/syncer/checksum.ts +140 -0
  358. package/src/syncer/code-generator.ts +198 -0
  359. package/src/syncer/entity-operations.ts +65 -0
  360. package/src/syncer/file-patterns.ts +56 -0
  361. package/src/syncer/index.ts +6 -0
  362. package/src/syncer/module-loader.ts +128 -0
  363. package/src/syncer/syncer.ts +389 -1453
  364. package/src/template/entity-converter.ts +114 -0
  365. package/src/template/helpers.ts +81 -0
  366. package/src/{templates → template/implementations}/entity.template.ts +7 -7
  367. package/src/{templates → template/implementations}/generated.template.ts +101 -101
  368. package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
  369. package/src/template/implementations/generated_sso.template.ts +151 -0
  370. package/src/{templates → template/implementations}/init_types.template.ts +5 -7
  371. package/src/{templates → template/implementations}/model.template.ts +52 -43
  372. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  373. package/src/{templates → template/implementations}/service.template.ts +66 -82
  374. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  375. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
  376. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  377. package/src/{templates → template/implementations}/view_form.template.ts +40 -83
  378. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  379. package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
  380. package/src/{templates → template/implementations}/view_list.template.ts +60 -152
  381. package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
  382. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  383. package/src/template/index.ts +6 -0
  384. package/src/template/template-manager.ts +166 -0
  385. package/src/template/template-types.ts +16 -0
  386. package/src/template/template.ts +105 -0
  387. package/src/template/zod-converter.ts +525 -0
  388. package/src/testing/_relation-graph.ts +18 -11
  389. package/src/testing/fixture-manager.ts +472 -359
  390. package/src/types/types.ts +553 -308
  391. package/src/typings/knex.d.ts +7 -9
  392. package/src/utils/async-utils.ts +23 -10
  393. package/src/utils/console-util.ts +4 -0
  394. package/src/utils/controller.ts +3 -0
  395. package/src/utils/esm-utils.ts +59 -0
  396. package/src/utils/formatter.ts +109 -0
  397. package/src/utils/fs-utils.ts +1 -1
  398. package/src/utils/lodash-able.ts +1 -4
  399. package/src/utils/object-utils.ts +217 -0
  400. package/src/utils/path-utils.ts +99 -0
  401. package/src/utils/process-utils.ts +46 -0
  402. package/src/utils/sql-parser.ts +23 -5
  403. package/src/utils/type-utils.ts +83 -0
  404. package/src/utils/utils.ts +66 -43
  405. package/src/utils/zod-error.ts +3 -4
  406. package/dist/api/base-frame.js.map +0 -1
  407. package/dist/api/caster.js.map +0 -1
  408. package/dist/api/code-converters.js.map +0 -1
  409. package/dist/api/context.js.map +0 -1
  410. package/dist/api/decorators.js.map +0 -1
  411. package/dist/api/index.js.map +0 -1
  412. package/dist/api/sonamu.js.map +0 -1
  413. package/dist/bin/build-config.js.map +0 -1
  414. package/dist/bin/cli-wrapper.d.ts +0 -3
  415. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  416. package/dist/bin/cli-wrapper.js +0 -3
  417. package/dist/bin/cli-wrapper.js.map +0 -1
  418. package/dist/bin/cli.js.map +0 -1
  419. package/dist/database/_batch_update.js.map +0 -1
  420. package/dist/database/base-model.js.map +0 -1
  421. package/dist/database/code-generator.js.map +0 -1
  422. package/dist/database/db.js.map +0 -1
  423. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  424. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  425. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
  426. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  427. package/dist/database/puri-wrapper.js.map +0 -1
  428. package/dist/database/puri.js.map +0 -1
  429. package/dist/database/puri.types.js.map +0 -1
  430. package/dist/database/transaction-context.js.map +0 -1
  431. package/dist/database/upsert-builder.js.map +0 -1
  432. package/dist/entity/entity-manager.js.map +0 -1
  433. package/dist/entity/entity-utils.d.ts +0 -61
  434. package/dist/entity/entity-utils.d.ts.map +0 -1
  435. package/dist/entity/entity-utils.js +0 -2
  436. package/dist/entity/entity-utils.js.map +0 -1
  437. package/dist/entity/entity.js.map +0 -1
  438. package/dist/exceptions/error-handler.js.map +0 -1
  439. package/dist/exceptions/so-exceptions.js.map +0 -1
  440. package/dist/file-storage/driver.js.map +0 -1
  441. package/dist/file-storage/file-storage.js.map +0 -1
  442. package/dist/index.js.map +0 -1
  443. package/dist/migration/code-generation.js.map +0 -1
  444. package/dist/migration/migration-set.js.map +0 -1
  445. package/dist/migration/migrator.js.map +0 -1
  446. package/dist/migration/types.js.map +0 -1
  447. package/dist/stream/index.js.map +0 -1
  448. package/dist/stream/sse.js.map +0 -1
  449. package/dist/syncer/index.js.map +0 -1
  450. package/dist/syncer/syncer.js.map +0 -1
  451. package/dist/templates/base-template.d.ts +0 -13
  452. package/dist/templates/base-template.d.ts.map +0 -1
  453. package/dist/templates/base-template.js +0 -2
  454. package/dist/templates/base-template.js.map +0 -1
  455. package/dist/templates/entity.template.d.ts.map +0 -1
  456. package/dist/templates/entity.template.js +0 -2
  457. package/dist/templates/entity.template.js.map +0 -1
  458. package/dist/templates/generated.template.d.ts.map +0 -1
  459. package/dist/templates/generated.template.js +0 -2
  460. package/dist/templates/generated.template.js.map +0 -1
  461. package/dist/templates/generated_http.template.d.ts.map +0 -1
  462. package/dist/templates/generated_http.template.js +0 -2
  463. package/dist/templates/generated_http.template.js.map +0 -1
  464. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  465. package/dist/templates/generated_sso.template.js +0 -2
  466. package/dist/templates/generated_sso.template.js.map +0 -1
  467. package/dist/templates/index.d.ts +0 -2
  468. package/dist/templates/index.d.ts.map +0 -1
  469. package/dist/templates/index.js +0 -2
  470. package/dist/templates/index.js.map +0 -1
  471. package/dist/templates/init_types.template.d.ts.map +0 -1
  472. package/dist/templates/init_types.template.js +0 -2
  473. package/dist/templates/init_types.template.js.map +0 -1
  474. package/dist/templates/model.template.d.ts +0 -17
  475. package/dist/templates/model.template.d.ts.map +0 -1
  476. package/dist/templates/model.template.js +0 -2
  477. package/dist/templates/model.template.js.map +0 -1
  478. package/dist/templates/model_test.template.d.ts.map +0 -1
  479. package/dist/templates/model_test.template.js +0 -2
  480. package/dist/templates/model_test.template.js.map +0 -1
  481. package/dist/templates/service.template.d.ts.map +0 -1
  482. package/dist/templates/service.template.js +0 -2
  483. package/dist/templates/service.template.js.map +0 -1
  484. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  485. package/dist/templates/view_enums_buttonset.template.js +0 -2
  486. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  487. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  488. package/dist/templates/view_enums_dropdown.template.js +0 -2
  489. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  490. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  491. package/dist/templates/view_enums_select.template.js +0 -2
  492. package/dist/templates/view_enums_select.template.js.map +0 -1
  493. package/dist/templates/view_form.template.d.ts.map +0 -1
  494. package/dist/templates/view_form.template.js +0 -2
  495. package/dist/templates/view_form.template.js.map +0 -1
  496. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  497. package/dist/templates/view_id_all_select.template.js +0 -2
  498. package/dist/templates/view_id_all_select.template.js.map +0 -1
  499. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  500. package/dist/templates/view_id_async_select.template.js +0 -2
  501. package/dist/templates/view_id_async_select.template.js.map +0 -1
  502. package/dist/templates/view_list.template.d.ts.map +0 -1
  503. package/dist/templates/view_list.template.js +0 -2
  504. package/dist/templates/view_list.template.js.map +0 -1
  505. package/dist/templates/view_list_columns.template.d.ts +0 -17
  506. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  507. package/dist/templates/view_list_columns.template.js +0 -2
  508. package/dist/templates/view_list_columns.template.js.map +0 -1
  509. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  510. package/dist/templates/view_search_input.template.js +0 -2
  511. package/dist/templates/view_search_input.template.js.map +0 -1
  512. package/dist/testing/_relation-graph.js.map +0 -1
  513. package/dist/testing/fixture-manager.js.map +0 -1
  514. package/dist/types/types.js.map +0 -1
  515. package/dist/typings/knex.d.js.map +0 -1
  516. package/dist/utils/async-utils.js.map +0 -1
  517. package/dist/utils/controller.js.map +0 -1
  518. package/dist/utils/fs-utils.js.map +0 -1
  519. package/dist/utils/lodash-able.js.map +0 -1
  520. package/dist/utils/model.js.map +0 -1
  521. package/dist/utils/sql-parser.js.map +0 -1
  522. package/dist/utils/utils.js.map +0 -1
  523. package/dist/utils/zod-error.js.map +0 -1
  524. package/src/bin/cli-wrapper.ts +0 -75
  525. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  526. package/src/entity/entity-utils.ts +0 -291
  527. package/src/templates/base-template.ts +0 -19
  528. package/src/templates/generated_sso.template.ts +0 -138
  529. package/src/templates/index.ts +0 -1
@@ -1,2 +1,258 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get apiParamToTsCode(){return apiParamToTsCode},get apiParamToTsCodeAsObject(){return apiParamToTsCodeAsObject},get apiParamTypeToTsType(){return apiParamTypeToTsType},get getTextTypeLength(){return getTextTypeLength},get getZodObjectFromApi(){return getZodObjectFromApi},get getZodObjectFromApiParams(){return getZodObjectFromApiParams},get getZodTypeFromApiParamType(){return getZodTypeFromApiParamType},get propNodeToZodTypeDef(){return propNodeToZodTypeDef},get propToZodTypeDef(){return propToZodTypeDef},get serializeZodType(){return serializeZodType},get unwrapPromiseOnce(){return unwrapPromiseOnce},get zodTypeToTsTypeDef(){return zodTypeToTsTypeDef},get zodTypeToZodCode(){return zodTypeToZodCode}});var _zod=require("zod");var _types=require("../types/types");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function 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 _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function getZodObjectFromApi(api){var references=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};var _api_typeParameters;if(((_api_typeParameters=api.typeParameters)===null||_api_typeParameters===void 0?void 0:_api_typeParameters.length)>0){api.typeParameters.map(function(typeParam){if(typeParam.constraint){var zodType=getZodTypeFromApiParamType(typeParam.constraint,references);references[typeParam.id]=zodType}})}var ReqType=getZodObjectFromApiParams(api.parameters.filter(function(param){return!_types.ApiParamType.isContext(param.type)&&!_types.ApiParamType.isRefKnex(param.type)&&!(param.optional===true&&param.name.startsWith("_"))}),references);return ReqType}function getZodObjectFromApiParams(apiParams){var references=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return _zod.z.object(apiParams.reduce(function(r,param){var zodType=getZodTypeFromApiParamType(param.type,references);if(param.optional){zodType=zodType.optional()}return _object_spread_props(_object_spread({},r),_define_property({},param.name,zodType))},{}))}function getZodTypeFromApiParamType(paramType,references){switch(paramType){case"string":return _zod.z.string();case"number":return _zod.z.number();case"boolean":return _zod.z.boolean();default:var advType=paramType;switch(advType.t){case"string-literal":case"numeric-literal":return _zod.z.literal(advType.value);case"object":var objType=paramType;return getZodObjectFromApiParams(objType.props);case"array":var arrType=paramType;return _zod.z.array(getZodTypeFromApiParamType(arrType.elementsType,references));case"ref":var refType=paramType;if(refType.id==="Date"){return _zod.z.date()}if(["Pick","Omit"].includes(refType.id)){var _refType_args;if(((_refType_args=refType.args)===null||_refType_args===void 0?void 0:_refType_args.length)!==2){throw new Error("잘못된 ".concat(refType.id))}var _refType_args_map=_sliced_to_array(refType.args.map(function(arg){return getZodTypeFromApiParamType(arg,references)}),2),obj=_refType_args_map[0],literalOrUnion=_refType_args_map[1];var keys=[];if(_instanceof(literalOrUnion,_zod.z.ZodUnion)){keys=literalOrUnion.def.options.map(function(option){return option.def.value})}else{keys=literalOrUnion.def.values}var keyRecord=keys.reduce(function(result,key){return _object_spread_props(_object_spread({},result),_define_property({},key,true))},{});if(refType.id==="Pick"){if(obj.pick){return obj.pick(keyRecord)}}else{if(obj.omit){return obj.omit(keyRecord)}}}if(["Partial"].includes(refType.id)){var _refType_args1;if(((_refType_args1=refType.args)===null||_refType_args1===void 0?void 0:_refType_args1.length)!==1){throw new Error("잘못된 ".concat(refType.id))}var obj1=getZodTypeFromApiParamType(refType.args[0],references);return obj1.partial()}var reference=references[refType.id];if(reference===undefined){return _zod.z.string()}return reference;case"union":var unionType=paramType;if(unionType.types.length===2&&unionType.types.some(function(type){return type==="null"})){if(unionType.types[0]==="null"){return getZodTypeFromApiParamType(unionType.types[1],references).nullable()}else{return getZodTypeFromApiParamType(unionType.types[0],references).nullable()}}return _zod.z.union(unionType.types.map(function(type){return getZodTypeFromApiParamType(type,references)}));case"intersection":var intersectionType=paramType;return intersectionType.types.reduce(function(result,type,index){var resolvedType=getZodTypeFromApiParamType(type,references);if(index===0){return resolvedType}else{return _zod.z.intersection(result,resolvedType)}},_zod.z.unknown());case"tuple-type":var tupleType=paramType;return _zod.z.tuple(tupleType.elements.map(function(elem){return getZodTypeFromApiParamType(elem,references)}))}return _zod.z.unknown()}}function propNodeToZodTypeDef(propNode,injectImportKeys){if(propNode.nodeType==="plain"){return propToZodTypeDef(propNode.prop,injectImportKeys)}else if(propNode.nodeType==="array"){return[propNode.prop?"".concat(propNode.prop.name,": "):"","z.array(z.object({",propNode.children.map(function(childPropNode){return propNodeToZodTypeDef(childPropNode,injectImportKeys)}).join("\n"),"","})),"].join("\n")}else if(propNode.nodeType==="object"){return[propNode.prop?"".concat(propNode.prop.name,": "):"","z.object({",propNode.children.map(function(childPropNode){return propNodeToZodTypeDef(childPropNode,injectImportKeys)}).join("\n"),"","})".concat(propNode.prop&&propNode.prop.nullable?".nullable()":"",",")].join("\n")}else{throw Error}}function getTextTypeLength(textType){switch(textType){case"text":return 1024*64-1;case"mediumtext":return 1024*1024*16-1;case"longtext":return 1024*1024*1024*4-1}}function propToZodTypeDef(prop,injectImportKeys){var stmt;if((0,_types.isIntegerProp)(prop)){stmt="".concat(prop.name,": z.int()")}else if((0,_types.isBigIntegerProp)(prop)){stmt="".concat(prop.name,": z.bigint()")}else if((0,_types.isTextProp)(prop)){stmt="".concat(prop.name,": z.string().max(").concat(getTextTypeLength(prop.textType),")")}else if((0,_types.isEnumProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isStringProp)(prop)){stmt="".concat(prop.name,": z.string().max(").concat(prop.length,")")}else if((0,_types.isDecimalProp)(prop)){stmt="".concat(prop.name,": z.string()")}else if((0,_types.isFloatProp)(prop)||(0,_types.isDoubleProp)(prop)){stmt="".concat(prop.name,": z.number()")}else if((0,_types.isBooleanProp)(prop)){stmt="".concat(prop.name,": z.boolean()")}else if((0,_types.isDateProp)(prop)){stmt="".concat(prop.name,": z.string().length(10)")}else if((0,_types.isTimeProp)(prop)){stmt="".concat(prop.name,": z.string().length(8)")}else if((0,_types.isDateTimeProp)(prop)){stmt="".concat(prop.name,": z.date()")}else if((0,_types.isTimestampProp)(prop)){stmt="".concat(prop.name,": z.date()")}else if((0,_types.isJsonProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isUuidProp)(prop)){stmt="".concat(prop.name,": z.uuid()")}else if((0,_types.isVirtualProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isRelationProp)(prop)){if((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn){stmt="".concat(prop.name,"_id: z.int()")}else{return"// ".concat(prop.name,": ").concat(prop.relationType," ").concat(prop.with)}}else{return"// unable to resolve"}if(prop.unsigned){stmt+=".nonnegative()"}if(prop.nullable){stmt+=".nullable()"}return stmt+","}function zodTypeToZodCode(zt){switch(zt.def.type){case"string":return"z.string()";case"number":return"z.number()";case"bigint":return"z.bigint()";case"boolean":return"z.boolean()";case"date":return"z.date()";case"null":return"z.null()";case"undefined":return"z.undefined()";case"any":return"z.any()";case"unknown":return"z.unknown()";case"never":return"z.never()";case"nullable":return zodTypeToZodCode(zt.def.innerType)+".nullable()";case"default":var zDefaultDef=zt.def;return zodTypeToZodCode(zDefaultDef.innerType)+".default(".concat(zDefaultDef.defaultValue,")");case"record":var zRecordDef=zt.def;return"z.record(".concat(zodTypeToZodCode(zRecordDef.keyType),", ").concat(zodTypeToZodCode(zRecordDef.valueType),")");case"literal":var items=Array.from(zt.values).map(function(value){if(typeof value==="string"){return'"'.concat(value,'"')}if(value===null){return"null"}if(value===undefined){return"undefined"}return"".concat(value)});if(items.length===1){return"z.literal(".concat(items[0],")")}return"z.literal([".concat(items.join(", "),"])");case"union":return"z.union([".concat(zt.def.options.map(function(option){return zodTypeToZodCode(option)}).join(","),"])");case"enum":return"z.enum({".concat(Object.entries(zt.def.entries).map(function(param){var _param=_sliced_to_array(param,2),key=_param[0],val=_param[1];return typeof val==="string"?"".concat(key,': "').concat(val,'"'):"".concat(key,": ").concat(val)}).join(", "),"})");case"array":return"z.array(".concat(zodTypeToZodCode(zt.def.element),")");case"object":var shape=zt.shape;return["z.object({"].concat(_to_consumable_array(Object.keys(shape).map(function(key){return"".concat(key,": ").concat(zodTypeToZodCode(shape[key]),",")})),["})"]).join("\n");case"optional":return zodTypeToZodCode(zt.def.innerType)+".optional()";case"file":return"z.file()";case"intersection":var zIntersectionDef=zt.def;return"z.intersection(".concat(zodTypeToZodCode(zIntersectionDef.left),", ").concat(zodTypeToZodCode(zIntersectionDef.right),")");case"file":return"z.file()";default:throw new Error("처리되지 않은 ZodType ".concat(zt.def.type))}}function apiParamToTsCode(params,injectImportKeys){return params.map(function(param){return"".concat(param.name).concat(param.optional&&!param.defaultDef?"?":"",": ").concat(apiParamTypeToTsType(param.type,injectImportKeys)).concat(param.defaultDef?"= ".concat(param.defaultDef):"")}).join(", ")}function apiParamToTsCodeAsObject(params,injectImportKeys){return"{ ".concat(params.map(function(param){return"".concat(param.name).concat(param.optional?"?":"",": ").concat(apiParamTypeToTsType(param.type,injectImportKeys)).concat(param.defaultDef?"= ".concat(param.defaultDef):"")}).join(", ")," }")}function apiParamTypeToTsType(paramType,injectImportKeys){if(["string","number","boolean","true","false","null","undefined","void","any","unknown"].includes(paramType)){return paramType}else if(_types.ApiParamType.isObject(paramType)){return"{ ".concat(apiParamToTsCode(paramType.props,injectImportKeys)," }")}else if(_types.ApiParamType.isStringLiteral(paramType)){return'"'.concat(paramType.value,'"')}else if(_types.ApiParamType.isNumericLiteral(paramType)){return String(paramType.value)}else if(_types.ApiParamType.isUnion(paramType)){return paramType.types.map(function(type){return apiParamTypeToTsType(type,injectImportKeys)}).join(" | ")}else if(_types.ApiParamType.isIntersection(paramType)){return paramType.types.map(function(type){return apiParamTypeToTsType(type,injectImportKeys)}).join(" & ")}else if(_types.ApiParamType.isArray(paramType)){return apiParamTypeToTsType(paramType.elementsType,injectImportKeys)+"[]"}else if(_types.ApiParamType.isRef(paramType)){if(["Pick","Omit","Promise","Partial","Date"].includes(paramType.id)===false){injectImportKeys.push(paramType.id)}if(paramType.args===undefined||paramType.args.length===0){return paramType.id}else{return"".concat(paramType.id,"<").concat(paramType.args.map(function(arg){return apiParamTypeToTsType(arg,injectImportKeys)}).join(","),">")}}else if(_types.ApiParamType.isIndexedAccess(paramType)){return"".concat(apiParamTypeToTsType(paramType.object,injectImportKeys),"[").concat(apiParamTypeToTsType(paramType.index,injectImportKeys),"]")}else if(_types.ApiParamType.isTupleType(paramType)){return"[ ".concat(paramType.elements.map(function(elem){return apiParamTypeToTsType(elem,injectImportKeys)})," ]")}else if(_types.ApiParamType.isTypeParam(paramType)){return"<".concat(paramType.id).concat(paramType.constraint?" extends ".concat(apiParamTypeToTsType(paramType.constraint,injectImportKeys)):"",">")}else{throw new Error("resolve 불가 ApiParamType ".concat(paramType))}}function unwrapPromiseOnce(paramType){if(_types.ApiParamType.isPromise(paramType)){return paramType.args[0]}else{return paramType}}function serializeZodType(zt){switch(zt.def.type){case"object":return{type:"object",shape:Object.keys(zt.shape).reduce(function(result,key){return _object_spread_props(_object_spread({},result),_define_property({},key,serializeZodType(zt.shape[key])))},{})};case"array":return{type:"array",element:serializeZodType(zt.def.element)};case"enum":return{type:"enum",values:zt.def.entries};case"string":return{type:"string",checks:zt.def.checks};case"number":return{type:"number",checks:zt.def.checks};case"boolean":return{type:"boolean"};case"nullable":return _object_spread_props(_object_spread({},serializeZodType(zt.def.innerType)),{nullable:true});case"optional":return _object_spread_props(_object_spread({},serializeZodType(zt.def.innerType)),{optional:true});case"any":return{type:"any"};case"record":return{type:"record",keyType:serializeZodType(zt.def.keyType),valueType:serializeZodType(zt.def.valueType)};case"union":return{type:"union",options:zt.def.options.map(function(option){return serializeZodType(option)})};default:throw new Error("Serialize 로직이 정의되지 않은 ZodType: ".concat(zt.def.type))}}function zodTypeToTsTypeDef(zt){switch(zt.def.type){case"string":case"number":case"boolean":case"bigint":case"date":case"null":case"undefined":case"any":case"unknown":case"never":return zt.def.type;case"nullable":return zodTypeToTsTypeDef(zt.def.innerType)+" | null";case"default":return zodTypeToTsTypeDef(zt.def.innerType);case"record":var recordType=zt;return"{ [ key: ".concat(zodTypeToTsTypeDef(recordType.def.keyType)," ]: ").concat(zodTypeToTsTypeDef(recordType.def.valueType),"}");case"literal":return Array.from(zt.values).map(function(value){if(typeof value==="string"){return'"'.concat(value,'"')}if(value===null){return"null"}if(value===undefined){return"undefined"}return"".concat(value)}).join(" | ");case"union":return"".concat(zt.options.map(function(option){return zodTypeToTsTypeDef(option)}).join(" | "));case"enum":return"".concat(zt.options.map(function(val){return'"'.concat(val,'"')}).join(" | "));case"array":return"".concat(zodTypeToTsTypeDef(zt.element),"[]");case"object":var shape=zt.shape;return["{"].concat(_to_consumable_array(Object.keys(shape).map(function(key){if(shape[key].def.type==="optional"){return"".concat(key,"?: ").concat(zodTypeToTsTypeDef(shape[key].def.innerType),",")}else{return"".concat(key,": ").concat(zodTypeToTsTypeDef(shape[key]),",")}})),["}"]).join("\n");case"optional":return zodTypeToTsTypeDef(zt.def.innerType)+" | undefined";default:throw new Error("처리되지 않은 ZodType ".concat(zt.def.type))}}
2
- //# sourceMappingURL=code-converters.js.map
1
+ /**
2
+ * code-converters는 API 타입 정의들을 Zod 객체나 TypeScript 코드로 변환하는 함수들을 제공합니다.
3
+ *
4
+ * 1. API 시리즈들:
5
+ * - ExtendedApi, ApiParam, ApiParamType
6
+ * - API 메타데이터를 표현하는 타입 정의들
7
+ *
8
+ * 2. ZodObject 변환
9
+ * - API 타입 정의 → Zod 타입 인스턴스 (런타임 밸리데이션용)
10
+ * - getZodTypeFromApiParamType → getZodObjectFromApiParams → getZodObjectFromApi
11
+ *
12
+ * 3. TsTypeDef 변환
13
+ * - API 타입 정의 → TypeScript 타입 코드 문자열 (코드 생성용)
14
+ * - apiParamTypeToTsType → apiParamToTsCode, apiParamToTsCodeAsObject
15
+ *
16
+ * 참고:
17
+ * - ZodTypeDef 생성 (Zod 코드 문자열): zod-converter.ts의 zodTypeToZodCode 사용
18
+ * - EntityProp 변환: zod-converter.ts 참조
19
+ */ import { z } from "zod";
20
+ import { ApiParamType } from "../types/types.js";
21
+ /**
22
+ * Promise 타입을 한 번 언래핑하여 내부 타입을 반환합니다.
23
+ * Promise가 아닌 경우 원본 타입을 그대로 반환합니다.
24
+ */ export function unwrapPromiseOnce(paramType) {
25
+ if (ApiParamType.isPromise(paramType)) {
26
+ return paramType.args?.[0];
27
+ } else {
28
+ return paramType;
29
+ }
30
+ }
31
+ /*
32
+ * API를 구성하는 요소들을 ZodObject로 변환하기 위한 함수들입니다.
33
+ */ /**
34
+ * ApiParamType을 Zod 타입 인스턴스로 변환합니다.
35
+ * string, number, array, union 등 모든 ApiParamType을 처리하며,
36
+ * 순환참조가 발생하는 경우 z.unknown()으로 fallback합니다.
37
+ */ export function getZodTypeFromApiParamType(paramType, references) {
38
+ switch(paramType){
39
+ case "string":
40
+ return z.string();
41
+ case "number":
42
+ return z.number();
43
+ case "boolean":
44
+ return z.boolean();
45
+ default:
46
+ {
47
+ const advType = paramType;
48
+ switch(advType.t){
49
+ case "string-literal":
50
+ case "numeric-literal":
51
+ return z.literal(advType.value);
52
+ case "object":
53
+ {
54
+ const objType = paramType;
55
+ return getZodObjectFromApiParams(objType.props);
56
+ }
57
+ case "array":
58
+ {
59
+ const arrType = paramType;
60
+ return z.array(getZodTypeFromApiParamType(arrType.elementsType, references));
61
+ }
62
+ case "ref":
63
+ {
64
+ const refType = paramType;
65
+ // Date 타입 처리
66
+ if (refType.id === "Date") {
67
+ return z.date();
68
+ }
69
+ // 객체 키 관리 유틸리티
70
+ if ([
71
+ "Pick",
72
+ "Omit"
73
+ ].includes(refType.id)) {
74
+ if (refType.args?.length !== 2) {
75
+ throw new Error(`잘못된 ${refType.id}`);
76
+ }
77
+ const [obj, literalOrUnion] = refType.args.map((arg)=>getZodTypeFromApiParamType(arg, references));
78
+ let keys = [];
79
+ if (literalOrUnion instanceof z.ZodUnion) {
80
+ keys = literalOrUnion.def.options.map((option)=>option.def.values[0]);
81
+ } else {
82
+ keys = literalOrUnion.def.values;
83
+ }
84
+ const keyRecord = Object.fromEntries(keys.map((key)=>[
85
+ key,
86
+ true
87
+ ]));
88
+ if (refType.id === "Pick") {
89
+ if (obj.pick) {
90
+ return obj.pick(keyRecord);
91
+ }
92
+ } else {
93
+ if (obj.omit) {
94
+ return obj.omit(keyRecord);
95
+ }
96
+ }
97
+ }
98
+ if ([
99
+ "Partial"
100
+ ].includes(refType.id)) {
101
+ if (refType.args?.length !== 1) {
102
+ throw new Error(`잘못된 ${refType.id}`);
103
+ }
104
+ const obj = getZodTypeFromApiParamType(refType.args[0], references);
105
+ // biome-ignore lint/suspicious/noExplicitAny: Partial 인수 타입 캐스팅
106
+ return obj.partial();
107
+ }
108
+ const reference = references[refType.id];
109
+ if (reference === undefined) {
110
+ return z.unknown();
111
+ // throw new Error(`ref 참조 불가 ${refType.id}`);
112
+ }
113
+ return reference;
114
+ }
115
+ case "union":
116
+ {
117
+ const unionType = paramType;
118
+ // nullable 유니온
119
+ if (unionType.types.length === 2 && unionType.types.some((type)=>type === "null")) {
120
+ if (unionType.types[0] === "null") {
121
+ return getZodTypeFromApiParamType(unionType.types[1], references).nullable();
122
+ } else {
123
+ return getZodTypeFromApiParamType(unionType.types[0], references).nullable();
124
+ }
125
+ }
126
+ // 일반 유니온
127
+ return z.union(unionType.types.map((type)=>getZodTypeFromApiParamType(type, references)));
128
+ }
129
+ case "intersection":
130
+ {
131
+ const intersectionType = paramType;
132
+ return intersectionType.types.reduce((result, type, index)=>{
133
+ const resolvedType = getZodTypeFromApiParamType(type, references);
134
+ if (index === 0) {
135
+ return resolvedType;
136
+ } else {
137
+ return z.intersection(result, resolvedType);
138
+ }
139
+ }, z.unknown());
140
+ }
141
+ case "tuple-type":
142
+ {
143
+ const tupleType = paramType;
144
+ return z.tuple(// biome-ignore lint/suspicious/noExplicitAny: 생성되는 ZodTuple의 타입을 추적하기 어려움
145
+ tupleType.elements.map((elem)=>getZodTypeFromApiParamType(elem, references)));
146
+ }
147
+ }
148
+ return z.unknown();
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * ApiParam 배열을 ZodObject로 변환합니다.
154
+ * 각 파라미터의 optional 여부를 반영하여 Zod 스키마를 생성합니다.
155
+ */ export function getZodObjectFromApiParams(apiParams, references = {}) {
156
+ return z.object(Object.fromEntries(apiParams.map((param)=>{
157
+ let zodType = getZodTypeFromApiParamType(param.type, references);
158
+ if (param.optional) {
159
+ zodType = zodType.optional();
160
+ }
161
+ return [
162
+ param.name,
163
+ zodType
164
+ ];
165
+ })));
166
+ }
167
+ /**
168
+ * ExtendedApi를 ZodObject로 변환합니다.
169
+ * TypeParameter와 일반 파라미터를 처리하며,
170
+ * Context, RefKnex, _로 시작하는 optional 파라미터는 제외합니다.
171
+ */ export function getZodObjectFromApi(api, references = {}) {
172
+ if (api.typeParameters?.length > 0) {
173
+ for (const typeParam of api.typeParameters){
174
+ if (typeParam.constraint) {
175
+ const zodType = getZodTypeFromApiParamType(typeParam.constraint, references);
176
+ // biome-ignore lint/suspicious/noExplicitAny: 레퍼런스 타입 캐스팅
177
+ references[typeParam.id] = zodType;
178
+ }
179
+ }
180
+ }
181
+ const ReqType = getZodObjectFromApiParams(// api parsing한 결과가 api params
182
+ api.parameters.filter((param)=>!ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional === true && param.name.startsWith("_"))), references);
183
+ return ReqType;
184
+ }
185
+ /*
186
+ * API 타입 정의를 TypeScript 코드 문자열로 변환하기 위한 함수들입니다.
187
+ */ /**
188
+ * ApiParamType을 TypeScript 타입 문자열로 변환합니다.
189
+ * union, intersection, array, ref 등 모든 타입을 TS 문법으로 표현하며,
190
+ * import가 필요한 타입 ID는 injectImportKeys에 수집합니다.
191
+ */ export function apiParamTypeToTsType(paramType, injectImportKeys) {
192
+ if ([
193
+ "string",
194
+ "number",
195
+ "boolean",
196
+ "true",
197
+ "false",
198
+ "null",
199
+ "undefined",
200
+ "void",
201
+ "any",
202
+ "unknown"
203
+ ].includes(paramType)) {
204
+ return paramType;
205
+ } else if (ApiParamType.isObject(paramType)) {
206
+ return `{ ${apiParamToTsCode(paramType.props, injectImportKeys)} }`;
207
+ } else if (ApiParamType.isStringLiteral(paramType)) {
208
+ return `"${paramType.value}"`;
209
+ } else if (ApiParamType.isNumericLiteral(paramType)) {
210
+ return String(paramType.value);
211
+ } else if (ApiParamType.isUnion(paramType)) {
212
+ return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" | ");
213
+ } else if (ApiParamType.isIntersection(paramType)) {
214
+ return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" & ");
215
+ } else if (ApiParamType.isArray(paramType)) {
216
+ return `${apiParamTypeToTsType(paramType.elementsType, injectImportKeys)}[]`;
217
+ } else if (ApiParamType.isRef(paramType)) {
218
+ if ([
219
+ "Pick",
220
+ "Omit",
221
+ "Promise",
222
+ "Partial",
223
+ "Date"
224
+ ].includes(paramType.id) === false) {
225
+ // importKeys 인젝션
226
+ injectImportKeys.push(paramType.id);
227
+ }
228
+ if (paramType.args === undefined || paramType.args.length === 0) {
229
+ return paramType.id;
230
+ } else {
231
+ return `${paramType.id}<${paramType.args.map((arg)=>apiParamTypeToTsType(arg, injectImportKeys)).join(",")}>`;
232
+ }
233
+ } else if (ApiParamType.isIndexedAccess(paramType)) {
234
+ return `${apiParamTypeToTsType(paramType.object, injectImportKeys)}[${apiParamTypeToTsType(paramType.index, injectImportKeys)}]`;
235
+ } else if (ApiParamType.isTupleType(paramType)) {
236
+ return `[ ${paramType.elements.map((elem)=>apiParamTypeToTsType(elem, injectImportKeys))} ]`;
237
+ } else if (ApiParamType.isTypeParam(paramType)) {
238
+ return `<${paramType.id}${paramType.constraint ? ` extends ${apiParamTypeToTsType(paramType.constraint, injectImportKeys)}` : ""}>`;
239
+ } else {
240
+ throw new Error(`resolve 불가 ApiParamType ${paramType}`);
241
+ }
242
+ }
243
+ /**
244
+ * ApiParam 배열을 TypeScript 함수 파라미터 코드로 변환합니다.
245
+ * 예: "name: string, age?: number, active: boolean = true"
246
+ */ export function apiParamToTsCode(params, injectImportKeys) {
247
+ return params.map((param)=>{
248
+ return `${param.name}${param.optional && !param.defaultDef ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`;
249
+ }).join(", ");
250
+ }
251
+ /**
252
+ * ApiParam 배열을 TypeScript 객체 타입 코드로 변환합니다.
253
+ * 예: "{ name: string, age?: number, active: boolean = true }"
254
+ */ export function apiParamToTsCodeAsObject(params, injectImportKeys) {
255
+ return `{ ${params.map((param)=>`${param.name}${param.optional ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`).join(", ")} }`;
256
+ }
257
+
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29kZS1jb252ZXJ0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY29kZS1jb252ZXJ0ZXJz64qUIEFQSSDtg4DsnoUg7KCV7J2Y65Ok7J2EIFpvZCDqsJ3ssrTrgpggVHlwZVNjcmlwdCDsvZTrk5zroZwg67OA7ZmY7ZWY64qUIO2VqOyImOuTpOydhCDsoJzqs7Xtlanri4jri6QuXG4gKlxuICogMS4gQVBJIOyLnOumrOymiOuTpDpcbiAqIC0gRXh0ZW5kZWRBcGksIEFwaVBhcmFtLCBBcGlQYXJhbVR5cGVcbiAqIC0gQVBJIOuplO2DgOuNsOydtO2EsOulvCDtkZztmITtlZjripQg7YOA7J6FIOygleydmOuTpFxuICpcbiAqIDIuIFpvZE9iamVjdCDrs4DtmZhcbiAqIC0gQVBJIO2DgOyehSDsoJXsnZgg4oaSIFpvZCDtg4DsnoUg7J247Iqk7YS07IqkICjrn7Dtg4DsnoQg67C466as642w7J207IWY7JqpKVxuICogLSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSDihpIgZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyDihpIgZ2V0Wm9kT2JqZWN0RnJvbUFwaVxuICpcbiAqIDMuIFRzVHlwZURlZiDrs4DtmZhcbiAqIC0gQVBJIO2DgOyehSDsoJXsnZgg4oaSIFR5cGVTY3JpcHQg7YOA7J6FIOy9lOuTnCDrrLjsnpDsl7QgKOy9lOuTnCDsg53shLHsmqkpXG4gKiAtIGFwaVBhcmFtVHlwZVRvVHNUeXBlIOKGkiBhcGlQYXJhbVRvVHNDb2RlLCBhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3RcbiAqXG4gKiDssLjqs6A6XG4gKiAtIFpvZFR5cGVEZWYg7IOd7ISxIChab2Qg7L2U65OcIOusuOyekOyXtCk6IHpvZC1jb252ZXJ0ZXIudHPsnZggem9kVHlwZVRvWm9kQ29kZSDsgqzsmqlcbiAqIC0gRW50aXR5UHJvcCDrs4DtmZg6IHpvZC1jb252ZXJ0ZXIudHMg7LC47KGwXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgY29yZSB9IGZyb20gXCJ6b2QvdjRcIjtcbmltcG9ydCB0eXBlIHsgJFpvZExvb3NlU2hhcGUgfSBmcm9tIFwiem9kL3Y0L2NvcmVcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8JFpvZExvb3NlU2hhcGU+O1xudHlwZSBBbnlab2RMaXRlcmFsID0gei5ab2RMaXRlcmFsPGNvcmUudXRpbC5MaXRlcmFsPjtcblxuLyoqXG4gKiBQcm9taXNlIO2DgOyeheydhCDtlZwg67KIIOyWuOuemO2Vke2VmOyXrCDrgrTrtoAg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIFByb21pc2XqsIAg7JWE64uMIOqyveyasCDsm5Drs7gg7YOA7J6F7J2EIOq3uOuMgOuhnCDrsJjtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBQcm9taXNlT25jZShwYXJhbVR5cGU6IEFwaVBhcmFtVHlwZSkge1xuICBpZiAoQXBpUGFyYW1UeXBlLmlzUHJvbWlzZShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS5hcmdzPy5bMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZTtcbiAgfVxufVxuXG4vKlxuICogQVBJ66W8IOq1rOyEse2VmOuKlCDsmpTshozrk6TsnYQgWm9kT2JqZWN066GcIOuzgO2ZmO2VmOq4sCDsnITtlZwg7ZWo7IiY65Ok7J6F64uI64ukLlxuICovXG5cbi8qKlxuICogQXBpUGFyYW1UeXBl7J2EIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHN0cmluZywgbnVtYmVyLCBhcnJheSwgdW5pb24g65OxIOuqqOuToCBBcGlQYXJhbVR5cGXsnYQg7LKY66as7ZWY66mwLFxuICog7Iic7ZmY7LC47KGw6rCAIOuwnOyDne2VmOuKlCDqsr3smrAgei51bmtub3duKCnsnLzroZwgZmFsbGJhY2vtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShcbiAgcGFyYW1UeXBlOiBBcGlQYXJhbVR5cGUsXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IEFueVpvZE9iamVjdDtcbiAgfSxcbik6IHouWm9kVHlwZTx1bmtub3duPiB7XG4gIHN3aXRjaCAocGFyYW1UeXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIHouc3RyaW5nKCk7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIHoubnVtYmVyKCk7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiB6LmJvb2xlYW4oKTtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBhZHZUeXBlID0gcGFyYW1UeXBlIGFzIHsgdDogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB8IG51bWJlciB9O1xuICAgICAgc3dpdGNoIChhZHZUeXBlLnQpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZy1saXRlcmFsXCI6XG4gICAgICAgIGNhc2UgXCJudW1lcmljLWxpdGVyYWxcIjpcbiAgICAgICAgICByZXR1cm4gei5saXRlcmFsKGFkdlR5cGUudmFsdWUpO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICBjb25zdCBvYmpUeXBlID0gcGFyYW1UeXBlIGFzIHsgdDogc3RyaW5nOyBwcm9wczogQXBpUGFyYW1bXSB9O1xuICAgICAgICAgIHJldHVybiBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zKG9ialR5cGUucHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhcnJheVwiOiB7XG4gICAgICAgICAgY29uc3QgYXJyVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICBlbGVtZW50c1R5cGU6IEFwaVBhcmFtVHlwZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB6LmFycmF5KGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyclR5cGUuZWxlbWVudHNUeXBlLCByZWZlcmVuY2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlZlwiOiB7XG4gICAgICAgICAgY29uc3QgcmVmVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgYXJncz86IEFwaVBhcmFtVHlwZVtdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gRGF0ZSDtg4DsnoUg7LKY66asXG4gICAgICAgICAgaWYgKHJlZlR5cGUuaWQgPT09IFwiRGF0ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gei5kYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOqwneyytCDtgqQg6rSA66asIOycoO2LuOumrO2LsFxuICAgICAgICAgIGlmIChbXCJQaWNrXCIsIFwiT21pdFwiXS5pbmNsdWRlcyhyZWZUeXBlLmlkKSkge1xuICAgICAgICAgICAgaWYgKHJlZlR5cGUuYXJncz8ubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFtvYmosIGxpdGVyYWxPclVuaW9uXSA9IHJlZlR5cGUuYXJncy5tYXAoXG4gICAgICAgICAgICAgIChhcmcpID0+IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyZywgcmVmZXJlbmNlcyksXG4gICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7IOd7ISx65CY64qUIFpvZFVuaW9u7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICApIGFzIFtBbnlab2RPYmplY3QsIHouWm9kVW5pb248YW55PiB8IEFueVpvZExpdGVyYWxdO1xuXG4gICAgICAgICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsT3JVbmlvbiBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICAgICAgICAgICAga2V5cyA9IGxpdGVyYWxPclVuaW9uLmRlZi5vcHRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAob3B0aW9uOiB7IGRlZjogeyB2YWx1ZXM6IHN0cmluZ1tdIH0gfSkgPT4gb3B0aW9uLmRlZi52YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBrZXlzID0gKGxpdGVyYWxPclVuaW9uIGFzIHouWm9kTGl0ZXJhbDxzdHJpbmc+KS5kZWYudmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5UmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKGtleXMubWFwKChrZXkpID0+IFtrZXksIHRydWUgYXMgY29uc3RdKSk7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5pZCA9PT0gXCJQaWNrXCIpIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5waWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5waWNrKGtleVJlY29yZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChvYmoub21pdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmoub21pdChrZXlSZWNvcmQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChbXCJQYXJ0aWFsXCJdLmluY2x1ZGVzKHJlZlR5cGUuaWQpKSB7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5hcmdzPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgJHtyZWZUeXBlLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JqID0gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUocmVmVHlwZS5hcmdzWzBdLCByZWZlcmVuY2VzKTtcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogUGFydGlhbCDsnbjsiJgg7YOA7J6FIOy6kOyKpO2MhVxuICAgICAgICAgICAgcmV0dXJuIChvYmogYXMgei5ab2RPYmplY3Q8YW55PikucGFydGlhbCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZWZlcmVuY2UgPSByZWZlcmVuY2VzW3JlZlR5cGUuaWRdO1xuICAgICAgICAgIGlmIChyZWZlcmVuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHoudW5rbm93bigpO1xuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKGByZWYg7LC47KGwIOu2iOqwgCAke3JlZlR5cGUuaWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZWZlcmVuY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInVuaW9uXCI6IHtcbiAgICAgICAgICBjb25zdCB1bmlvblR5cGUgPSBwYXJhbVR5cGUgYXMge1xuICAgICAgICAgICAgdDogc3RyaW5nO1xuICAgICAgICAgICAgdHlwZXM6IEFwaVBhcmFtVHlwZVtdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gbnVsbGFibGUg7Jyg64uI7JioXG4gICAgICAgICAgaWYgKHVuaW9uVHlwZS50eXBlcy5sZW5ndGggPT09IDIgJiYgdW5pb25UeXBlLnR5cGVzLnNvbWUoKHR5cGUpID0+IHR5cGUgPT09IFwibnVsbFwiKSkge1xuICAgICAgICAgICAgaWYgKHVuaW9uVHlwZS50eXBlc1swXSA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHVuaW9uVHlwZS50eXBlc1sxXSwgcmVmZXJlbmNlcykubnVsbGFibGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSh1bmlvblR5cGUudHlwZXNbMF0sIHJlZmVyZW5jZXMpLm51bGxhYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOydvOuwmCDsnKDri4jsmKhcbiAgICAgICAgICByZXR1cm4gei51bmlvbihcbiAgICAgICAgICAgIHVuaW9uVHlwZS50eXBlcy5tYXAoKHR5cGUpID0+IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHR5cGUsIHJlZmVyZW5jZXMpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvblR5cGUgPSBwYXJhbVR5cGUgYXMge1xuICAgICAgICAgICAgdDogc3RyaW5nO1xuICAgICAgICAgICAgdHlwZXM6IEFwaVBhcmFtVHlwZVtdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvblR5cGUudHlwZXMucmVkdWNlKFxuICAgICAgICAgICAgKHJlc3VsdCwgdHlwZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZSwgcmVmZXJlbmNlcyk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFR5cGU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHouaW50ZXJzZWN0aW9uKHJlc3VsdCwgcmVzb2x2ZWRUeXBlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHoudW5rbm93bigpIGFzIHouWm9kVHlwZTx1bmtub3duPixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ0dXBsZS10eXBlXCI6IHtcbiAgICAgICAgICBjb25zdCB0dXBsZVR5cGUgPSBwYXJhbVR5cGUgYXMgQXBpUGFyYW1UeXBlLlR1cGxlVHlwZTtcbiAgICAgICAgICByZXR1cm4gei50dXBsZShcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7IOd7ISx65CY64qUIFpvZFR1cGxl7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICB0dXBsZVR5cGUuZWxlbWVudHMubWFwKChlbGVtKSA9PiBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShlbGVtLCByZWZlcmVuY2VzKSkgYXMgYW55LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnVua25vd24oKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcGlQYXJhbSDrsLDsl7TsnYQgWm9kT2JqZWN066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSDtjIzrnbzrr7jthLDsnZggb3B0aW9uYWwg7Jes67aA66W8IOuwmOyYge2VmOyXrCBab2Qg7Iqk7YKk66eI66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMoXG4gIGFwaVBhcmFtczogQXBpUGFyYW1bXSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogQW55Wm9kT2JqZWN0O1xuICB9ID0ge30sXG4pOiB6LlpvZE9iamVjdCB7XG4gIHJldHVybiB6Lm9iamVjdChcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBhcGlQYXJhbXMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBsZXQgem9kVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHBhcmFtLnR5cGUsIHJlZmVyZW5jZXMpO1xuICAgICAgICBpZiAocGFyYW0ub3B0aW9uYWwpIHtcbiAgICAgICAgICB6b2RUeXBlID0gem9kVHlwZS5vcHRpb25hbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcGFyYW0ubmFtZSwgem9kVHlwZV07XG4gICAgICB9KSxcbiAgICApLFxuICApO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkQXBp66W8IFpvZE9iamVjdOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBUeXBlUGFyYW1ldGVy7JmAIOydvOuwmCDtjIzrnbzrr7jthLDrpbwg7LKY66as7ZWY66mwLFxuICogQ29udGV4dCwgUmVmS25leCwgX+uhnCDsi5zsnpHtlZjripQgb3B0aW9uYWwg7YyM652866+47YSw64qUIOygnOyZuO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZE9iamVjdEZyb21BcGkoXG4gIGFwaTogRXh0ZW5kZWRBcGksXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IEFueVpvZE9iamVjdDtcbiAgfSA9IHt9LFxuKSB7XG4gIGlmIChhcGkudHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHR5cGVQYXJhbSBvZiBhcGkudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgIGlmICh0eXBlUGFyYW0uY29uc3RyYWludCkge1xuICAgICAgICBjb25zdCB6b2RUeXBlID0gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZVBhcmFtLmNvbnN0cmFpbnQsIHJlZmVyZW5jZXMpO1xuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IOugiO2NvOufsOyKpCDtg4DsnoUg7LqQ7Iqk7YyFXG4gICAgICAgIChyZWZlcmVuY2VzW3R5cGVQYXJhbS5pZF0gYXMgei5ab2RUeXBlPGFueT4pID0gem9kVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMoXG4gICAgLy8gYXBpIHBhcnNpbmftlZwg6rKw6rO86rCAIGFwaSBwYXJhbXNcbiAgICBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAocGFyYW0pID0+XG4gICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksIC8vIF/roZwg7Iuc7J6R7ZWY64qUIO2MjOudvOuvuO2EsOuKlCDsoJzsmbhcbiAgICApLFxuICAgIHJlZmVyZW5jZXMsXG4gICk7XG4gIHJldHVybiBSZXFUeXBlO1xufVxuXG4vKlxuICogQVBJIO2DgOyehSDsoJXsnZjrpbwgVHlwZVNjcmlwdCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VmOq4sCDsnITtlZwg7ZWo7IiY65Ok7J6F64uI64ukLlxuICovXG5cbi8qKlxuICogQXBpUGFyYW1UeXBl7J2EIFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiB1bmlvbiwgaW50ZXJzZWN0aW9uLCBhcnJheSwgcmVmIOuTsSDrqqjrk6Ag7YOA7J6F7J2EIFRTIOusuOuyleycvOuhnCDtkZztmITtlZjrqbAsXG4gKiBpbXBvcnTqsIAg7ZWE7JqU7ZWcIO2DgOyehSBJROuKlCBpbmplY3RJbXBvcnRLZXlz7JeQIOyImOynke2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZTogQXBpUGFyYW1UeXBlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChcbiAgICBbXG4gICAgICBcInN0cmluZ1wiLFxuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwiYm9vbGVhblwiLFxuICAgICAgXCJ0cnVlXCIsXG4gICAgICBcImZhbHNlXCIsXG4gICAgICBcIm51bGxcIixcbiAgICAgIFwidW5kZWZpbmVkXCIsXG4gICAgICBcInZvaWRcIixcbiAgICAgIFwiYW55XCIsXG4gICAgICBcInVua25vd25cIixcbiAgICBdLmluY2x1ZGVzKHBhcmFtVHlwZSBhcyBzdHJpbmcpXG4gICkge1xuICAgIHJldHVybiBwYXJhbVR5cGUgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc09iamVjdChwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGB7ICR7YXBpUGFyYW1Ub1RzQ29kZShwYXJhbVR5cGUucHJvcHMsIGluamVjdEltcG9ydEtleXMpfSB9YDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNTdHJpbmdMaXRlcmFsKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYFwiJHtwYXJhbVR5cGUudmFsdWV9XCJgO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc051bWVyaWNMaXRlcmFsKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtVHlwZS52YWx1ZSk7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVW5pb24ocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBwYXJhbVR5cGUudHlwZXMubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSkuam9pbihcIiB8IFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNJbnRlcnNlY3Rpb24ocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBwYXJhbVR5cGUudHlwZXMubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSkuam9pbihcIiAmIFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNBcnJheShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZS5lbGVtZW50c1R5cGUsIGluamVjdEltcG9ydEtleXMpfVtdYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNSZWYocGFyYW1UeXBlKSkge1xuICAgIGlmIChbXCJQaWNrXCIsIFwiT21pdFwiLCBcIlByb21pc2VcIiwgXCJQYXJ0aWFsXCIsIFwiRGF0ZVwiXS5pbmNsdWRlcyhwYXJhbVR5cGUuaWQpID09PSBmYWxzZSkge1xuICAgICAgLy8gaW1wb3J0S2V5cyDsnbjsoJ3shZhcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwYXJhbVR5cGUuaWQpO1xuICAgIH1cbiAgICBpZiAocGFyYW1UeXBlLmFyZ3MgPT09IHVuZGVmaW5lZCB8fCBwYXJhbVR5cGUuYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwYXJhbVR5cGUuaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtwYXJhbVR5cGUuaWR9PCR7cGFyYW1UeXBlLmFyZ3NcbiAgICAgICAgLm1hcCgoYXJnKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZShhcmcsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIixcIil9PmA7XG4gICAgfVxuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0luZGV4ZWRBY2Nlc3MocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgIHBhcmFtVHlwZS5vYmplY3QsXG4gICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICl9WyR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW1UeXBlLmluZGV4LCBpbmplY3RJbXBvcnRLZXlzKX1dYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNUdXBsZVR5cGUocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgWyAke3BhcmFtVHlwZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKGVsZW0sIGluamVjdEltcG9ydEtleXMpKX0gXWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVHlwZVBhcmFtKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYDwke3BhcmFtVHlwZS5pZH0ke1xuICAgICAgcGFyYW1UeXBlLmNvbnN0cmFpbnRcbiAgICAgICAgPyBgIGV4dGVuZHMgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbVR5cGUuY29uc3RyYWludCwgaW5qZWN0SW1wb3J0S2V5cyl9YFxuICAgICAgICA6IFwiXCJcbiAgICB9PmA7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgCBBcGlQYXJhbVR5cGUgJHtwYXJhbVR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcGlQYXJhbSDrsLDsl7TsnYQgVHlwZVNjcmlwdCDtlajsiJgg7YyM652866+47YSwIOy9lOuTnOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDsmIg6IFwibmFtZTogc3RyaW5nLCBhZ2U/OiBudW1iZXIsIGFjdGl2ZTogYm9vbGVhbiA9IHRydWVcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpUGFyYW1Ub1RzQ29kZShwYXJhbXM6IEFwaVBhcmFtW10sIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmFtc1xuICAgIC5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICByZXR1cm4gYCR7cGFyYW0ubmFtZX0ke1xuICAgICAgICBwYXJhbS5vcHRpb25hbCAmJiAhcGFyYW0uZGVmYXVsdERlZiA/IFwiP1wiIDogXCJcIlxuICAgICAgfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbS50eXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ke1xuICAgICAgICBwYXJhbS5kZWZhdWx0RGVmID8gYD0gJHtwYXJhbS5kZWZhdWx0RGVmfWAgOiBcIlwiXG4gICAgICB9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIik7XG59XG5cbi8qKlxuICogQXBpUGFyYW0g67Cw7Je07J2EIFR5cGVTY3JpcHQg6rCd7LK0IO2DgOyehSDsvZTrk5zroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7JiIOiBcInsgbmFtZTogc3RyaW5nLCBhZ2U/OiBudW1iZXIsIGFjdGl2ZTogYm9vbGVhbiA9IHRydWUgfVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3QocGFyYW1zOiBBcGlQYXJhbVtdLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgeyAke3BhcmFtc1xuICAgIC5tYXAoXG4gICAgICAocGFyYW0pID0+XG4gICAgICAgIGAke3BhcmFtLm5hbWV9JHtwYXJhbS5vcHRpb25hbCA/IFwiP1wiIDogXCJcIn06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUoXG4gICAgICAgICAgcGFyYW0udHlwZSxcbiAgICAgICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICAgICApfSR7cGFyYW0uZGVmYXVsdERlZiA/IGA9ICR7cGFyYW0uZGVmYXVsdERlZn1gIDogXCJcIn1gLFxuICAgIClcbiAgICAuam9pbihcIiwgXCIpfSB9YDtcbn1cbiJdLCJuYW1lcyI6WyJ6IiwiQXBpUGFyYW1UeXBlIiwidW53cmFwUHJvbWlzZU9uY2UiLCJwYXJhbVR5cGUiLCJpc1Byb21pc2UiLCJhcmdzIiwiZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUiLCJyZWZlcmVuY2VzIiwic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiIsImFkdlR5cGUiLCJ0IiwibGl0ZXJhbCIsInZhbHVlIiwib2JqVHlwZSIsImdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMiLCJwcm9wcyIsImFyclR5cGUiLCJhcnJheSIsImVsZW1lbnRzVHlwZSIsInJlZlR5cGUiLCJpZCIsImRhdGUiLCJpbmNsdWRlcyIsImxlbmd0aCIsIkVycm9yIiwib2JqIiwibGl0ZXJhbE9yVW5pb24iLCJtYXAiLCJhcmciLCJrZXlzIiwiWm9kVW5pb24iLCJkZWYiLCJvcHRpb25zIiwib3B0aW9uIiwidmFsdWVzIiwia2V5UmVjb3JkIiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJrZXkiLCJwaWNrIiwib21pdCIsInBhcnRpYWwiLCJyZWZlcmVuY2UiLCJ1bmRlZmluZWQiLCJ1bmtub3duIiwidW5pb25UeXBlIiwidHlwZXMiLCJzb21lIiwidHlwZSIsIm51bGxhYmxlIiwidW5pb24iLCJpbnRlcnNlY3Rpb25UeXBlIiwicmVkdWNlIiwicmVzdWx0IiwiaW5kZXgiLCJyZXNvbHZlZFR5cGUiLCJpbnRlcnNlY3Rpb24iLCJ0dXBsZVR5cGUiLCJ0dXBsZSIsImVsZW1lbnRzIiwiZWxlbSIsImFwaVBhcmFtcyIsIm9iamVjdCIsInBhcmFtIiwiem9kVHlwZSIsIm9wdGlvbmFsIiwibmFtZSIsImdldFpvZE9iamVjdEZyb21BcGkiLCJhcGkiLCJ0eXBlUGFyYW1ldGVycyIsInR5cGVQYXJhbSIsImNvbnN0cmFpbnQiLCJSZXFUeXBlIiwicGFyYW1ldGVycyIsImZpbHRlciIsImlzQ29udGV4dCIsImlzUmVmS25leCIsInN0YXJ0c1dpdGgiLCJhcGlQYXJhbVR5cGVUb1RzVHlwZSIsImluamVjdEltcG9ydEtleXMiLCJpc09iamVjdCIsImFwaVBhcmFtVG9Uc0NvZGUiLCJpc1N0cmluZ0xpdGVyYWwiLCJpc051bWVyaWNMaXRlcmFsIiwiU3RyaW5nIiwiaXNVbmlvbiIsImpvaW4iLCJpc0ludGVyc2VjdGlvbiIsImlzQXJyYXkiLCJpc1JlZiIsInB1c2giLCJpc0luZGV4ZWRBY2Nlc3MiLCJpc1R1cGxlVHlwZSIsImlzVHlwZVBhcmFtIiwicGFyYW1zIiwiZGVmYXVsdERlZiIsImFwaVBhcmFtVG9Uc0NvZGVBc09iamVjdCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCQyxHQUVELFNBQVNBLENBQUMsUUFBUSxNQUFNO0FBR3hCLFNBQXdCQyxZQUFZLFFBQVEsb0JBQWlCO0FBTzdEOzs7Q0FHQyxHQUNELE9BQU8sU0FBU0Msa0JBQWtCQyxTQUF1QjtJQUN2RCxJQUFJRixhQUFhRyxTQUFTLENBQUNELFlBQVk7UUFDckMsT0FBT0EsVUFBVUUsSUFBSSxFQUFFLENBQUMsRUFBRTtJQUM1QixPQUFPO1FBQ0wsT0FBT0Y7SUFDVDtBQUNGO0FBRUE7O0NBRUMsR0FFRDs7OztDQUlDLEdBQ0QsT0FBTyxTQUFTRywyQkFDZEgsU0FBdUIsRUFDdkJJLFVBRUM7SUFFRCxPQUFRSjtRQUNOLEtBQUs7WUFDSCxPQUFPSCxFQUFFUSxNQUFNO1FBQ2pCLEtBQUs7WUFDSCxPQUFPUixFQUFFUyxNQUFNO1FBQ2pCLEtBQUs7WUFDSCxPQUFPVCxFQUFFVSxPQUFPO1FBQ2xCO1lBQVM7Z0JBQ1AsTUFBTUMsVUFBVVI7Z0JBQ2hCLE9BQVFRLFFBQVFDLENBQUM7b0JBQ2YsS0FBSztvQkFDTCxLQUFLO3dCQUNILE9BQU9aLEVBQUVhLE9BQU8sQ0FBQ0YsUUFBUUcsS0FBSztvQkFDaEMsS0FBSzt3QkFBVTs0QkFDYixNQUFNQyxVQUFVWjs0QkFDaEIsT0FBT2EsMEJBQTBCRCxRQUFRRSxLQUFLO3dCQUNoRDtvQkFDQSxLQUFLO3dCQUFTOzRCQUNaLE1BQU1DLFVBQVVmOzRCQUloQixPQUFPSCxFQUFFbUIsS0FBSyxDQUFDYiwyQkFBMkJZLFFBQVFFLFlBQVksRUFBRWI7d0JBQ2xFO29CQUNBLEtBQUs7d0JBQU87NEJBQ1YsTUFBTWMsVUFBVWxCOzRCQUtoQixhQUFhOzRCQUNiLElBQUlrQixRQUFRQyxFQUFFLEtBQUssUUFBUTtnQ0FDekIsT0FBT3RCLEVBQUV1QixJQUFJOzRCQUNmOzRCQUNBLGVBQWU7NEJBQ2YsSUFBSTtnQ0FBQztnQ0FBUTs2QkFBTyxDQUFDQyxRQUFRLENBQUNILFFBQVFDLEVBQUUsR0FBRztnQ0FDekMsSUFBSUQsUUFBUWhCLElBQUksRUFBRW9CLFdBQVcsR0FBRztvQ0FDOUIsTUFBTSxJQUFJQyxNQUFNLENBQUMsSUFBSSxFQUFFTCxRQUFRQyxFQUFFLEVBQUU7Z0NBQ3JDO2dDQUNBLE1BQU0sQ0FBQ0ssS0FBS0MsZUFBZSxHQUFHUCxRQUFRaEIsSUFBSSxDQUFDd0IsR0FBRyxDQUM1QyxDQUFDQyxNQUFReEIsMkJBQTJCd0IsS0FBS3ZCO2dDQUkzQyxJQUFJd0IsT0FBaUIsRUFBRTtnQ0FDdkIsSUFBSUgsMEJBQTBCNUIsRUFBRWdDLFFBQVEsRUFBRTtvQ0FDeENELE9BQU9ILGVBQWVLLEdBQUcsQ0FBQ0MsT0FBTyxDQUFDTCxHQUFHLENBQ25DLENBQUNNLFNBQTBDQSxPQUFPRixHQUFHLENBQUNHLE1BQU0sQ0FBQyxFQUFFO2dDQUVuRSxPQUFPO29DQUNMTCxPQUFPLEFBQUNILGVBQXdDSyxHQUFHLENBQUNHLE1BQU07Z0NBQzVEO2dDQUNBLE1BQU1DLFlBQVlDLE9BQU9DLFdBQVcsQ0FBQ1IsS0FBS0YsR0FBRyxDQUFDLENBQUNXLE1BQVE7d0NBQUNBO3dDQUFLO3FDQUFjO2dDQUMzRSxJQUFJbkIsUUFBUUMsRUFBRSxLQUFLLFFBQVE7b0NBQ3pCLElBQUlLLElBQUljLElBQUksRUFBRTt3Q0FDWixPQUFPZCxJQUFJYyxJQUFJLENBQUNKO29DQUNsQjtnQ0FDRixPQUFPO29DQUNMLElBQUlWLElBQUllLElBQUksRUFBRTt3Q0FDWixPQUFPZixJQUFJZSxJQUFJLENBQUNMO29DQUNsQjtnQ0FDRjs0QkFDRjs0QkFDQSxJQUFJO2dDQUFDOzZCQUFVLENBQUNiLFFBQVEsQ0FBQ0gsUUFBUUMsRUFBRSxHQUFHO2dDQUNwQyxJQUFJRCxRQUFRaEIsSUFBSSxFQUFFb0IsV0FBVyxHQUFHO29DQUM5QixNQUFNLElBQUlDLE1BQU0sQ0FBQyxJQUFJLEVBQUVMLFFBQVFDLEVBQUUsRUFBRTtnQ0FDckM7Z0NBQ0EsTUFBTUssTUFBTXJCLDJCQUEyQmUsUUFBUWhCLElBQUksQ0FBQyxFQUFFLEVBQUVFO2dDQUN4RCxnRUFBZ0U7Z0NBQ2hFLE9BQU8sQUFBQ29CLElBQXlCZ0IsT0FBTzs0QkFDMUM7NEJBQ0EsTUFBTUMsWUFBWXJDLFVBQVUsQ0FBQ2MsUUFBUUMsRUFBRSxDQUFDOzRCQUN4QyxJQUFJc0IsY0FBY0MsV0FBVztnQ0FDM0IsT0FBTzdDLEVBQUU4QyxPQUFPOzRCQUNoQiw4Q0FBOEM7NEJBQ2hEOzRCQUNBLE9BQU9GO3dCQUNUO29CQUNBLEtBQUs7d0JBQVM7NEJBQ1osTUFBTUcsWUFBWTVDOzRCQUlsQixlQUFlOzRCQUNmLElBQUk0QyxVQUFVQyxLQUFLLENBQUN2QixNQUFNLEtBQUssS0FBS3NCLFVBQVVDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLENBQUNDLE9BQVNBLFNBQVMsU0FBUztnQ0FDbkYsSUFBSUgsVUFBVUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxRQUFRO29DQUNqQyxPQUFPMUMsMkJBQTJCeUMsVUFBVUMsS0FBSyxDQUFDLEVBQUUsRUFBRXpDLFlBQVk0QyxRQUFRO2dDQUM1RSxPQUFPO29DQUNMLE9BQU83QywyQkFBMkJ5QyxVQUFVQyxLQUFLLENBQUMsRUFBRSxFQUFFekMsWUFBWTRDLFFBQVE7Z0NBQzVFOzRCQUNGOzRCQUNBLFNBQVM7NEJBQ1QsT0FBT25ELEVBQUVvRCxLQUFLLENBQ1pMLFVBQVVDLEtBQUssQ0FBQ25CLEdBQUcsQ0FBQyxDQUFDcUIsT0FBUzVDLDJCQUEyQjRDLE1BQU0zQzt3QkFFbkU7b0JBQ0EsS0FBSzt3QkFBZ0I7NEJBQ25CLE1BQU04QyxtQkFBbUJsRDs0QkFJekIsT0FBT2tELGlCQUFpQkwsS0FBSyxDQUFDTSxNQUFNLENBQ2xDLENBQUNDLFFBQVFMLE1BQU1NO2dDQUNiLE1BQU1DLGVBQWVuRCwyQkFBMkI0QyxNQUFNM0M7Z0NBQ3RELElBQUlpRCxVQUFVLEdBQUc7b0NBQ2YsT0FBT0M7Z0NBQ1QsT0FBTztvQ0FDTCxPQUFPekQsRUFBRTBELFlBQVksQ0FBQ0gsUUFBUUU7Z0NBQ2hDOzRCQUNGLEdBQ0F6RCxFQUFFOEMsT0FBTzt3QkFFYjtvQkFDQSxLQUFLO3dCQUFjOzRCQUNqQixNQUFNYSxZQUFZeEQ7NEJBQ2xCLE9BQU9ILEVBQUU0RCxLQUFLLENBQ1osMEVBQTBFOzRCQUMxRUQsVUFBVUUsUUFBUSxDQUFDaEMsR0FBRyxDQUFDLENBQUNpQyxPQUFTeEQsMkJBQTJCd0QsTUFBTXZEO3dCQUV0RTtnQkFDRjtnQkFDQSxPQUFPUCxFQUFFOEMsT0FBTztZQUNsQjtJQUNGO0FBQ0Y7QUFFQTs7O0NBR0MsR0FDRCxPQUFPLFNBQVM5QiwwQkFDZCtDLFNBQXFCLEVBQ3JCeEQsYUFFSSxDQUFDLENBQUM7SUFFTixPQUFPUCxFQUFFZ0UsTUFBTSxDQUNiMUIsT0FBT0MsV0FBVyxDQUNoQndCLFVBQVVsQyxHQUFHLENBQUMsQ0FBQ29DO1FBQ2IsSUFBSUMsVUFBVTVELDJCQUEyQjJELE1BQU1mLElBQUksRUFBRTNDO1FBQ3JELElBQUkwRCxNQUFNRSxRQUFRLEVBQUU7WUFDbEJELFVBQVVBLFFBQVFDLFFBQVE7UUFDNUI7UUFDQSxPQUFPO1lBQUNGLE1BQU1HLElBQUk7WUFBRUY7U0FBUTtJQUM5QjtBQUdOO0FBRUE7Ozs7Q0FJQyxHQUNELE9BQU8sU0FBU0csb0JBQ2RDLEdBQWdCLEVBQ2hCL0QsYUFFSSxDQUFDLENBQUM7SUFFTixJQUFJK0QsSUFBSUMsY0FBYyxFQUFFOUMsU0FBUyxHQUFHO1FBQ2xDLEtBQUssTUFBTStDLGFBQWFGLElBQUlDLGNBQWMsQ0FBRTtZQUMxQyxJQUFJQyxVQUFVQyxVQUFVLEVBQUU7Z0JBQ3hCLE1BQU1QLFVBQVU1RCwyQkFBMkJrRSxVQUFVQyxVQUFVLEVBQUVsRTtnQkFDakUsMERBQTBEO2dCQUN6REEsVUFBVSxDQUFDaUUsVUFBVWxELEVBQUUsQ0FBQyxHQUFzQjRDO1lBQ2pEO1FBQ0Y7SUFDRjtJQUNBLE1BQU1RLFVBQVUxRCwwQkFDZCw4QkFBOEI7SUFDOUJzRCxJQUFJSyxVQUFVLENBQUNDLE1BQU0sQ0FDbkIsQ0FBQ1gsUUFDQyxDQUFDaEUsYUFBYTRFLFNBQVMsQ0FBQ1osTUFBTWYsSUFBSSxLQUNsQyxDQUFDakQsYUFBYTZFLFNBQVMsQ0FBQ2IsTUFBTWYsSUFBSSxLQUNsQyxDQUFFZSxDQUFBQSxNQUFNRSxRQUFRLEtBQUssUUFBUUYsTUFBTUcsSUFBSSxDQUFDVyxVQUFVLENBQUMsSUFBRyxJQUUxRHhFO0lBRUYsT0FBT21FO0FBQ1Q7QUFFQTs7Q0FFQyxHQUVEOzs7O0NBSUMsR0FDRCxPQUFPLFNBQVNNLHFCQUFxQjdFLFNBQXVCLEVBQUU4RSxnQkFBMEI7SUFDdEYsSUFDRTtRQUNFO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO0tBQ0QsQ0FBQ3pELFFBQVEsQ0FBQ3JCLFlBQ1g7UUFDQSxPQUFPQTtJQUNULE9BQU8sSUFBSUYsYUFBYWlGLFFBQVEsQ0FBQy9FLFlBQVk7UUFDM0MsT0FBTyxDQUFDLEVBQUUsRUFBRWdGLGlCQUFpQmhGLFVBQVVjLEtBQUssRUFBRWdFLGtCQUFrQixFQUFFLENBQUM7SUFDckUsT0FBTyxJQUFJaEYsYUFBYW1GLGVBQWUsQ0FBQ2pGLFlBQVk7UUFDbEQsT0FBTyxDQUFDLENBQUMsRUFBRUEsVUFBVVcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMvQixPQUFPLElBQUliLGFBQWFvRixnQkFBZ0IsQ0FBQ2xGLFlBQVk7UUFDbkQsT0FBT21GLE9BQU9uRixVQUFVVyxLQUFLO0lBQy9CLE9BQU8sSUFBSWIsYUFBYXNGLE9BQU8sQ0FBQ3BGLFlBQVk7UUFDMUMsT0FBT0EsVUFBVTZDLEtBQUssQ0FBQ25CLEdBQUcsQ0FBQyxDQUFDcUIsT0FBUzhCLHFCQUFxQjlCLE1BQU0rQixtQkFBbUJPLElBQUksQ0FBQztJQUMxRixPQUFPLElBQUl2RixhQUFhd0YsY0FBYyxDQUFDdEYsWUFBWTtRQUNqRCxPQUFPQSxVQUFVNkMsS0FBSyxDQUFDbkIsR0FBRyxDQUFDLENBQUNxQixPQUFTOEIscUJBQXFCOUIsTUFBTStCLG1CQUFtQk8sSUFBSSxDQUFDO0lBQzFGLE9BQU8sSUFBSXZGLGFBQWF5RixPQUFPLENBQUN2RixZQUFZO1FBQzFDLE9BQU8sR0FBRzZFLHFCQUFxQjdFLFVBQVVpQixZQUFZLEVBQUU2RCxrQkFBa0IsRUFBRSxDQUFDO0lBQzlFLE9BQU8sSUFBSWhGLGFBQWEwRixLQUFLLENBQUN4RixZQUFZO1FBQ3hDLElBQUk7WUFBQztZQUFRO1lBQVE7WUFBVztZQUFXO1NBQU8sQ0FBQ3FCLFFBQVEsQ0FBQ3JCLFVBQVVtQixFQUFFLE1BQU0sT0FBTztZQUNuRixpQkFBaUI7WUFDakIyRCxpQkFBaUJXLElBQUksQ0FBQ3pGLFVBQVVtQixFQUFFO1FBQ3BDO1FBQ0EsSUFBSW5CLFVBQVVFLElBQUksS0FBS3dDLGFBQWExQyxVQUFVRSxJQUFJLENBQUNvQixNQUFNLEtBQUssR0FBRztZQUMvRCxPQUFPdEIsVUFBVW1CLEVBQUU7UUFDckIsT0FBTztZQUNMLE9BQU8sR0FBR25CLFVBQVVtQixFQUFFLENBQUMsQ0FBQyxFQUFFbkIsVUFBVUUsSUFBSSxDQUNyQ3dCLEdBQUcsQ0FBQyxDQUFDQyxNQUFRa0QscUJBQXFCbEQsS0FBS21ELG1CQUN2Q08sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCO0lBQ0YsT0FBTyxJQUFJdkYsYUFBYTRGLGVBQWUsQ0FBQzFGLFlBQVk7UUFDbEQsT0FBTyxHQUFHNkUscUJBQ1I3RSxVQUFVNkQsTUFBTSxFQUNoQmlCLGtCQUNBLENBQUMsRUFBRUQscUJBQXFCN0UsVUFBVXFELEtBQUssRUFBRXlCLGtCQUFrQixDQUFDLENBQUM7SUFDakUsT0FBTyxJQUFJaEYsYUFBYTZGLFdBQVcsQ0FBQzNGLFlBQVk7UUFDOUMsT0FBTyxDQUFDLEVBQUUsRUFBRUEsVUFBVTBELFFBQVEsQ0FBQ2hDLEdBQUcsQ0FBQyxDQUFDaUMsT0FBU2tCLHFCQUFxQmxCLE1BQU1tQixtQkFBbUIsRUFBRSxDQUFDO0lBQ2hHLE9BQU8sSUFBSWhGLGFBQWE4RixXQUFXLENBQUM1RixZQUFZO1FBQzlDLE9BQU8sQ0FBQyxDQUFDLEVBQUVBLFVBQVVtQixFQUFFLEdBQ3JCbkIsVUFBVXNFLFVBQVUsR0FDaEIsQ0FBQyxTQUFTLEVBQUVPLHFCQUFxQjdFLFVBQVVzRSxVQUFVLEVBQUVRLG1CQUFtQixHQUMxRSxHQUNMLENBQUMsQ0FBQztJQUNMLE9BQU87UUFDTCxNQUFNLElBQUl2RCxNQUFNLENBQUMsd0JBQXdCLEVBQUV2QixXQUFXO0lBQ3hEO0FBQ0Y7QUFFQTs7O0NBR0MsR0FDRCxPQUFPLFNBQVNnRixpQkFBaUJhLE1BQWtCLEVBQUVmLGdCQUEwQjtJQUM3RSxPQUFPZSxPQUNKbkUsR0FBRyxDQUFDLENBQUNvQztRQUNKLE9BQU8sR0FBR0EsTUFBTUcsSUFBSSxHQUNsQkgsTUFBTUUsUUFBUSxJQUFJLENBQUNGLE1BQU1nQyxVQUFVLEdBQUcsTUFBTSxHQUM3QyxFQUFFLEVBQUVqQixxQkFBcUJmLE1BQU1mLElBQUksRUFBRStCLG9CQUNwQ2hCLE1BQU1nQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLEVBQUVoQyxNQUFNZ0MsVUFBVSxFQUFFLEdBQUcsSUFDN0M7SUFDSixHQUNDVCxJQUFJLENBQUM7QUFDVjtBQUVBOzs7Q0FHQyxHQUNELE9BQU8sU0FBU1UseUJBQXlCRixNQUFrQixFQUFFZixnQkFBMEI7SUFDckYsT0FBTyxDQUFDLEVBQUUsRUFBRWUsT0FDVG5FLEdBQUcsQ0FDRixDQUFDb0MsUUFDQyxHQUFHQSxNQUFNRyxJQUFJLEdBQUdILE1BQU1FLFFBQVEsR0FBRyxNQUFNLEdBQUcsRUFBRSxFQUFFYSxxQkFDNUNmLE1BQU1mLElBQUksRUFDVitCLG9CQUNFaEIsTUFBTWdDLFVBQVUsR0FBRyxDQUFDLEVBQUUsRUFBRWhDLE1BQU1nQyxVQUFVLEVBQUUsR0FBRyxJQUFJLEVBRXhEVCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDbkIifQ==
@@ -0,0 +1,90 @@
1
+ import type { FastifyCorsOptions } from "@fastify/cors";
2
+ import type { FastifyFormbodyOptions } from "@fastify/formbody";
3
+ import type { FastifyMultipartOptions } from "@fastify/multipart";
4
+ import type { DeserializeFunction, SerializeFunction } from "@fastify/passport/dist/Authenticator";
5
+ import type { SecureSessionPluginOptions } from "@fastify/secure-session";
6
+ import type { FastifyStaticOptions } from "@fastify/static";
7
+ import type { FastifyInstance, FastifyReply, FastifyRequest, FastifyServerOptions } from "fastify";
8
+ import type { QsPluginOptions } from "fastify-qs";
9
+ import type { SsePluginOptions } from "fastify-sse-v2/lib/types";
10
+ import type { Knex } from "knex";
11
+ import type { Driver } from "../file-storage/driver";
12
+ import type { SonamuFastifyConfig } from "../types/types";
13
+ export type DatabaseConfig = Omit<Knex.Config, "connection"> & {
14
+ connection?: Knex.PgConnectionConfig;
15
+ };
16
+ export type SonamuConfig = {
17
+ projectName?: string;
18
+ api: {
19
+ dir: string;
20
+ route: {
21
+ prefix: string;
22
+ };
23
+ timezone?: string;
24
+ };
25
+ sync: {
26
+ targets: string[];
27
+ };
28
+ ui?: {
29
+ port: number;
30
+ };
31
+ database: {
32
+ database?: "postgresql";
33
+ name: string;
34
+ defaultOptions: DatabaseConfig;
35
+ environments?: {
36
+ development?: DatabaseConfig;
37
+ development_slave?: DatabaseConfig;
38
+ production?: DatabaseConfig;
39
+ production_slave?: DatabaseConfig;
40
+ remote_fixture?: DatabaseConfig;
41
+ };
42
+ };
43
+ server: SonamuServerOptions;
44
+ };
45
+ export type SonamuServerOptions = {
46
+ fastify?: FastifyServerOptions;
47
+ listen?: {
48
+ port: number;
49
+ host?: string;
50
+ };
51
+ plugins?: {
52
+ cors?: boolean | FastifyCorsOptions;
53
+ formbody?: boolean | FastifyFormbodyOptions;
54
+ multipart?: boolean | FastifyMultipartOptions;
55
+ qs?: boolean | QsPluginOptions;
56
+ sse?: boolean | SsePluginOptions;
57
+ static?: boolean | FastifyStaticOptions;
58
+ session?: boolean | SecureSessionPluginOptions;
59
+ custom?: (server: FastifyInstance) => void;
60
+ };
61
+ auth?: boolean | {
62
+ userSerializer: SerializeFunction<unknown, unknown>;
63
+ userDeserializer: DeserializeFunction<unknown, unknown>;
64
+ };
65
+ apiConfig: SonamuFastifyConfig;
66
+ storage?: Driver;
67
+ lifecycle?: {
68
+ onStart?: (server: FastifyInstance) => Promise<void> | void;
69
+ onShutdown?: (server: FastifyInstance) => Promise<void> | void;
70
+ onError?: (error: Error, request: FastifyRequest, reply: FastifyReply) => Promise<void> | void;
71
+ };
72
+ };
73
+ export type SonamuConfigExport = SonamuConfig | Promise<SonamuConfig>;
74
+ export declare function defineConfig(config: SonamuConfig): SonamuConfig;
75
+ export declare function defineConfig(config: Promise<SonamuConfig>): Promise<SonamuConfig>;
76
+ /**
77
+ * sonamu.config.ts 파일을 로드합니다.
78
+ * 이 설정 파일은 환경에 따라 다른 경로에 있을 수 있습니다.
79
+ * dist를 빌드하는 환경이라면 dist 바로 아래에 있을 것이고(cli-wrapper.ts에서 빌드),
80
+ * 그렇지 않은 환경이라면 프로젝트 루트에 있을 것입니다.
81
+ *
82
+ * 이 함수는 의도적으로 다른 의존성의 사용을 최대한 배제하였습니다.
83
+ * 이는 실행 초기에 최대한 빠르게 설정을 읽어올 수 있도록 하기 위함입니다.
84
+ * 따라서 경로 concat과 URL scheme 추가도 단순한 문자열 조작으로 처리하였습니다.
85
+ *
86
+ * @param rootPath
87
+ * @returns
88
+ */
89
+ export declare function loadConfig(rootPath: string): Promise<SonamuConfig>;
90
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export function defineConfig(config) {
2
+ return config;
3
+ }
4
+ /**
5
+ * sonamu.config.ts 파일을 로드합니다.
6
+ * 이 설정 파일은 환경에 따라 다른 경로에 있을 수 있습니다.
7
+ * dist를 빌드하는 환경이라면 dist 바로 아래에 있을 것이고(cli-wrapper.ts에서 빌드),
8
+ * 그렇지 않은 환경이라면 프로젝트 루트에 있을 것입니다.
9
+ *
10
+ * 이 함수는 의도적으로 다른 의존성의 사용을 최대한 배제하였습니다.
11
+ * 이는 실행 초기에 최대한 빠르게 설정을 읽어올 수 있도록 하기 위함입니다.
12
+ * 따라서 경로 concat과 URL scheme 추가도 단순한 문자열 조작으로 처리하였습니다.
13
+ *
14
+ * @param rootPath
15
+ * @returns
16
+ */ export async function loadConfig(rootPath) {
17
+ const start = performance.now();
18
+ const configPath = process.env.HOT === "yes" || process.env.VITEST === "true" ? `${rootPath}/sonamu.config.ts` : `${rootPath}/dist/sonamu.config.js`;
19
+ const { default: config } = await import(`file://${configPath}`);
20
+ const importTime = performance.now() - start;
21
+ process.env.NODE_ENV !== "test" && console.log(`[TIMING] loadConfig took ${importTime.toFixed(2)}ms`);
22
+ return config;
23
+ }
24
+
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdGlmeUNvcnNPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L2NvcnNcIjtcbmltcG9ydCB0eXBlIHsgRmFzdGlmeUZvcm1ib2R5T3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9mb3JtYm9keVwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5TXVsdGlwYXJ0T3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9tdWx0aXBhcnRcIjtcbmltcG9ydCB0eXBlIHsgRGVzZXJpYWxpemVGdW5jdGlvbiwgU2VyaWFsaXplRnVuY3Rpb24gfSBmcm9tIFwiQGZhc3RpZnkvcGFzc3BvcnQvZGlzdC9BdXRoZW50aWNhdG9yXCI7XG5pbXBvcnQgdHlwZSB7IFNlY3VyZVNlc3Npb25QbHVnaW5PcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L3NlY3VyZS1zZXNzaW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlTdGF0aWNPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L3N0YXRpY1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QsIEZhc3RpZnlTZXJ2ZXJPcHRpb25zIH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB0eXBlIHsgUXNQbHVnaW5PcHRpb25zIH0gZnJvbSBcImZhc3RpZnktcXNcIjtcbmltcG9ydCB0eXBlIHsgU3NlUGx1Z2luT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5LXNzZS12Mi9saWIvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlciB9IGZyb20gXCIuLi9maWxlLXN0b3JhZ2UvZHJpdmVyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VDb25maWcgPSBPbWl0PEtuZXguQ29uZmlnLCBcImNvbm5lY3Rpb25cIj4gJiB7XG4gIGNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdUNvbmZpZyA9IHtcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG5cbiAgYXBpOiB7XG4gICAgZGlyOiBzdHJpbmc7XG4gICAgcm91dGU6IHtcbiAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgIH07XG4gICAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIH07XG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBzdHJpbmdbXTsgLy8gXCJ3ZWJcIiwgXCJhcHBcIiDrk7FcbiAgfTtcbiAgdWk/OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICB9O1xuXG4gIGRhdGFiYXNlOiB7XG4gICAgLy8g642w7J207YSw67Kg7J207IqkXG4gICAgZGF0YWJhc2U/OiBcInBvc3RncmVzcWxcIjtcbiAgICAvLyDquLDrs7gg642w7J207YSw67Kg7J207IqkIOydtOumhFxuICAgIG5hbWU6IHN0cmluZztcbiAgICAvLyDrqqjrk6Ag7ZmY6rK97JeQIOyggeyaqeuQoCDquLDrs7ggS25leCDsmLXshZhcbiAgICBkZWZhdWx0T3B0aW9uczogRGF0YWJhc2VDb25maWc7XG4gICAgLy8g7ZmY6rK967OEIOyEpOyglVxuICAgIGVudmlyb25tZW50cz86IHtcbiAgICAgIGRldmVsb3BtZW50PzogRGF0YWJhc2VDb25maWc7XG4gICAgICBkZXZlbG9wbWVudF9zbGF2ZT86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcHJvZHVjdGlvbj86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcHJvZHVjdGlvbl9zbGF2ZT86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcmVtb3RlX2ZpeHR1cmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICB9O1xuICB9O1xuXG4gIHNlcnZlcjogU29uYW11U2VydmVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVNlcnZlck9wdGlvbnMgPSB7XG4gIGZhc3RpZnk/OiBGYXN0aWZ5U2VydmVyT3B0aW9ucztcblxuICBsaXN0ZW4/OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIGhvc3Q/OiBzdHJpbmc7XG4gIH07XG5cbiAgcGx1Z2lucz86IHtcbiAgICBjb3JzPzogYm9vbGVhbiB8IEZhc3RpZnlDb3JzT3B0aW9ucztcbiAgICBmb3JtYm9keT86IGJvb2xlYW4gfCBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zO1xuICAgIG11bHRpcGFydD86IGJvb2xlYW4gfCBGYXN0aWZ5TXVsdGlwYXJ0T3B0aW9ucztcbiAgICBxcz86IGJvb2xlYW4gfCBRc1BsdWdpbk9wdGlvbnM7XG4gICAgc3NlPzogYm9vbGVhbiB8IFNzZVBsdWdpbk9wdGlvbnM7XG4gICAgc3RhdGljPzogYm9vbGVhbiB8IEZhc3RpZnlTdGF0aWNPcHRpb25zO1xuICAgIHNlc3Npb24/OiBib29sZWFuIHwgU2VjdXJlU2Vzc2lvblBsdWdpbk9wdGlvbnM7XG5cbiAgICBjdXN0b20/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IHZvaWQ7XG4gIH07XG5cbiAgYXV0aD86XG4gICAgfCBib29sZWFuXG4gICAgfCB7XG4gICAgICAgIHVzZXJTZXJpYWxpemVyOiBTZXJpYWxpemVGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPjtcbiAgICAgICAgdXNlckRlc2VyaWFsaXplcjogRGVzZXJpYWxpemVGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPjtcbiAgICAgIH07XG5cbiAgYXBpQ29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnO1xuXG4gIHN0b3JhZ2U/OiBEcml2ZXI7XG5cbiAgbGlmZWN5Y2xlPzoge1xuICAgIG9uU3RhcnQ/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uU2h1dGRvd24/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBTb25hbXVDb25maWdFeHBvcnQgPSBTb25hbXVDb25maWcgfCBQcm9taXNlPFNvbmFtdUNvbmZpZz47XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpOiBTb25hbXVDb25maWc7XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnKGNvbmZpZzogUHJvbWlzZTxTb25hbXVDb25maWc+KTogUHJvbWlzZTxTb25hbXVDb25maWc+O1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZ0V4cG9ydCk6IFNvbmFtdUNvbmZpZ0V4cG9ydCB7XG4gIHJldHVybiBjb25maWc7XG59XG5cbi8qKlxuICogc29uYW11LmNvbmZpZy50cyDtjIzsnbzsnYQg66Gc65Oc7ZWp64uI64ukLlxuICog7J20IOyEpOyglSDtjIzsnbzsnYAg7ZmY6rK97JeQIOuUsOudvCDri6Trpbgg6rK966Gc7JeQIOyeiOydhCDsiJgg7J6I7Iq164uI64ukLlxuICogZGlzdOulvCDruYzrk5ztlZjripQg7ZmY6rK97J20652866m0IGRpc3Qg67CU66GcIOyVhOuemOyXkCDsnojsnYQg6rKD7J206rOgKGNsaS13cmFwcGVyLnRz7JeQ7IScIOu5jOuTnCksXG4gKiDqt7jroIfsp4Ag7JWK7J2AIO2ZmOqyveydtOudvOuptCDtlITroZzsoJ3tirgg66Oo7Yq47JeQIOyeiOydhCDqsoPsnoXri4jri6QuXG4gKlxuICog7J20IO2VqOyImOuKlCDsnZjrj4TsoIHsnLzroZwg64uk66W4IOydmOyhtOyEseydmCDsgqzsmqnsnYQg7LWc64yA7ZWcIOuwsOygnO2VmOyYgOyKteuLiOuLpC5cbiAqIOydtOuKlCDsi6Ttlokg7LSI6riw7JeQIOy1nOuMgO2VnCDruaDrpbTqsowg7ISk7KCV7J2EIOydveyWtOyYrCDsiJgg7J6I64+E66GdIO2VmOq4sCDsnITtlajsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg6rK966GcIGNvbmNhdOqzvCBVUkwgc2NoZW1lIOy2lOqwgOuPhCDri6jsiJztlZwg66y47J6Q7Je0IOyhsOyekeycvOuhnCDsspjrpqztlZjsmIDsirXri4jri6QuXG4gKlxuICogQHBhcmFtIHJvb3RQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhyb290UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb25hbXVDb25maWc+IHtcbiAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgY29uZmlnUGF0aCA9XG4gICAgcHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiIHx8IHByb2Nlc3MuZW52LlZJVEVTVCA9PT0gXCJ0cnVlXCJcbiAgICAgID8gYCR7cm9vdFBhdGh9L3NvbmFtdS5jb25maWcudHNgXG4gICAgICA6IGAke3Jvb3RQYXRofS9kaXN0L3NvbmFtdS5jb25maWcuanNgO1xuICBjb25zdCB7IGRlZmF1bHQ6IGNvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KGBmaWxlOi8vJHtjb25maWdQYXRofWApO1xuICBjb25zdCBpbXBvcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwidGVzdFwiICYmXG4gICAgY29uc29sZS5sb2coYFtUSU1JTkddIGxvYWRDb25maWcgdG9vayAke2ltcG9ydFRpbWUudG9GaXhlZCgyKX1tc2ApO1xuICByZXR1cm4gY29uZmlnO1xufVxuIl0sIm5hbWVzIjpbImRlZmluZUNvbmZpZyIsImNvbmZpZyIsImxvYWRDb25maWciLCJyb290UGF0aCIsInN0YXJ0IiwicGVyZm9ybWFuY2UiLCJub3ciLCJjb25maWdQYXRoIiwicHJvY2VzcyIsImVudiIsIkhPVCIsIlZJVEVTVCIsImRlZmF1bHQiLCJpbXBvcnRUaW1lIiwiTk9ERV9FTlYiLCJjb25zb2xlIiwibG9nIiwidG9GaXhlZCJdLCJtYXBwaW5ncyI6IkFBZ0dBLE9BQU8sU0FBU0EsYUFBYUMsTUFBMEI7SUFDckQsT0FBT0E7QUFDVDtBQUVBOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUNELE9BQU8sZUFBZUMsV0FBV0MsUUFBZ0I7SUFDL0MsTUFBTUMsUUFBUUMsWUFBWUMsR0FBRztJQUM3QixNQUFNQyxhQUNKQyxRQUFRQyxHQUFHLENBQUNDLEdBQUcsS0FBSyxTQUFTRixRQUFRQyxHQUFHLENBQUNFLE1BQU0sS0FBSyxTQUNoRCxHQUFHUixTQUFTLGlCQUFpQixDQUFDLEdBQzlCLEdBQUdBLFNBQVMsc0JBQXNCLENBQUM7SUFDekMsTUFBTSxFQUFFUyxTQUFTWCxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRU0sWUFBWTtJQUMvRCxNQUFNTSxhQUFhUixZQUFZQyxHQUFHLEtBQUtGO0lBQ3ZDSSxRQUFRQyxHQUFHLENBQUNLLFFBQVEsS0FBSyxVQUN2QkMsUUFBUUMsR0FBRyxDQUFDLENBQUMseUJBQXlCLEVBQUVILFdBQVdJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuRSxPQUFPaEI7QUFDVCJ9
@@ -1,8 +1,9 @@
1
1
  import type { FastifyReply, FastifyRequest, PassportUser } from "fastify";
2
2
  import type { RouteGenericInterface } from "fastify/types/route";
3
- import type { Server, IncomingMessage, ServerResponse, IncomingHttpHeaders } from "http";
4
- import type { FileStorage } from "../file-storage/file-storage";
3
+ import type { IncomingHttpHeaders, IncomingMessage, Server, ServerResponse } from "http";
5
4
  import type { ZodObject } from "zod";
5
+ import type { FileStorage } from "../file-storage/file-storage";
6
+ import type { NaiteStore } from "../naite/naite";
6
7
  import type { createSSEFactory } from "../stream/sse";
7
8
  export interface ContextExtend {
8
9
  }
@@ -11,6 +12,7 @@ export type Context = {
11
12
  reply: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>;
12
13
  headers: IncomingHttpHeaders;
13
14
  createSSE: <T extends ZodObject>(events: T) => ReturnType<typeof createSSEFactory<T>>;
15
+ naiteStore: NaiteStore;
14
16
  } & AuthContext & ContextExtend;
15
17
  export type AuthContext = {
16
18
  user: PassportUser | null;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,cAAc,EACd,mBAAmB,EACpB,MAAM,MAAM,CAAC;AACd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,aAAa;CAAG;AACjC,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,YAAY,CACjB,MAAM,EACN,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,OAAO,CACR,CAAC;IACF,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EAC7B,MAAM,EAAE,CAAC,KACN,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7C,GAAG,WAAW,GACb,aAAa,CAAC;AAEhB,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,MAAM,WAAW,aAAa;CAAG;AACjC,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC7F,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,UAAU,EAAE,UAAU,CAAC;CACxB,GAAG,WAAW,GACb,aAAa,CAAC;AAEhB,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC"}
@@ -1,2 +1,3 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});
2
- //# sourceMappingURL=context.js.map
1
+ export { };
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29udGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QsIFBhc3Nwb3J0VXNlciB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRlR2VuZXJpY0ludGVyZmFjZSB9IGZyb20gXCJmYXN0aWZ5L3R5cGVzL3JvdXRlXCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nSHR0cEhlYWRlcnMsIEluY29taW5nTWVzc2FnZSwgU2VydmVyLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgdHlwZSB7IFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN0b3JhZ2UgfSBmcm9tIFwiLi4vZmlsZS1zdG9yYWdlL2ZpbGUtc3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUgeyBOYWl0ZVN0b3JlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgdHlwZSB7IGNyZWF0ZVNTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRW1wdHlJbnRlcmZhY2U6IENvbnRleHQg7ZmV7J6lIO2DgOyehVxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0RXh0ZW5kIHt9XG5leHBvcnQgdHlwZSBDb250ZXh0ID0ge1xuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdDtcbiAgcmVwbHk6IEZhc3RpZnlSZXBseTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UsIFJvdXRlR2VuZXJpY0ludGVyZmFjZSwgdW5rbm93bj47XG4gIGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnM7XG4gIGNyZWF0ZVNTRTogPFQgZXh0ZW5kcyBab2RPYmplY3Q+KGV2ZW50czogVCkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU1NFRmFjdG9yeTxUPj47XG4gIG5haXRlU3RvcmU6IE5haXRlU3RvcmU7XG59ICYgQXV0aENvbnRleHQgJlxuICBDb250ZXh0RXh0ZW5kO1xuXG5leHBvcnQgdHlwZSBBdXRoQ29udGV4dCA9IHtcbiAgdXNlcjogUGFzc3BvcnRVc2VyIHwgbnVsbDtcbiAgcGFzc3BvcnQ6IHtcbiAgICBsb2dpbjogKHVzZXI6IFBhc3Nwb3J0VXNlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBsb2dvdXQ6ICgpID0+IHZvaWQ7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBVcGxvYWRDb250ZXh0ID0ge1xuICBmaWxlPzogRmlsZVN0b3JhZ2U7XG4gIGZpbGVzOiBGaWxlU3RvcmFnZVtdO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyQkEsV0FHRSJ9
@@ -1,7 +1,7 @@
1
1
  import type { HTTPMethods } from "fastify";
2
+ import type { z } from "zod";
3
+ import { type TransactionalOptions } from "../database/puri-wrapper";
2
4
  import type { ApiParam, ApiParamType } from "../types/types";
3
- import { z } from "zod";
4
- import { TransactionalOptions } from "../database/puri-wrapper";
5
5
  export interface GuardKeys {
6
6
  query: true;
7
7
  admin: true;
@@ -31,6 +31,9 @@ export type UploadDecoratorOptions = {
31
31
  mode?: "single" | "multiple";
32
32
  };
33
33
  export declare const registeredApis: {
34
+ /**
35
+ * modelName은 모델 클래스 이름입니다. (ex. "UserModel")
36
+ */
34
37
  modelName: string;
35
38
  methodName: string;
36
39
  path: string;
@@ -49,8 +52,19 @@ export type ExtendedApi = {
49
52
  parameters: ApiParam[];
50
53
  returnType: ApiParamType;
51
54
  };
52
- export declare function api(options?: ApiDecoratorOptions): (target: Object, propertyKey: string) => void;
53
- export declare function stream(options: StreamDecoratorOptions): (target: Object, propertyKey: string) => void;
54
- export declare function transactional(options?: TransactionalOptions): (_target: Object, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
55
- export declare function upload(options?: UploadDecoratorOptions): (_target: Object, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
55
+ type DecoratorTarget = {
56
+ constructor: {
57
+ name: string;
58
+ };
59
+ };
60
+ export declare function api(options?: ApiDecoratorOptions): (target: DecoratorTarget, propertyKey: string) => void;
61
+ export declare function stream(options: StreamDecoratorOptions): (target: DecoratorTarget, propertyKey: string) => void;
62
+ export declare function transactional(options?: TransactionalOptions): (_target: DecoratorTarget, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
63
+ /**
64
+ * api 데코레이터와 함께 사용할 수 있습니다.
65
+ * @param options
66
+ * @returns
67
+ */
68
+ export declare function upload(options?: UploadDecoratorOptions): (_target: DecoratorTarget, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
69
+ export {};
56
70
  //# sourceMappingURL=decorators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;CACZ;AACD,MAAM,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;AACvC,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,iBAAiB,GACjB,KAAK,GACL,cAAc,CAAC;AACnB,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,WAAW,CAAC,EACR,YAAY,GACZ,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,0BAA0B,CAAC;IAC/B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC9B,CAAC;AACF,eAAO,MAAM,cAAc,EAAE;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC,EAAO,CAAC;AACT,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,cAAc,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;IACzC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;CAC1B,CAAC;AAEF,wBAAgB,GAAG,CAAC,OAAO,GAAE,mBAAwB,IAQlC,QAAQ,MAAM,EAAE,aAAa,MAAM,UAwBrD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,sBAAsB,IACnC,QAAQ,MAAM,EAAE,aAAa,MAAM,UA2BrD;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,IAI5D,SAAS,MAAM,EACf,cAAc,MAAM,EACpB,YAAY,kBAAkB,wBAkDjC;AAED,wBAAgB,MAAM,CAAC,OAAO,GAAE,sBAA2B,IAEvD,SAAS,MAAM,EACf,cAAc,MAAM,EACpB,YAAY,kBAAkB,wBAgDjC"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"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"}