sonamu 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/dist/api/base-frame.js +12 -2
  2. package/dist/api/caster.js +66 -2
  3. package/dist/api/code-converters.js +489 -2
  4. package/dist/api/config.d.ts +76 -0
  5. package/dist/api/config.d.ts.map +1 -0
  6. package/dist/api/config.js +32 -0
  7. package/dist/api/context.d.ts +1 -0
  8. package/dist/api/context.d.ts.map +1 -1
  9. package/dist/api/context.js +3 -2
  10. package/dist/api/decorators.d.ts +1 -0
  11. package/dist/api/decorators.d.ts.map +1 -1
  12. package/dist/api/decorators.js +142 -2
  13. package/dist/api/index.js +9 -2
  14. package/dist/api/sonamu.d.ts +8 -22
  15. package/dist/api/sonamu.d.ts.map +1 -1
  16. package/dist/api/sonamu.js +482 -2
  17. package/dist/bin/build-config.d.ts +2 -1
  18. package/dist/bin/build-config.d.ts.map +1 -1
  19. package/dist/bin/build-config.js +12 -2
  20. package/dist/bin/cli-wrapper.js +71 -2
  21. package/dist/bin/cli.js +418 -2
  22. package/dist/bin/hot-hook-register.d.ts +11 -0
  23. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  24. package/dist/bin/hot-hook-register.js +21 -0
  25. package/dist/database/_batch_update.js +78 -2
  26. package/dist/database/base-model.js +247 -2
  27. package/dist/database/code-generator.js +53 -2
  28. package/dist/database/db.d.ts +5 -16
  29. package/dist/database/db.d.ts.map +1 -1
  30. package/dist/database/db.js +132 -2
  31. package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
  32. package/dist/database/puri-wrapper.d.ts +22 -10
  33. package/dist/database/puri-wrapper.d.ts.map +1 -1
  34. package/dist/database/puri-wrapper.js +109 -2
  35. package/dist/database/puri.d.ts +105 -73
  36. package/dist/database/puri.d.ts.map +1 -1
  37. package/dist/database/puri.js +539 -2
  38. package/dist/database/puri.types.d.ts +33 -42
  39. package/dist/database/puri.types.d.ts.map +1 -1
  40. package/dist/database/puri.types.js +3 -2
  41. package/dist/database/transaction-context.d.ts +3 -3
  42. package/dist/database/transaction-context.d.ts.map +1 -1
  43. package/dist/database/transaction-context.js +14 -2
  44. package/dist/database/upsert-builder.js +215 -2
  45. package/dist/entity/entity-manager.d.ts +3 -1
  46. package/dist/entity/entity-manager.d.ts.map +1 -1
  47. package/dist/entity/entity-manager.js +114 -2
  48. package/dist/entity/entity-utils.js +210 -2
  49. package/dist/entity/entity.d.ts.map +1 -1
  50. package/dist/entity/entity.js +651 -2
  51. package/dist/exceptions/error-handler.js +29 -2
  52. package/dist/exceptions/so-exceptions.js +85 -2
  53. package/dist/file-storage/driver.js +79 -2
  54. package/dist/file-storage/file-storage.js +75 -2
  55. package/dist/index.d.ts +2 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +28 -2
  58. package/dist/migration/code-generation.js +558 -2
  59. package/dist/migration/migration-set.js +364 -2
  60. package/dist/migration/migrator.d.ts +0 -9
  61. package/dist/migration/migrator.d.ts.map +1 -1
  62. package/dist/migration/migrator.js +510 -2
  63. package/dist/migration/types.js +3 -2
  64. package/dist/naite/naite.d.ts +12 -0
  65. package/dist/naite/naite.d.ts.map +1 -0
  66. package/dist/naite/naite.js +72 -0
  67. package/dist/stream/index.js +3 -2
  68. package/dist/stream/sse.js +38 -2
  69. package/dist/syncer/api-parser.d.ts +20 -0
  70. package/dist/syncer/api-parser.d.ts.map +1 -0
  71. package/dist/syncer/api-parser.js +229 -0
  72. package/dist/syncer/checksum.d.ts +21 -0
  73. package/dist/syncer/checksum.d.ts.map +1 -0
  74. package/dist/syncer/checksum.js +98 -0
  75. package/dist/syncer/code-generator.d.ts +20 -0
  76. package/dist/syncer/code-generator.d.ts.map +1 -0
  77. package/dist/syncer/code-generator.js +141 -0
  78. package/dist/syncer/entity-operations.d.ts +17 -0
  79. package/dist/syncer/entity-operations.d.ts.map +1 -0
  80. package/dist/syncer/entity-operations.js +58 -0
  81. package/dist/syncer/file-patterns.d.ts +29 -0
  82. package/dist/syncer/file-patterns.d.ts.map +1 -0
  83. package/dist/syncer/file-patterns.js +38 -0
  84. package/dist/syncer/index.d.ts +6 -0
  85. package/dist/syncer/index.d.ts.map +1 -1
  86. package/dist/syncer/index.js +9 -2
  87. package/dist/syncer/module-loader.d.ts +35 -0
  88. package/dist/syncer/module-loader.d.ts.map +1 -0
  89. package/dist/syncer/module-loader.js +82 -0
  90. package/dist/syncer/syncer.d.ts +93 -108
  91. package/dist/syncer/syncer.d.ts.map +1 -1
  92. package/dist/syncer/syncer.js +375 -2
  93. package/dist/template/entity-converter.d.ts +14 -0
  94. package/dist/template/entity-converter.d.ts.map +1 -0
  95. package/dist/template/entity-converter.js +101 -0
  96. package/dist/template/helpers.d.ts +23 -0
  97. package/dist/template/helpers.d.ts.map +1 -0
  98. package/dist/template/helpers.js +64 -0
  99. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  100. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  101. package/dist/template/implementations/entity.template.js +87 -0
  102. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
  103. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  104. package/dist/template/implementations/generated.template.js +232 -0
  105. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
  106. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  107. package/dist/template/implementations/generated_http.template.js +131 -0
  108. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
  109. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  110. package/dist/template/implementations/generated_sso.template.js +105 -0
  111. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  112. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  113. package/dist/template/implementations/init_types.template.js +38 -0
  114. package/dist/template/implementations/model.template.d.ts +17 -0
  115. package/dist/template/implementations/model.template.d.ts.map +1 -0
  116. package/dist/template/implementations/model.template.js +171 -0
  117. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  118. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  119. package/dist/template/implementations/model_test.template.js +35 -0
  120. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  121. package/dist/template/implementations/service.template.d.ts.map +1 -0
  122. package/dist/template/implementations/service.template.js +193 -0
  123. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  124. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  125. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  126. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  127. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  128. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  129. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  130. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  131. package/dist/template/implementations/view_enums_select.template.js +55 -0
  132. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  133. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  134. package/dist/template/implementations/view_form.template.js +337 -0
  135. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  136. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  137. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  138. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  139. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  140. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  141. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  142. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  143. package/dist/template/implementations/view_list.template.js +465 -0
  144. package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
  145. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  146. package/dist/template/implementations/view_list_columns.template.js +49 -0
  147. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  148. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  149. package/dist/template/implementations/view_search_input.template.js +64 -0
  150. package/dist/template/index.d.ts +5 -0
  151. package/dist/template/index.d.ts.map +1 -0
  152. package/dist/template/index.js +6 -0
  153. package/dist/template/template.d.ts +39 -0
  154. package/dist/template/template.d.ts.map +1 -0
  155. package/dist/template/template.js +47 -0
  156. package/dist/template/zod-converter.d.ts +18 -0
  157. package/dist/template/zod-converter.d.ts.map +1 -0
  158. package/dist/template/zod-converter.js +166 -0
  159. package/dist/testing/_relation-graph.js +80 -2
  160. package/dist/testing/fixture-manager.d.ts.map +1 -1
  161. package/dist/testing/fixture-manager.js +521 -2
  162. package/dist/types/types.d.ts +39 -40
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +289 -2
  165. package/dist/typings/knex.d.js +3 -2
  166. package/dist/utils/async-utils.d.ts +7 -0
  167. package/dist/utils/async-utils.d.ts.map +1 -1
  168. package/dist/utils/async-utils.js +57 -2
  169. package/dist/utils/console-util.d.ts +2 -0
  170. package/dist/utils/console-util.d.ts.map +1 -0
  171. package/dist/utils/console-util.js +6 -0
  172. package/dist/utils/controller.js +26 -2
  173. package/dist/utils/esm-utils.d.ts +45 -0
  174. package/dist/utils/esm-utils.d.ts.map +1 -0
  175. package/dist/utils/esm-utils.js +56 -0
  176. package/dist/utils/fs-utils.js +17 -2
  177. package/dist/utils/lodash-able.js +6 -2
  178. package/dist/utils/model.js +22 -2
  179. package/dist/utils/path-utils.d.ts +89 -0
  180. package/dist/utils/path-utils.d.ts.map +1 -0
  181. package/dist/utils/path-utils.js +60 -0
  182. package/dist/utils/process-utils.d.ts +13 -0
  183. package/dist/utils/process-utils.d.ts.map +1 -0
  184. package/dist/utils/process-utils.js +36 -0
  185. package/dist/utils/sql-parser.js +35 -2
  186. package/dist/utils/utils.d.ts +4 -7
  187. package/dist/utils/utils.d.ts.map +1 -1
  188. package/dist/utils/utils.js +33 -2
  189. package/dist/utils/zod-error.d.ts.map +1 -1
  190. package/dist/utils/zod-error.js +19 -2
  191. package/package.json +21 -9
  192. package/src/api/code-converters.ts +2 -2
  193. package/src/api/config.ts +142 -0
  194. package/src/api/context.ts +1 -0
  195. package/src/api/decorators.ts +15 -5
  196. package/src/api/sonamu.ts +102 -87
  197. package/src/bin/build-config.ts +2 -1
  198. package/src/bin/cli-wrapper.ts +10 -3
  199. package/src/bin/cli.ts +108 -56
  200. package/src/bin/hot-hook-register.ts +22 -0
  201. package/src/database/base-model.ts +1 -1
  202. package/src/database/code-generator.ts +1 -1
  203. package/src/database/db.ts +53 -60
  204. package/src/database/puri-wrapper.ts +104 -26
  205. package/src/database/puri.ts +477 -580
  206. package/src/database/puri.types.ts +111 -201
  207. package/src/database/transaction-context.ts +4 -4
  208. package/src/database/upsert-builder.ts +1 -1
  209. package/src/entity/entity-manager.ts +19 -15
  210. package/src/entity/entity.ts +4 -3
  211. package/src/index.ts +2 -0
  212. package/src/migration/code-generation.ts +1 -1
  213. package/src/migration/migration-set.ts +1 -1
  214. package/src/migration/migrator.ts +23 -152
  215. package/src/naite/naite.ts +70 -0
  216. package/src/syncer/api-parser.ts +299 -0
  217. package/src/syncer/checksum.ts +152 -0
  218. package/src/syncer/code-generator.ts +202 -0
  219. package/src/syncer/entity-operations.ts +68 -0
  220. package/src/syncer/file-patterns.ts +56 -0
  221. package/src/syncer/index.ts +6 -0
  222. package/src/syncer/module-loader.ts +125 -0
  223. package/src/syncer/syncer.ts +363 -1420
  224. package/src/template/entity-converter.ts +123 -0
  225. package/src/template/helpers.ts +84 -0
  226. package/src/{templates → template/implementations}/entity.template.ts +4 -4
  227. package/src/{templates → template/implementations}/generated.template.ts +9 -9
  228. package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
  229. package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
  230. package/src/{templates → template/implementations}/init_types.template.ts +4 -4
  231. package/src/{templates → template/implementations}/model.template.ts +9 -9
  232. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  233. package/src/{templates → template/implementations}/service.template.ts +29 -12
  234. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  235. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
  236. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  237. package/src/{templates → template/implementations}/view_form.template.ts +11 -13
  238. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  239. package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
  240. package/src/{templates → template/implementations}/view_list.template.ts +13 -64
  241. package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
  242. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  243. package/src/template/index.ts +4 -0
  244. package/src/template/template.ts +86 -0
  245. package/src/template/zod-converter.ts +219 -0
  246. package/src/testing/fixture-manager.ts +8 -1
  247. package/src/types/types.ts +39 -62
  248. package/src/utils/async-utils.ts +17 -0
  249. package/src/utils/console-util.ts +4 -0
  250. package/src/utils/esm-utils.ts +69 -0
  251. package/src/utils/path-utils.ts +102 -0
  252. package/src/utils/process-utils.ts +46 -0
  253. package/src/utils/sql-parser.ts +1 -1
  254. package/src/utils/utils.ts +14 -40
  255. package/src/utils/zod-error.ts +0 -1
  256. package/dist/api/base-frame.js.map +0 -1
  257. package/dist/api/caster.js.map +0 -1
  258. package/dist/api/code-converters.js.map +0 -1
  259. package/dist/api/context.js.map +0 -1
  260. package/dist/api/decorators.js.map +0 -1
  261. package/dist/api/index.js.map +0 -1
  262. package/dist/api/sonamu.js.map +0 -1
  263. package/dist/bin/build-config.js.map +0 -1
  264. package/dist/bin/cli-wrapper.js.map +0 -1
  265. package/dist/bin/cli.js.map +0 -1
  266. package/dist/database/_batch_update.js.map +0 -1
  267. package/dist/database/base-model.js.map +0 -1
  268. package/dist/database/code-generator.js.map +0 -1
  269. package/dist/database/db.js.map +0 -1
  270. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  271. package/dist/database/puri-wrapper.js.map +0 -1
  272. package/dist/database/puri.js.map +0 -1
  273. package/dist/database/puri.types.js.map +0 -1
  274. package/dist/database/transaction-context.js.map +0 -1
  275. package/dist/database/upsert-builder.js.map +0 -1
  276. package/dist/entity/entity-manager.js.map +0 -1
  277. package/dist/entity/entity-utils.js.map +0 -1
  278. package/dist/entity/entity.js.map +0 -1
  279. package/dist/exceptions/error-handler.js.map +0 -1
  280. package/dist/exceptions/so-exceptions.js.map +0 -1
  281. package/dist/file-storage/driver.js.map +0 -1
  282. package/dist/file-storage/file-storage.js.map +0 -1
  283. package/dist/index.js.map +0 -1
  284. package/dist/migration/code-generation.js.map +0 -1
  285. package/dist/migration/migration-set.js.map +0 -1
  286. package/dist/migration/migrator.js.map +0 -1
  287. package/dist/migration/types.js.map +0 -1
  288. package/dist/stream/index.js.map +0 -1
  289. package/dist/stream/sse.js.map +0 -1
  290. package/dist/syncer/index.js.map +0 -1
  291. package/dist/syncer/syncer.js.map +0 -1
  292. package/dist/templates/base-template.d.ts +0 -13
  293. package/dist/templates/base-template.d.ts.map +0 -1
  294. package/dist/templates/base-template.js +0 -2
  295. package/dist/templates/base-template.js.map +0 -1
  296. package/dist/templates/entity.template.d.ts.map +0 -1
  297. package/dist/templates/entity.template.js +0 -2
  298. package/dist/templates/entity.template.js.map +0 -1
  299. package/dist/templates/generated.template.d.ts.map +0 -1
  300. package/dist/templates/generated.template.js +0 -2
  301. package/dist/templates/generated.template.js.map +0 -1
  302. package/dist/templates/generated_http.template.d.ts.map +0 -1
  303. package/dist/templates/generated_http.template.js +0 -2
  304. package/dist/templates/generated_http.template.js.map +0 -1
  305. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  306. package/dist/templates/generated_sso.template.js +0 -2
  307. package/dist/templates/generated_sso.template.js.map +0 -1
  308. package/dist/templates/index.d.ts +0 -2
  309. package/dist/templates/index.d.ts.map +0 -1
  310. package/dist/templates/index.js +0 -2
  311. package/dist/templates/index.js.map +0 -1
  312. package/dist/templates/init_types.template.d.ts.map +0 -1
  313. package/dist/templates/init_types.template.js +0 -2
  314. package/dist/templates/init_types.template.js.map +0 -1
  315. package/dist/templates/model.template.d.ts +0 -17
  316. package/dist/templates/model.template.d.ts.map +0 -1
  317. package/dist/templates/model.template.js +0 -2
  318. package/dist/templates/model.template.js.map +0 -1
  319. package/dist/templates/model_test.template.d.ts.map +0 -1
  320. package/dist/templates/model_test.template.js +0 -2
  321. package/dist/templates/model_test.template.js.map +0 -1
  322. package/dist/templates/service.template.d.ts.map +0 -1
  323. package/dist/templates/service.template.js +0 -2
  324. package/dist/templates/service.template.js.map +0 -1
  325. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  326. package/dist/templates/view_enums_buttonset.template.js +0 -2
  327. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  328. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  329. package/dist/templates/view_enums_dropdown.template.js +0 -2
  330. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  331. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  332. package/dist/templates/view_enums_select.template.js +0 -2
  333. package/dist/templates/view_enums_select.template.js.map +0 -1
  334. package/dist/templates/view_form.template.d.ts.map +0 -1
  335. package/dist/templates/view_form.template.js +0 -2
  336. package/dist/templates/view_form.template.js.map +0 -1
  337. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  338. package/dist/templates/view_id_all_select.template.js +0 -2
  339. package/dist/templates/view_id_all_select.template.js.map +0 -1
  340. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  341. package/dist/templates/view_id_async_select.template.js +0 -2
  342. package/dist/templates/view_id_async_select.template.js.map +0 -1
  343. package/dist/templates/view_list.template.d.ts.map +0 -1
  344. package/dist/templates/view_list.template.js +0 -2
  345. package/dist/templates/view_list.template.js.map +0 -1
  346. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  347. package/dist/templates/view_list_columns.template.js +0 -2
  348. package/dist/templates/view_list_columns.template.js.map +0 -1
  349. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  350. package/dist/templates/view_search_input.template.js +0 -2
  351. package/dist/templates/view_search_input.template.js.map +0 -1
  352. package/dist/testing/_relation-graph.js.map +0 -1
  353. package/dist/testing/fixture-manager.js.map +0 -1
  354. package/dist/types/types.js.map +0 -1
  355. package/dist/typings/knex.d.js.map +0 -1
  356. package/dist/utils/async-utils.js.map +0 -1
  357. package/dist/utils/controller.js.map +0 -1
  358. package/dist/utils/fs-utils.js.map +0 -1
  359. package/dist/utils/lodash-able.js.map +0 -1
  360. package/dist/utils/model.js.map +0 -1
  361. package/dist/utils/sql-parser.js.map +0 -1
  362. package/dist/utils/utils.js.map +0 -1
  363. package/dist/utils/zod-error.js.map +0 -1
  364. package/src/templates/base-template.ts +0 -19
  365. package/src/templates/index.ts +0 -1
@@ -0,0 +1,101 @@
1
+ import z from "zod";
2
+ import { EntityManager } from "../entity/entity-manager.js";
3
+ import { ServiceUnavailableException } from "../exceptions/so-exceptions.js";
4
+ import { zodTypeToRenderingNode, propToZodType } from "./zod-converter.js";
5
+ /**
6
+ * 엔티티의 특정 subset을 RenderingNode로 변환합니다.
7
+ * subset의 필드들을 Zod 타입으로 변환한 후 UI 렌더링용 노드로 만듭니다.
8
+ * object와 array의 경우 적절한 pick 필드를 자동으로 선택합니다.
9
+ */ export async function getColumnsNode(entityId, subsetKey) {
10
+ const entity = EntityManager.get(entityId);
11
+ const subset = entity.subsets[subsetKey];
12
+ if (subset === undefined) {
13
+ throw new ServiceUnavailableException(`Subset ${subsetKey} 가 없습니다.`);
14
+ }
15
+ const propNodes = entity.fieldExprsToPropNodes(subset);
16
+ const rootPropNode = {
17
+ nodeType: "object",
18
+ children: propNodes
19
+ };
20
+ const columnsZodType = await propNodeToZodType(rootPropNode);
21
+ const columnsNode = zodTypeToRenderingNode(columnsZodType);
22
+ columnsNode.children = columnsNode.children.map((child)=>{
23
+ if (child.renderType === "object") {
24
+ const pickedCol = child.children.find((cc)=>[
25
+ "title",
26
+ "name"
27
+ ].includes(cc.name));
28
+ if (pickedCol) {
29
+ return {
30
+ ...child,
31
+ renderType: "object-pick",
32
+ config: {
33
+ picked: pickedCol.name
34
+ }
35
+ };
36
+ } else {
37
+ return child;
38
+ }
39
+ } else if (child.renderType === "array" && child.element && child.element.renderType === "object") {
40
+ const pickedCol = child.element.children.find((cc)=>[
41
+ "title",
42
+ "name"
43
+ ].includes(cc.name));
44
+ if (pickedCol) {
45
+ return {
46
+ ...child,
47
+ element: {
48
+ ...child.element,
49
+ renderType: "object-pick",
50
+ config: {
51
+ picked: pickedCol.name
52
+ }
53
+ }
54
+ };
55
+ } else {
56
+ return child;
57
+ }
58
+ }
59
+ return child;
60
+ });
61
+ return columnsNode;
62
+ }
63
+ /**
64
+ * EntityPropNode를 Zod 타입으로 변환합니다.
65
+ * plain, array, object 세 가지 nodeType을 재귀적으로 처리합니다.
66
+ */ export async function propNodeToZodType(propNode) {
67
+ if (propNode.nodeType === "plain") {
68
+ return propToZodType(propNode.prop);
69
+ } else if (propNode.nodeType === "array") {
70
+ if (propNode.prop === undefined) {
71
+ throw new Error();
72
+ } else if (propNode.children.length > 0) {
73
+ return (await propNodeToZodType({
74
+ ...propNode,
75
+ nodeType: "object"
76
+ })).array();
77
+ } else {
78
+ const innerType = await propToZodType(propNode.prop);
79
+ if (propNode.prop.nullable === true) {
80
+ return z.array(innerType).nullable();
81
+ } else {
82
+ return z.array(innerType);
83
+ }
84
+ }
85
+ } else if (propNode.nodeType === "object") {
86
+ const obj = await propNode.children.reduce(async (promise, childPropNode)=>{
87
+ const result = await promise;
88
+ result[childPropNode.prop.name] = await propNodeToZodType(childPropNode);
89
+ return result;
90
+ }, {});
91
+ if (propNode.prop?.nullable === true) {
92
+ return z.object(obj).nullable();
93
+ } else {
94
+ return z.object(obj);
95
+ }
96
+ } else {
97
+ throw Error;
98
+ }
99
+ }
100
+
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS9lbnRpdHktY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB6IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBFbnRpdHlQcm9wTm9kZSwgUmVuZGVyaW5nTm9kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSwgcHJvcFRvWm9kVHlwZSB9IGZyb20gXCIuL3pvZC1jb252ZXJ0ZXJcIjtcblxuLyoqXG4gKiDsl5Tti7Dti7DsnZgg7Yq57KCVIHN1YnNldOydhCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHN1YnNldOydmCDtlYTrk5zrk6TsnYQgWm9kIO2DgOyeheycvOuhnCDrs4DtmZjtlZwg7ZuEIFVJIOugjOuNlOungeyaqSDrhbjrk5zroZwg66eM65Ot64uI64ukLlxuICogb2JqZWN07JmAIGFycmF57J2YIOqyveyasCDsoIHsoIjtlZwgcGljayDtlYTrk5zrpbwg7J6Q64+Z7Jy866GcIOyEoO2Dne2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbHVtbnNOb2RlKFxuICBlbnRpdHlJZDogc3RyaW5nLFxuICBzdWJzZXRLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxSZW5kZXJpbmdOb2RlPiB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgY29uc3Qgc3Vic2V0ID0gZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgaWYgKHN1YnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihgU3Vic2V0ICR7c3Vic2V0S2V5fSDqsIAg7JeG7Iq164uI64ukLmApO1xuICB9XG4gIGNvbnN0IHByb3BOb2RlcyA9IGVudGl0eS5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoc3Vic2V0KTtcbiAgY29uc3Qgcm9vdFByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSA9IHtcbiAgICBub2RlVHlwZTogXCJvYmplY3RcIixcbiAgICBjaGlsZHJlbjogcHJvcE5vZGVzLFxuICB9O1xuXG4gIGNvbnN0IGNvbHVtbnNab2RUeXBlID0gKGF3YWl0IHByb3BOb2RlVG9ab2RUeXBlKFxuICAgIHJvb3RQcm9wTm9kZVxuICApKSBhcyB6LlpvZE9iamVjdDxhbnk+O1xuXG4gIGNvbnN0IGNvbHVtbnNOb2RlID0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShjb2x1bW5zWm9kVHlwZSk7XG4gIGNvbHVtbnNOb2RlLmNoaWxkcmVuID0gY29sdW1uc05vZGUuY2hpbGRyZW4hLm1hcCgoY2hpbGQpID0+IHtcbiAgICBpZiAoY2hpbGQucmVuZGVyVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgcGlja2VkQ29sID0gY2hpbGQuY2hpbGRyZW4hLmZpbmQoKGNjKSA9PlxuICAgICAgICBbXCJ0aXRsZVwiLCBcIm5hbWVcIl0uaW5jbHVkZXMoY2MubmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAocGlja2VkQ29sKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2hpbGQsXG4gICAgICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3QtcGlja1wiLFxuICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgcGlja2VkOiBwaWNrZWRDb2wubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjaGlsZC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiZcbiAgICAgIGNoaWxkLmVsZW1lbnQgJiZcbiAgICAgIGNoaWxkLmVsZW1lbnQucmVuZGVyVHlwZSA9PT0gXCJvYmplY3RcIlxuICAgICkge1xuICAgICAgY29uc3QgcGlja2VkQ29sID0gY2hpbGQuZWxlbWVudCEuY2hpbGRyZW4hLmZpbmQoKGNjKSA9PlxuICAgICAgICBbXCJ0aXRsZVwiLCBcIm5hbWVcIl0uaW5jbHVkZXMoY2MubmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAocGlja2VkQ29sKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2hpbGQsXG4gICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgLi4uY2hpbGQuZWxlbWVudCxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0LXBpY2tcIixcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICBwaWNrZWQ6IHBpY2tlZENvbC5uYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pO1xuXG4gIHJldHVybiBjb2x1bW5zTm9kZTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9wTm9kZeulvCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHBsYWluLCBhcnJheSwgb2JqZWN0IOyEuCDqsIDsp4Agbm9kZVR5cGXsnYQg7J6s6reA7KCB7Jy866GcIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlKFxuICBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGVcbik6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJwbGFpblwiKSB7XG4gICAgcmV0dXJuIHByb3BUb1pvZFR5cGUocHJvcE5vZGUucHJvcCk7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIGlmIChwcm9wTm9kZS5wcm9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gZWxzZSBpZiAocHJvcE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgYXdhaXQgcHJvcE5vZGVUb1pvZFR5cGUoe1xuICAgICAgICAgIC4uLnByb3BOb2RlLFxuICAgICAgICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgICB9KVxuICAgICAgKS5hcnJheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSBhd2FpdCBwcm9wVG9ab2RUeXBlKHByb3BOb2RlLnByb3ApO1xuICAgICAgaWYgKHByb3BOb2RlLnByb3AubnVsbGFibGUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHouYXJyYXkoaW5uZXJUeXBlKS5udWxsYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHouYXJyYXkoaW5uZXJUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBvYmogPSBhd2FpdCBwcm9wTm9kZS5jaGlsZHJlbi5yZWR1Y2UoXG4gICAgICBhc3luYyAocHJvbWlzZSwgY2hpbGRQcm9wTm9kZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICByZXN1bHRbY2hpbGRQcm9wTm9kZS5wcm9wIS5uYW1lXSA9XG4gICAgICAgICAgYXdhaXQgcHJvcE5vZGVUb1pvZFR5cGUoY2hpbGRQcm9wTm9kZSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgYW55XG4gICAgKTtcblxuICAgIGlmIChwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHoub2JqZWN0KG9iaikubnVsbGFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHoub2JqZWN0KG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG4iXSwibmFtZXMiOlsieiIsIkVudGl0eU1hbmFnZXIiLCJTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24iLCJ6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIiwicHJvcFRvWm9kVHlwZSIsImdldENvbHVtbnNOb2RlIiwiZW50aXR5SWQiLCJzdWJzZXRLZXkiLCJlbnRpdHkiLCJnZXQiLCJzdWJzZXQiLCJzdWJzZXRzIiwidW5kZWZpbmVkIiwicHJvcE5vZGVzIiwiZmllbGRFeHByc1RvUHJvcE5vZGVzIiwicm9vdFByb3BOb2RlIiwibm9kZVR5cGUiLCJjaGlsZHJlbiIsImNvbHVtbnNab2RUeXBlIiwicHJvcE5vZGVUb1pvZFR5cGUiLCJjb2x1bW5zTm9kZSIsIm1hcCIsImNoaWxkIiwicmVuZGVyVHlwZSIsInBpY2tlZENvbCIsImZpbmQiLCJjYyIsImluY2x1ZGVzIiwibmFtZSIsImNvbmZpZyIsInBpY2tlZCIsImVsZW1lbnQiLCJwcm9wTm9kZSIsInByb3AiLCJFcnJvciIsImxlbmd0aCIsImFycmF5IiwiaW5uZXJUeXBlIiwibnVsbGFibGUiLCJvYmoiLCJyZWR1Y2UiLCJwcm9taXNlIiwiY2hpbGRQcm9wTm9kZSIsInJlc3VsdCIsIm9iamVjdCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsT0FBTyxNQUFNO0FBQ3BCLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FBU0MsMkJBQTJCLFFBQVEsaUNBQThCO0FBRTFFLFNBQVNDLHNCQUFzQixFQUFFQyxhQUFhLFFBQVEscUJBQWtCO0FBRXhFOzs7O0NBSUMsR0FDRCxPQUFPLGVBQWVDLGVBQ3BCQyxRQUFnQixFQUNoQkMsU0FBaUI7SUFFakIs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
@@ -0,0 +1,23 @@
1
+ import { EntityNamesRecord } from "../entity/entity-manager";
2
+ import { RelationProp } from "../types/types";
3
+ /**
4
+ * Enum의 표시용 라벨을 가져옵니다.
5
+ * OrderBy, SearchField 등 특수한 경우와 일반 Enum을 구분하여 처리합니다.
6
+ */
7
+ export declare function getLabel(entityId: string, enumId: string): string;
8
+ /**
9
+ * 컬럼 이름으로부터 Enum 정보를 추출합니다.
10
+ * Entity의 prop 중 enum 타입인 것을 찾아 관련 정보를 반환합니다.
11
+ */
12
+ export declare function getEnumInfoFromColName(entityId: string, colName: string): {
13
+ id: string;
14
+ targetEntityNames: EntityNamesRecord;
15
+ targetEntityId: string;
16
+ title: string;
17
+ };
18
+ /**
19
+ * 컬럼 이름으로부터 Relation prop 정보를 가져옵니다.
20
+ * 관계형 prop이 아닌 경우 에러를 발생시킵니다.
21
+ */
22
+ export declare function getRelationPropFromColName(entityId: string, colName: string): RelationProp;
23
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/template/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAA8B,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAcjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IACD,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CA0BA;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,YAAY,CAYd"}
@@ -0,0 +1,64 @@
1
+ import inflection from "inflection";
2
+ import { EntityManager } from "../entity/entity-manager.js";
3
+ import { isEnumProp, isRelationProp } from "../types/types.js";
4
+ /**
5
+ * Enum의 표시용 라벨을 가져옵니다.
6
+ * OrderBy, SearchField 등 특수한 경우와 일반 Enum을 구분하여 처리합니다.
7
+ */ export function getLabel(entityId, enumId) {
8
+ if (enumId.endsWith("OrderBy")) {
9
+ return "정렬";
10
+ } else if (enumId.endsWith("SearchField")) {
11
+ return "검색";
12
+ } else {
13
+ const enumProp = EntityManager.get(entityId).props.find((prop)=>`${entityId}${inflection.camelize(prop.name)}` === enumId);
14
+ if (enumProp && enumProp.desc) {
15
+ return enumProp.desc;
16
+ }
17
+ return enumId;
18
+ }
19
+ }
20
+ /**
21
+ * 컬럼 이름으로부터 Enum 정보를 추출합니다.
22
+ * Entity의 prop 중 enum 타입인 것을 찾아 관련 정보를 반환합니다.
23
+ */ export function getEnumInfoFromColName(entityId, colName) {
24
+ const baseEntity = EntityManager.get(entityId);
25
+ const prop = baseEntity.props.find((p)=>p.name === colName);
26
+ if (prop && isEnumProp(prop)) {
27
+ return {
28
+ id: prop.id,
29
+ targetEntityId: entityId,
30
+ targetEntityNames: EntityManager.getNamesFromId(entityId),
31
+ title: prop.desc ?? prop.id
32
+ };
33
+ } else {
34
+ const idCandidate = inflection.camelize(inflection.underscore(entityId) + "_" + inflection.underscore(colName), false);
35
+ try {
36
+ const targetEntityNames = EntityManager.getNamesFromId(entityId);
37
+ return {
38
+ id: idCandidate,
39
+ targetEntityId: entityId,
40
+ targetEntityNames: targetEntityNames,
41
+ title: idCandidate
42
+ };
43
+ } catch {}
44
+ throw new Error(`찾을 수 없는 EnumProp ${colName}`);
45
+ }
46
+ }
47
+ /**
48
+ * 컬럼 이름으로부터 Relation prop 정보를 가져옵니다.
49
+ * 관계형 prop이 아닌 경우 에러를 발생시킵니다.
50
+ */ export function getRelationPropFromColName(entityId, colName) {
51
+ const baseEntity = EntityManager.get(entityId);
52
+ const relProp = baseEntity.props.find((prop)=>prop.name === colName);
53
+ if (isRelationProp(relProp)) {
54
+ const relEntity = EntityManager.get(relProp.with);
55
+ if (relEntity.parentId !== undefined) {
56
+ throw new Error("Only parent entities can be used as relation props");
57
+ }
58
+ return relProp;
59
+ } else {
60
+ throw new Error(`찾을 수 없는 Relation ${colName}`);
61
+ }
62
+ }
63
+
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS9oZWxwZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGlzRW51bVByb3AsIGlzUmVsYXRpb25Qcm9wLCBSZWxhdGlvblByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLyoqXG4gKiBFbnVt7J2YIO2RnOyLnOyaqSDrnbzrsqjsnYQg6rCA7KC47Ji164uI64ukLlxuICogT3JkZXJCeSwgU2VhcmNoRmllbGQg65OxIO2KueyImO2VnCDqsr3smrDsmYAg7J2867CYIEVudW3snYQg6rWs67aE7ZWY7JesIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExhYmVsKGVudGl0eUlkOiBzdHJpbmcsIGVudW1JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGVudW1JZC5lbmRzV2l0aChcIk9yZGVyQnlcIikpIHtcbiAgICByZXR1cm4gXCLsoJXroKxcIjtcbiAgfSBlbHNlIGlmIChlbnVtSWQuZW5kc1dpdGgoXCJTZWFyY2hGaWVsZFwiKSkge1xuICAgIHJldHVybiBcIuqygOyDiVwiO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVudW1Qcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoXG4gICAgICAocHJvcCkgPT4gYCR7ZW50aXR5SWR9JHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3AubmFtZSl9YCA9PT0gZW51bUlkXG4gICAgKTtcbiAgICBpZiAoZW51bVByb3AgJiYgZW51bVByb3AuZGVzYykge1xuICAgICAgcmV0dXJuIGVudW1Qcm9wLmRlc2M7XG4gICAgfVxuICAgIHJldHVybiBlbnVtSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiDsu6zrn7wg7J2066aE7Jy866Gc67aA7YSwIEVudW0g7KCV67O066W8IOy2lOy2nO2VqeuLiOuLpC5cbiAqIEVudGl0eeydmCBwcm9wIOykkSBlbnVtIO2DgOyeheyduCDqsoPsnYQg7LC+7JWEIOq0gOugqCDsoJXrs7Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShcbiAgZW50aXR5SWQ6IHN0cmluZyxcbiAgY29sTmFtZTogc3RyaW5nXG4pOiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRhcmdldEVudGl0eU5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgdGFyZ2V0RW50aXR5SWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbn0ge1xuICBjb25zdCBiYXNlRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBjb25zdCBwcm9wID0gYmFzZUVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbE5hbWUpO1xuICBpZiAocHJvcCAmJiBpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBwcm9wLmlkLFxuICAgICAgdGFyZ2V0RW50aXR5SWQ6IGVudGl0eUlkLFxuICAgICAgdGFyZ2V0RW50aXR5TmFtZXM6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgdGl0bGU6IHByb3AuZGVzYyA/PyBwcm9wLmlkLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaWRDYW5kaWRhdGUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKFxuICAgICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eUlkKSArIFwiX1wiICsgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNvbE5hbWUpLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRFbnRpdHlOYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlkQ2FuZGlkYXRlLFxuICAgICAgICB0YXJnZXRFbnRpdHlJZDogZW50aXR5SWQsXG4gICAgICAgIHRhcmdldEVudGl0eU5hbWVzOiB0YXJnZXRFbnRpdHlOYW1lcyxcbiAgICAgICAgdGl0bGU6IGlkQ2FuZGlkYXRlLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHt9XG4gICAgdGhyb3cgbmV3IEVycm9yKGDssL7snYQg7IiYIOyXhuuKlCBFbnVtUHJvcCAke2NvbE5hbWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiDsu6zrn7wg7J2066aE7Jy866Gc67aA7YSwIFJlbGF0aW9uIHByb3Ag7KCV67O066W8IOqwgOyguOyYteuLiOuLpC5cbiAqIOq0gOqzhO2YlSBwcm9w7J20IOyVhOuLjCDqsr3smrAg7JeQ65+s66W8IOuwnOyDneyLnO2CteuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKFxuICBlbnRpdHlJZDogc3RyaW5nLFxuICBjb2xOYW1lOiBzdHJpbmdcbik6IFJlbGF0aW9uUHJvcCB7XG4gIGNvbnN0IGJhc2VFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGNvbnN0IHJlbFByb3AgPSBiYXNlRW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gY29sTmFtZSk7XG4gIGlmIChpc1JlbGF0aW9uUHJvcChyZWxQcm9wKSkge1xuICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbFByb3Aud2l0aCk7XG4gICAgaWYgKHJlbEVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IHBhcmVudCBlbnRpdGllcyBjYW4gYmUgdXNlZCBhcyByZWxhdGlvbiBwcm9wc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbFByb3A7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDssL7snYQg7IiYIOyXhuuKlCBSZWxhdGlvbiAke2NvbE5hbWV9YCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJpbmZsZWN0aW9uIiwiRW50aXR5TWFuYWdlciIsImlzRW51bVByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImdldExhYmVsIiwiZW50aXR5SWQiLCJlbnVtSWQiLCJlbmRzV2l0aCIsImVudW1Qcm9wIiwiZ2V0IiwicHJvcHMiLCJmaW5kIiwicHJvcCIsImNhbWVsaXplIiwibmFtZSIsImRlc2MiLCJnZXRFbnVtSW5mb0Zyb21Db2xOYW1lIiwiY29sTmFtZSIsImJhc2VFbnRpdHkiLCJwIiwiaWQiLCJ0YXJnZXRFbnRpdHlJZCIsInRhcmdldEVudGl0eU5hbWVzIiwiZ2V0TmFtZXNGcm9tSWQiLCJ0aXRsZSIsImlkQ2FuZGlkYXRlIiwidW5kZXJzY29yZSIsIkVycm9yIiwiZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUiLCJyZWxQcm9wIiwicmVsRW50aXR5Iiwid2l0aCIsInBhcmVudElkIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxhQUFhLFFBQTJCLDhCQUEyQjtBQUM1RSxTQUFTQyxVQUFVLEVBQUVDLGNBQWMsUUFBc0Isb0JBQWlCO0FBRTFFOzs7Q0FHQyxHQUNELE9BQU8sU0FBU0MsU0FBU0MsUUFBZ0IsRUFBRUMsTUFBYztJQUN2RCxJQUFJQSxPQUFPQyxRQUFRLENBQUMsWUFBWTtRQUM5QixPQUFPO0lBQ1QsT0FBTyxJQUFJRCxPQUFPQyxRQUFRLENBQUMsZ0JBQWdCO1FBQ3pDLE9BQU87SUFDVCxPQUFPO1FBQ0wsTUFBTUMsV0FBV1AsY0FBY1EsR0FBRyxDQUFDSixVQUFVSyxLQUFLLENBQUNDLElBQUksQ0FDckQsQ0FBQ0MsT0FBUyxHQUFHUCxXQUFXTCxXQUFXYSxRQUFRLENBQUNELEtBQUtFLElBQUksR0FBRyxLQUFLUjtRQUUvRCxJQUFJRSxZQUFZQSxTQUFTTyxJQUFJLEVBQUU7WUFDN0IsT0FBT1AsU0FBU08sSUFBSTtRQUN0QjtRQUNBLE9BQU9UO0lBQ1Q7QUFDRjtBQUVBOzs7Q0FHQyxHQUNELE9BQU8sU0FBU1UsdUJBQ2RYLFFBQWdCLEVBQ2hCWSxPQUFlO0lBT2YsTUFBTUMsYUFBYWpCLGNBQWNRLEdBQUcsQ0FBQ0o7SUFDckMsTUFBTU8sT0FBT00sV0FBV1IsS0FBSyxDQUFDQyxJQUFJLENBQUMsQ0FBQ1EsSUFBTUEsRUFBRUwsSUFBSSxLQUFLRztJQUNyRCxJQUFJTCxRQUFRVixXQUFXVSxPQUFPO1FBQzVCLE9BQU87WUFDTFEsSUFBSVIsS0FBS1EsRUFBRTtZQUNYQyxnQkFBZ0JoQjtZQUNoQmlCLG1CQUFtQnJCLGNBQWNzQixjQUFjLENBQUNsQjtZQUNoRG1CLE9BQU9aLEtBQUtHLElBQUksSUFBSUgsS0FBS1EsRUFBRTtRQUM3QjtJQUNGLE9BQU87UUFDTCxNQUFNSyxjQUFjekIsV0FBV2EsUUFBUSxDQUNyQ2IsV0FBVzBCLFVBQVUsQ0FBQ3JCLFlBQVksTUFBTUwsV0FBVzBCLFVBQVUsQ0FBQ1QsVUFDOUQ7UUFFRixJQUFJO1lBQ0YsTUFBTUssb0JBQW9CckIsY0FBY3NCLGNBQWMsQ0FBQ2xCO1lBQ3ZELE9BQU87Z0JBQ0xlLElBQUlLO2dCQUNKSixnQkFBZ0JoQjtnQkFDaEJpQixtQkFBbUJBO2dCQUNuQkUsT0FBT0M7WUFDVDtRQUNGLEVBQUUsT0FBTSxDQUFDO1FBQ1QsTUFBTSxJQUFJRSxNQUFNLENBQUMsaUJBQWlCLEVBQUVWLFNBQVM7SUFDL0M7QUFDRjtBQUVBOzs7Q0FHQyxHQUNELE9BQU8sU0FBU1csMkJBQ2R2QixRQUFnQixFQUNoQlksT0FBZTtJQUVmLE1BQU1DLGFBQWFqQixjQUFjUSxHQUFHLENBQUNKO0lBQ3JDLE1BQU13QixVQUFVWCxXQUFXUixLQUFLLENBQUNDLElBQUksQ0FBQyxDQUFDQyxPQUFTQSxLQUFLRSxJQUFJLEtBQUtHO0lBQzlELElBQUlkLGVBQWUwQixVQUFVO1FBQzNCLE1BQU1DLFlBQVk3QixjQUFjUSxHQUFHLENBQUNvQixRQUFRRSxJQUFJO1FBQ2hELElBQUlELFVBQVVFLFFBQVEsS0FBS0MsV0FBVztZQUNwQyxNQUFNLElBQUlOLE1BQU07UUFDbEI7UUFDQSxPQUFPRTtJQUNULE9BQU87UUFDTCxNQUFNLElBQUlGLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRVYsU0FBUztJQUMvQztBQUNGIn0=
@@ -1,6 +1,6 @@
1
- import { TemplateOptions } from "../types/types";
2
- import { EntityNamesRecord } from "../entity/entity-manager";
3
- import { Template } from "./base-template";
1
+ import { TemplateOptions } from "../../types/types";
2
+ import { EntityNamesRecord } from "../../entity/entity-manager";
3
+ import { Template } from "../template";
4
4
  export declare class Template__entity extends Template {
5
5
  constructor();
6
6
  getTargetAndPath(names: EntityNamesRecord, parentNames?: EntityNamesRecord): {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/entity.template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAiB,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,gBAAiB,SAAQ,QAAQ;;IAK5C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,iBAAiB;;;;IAS1E,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC;;;;;;CAoE1C"}
@@ -0,0 +1,87 @@
1
+ import { EntityManager } from "../../entity/entity-manager.js";
2
+ import { Template } from "../template.js";
3
+ import { Sonamu } from "../../api/index.js";
4
+ export class Template__entity extends Template {
5
+ constructor(){
6
+ super("entity");
7
+ }
8
+ getTargetAndPath(names, parentNames) {
9
+ const { dir } = Sonamu.config.api;
10
+ return {
11
+ target: `${dir}/src/application`,
12
+ path: `${(parentNames ?? names).fs}/${names.fs}.entity.json`
13
+ };
14
+ }
15
+ render(options) {
16
+ const { entityId, title, parentId, table } = options;
17
+ const names = EntityManager.getNamesFromId(entityId);
18
+ const parent = (()=>{
19
+ if (parentId) {
20
+ return {
21
+ names: EntityManager.getNamesFromId(parentId),
22
+ entity: EntityManager.get(parentId)
23
+ };
24
+ } else {
25
+ return null;
26
+ }
27
+ })();
28
+ return {
29
+ ...this.getTargetAndPath(names, parent?.names ?? names),
30
+ body: JSON.stringify({
31
+ id: entityId,
32
+ title: title ?? entityId,
33
+ parentId,
34
+ table: table ?? names.fsPlural.replace(/\-/g, "_"),
35
+ props: options.props?.length ? options.props : [
36
+ {
37
+ name: "id",
38
+ type: "integer",
39
+ unsigned: true,
40
+ desc: "ID"
41
+ },
42
+ ...parent ? [
43
+ {
44
+ type: "relation",
45
+ name: parent.names.camel,
46
+ relationType: "BelongsToOne",
47
+ with: parentId,
48
+ onUpdate: "CASCADE",
49
+ onDelete: "CASCADE",
50
+ desc: parent.entity.title
51
+ }
52
+ ] : [],
53
+ {
54
+ name: "created_at",
55
+ type: "timestamp",
56
+ desc: "등록일시",
57
+ dbDefault: "CURRENT_TIMESTAMP"
58
+ }
59
+ ],
60
+ indexes: [
61
+ ...options.indexes ?? []
62
+ ],
63
+ subsets: options.subsets ?? {
64
+ ...parentId ? {} : {
65
+ A: [
66
+ "id",
67
+ "created_at"
68
+ ]
69
+ }
70
+ },
71
+ enums: options.enums ?? {
72
+ ...parentId ? {} : {
73
+ [`${names.capital}OrderBy`]: {
74
+ "id-desc": "ID최신순"
75
+ },
76
+ [`${names.capital}SearchField`]: {
77
+ id: "ID"
78
+ }
79
+ }
80
+ }
81
+ }).trim(),
82
+ importKeys: []
83
+ };
84
+ }
85
+ }
86
+
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZW50aXR5LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX2VudGl0eSBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJlbnRpdHlcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCwgcGFyZW50TmFtZXM/OiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGNvbnN0IHsgZGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGAkeyhwYXJlbnROYW1lcyA/PyBuYW1lcykuZnN9LyR7bmFtZXMuZnN9LmVudGl0eS5qc29uYCxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKG9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIGNvbnN0IHsgZW50aXR5SWQsIHRpdGxlLCBwYXJlbnRJZCwgdGFibGUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcblxuICAgIGNvbnN0IHBhcmVudCA9ICgoKSA9PiB7XG4gICAgICBpZiAocGFyZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lczogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChwYXJlbnRJZCksXG4gICAgICAgICAgZW50aXR5OiBFbnRpdHlNYW5hZ2VyLmdldChwYXJlbnRJZCksXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgcGFyZW50Py5uYW1lcyA/PyBuYW1lcyksXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlkOiBlbnRpdHlJZCxcbiAgICAgICAgdGl0bGU6IHRpdGxlID8/IGVudGl0eUlkLFxuICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgdGFibGU6IHRhYmxlID8/IG5hbWVzLmZzUGx1cmFsLnJlcGxhY2UoL1xcLS9nLCBcIl9cIiksXG4gICAgICAgIHByb3BzOiBvcHRpb25zLnByb3BzPy5sZW5ndGhcbiAgICAgICAgICA/IG9wdGlvbnMucHJvcHNcbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiLCB1bnNpZ25lZDogdHJ1ZSwgZGVzYzogXCJJRFwiIH0sXG4gICAgICAgICAgICAgIC4uLihwYXJlbnRcbiAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVsYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJlbnQubmFtZXMuY2FtZWwsXG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25UeXBlOiBcIkJlbG9uZ3NUb09uZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpdGg6IHBhcmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgIG9uVXBkYXRlOiBcIkNBU0NBREVcIixcbiAgICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZTogXCJDQVNDQURFXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZGVzYzogcGFyZW50LmVudGl0eS50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY3JlYXRlZF9hdFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgICAgICAgZGVzYzogXCLrk7HroZ3snbzsi5xcIixcbiAgICAgICAgICAgICAgICBkYkRlZmF1bHQ6IFwiQ1VSUkVOVF9USU1FU1RBTVBcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIGluZGV4ZXM6IFsuLi4ob3B0aW9ucy5pbmRleGVzID8/IFtdKV0sXG4gICAgICAgIHN1YnNldHM6IG9wdGlvbnMuc3Vic2V0cyA/PyB7XG4gICAgICAgICAgLi4uKHBhcmVudElkXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBBOiBbXCJpZFwiLCBcImNyZWF0ZWRfYXRcIl0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICBlbnVtczogb3B0aW9ucy5lbnVtcyA/PyB7XG4gICAgICAgICAgLi4uKHBhcmVudElkXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBbYCR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5YF06IHtcbiAgICAgICAgICAgICAgICAgIFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbYCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZGBdOiB7IGlkOiBcIklEXCIgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9KS50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiRW50aXR5TWFuYWdlciIsIlRlbXBsYXRlIiwiU29uYW11IiwiVGVtcGxhdGVfX2VudGl0eSIsImdldFRhcmdldEFuZFBhdGgiLCJuYW1lcyIsInBhcmVudE5hbWVzIiwiZGlyIiwiY29uZmlnIiwiYXBpIiwidGFyZ2V0IiwicGF0aCIsImZzIiwicmVuZGVyIiwib3B0aW9ucyIsImVudGl0eUlkIiwidGl0bGUiLCJwYXJlbnRJZCIsInRhYmxlIiwiZ2V0TmFtZXNGcm9tSWQiLCJwYXJlbnQiLCJlbnRpdHkiLCJnZXQiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsImlkIiwiZnNQbHVyYWwiLCJyZXBsYWNlIiwicHJvcHMiLCJsZW5ndGgiLCJuYW1lIiwidHlwZSIsInVuc2lnbmVkIiwiZGVzYyIsImNhbWVsIiwicmVsYXRpb25UeXBlIiwid2l0aCIsIm9uVXBkYXRlIiwib25EZWxldGUiLCJkYkRlZmF1bHQiLCJpbmRleGVzIiwic3Vic2V0cyIsIkEiLCJlbnVtcyIsImNhcGl0YWwiLCJ0cmltIiwiaW1wb3J0S2V5cyJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsYUFBYSxRQUEyQixpQ0FBOEI7QUFDL0UsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLE1BQU0sUUFBUSxxQkFBWTtBQUVuQyxPQUFPLE1BQU1DLHlCQUF5QkY7SUFDcEMsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFHLGlCQUFpQkMsS0FBd0IsRUFBRUMsV0FBK0IsRUFBRTtRQUMxRSxNQUFNLEVBQUVDLEdBQUcsRUFBRSxHQUFHTCxPQUFPTSxNQUFNLENBQUNDLEdBQUc7UUFFakMsT0FBTztZQUNMQyxRQUFRLEdBQUdILElBQUksZ0JBQWdCLENBQUM7WUFDaENJLE1BQU0sR0FBRyxBQUFDTCxDQUFBQSxlQUFlRCxLQUFJLEVBQUdPLEVBQUUsQ0FBQyxDQUFDLEVBQUVQLE1BQU1PLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDOUQ7SUFDRjtJQUVBQyxPQUFPQyxPQUFrQyxFQUFFO1FBQ3pDLE1BQU0sRUFBRUMsUUFBUSxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsS0FBSyxFQUFFLEdBQUdKO1FBQzdDLE1BQU1ULFFBQVFMLGNBQWNtQixjQUFjLENBQUNKO1FBRTNDLE1BQU1LLFNBQVMsQUFBQyxDQUFBO1lBQ2QsSUFBSUgsVUFBVTtnQkFDWixPQUFPO29CQUNMWixPQUFPTCxjQUFjbUIsY0FBYyxDQUFDRjtvQkFDcENJLFFBQVFyQixjQUFjc0IsR0FBRyxDQUFDTDtnQkFDNUI7WUFDRixPQUFPO2dCQUNMLE9BQU87WUFDVDtRQUNGLENBQUE7UUFFQSxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUNiLGdCQUFnQixDQUFDQyxPQUFPZSxRQUFRZixTQUFTQSxNQUFNO1lBQ3ZEa0IsTUFBTUMsS0FBS0MsU0FBUyxDQUFDO2dCQUNuQkMsSUFBSVg7Z0JBQ0pDLE9BQU9BLFNBQVNEO2dCQUNoQkU7Z0JBQ0FDLE9BQU9BLFNBQVNiLE1BQU1zQixRQUFRLENBQUNDLE9BQU8sQ0FBQyxPQUFPO2dCQUM5Q0MsT0FBT2YsUUFBUWUsS0FBSyxFQUFFQyxTQUNsQmhCLFFBQVFlLEtBQUssR0FDYjtvQkFDRTt3QkFBRUUsTUFBTTt3QkFBTUMsTUFBTTt3QkFBV0MsVUFBVTt3QkFBTUMsTUFBTTtvQkFBSzt1QkFDdERkLFNBQ0E7d0JBQ0U7NEJBQ0VZLE1BQU07NEJBQ05ELE1BQU1YLE9BQU9mLEtBQUssQ0FBQzhCLEtBQUs7NEJBQ3hCQyxjQUFjOzRCQUNkQyxNQUFNcEI7NEJBQ05xQixVQUFVOzRCQUNWQyxVQUFVOzRCQUNWTCxNQUFNZCxPQUFPQyxNQUFNLENBQUNMLEtBQUs7d0JBQzNCO3FCQUNELEdBQ0QsRUFBRTtvQkFDTjt3QkFDRWUsTUFBTTt3QkFDTkMsTUFBTTt3QkFDTkUsTUFBTTt3QkFDTk0sV0FBVztvQkFDYjtpQkFDRDtnQkFDTEMsU0FBUzt1QkFBSzNCLFFBQVEyQixPQUFPLElBQUksRUFBRTtpQkFBRTtnQkFDckNDLFNBQVM1QixRQUFRNEIsT0FBTyxJQUFJO29CQUMxQixHQUFJekIsV0FDQSxDQUFDLElBQ0Q7d0JBQ0UwQixHQUFHOzRCQUFDOzRCQUFNO3lCQUFhO29CQUN6QixDQUFDO2dCQUNQO2dCQUNBQyxPQUFPOUIsUUFBUThCLEtBQUssSUFBSTtvQkFDdEIsR0FBSTNCLFdBQ0EsQ0FBQyxJQUNEO3dCQUNFLENBQUMsR0FBR1osTUFBTXdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFOzRCQUMzQixXQUFXO3dCQUNiO3dCQUNBLENBQUMsR0FBR3hDLE1BQU13QyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRTs0QkFBRW5CLElBQUk7d0JBQUs7b0JBQzlDLENBQUM7Z0JBQ1A7WUFDRixHQUFHb0IsSUFBSTtZQUNQQyxZQUFZLEVBQUU7UUFDaEI7SUFDRjtBQUNGIn0=
@@ -1,6 +1,6 @@
1
- import { TemplateOptions } from "../types/types";
2
- import { Entity } from "../entity/entity";
3
- import { Template } from "./base-template";
1
+ import { TemplateOptions } from "../../types/types";
2
+ import { Entity } from "../../entity/entity";
3
+ import { Template } from "../template";
4
4
  export type SourceCode = {
5
5
  label: string;
6
6
  lines: string[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated.template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIvC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AACF,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB;;;;IAShB,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC;;;;;;;IAyGvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAsBrD,uBAAuB,CACrB,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAAM,EAAO,GACxB,UAAU;IAsCb,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAiD9D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CAmDvD"}
@@ -0,0 +1,232 @@
1
+ import * as _ from "lodash-es";
2
+ import { EntityManager } from "../../entity/entity-manager.js";
3
+ import { propNodeToZodTypeDef, zodTypeToZodCode } from "../../api/code-converters.js";
4
+ import { Template } from "../template.js";
5
+ import { nonNullable } from "../../utils/utils.js";
6
+ import { Sonamu } from "../../api/index.js";
7
+ export class Template__generated extends Template {
8
+ constructor(){
9
+ super("generated");
10
+ }
11
+ getTargetAndPath() {
12
+ const { dir } = Sonamu.config.api;
13
+ return {
14
+ target: `${dir}/src/application`,
15
+ path: `sonamu.generated.ts`
16
+ };
17
+ }
18
+ render({}) {
19
+ const entityIds = EntityManager.getAllIds();
20
+ const entities = entityIds.map((id)=>EntityManager.get(id));
21
+ // 전체 SourceCode 생성
22
+ const sourceCodes = entities.map((entity)=>{
23
+ return [
24
+ this.getEnumsSourceCode(entity),
25
+ this.getBaseSchemaSourceCode(entity),
26
+ this.getBaseListParamsSourceCode(entity),
27
+ this.getSubsetSourceCode(entity)
28
+ ].filter(nonNullable);
29
+ }).flat();
30
+ // Sort
31
+ const LABEL_KEY_ORDER = [
32
+ "Enums",
33
+ "BaseSchema",
34
+ "BaseListParams",
35
+ "Subsets",
36
+ "SubsetQueries"
37
+ ];
38
+ sourceCodes.sort((a, b)=>{
39
+ const [aKey] = a.label.split(":");
40
+ const [bKey] = b.label.split(":");
41
+ const aIndex = LABEL_KEY_ORDER.indexOf(aKey);
42
+ const bIndex = LABEL_KEY_ORDER.indexOf(bKey);
43
+ if (aIndex > bIndex) {
44
+ return 1;
45
+ } else if (aIndex < bIndex) {
46
+ return -1;
47
+ } else {
48
+ return 0;
49
+ }
50
+ });
51
+ const sourceCode = sourceCodes.reduce((result, ts)=>{
52
+ if (ts === null) {
53
+ return result;
54
+ }
55
+ return {
56
+ lines: [
57
+ ...result.lines,
58
+ `// ${ts.label}`,
59
+ ...ts.lines,
60
+ ""
61
+ ],
62
+ importKeys: _.uniq([
63
+ ...result.importKeys,
64
+ ...ts.importKeys
65
+ ].sort())
66
+ };
67
+ }, {
68
+ lines: [],
69
+ importKeys: []
70
+ });
71
+ // .types.ts의 타입을 참조하는 경우 순환참조(상호참조)가 발생하므로 타입을 가져와 인라인 처리
72
+ const allTypeKeys = entities.map((entity)=>Object.keys(entity.types)).flat();
73
+ const cdImportKeys = sourceCode.importKeys.filter((importKey)=>allTypeKeys.includes(importKey));
74
+ if (cdImportKeys.length > 0) {
75
+ const customScalarLines = cdImportKeys.map((importKey)=>{
76
+ const entity = entities.find((entity)=>entity.types[importKey]);
77
+ if (!entity) {
78
+ throw new Error(`ZodType not found ${importKey}`);
79
+ }
80
+ const zodType = entity.types[importKey];
81
+ return [
82
+ `// CustomScalar: ${importKey}`,
83
+ `const ${importKey} = ${zodTypeToZodCode(zodType)};`,
84
+ `type ${importKey} = z.infer<typeof ${importKey}>`,
85
+ ""
86
+ ];
87
+ }).flat();
88
+ sourceCode.lines = [
89
+ ...customScalarLines,
90
+ ...sourceCode.lines
91
+ ];
92
+ sourceCode.importKeys = sourceCode.importKeys.filter((importKey)=>!cdImportKeys.includes(importKey));
93
+ }
94
+ const body = sourceCode.lines.join("\n");
95
+ // import
96
+ const sonamuImports = [
97
+ "zArrayable",
98
+ "SQLDateTimeString",
99
+ "SubsetQuery",
100
+ "SonamuQueryMode"
101
+ ].filter((mod)=>body.includes(mod));
102
+ return {
103
+ ...this.getTargetAndPath(),
104
+ body,
105
+ importKeys: sourceCode.importKeys,
106
+ customHeaders: [
107
+ `import { z } from 'zod';`,
108
+ `import { ${sonamuImports.join(",")} } from "sonamu";`
109
+ ]
110
+ };
111
+ }
112
+ getEnumsSourceCode(entity) {
113
+ if (Object.keys(entity.enumLabels).length === 0) {
114
+ return null;
115
+ }
116
+ return {
117
+ label: `Enums: ${entity.id}`,
118
+ lines: [
119
+ ...Object.entries(entity.enumLabels).filter(([_, enumLabel])=>Object.keys(enumLabel).length > 0).map(([enumId, enumLabel])=>[
120
+ `export const ${enumId} = z.enum([${Object.keys(enumLabel).map((el)=>`"${el}"`)}]).describe("${enumId}");`,
121
+ `export type ${enumId} = z.infer<typeof ${enumId}>`,
122
+ `export const ${enumId}Label = ${JSON.stringify(enumLabel)}`
123
+ ]).flat()
124
+ ],
125
+ importKeys: []
126
+ };
127
+ }
128
+ getBaseSchemaSourceCode(entity, importKeys = []) {
129
+ const schemaName = `${entity.names.module}BaseSchema`;
130
+ const propNode = {
131
+ nodeType: "object",
132
+ children: entity.props.map((prop)=>{
133
+ return {
134
+ nodeType: "plain",
135
+ prop
136
+ };
137
+ })
138
+ };
139
+ const schemaBody = propNodeToZodTypeDef(propNode, importKeys);
140
+ // fulltext index에 포함된 컬럼들 추출
141
+ const fulltextColumns = _.uniq(entity.indexes.filter((index)=>index.type === "fulltext").flatMap((index)=>index.columns));
142
+ const lines = [
143
+ `export const ${schemaName} = ${schemaBody}`,
144
+ `export type ${schemaName} = z.infer<typeof ${schemaName}>` + (fulltextColumns.length > 0 ? ` & { readonly __fulltext__: readonly [${fulltextColumns.map((col)=>`"${col}"`).join(", ")}] }` : "")
145
+ ];
146
+ return {
147
+ label: `BaseSchema: ${entity.id}`,
148
+ importKeys,
149
+ lines
150
+ };
151
+ }
152
+ getBaseListParamsSourceCode(entity) {
153
+ // Prop 없는 MD인 경우 생성 제외
154
+ if (entity.props.length === 0) {
155
+ return null;
156
+ } else if (entity.parentId !== undefined) {
157
+ return null;
158
+ }
159
+ const schemaName = `${entity.names.module}BaseListParams`;
160
+ const filterProps = entity.props.filter((prop)=>prop.toFilter === true);
161
+ const propNodes = filterProps.map((prop)=>{
162
+ return {
163
+ nodeType: "plain",
164
+ prop,
165
+ children: []
166
+ };
167
+ });
168
+ const importKeys = [];
169
+ const filterBody = propNodes.map((propNode)=>propNodeToZodTypeDef(propNode, importKeys)).join("\n");
170
+ const schemaBody = `
171
+ z.object({
172
+ num: z.number().int().nonnegative(),
173
+ page: z.number().int().min(1),
174
+ search: ${entity.id}SearchField,
175
+ keyword: z.string(),
176
+ orderBy: ${entity.id}OrderBy,
177
+ queryMode: SonamuQueryMode,
178
+ id: zArrayable(z.number().int().positive()),${filterBody}
179
+ }).partial();
180
+ `.trim();
181
+ const lines = [
182
+ `export const ${schemaName} = ${schemaBody}`,
183
+ `export type ${schemaName} = z.infer<typeof ${schemaName}>`
184
+ ];
185
+ return {
186
+ label: `BaseListParams: ${entity.id}`,
187
+ importKeys,
188
+ lines
189
+ };
190
+ }
191
+ getSubsetSourceCode(entity) {
192
+ if (Object.keys(entity.subsets).length == 0) {
193
+ return null;
194
+ } else if (entity.parentId !== undefined) {
195
+ return null;
196
+ }
197
+ const subsetKeys = Object.keys(entity.subsets);
198
+ const importKeys = [];
199
+ const lines = [
200
+ ...subsetKeys.map((subsetKey)=>{
201
+ // 서브셋에서 FieldExpr[] 가져옴
202
+ const fieldExprs = entity.subsets[subsetKey];
203
+ // FieldExpr[]로 EntityPropNode[] 가져옴
204
+ const propNodes = entity.fieldExprsToPropNodes(fieldExprs);
205
+ const schemaName = `${entity.names.module}Subset${subsetKey}`;
206
+ const propNode = {
207
+ nodeType: "object",
208
+ children: propNodes
209
+ };
210
+ // EntityPropNode[]로 ZodTypeDef(string)을 가져옴
211
+ const body = propNodeToZodTypeDef(propNode, importKeys);
212
+ return [
213
+ `export const ${schemaName} = ${body}`,
214
+ `export type ${schemaName} = z.infer<typeof ${schemaName}>`
215
+ ];
216
+ }).flat(),
217
+ `export type ${entity.names.module}SubsetMapping = {`,
218
+ ...subsetKeys.map((subsetKey)=>` ${subsetKey}: ${entity.names.module}Subset${subsetKey};`),
219
+ "}",
220
+ `export const ${entity.names.module}SubsetKey = z.enum([${subsetKeys.map((k)=>`"${k}"`).join(",")}]);`,
221
+ `export type ${entity.names.module}SubsetKey = z.infer<typeof ${entity.names.module}SubsetKey>`,
222
+ ""
223
+ ];
224
+ return {
225
+ label: `Subsets: ${entity.id}`,
226
+ lines,
227
+ importKeys: _.uniq(importKeys)
228
+ };
229
+ }
230
+ }
231
+
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eVByb3BOb2RlIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBwcm9wTm9kZVRvWm9kVHlwZURlZiwgem9kVHlwZVRvWm9kQ29kZSB9IGZyb20gXCIuLi8uLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcblxuZXhwb3J0IHR5cGUgU291cmNlQ29kZSA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGluZXM6IHN0cmluZ1tdO1xuICBpbXBvcnRLZXlzOiBzdHJpbmdbXTtcbn07XG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX2dlbmVyYXRlZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJnZW5lcmF0ZWRcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKCkge1xuICAgIGNvbnN0IHsgZGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGBzb25hbXUuZ2VuZXJhdGVkLnRzYCxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHt9OiBUZW1wbGF0ZU9wdGlvbnNbXCJnZW5lcmF0ZWRcIl0pIHtcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGVudGl0aWVzID0gZW50aXR5SWRzLm1hcCgoaWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGlkKSk7XG5cbiAgICAvLyDsoITssrQgU291cmNlQ29kZSDsg53shLFcbiAgICBjb25zdCBzb3VyY2VDb2RlcyA9IGVudGl0aWVzXG4gICAgICAubWFwKChlbnRpdHkpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB0aGlzLmdldEVudW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICAgIHRoaXMuZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUoZW50aXR5KSxcbiAgICAgICAgICB0aGlzLmdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICAgIHRoaXMuZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICBdLmZpbHRlcihub25OdWxsYWJsZSk7XG4gICAgICB9KVxuICAgICAgLmZsYXQoKTtcblxuICAgIC8vIFNvcnRcbiAgICBjb25zdCBMQUJFTF9LRVlfT1JERVIgPSBbXG4gICAgICBcIkVudW1zXCIsXG4gICAgICBcIkJhc2VTY2hlbWFcIixcbiAgICAgIFwiQmFzZUxpc3RQYXJhbXNcIixcbiAgICAgIFwiU3Vic2V0c1wiLFxuICAgICAgXCJTdWJzZXRRdWVyaWVzXCIsXG4gICAgXTtcbiAgICBzb3VyY2VDb2Rlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBbYUtleV0gPSBhLmxhYmVsLnNwbGl0KFwiOlwiKTtcbiAgICAgIGNvbnN0IFtiS2V5XSA9IGIubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgYUluZGV4ID0gTEFCRUxfS0VZX09SREVSLmluZGV4T2YoYUtleSk7XG4gICAgICBjb25zdCBiSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihiS2V5KTtcbiAgICAgIGlmIChhSW5kZXggPiBiSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGFJbmRleCA8IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzb3VyY2VDb2Rlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB0cykgPT4ge1xuICAgICAgICBpZiAodHMgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZXM6IFsuLi5yZXN1bHQhLmxpbmVzLCBgLy8gJHt0cy5sYWJlbH1gLCAuLi50cy5saW5lcywgXCJcIl0sXG4gICAgICAgICAgaW1wb3J0S2V5czogXy51bmlxKFsuLi5yZXN1bHQhLmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdLnNvcnQoKSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj5cbiAgICApO1xuXG4gICAgLy8gLnR5cGVzLnRz7J2YIO2DgOyeheydhCDssLjsobDtlZjripQg6rK97JqwIOyInO2ZmOywuOyhsCjsg4HtmLjssLjsobAp6rCAIOuwnOyDne2VmOuvgOuhnCDtg4DsnoXsnYQg6rCA7KC47JmAIOyduOudvOyduCDsspjrpqxcbiAgICBjb25zdCBhbGxUeXBlS2V5cyA9IGVudGl0aWVzXG4gICAgICAubWFwKChlbnRpdHkpID0+IE9iamVjdC5rZXlzKGVudGl0eS50eXBlcykpXG4gICAgICAuZmxhdCgpO1xuICAgIGNvbnN0IGNkSW1wb3J0S2V5cyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGltcG9ydEtleSkgPT5cbiAgICAgIGFsbFR5cGVLZXlzLmluY2x1ZGVzKGltcG9ydEtleSlcbiAgICApO1xuICAgIGlmIChjZEltcG9ydEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VzdG9tU2NhbGFyTGluZXMgPSBjZEltcG9ydEtleXNcbiAgICAgICAgLm1hcCgoaW1wb3J0S2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gZW50aXRpZXMuZmluZCgoZW50aXR5KSA9PiBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XSk7XG4gICAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWm9kVHlwZSBub3QgZm91bmQgJHtpbXBvcnRLZXl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHpvZFR5cGUgPSBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XSE7XG5cbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYC8vIEN1c3RvbVNjYWxhcjogJHtpbXBvcnRLZXl9YCxcbiAgICAgICAgICAgIGBjb25zdCAke2ltcG9ydEtleX0gPSAke3pvZFR5cGVUb1pvZENvZGUoem9kVHlwZSl9O2AsXG4gICAgICAgICAgICBgdHlwZSAke2ltcG9ydEtleX0gPSB6LmluZmVyPHR5cGVvZiAke2ltcG9ydEtleX0+YCxcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZsYXQoKTtcbiAgICAgIHNvdXJjZUNvZGUubGluZXMgPSBbLi4uY3VzdG9tU2NhbGFyTGluZXMsIC4uLnNvdXJjZUNvZGUubGluZXNdO1xuICAgICAgc291cmNlQ29kZS5pbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcihcbiAgICAgICAgKGltcG9ydEtleSkgPT4gIWNkSW1wb3J0S2V5cy5pbmNsdWRlcyhpbXBvcnRLZXkpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBpbXBvcnRcbiAgICBjb25zdCBzb25hbXVJbXBvcnRzID0gW1xuICAgICAgXCJ6QXJyYXlhYmxlXCIsXG4gICAgICBcIlNRTERhdGVUaW1lU3RyaW5nXCIsXG4gICAgICBcIlN1YnNldFF1ZXJ5XCIsXG4gICAgICBcIlNvbmFtdVF1ZXJ5TW9kZVwiLFxuICAgIF0uZmlsdGVyKChtb2QpID0+IGJvZHkuaW5jbHVkZXMobW9kKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBgaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11SW1wb3J0cy5qb2luKFwiLFwiKX0gfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGdldEVudW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEVudW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMoZW50aXR5LmVudW1MYWJlbHMpXG4gICAgICAgICAgLmZpbHRlcigoW18sIGVudW1MYWJlbF0pID0+IE9iamVjdC5rZXlzKGVudW1MYWJlbCkubGVuZ3RoID4gMClcbiAgICAgICAgICAubWFwKChbZW51bUlkLCBlbnVtTGFiZWxdKSA9PiBbXG4gICAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7ZW51bUlkfSA9IHouZW51bShbJHtPYmplY3Qua2V5cyhlbnVtTGFiZWwpLm1hcChcbiAgICAgICAgICAgICAgKGVsKSA9PiBgXCIke2VsfVwiYFxuICAgICAgICAgICAgKX1dKS5kZXNjcmliZShcIiR7ZW51bUlkfVwiKTtgLFxuICAgICAgICAgICAgYGV4cG9ydCB0eXBlICR7ZW51bUlkfSA9IHouaW5mZXI8dHlwZW9mICR7ZW51bUlkfT5gLFxuICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudW1JZH1MYWJlbCA9ICR7SlNPTi5zdHJpbmdpZnkoZW51bUxhYmVsKX1gLFxuICAgICAgICAgIF0pXG4gICAgICAgICAgLmZsYXQoKSxcbiAgICAgIF0sXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXVxuICApOiBTb3VyY2VDb2RlIHtcbiAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1CYXNlU2NoZW1hYDtcbiAgICBjb25zdCBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUgPSB7XG4gICAgICBub2RlVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuOiBlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIixcbiAgICAgICAgICBwcm9wLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IHNjaGVtYUJvZHkgPSBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cyk7XG5cbiAgICAvLyBmdWxsdGV4dCBpbmRleOyXkCDtj6ztlajrkJwg7Lus65+865OkIOy2lOy2nFxuICAgIGNvbnN0IGZ1bGx0ZXh0Q29sdW1ucyA9IF8udW5pcShcbiAgICAgIGVudGl0eS5pbmRleGVzXG4gICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleC50eXBlID09PSBcImZ1bGx0ZXh0XCIpXG4gICAgICAgIC5mbGF0TWFwKChpbmRleCkgPT4gaW5kZXguY29sdW1ucylcbiAgICApO1xuXG4gICAgY29uc3QgbGluZXMgPSBbXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7c2NoZW1hTmFtZX0gPSAke3NjaGVtYUJvZHl9YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT5gICtcbiAgICAgICAgKGZ1bGx0ZXh0Q29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBgICYgeyByZWFkb25seSBfX2Z1bGx0ZXh0X186IHJlYWRvbmx5IFske2Z1bGx0ZXh0Q29sdW1uc1xuICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dIH1gXG4gICAgICAgICAgOiBcIlwiKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgQmFzZVNjaGVtYTogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGltcG9ydEtleXMsXG4gICAgICBsaW5lcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIC8vIFByb3Ag7JeG64qUIE1E7J24IOqyveyasCDsg53shLEg7KCc7Jm4XG4gICAgaWYgKGVudGl0eS5wcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZW50aXR5LnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfUJhc2VMaXN0UGFyYW1zYDtcblxuICAgIGNvbnN0IGZpbHRlclByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcigocHJvcCkgPT4gcHJvcC50b0ZpbHRlciA9PT0gdHJ1ZSk7XG5cbiAgICBjb25zdCBwcm9wTm9kZXM6IEVudGl0eVByb3BOb2RlW10gPSBmaWx0ZXJQcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGZpbHRlckJvZHkgPSBwcm9wTm9kZXNcbiAgICAgIC5tYXAoKHByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cykpXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIGNvbnN0IHNjaGVtYUJvZHkgPSBgXG56Lm9iamVjdCh7XG4gIG51bTogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxuICBwYWdlOiB6Lm51bWJlcigpLmludCgpLm1pbigxKSxcbiAgc2VhcmNoOiAke2VudGl0eS5pZH1TZWFyY2hGaWVsZCxcbiAga2V5d29yZDogei5zdHJpbmcoKSxcbiAgb3JkZXJCeTogJHtlbnRpdHkuaWR9T3JkZXJCeSxcbiAgcXVlcnlNb2RlOiBTb25hbXVRdWVyeU1vZGUsXG4gIGlkOiB6QXJyYXlhYmxlKHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKSksJHtmaWx0ZXJCb2R5fVxufSkucGFydGlhbCgpO1xuYC50cmltKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7c2NoZW1hQm9keX1gLFxuICAgICAgYGV4cG9ydCB0eXBlICR7c2NoZW1hTmFtZX0gPSB6LmluZmVyPHR5cGVvZiAke3NjaGVtYU5hbWV9PmAsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VMaXN0UGFyYW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICAgIGxpbmVzLFxuICAgIH07XG4gIH1cblxuICBnZXRTdWJzZXRTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cykubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZW50aXR5LnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cyk7XG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICAuLi5zdWJzZXRLZXlzXG4gICAgICAgIC5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgIC8vIOyEnOu4jOyFi+yXkOyEnCBGaWVsZEV4cHJbXSDqsIDsoLjsmLRcbiAgICAgICAgICBjb25zdCBmaWVsZEV4cHJzID0gZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIEZpZWxkRXhwcltd66GcIEVudGl0eVByb3BOb2RlW10g6rCA7KC47Ji0XG4gICAgICAgICAgY29uc3QgcHJvcE5vZGVzID0gZW50aXR5LmZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzKTtcbiAgICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX1gO1xuICAgICAgICAgIGNvbnN0IHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSA9IHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgY2hpbGRyZW46IHByb3BOb2RlcyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gRW50aXR5UHJvcE5vZGVbXeuhnCBab2RUeXBlRGVmKHN0cmluZynsnYQg6rCA7KC47Ji0XG4gICAgICAgICAgY29uc3QgYm9keSA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcblxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7c2NoZW1hTmFtZX0gPSAke2JvZHl9YCxcbiAgICAgICAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT5gLFxuICAgICAgICAgIF07XG4gICAgICAgIH0pXG4gICAgICAgIC5mbGF0KCksXG4gICAgICBgZXhwb3J0IHR5cGUgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldE1hcHBpbmcgPSB7YCxcbiAgICAgIC4uLnN1YnNldEtleXMubWFwKFxuICAgICAgICAoc3Vic2V0S2V5KSA9PlxuICAgICAgICAgIGAgICR7c3Vic2V0S2V5fTogJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldCR7c3Vic2V0S2V5fTtgXG4gICAgICApLFxuICAgICAgXCJ9XCIsXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXkgPSB6LmVudW0oWyR7c3Vic2V0S2V5c1xuICAgICAgICAubWFwKChrKSA9PiBgXCIke2t9XCJgKVxuICAgICAgICAuam9pbihcIixcIil9XSk7YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5ID0gei5pbmZlcjx0eXBlb2YgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleT5gLFxuICAgICAgXCJcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgU3Vic2V0czogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGxpbmVzLFxuICAgICAgaW1wb3J0S2V5czogXy51bmlxKGltcG9ydEtleXMpLFxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJfIiwiRW50aXR5TWFuYWdlciIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwiem9kVHlwZVRvWm9kQ29kZSIsIlRlbXBsYXRlIiwibm9uTnVsbGFibGUiLCJTb25hbXUiLCJUZW1wbGF0ZV9fZ2VuZXJhdGVkIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsImRpciIsImNvbmZpZyIsImFwaSIsInRhcmdldCIsInBhdGgiLCJyZW5kZXIiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJlbnRpdGllcyIsIm1hcCIsImlkIiwiZ2V0Iiwic291cmNlQ29kZXMiLCJlbnRpdHkiLCJnZXRFbnVtc1NvdXJjZUNvZGUiLCJnZXRCYXNlU2NoZW1hU291cmNlQ29kZSIsImdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZSIsImdldFN1YnNldFNvdXJjZUNvZGUiLCJmaWx0ZXIiLCJmbGF0IiwiTEFCRUxfS0VZX09SREVSIiwic29ydCIsImEiLCJiIiwiYUtleSIsImxhYmVsIiwic3BsaXQiLCJiS2V5IiwiYUluZGV4IiwiaW5kZXhPZiIsImJJbmRleCIsInNvdXJjZUNvZGUiLCJyZWR1Y2UiLCJyZXN1bHQiLCJ0cyIsImxpbmVzIiwiaW1wb3J0S2V5cyIsInVuaXEiLCJhbGxUeXBlS2V5cyIsIk9iamVjdCIsImtleXMiLCJ0eXBlcyIsImNkSW1wb3J0S2V5cyIsImltcG9ydEtleSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiY3VzdG9tU2NhbGFyTGluZXMiLCJmaW5kIiwiRXJyb3IiLCJ6b2RUeXBlIiwiYm9keSIsImpvaW4iLCJzb25hbXVJbXBvcnRzIiwibW9kIiwiY3VzdG9tSGVhZGVycyIsImVudW1MYWJlbHMiLCJlbnRyaWVzIiwiZW51bUxhYmVsIiwiZW51bUlkIiwiZWwiLCJKU09OIiwic3RyaW5naWZ5Iiwic2NoZW1hTmFtZSIsIm5hbWVzIiwibW9kdWxlIiwicHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwicHJvcHMiLCJwcm9wIiwic2NoZW1hQm9keSIsImZ1bGx0ZXh0Q29sdW1ucyIsImluZGV4ZXMiLCJpbmRleCIsInR5cGUiLCJmbGF0TWFwIiwiY29sdW1ucyIsImNvbCIsInBhcmVudElkIiwidW5kZWZpbmVkIiwiZmlsdGVyUHJvcHMiLCJ0b0ZpbHRlciIsInByb3BOb2RlcyIsImZpbHRlckJvZHkiLCJ0cmltIiwic3Vic2V0cyIsInN1YnNldEtleXMiLCJzdWJzZXRLZXkiLCJmaWVsZEV4cHJzIiwiZmllbGRFeHByc1RvUHJvcE5vZGVzIiwiayJdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWUEsT0FBTyxZQUFZO0FBRS9CLFNBQVNDLGFBQWEsUUFBUSxpQ0FBOEI7QUFHNUQsU0FBU0Msb0JBQW9CLEVBQUVDLGdCQUFnQixRQUFRLCtCQUE0QjtBQUNuRixTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFDdkMsU0FBU0MsV0FBVyxRQUFRLHVCQUFvQjtBQUNoRCxTQUFTQyxNQUFNLFFBQVEscUJBQVk7QUFPbkMsT0FBTyxNQUFNQyw0QkFBNEJIO0lBQ3ZDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBSSxtQkFBbUI7UUFDakIsTUFBTSxFQUFFQyxHQUFHLEVBQUUsR0FBR0gsT0FBT0ksTUFBTSxDQUFDQyxHQUFHO1FBRWpDLE9BQU87WUFDTEMsUUFBUSxHQUFHSCxJQUFJLGdCQUFnQixDQUFDO1lBQ2hDSSxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDN0I7SUFDRjtJQUVBQyxPQUFPLEVBQWdDLEVBQUU7UUFDdkMsTUFBTUMsWUFBWWQsY0FBY2UsU0FBUztRQUN6QyxNQUFNQyxXQUFXRixVQUFVRyxHQUFHLENBQUMsQ0FBQ0MsS0FBT2xCLGNBQWNtQixHQUFHLENBQUNEO1FBRXpELG1CQUFtQjtRQUNuQixNQUFNRSxjQUFjSixTQUNqQkMsR0FBRyxDQUFDLENBQUNJO1lBQ0os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
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
- import { TemplateOptions } from "../types/types";
3
- import { ExtendedApi } from "../api/decorators";
4
- import { Template } from "./base-template";
2
+ import { TemplateOptions } from "../../types/types";
3
+ import { ExtendedApi } from "../../api/decorators";
4
+ import { Template } from "../template";
5
5
  export declare class Template__generated_http extends Template {
6
6
  constructor();
7
7
  getTargetAndPath(): {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated_http.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated_http.template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIvC,qBAAa,wBAAyB,SAAQ,QAAQ;;IAKpD,gBAAgB;;;;IASV,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,gBAAgB,CAAC;;;;;;IAwDlD,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAoFvE,gBAAgB,CACd,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;KAAE,GACnD;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE;CAc9B"}