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,141 @@
1
+ import path from "path";
2
+ import { Sonamu } from "../api/sonamu.js";
3
+ import { AlreadyProcessedException } from "../exceptions/so-exceptions.js";
4
+ import { everyAsync, filterAsync } from "../utils/async-utils.js";
5
+ import { exists } from "../utils/fs-utils.js";
6
+ import chalk from "chalk";
7
+ import { mkdir, writeFile } from "node:fs/promises";
8
+ import * as _ from "lodash-es";
9
+ import { Template } from "../template/template.js";
10
+ import { EntityManager } from "../entity/entity-manager.js";
11
+ import { wrapIf } from "../utils/lodash-able.js";
12
+ import prettier from "prettier";
13
+ /**
14
+ * 템플릿을 렌더링하고 파일로 생성합니다.
15
+ * overwrite 옵션이 false인 경우, 이미 존재하는 파일은 건너뜁니다.
16
+ * @param key - 템플릿 키 (예: "entity", "model", "service" 등)
17
+ * @param templateOptions - 템플릿 렌더링에 필요한 옵션
18
+ * @param _generateOptions - 생성 옵션 (overwrite 여부)
19
+ * @returns 생성된 파일 경로 배열
20
+ */ export async function generateTemplate(key, templateOptions, _generateOptions) {
21
+ const generateOptions = {
22
+ overwrite: false,
23
+ ..._generateOptions
24
+ };
25
+ // 키 children
26
+ const keys = [
27
+ key
28
+ ];
29
+ // 템플릿 렌더
30
+ const pathAndCodes = (await Promise.all(keys.map(async (key)=>{
31
+ return await renderTemplate(key, templateOptions);
32
+ }))).flat();
33
+ const filteredPathAndCodes = await (async ()=>{
34
+ if (generateOptions.overwrite === true) {
35
+ return pathAndCodes;
36
+ } else {
37
+ return await filterAsync(pathAndCodes, async (pathAndCode)=>{
38
+ const { targets } = Sonamu.config.sync;
39
+ const filePath = `${Sonamu.appRootPath}/${pathAndCode.path}`;
40
+ const dstFilePaths = targets.map((target)=>filePath.replace("/:target/", `/${target}/`));
41
+ return await everyAsync(dstFilePaths, async (dstPath)=>!await exists(dstPath));
42
+ });
43
+ }
44
+ })();
45
+ if (filteredPathAndCodes.length === 0) {
46
+ throw new AlreadyProcessedException("이미 경로에 모든 파일이 존재합니다.");
47
+ }
48
+ return (await Promise.all(filteredPathAndCodes.map((pathAndCode)=>writeCodeToPathEachTarget(pathAndCode)))).flat();
49
+ }
50
+ /**
51
+ * 템플릿을 렌더링하여 PathAndCode 객체를 반환합니다.
52
+ * 파일로 쓰지 않고 메모리상에서만 렌더링합니다.
53
+ * @param key - 템플릿 키
54
+ * @param options - 템플릿 렌더링 옵션
55
+ * @returns 경로와 코드 쌍의 배열
56
+ */ export async function renderTemplate(key, options) {
57
+ const template = Template.find(key);
58
+ const rendered = await template.render(options);
59
+ const resolved = await resolveRenderedTemplate(key, rendered);
60
+ let preTemplateResolved = [];
61
+ if (rendered.preTemplates) {
62
+ preTemplateResolved = (await Promise.all(rendered.preTemplates.map(({ key, options })=>{
63
+ return renderTemplate(key, options);
64
+ }))).flat();
65
+ }
66
+ return [
67
+ resolved,
68
+ ...preTemplateResolved
69
+ ];
70
+ }
71
+ async function resolveRenderedTemplate(key, result) {
72
+ const { target, path: filePath, body, importKeys, customHeaders } = result;
73
+ // import 할 대상의 대상 path 추출
74
+ const importDefs = importKeys.reduce((r, importKey)=>{
75
+ const modulePath = EntityManager.getModulePath(importKey);
76
+ let importPath = modulePath;
77
+ if (modulePath.includes("/") || modulePath.includes(".")) {
78
+ importPath = wrapIf(path.relative(path.dirname(filePath), modulePath), (p)=>[
79
+ p.startsWith(".") === false,
80
+ "./" + p
81
+ ]);
82
+ }
83
+ // 같은 파일에서 import 하는 경우 keys 로 나열 처리
84
+ const existsOne = r.find((importDef)=>importDef.from === importPath);
85
+ if (existsOne) {
86
+ existsOne.keys = _.uniq(existsOne.keys.concat(importKey));
87
+ } else {
88
+ r.push({
89
+ keys: [
90
+ importKey
91
+ ],
92
+ from: importPath
93
+ });
94
+ }
95
+ return r;
96
+ }, [])// 셀프 참조 방지
97
+ .filter((importDef)=>filePath.endsWith(importDef.from.replace("./", "") + ".ts") === false);
98
+ // 커스텀 헤더 포함하여 헤더 생성
99
+ const header = [
100
+ ...customHeaders ?? [],
101
+ ...importDefs.map((importDef)=>`import { ${importDef.keys.join(", ")} } from '${importDef.from}'`)
102
+ ].join("\n");
103
+ const formatted = await (async ()=>{
104
+ if (key === "generated_http") {
105
+ return [
106
+ header,
107
+ body
108
+ ].join("\n\n");
109
+ } else {
110
+ return prettier.format([
111
+ header,
112
+ body
113
+ ].join("\n\n"), {
114
+ parser: key === "entity" ? "json" : "typescript"
115
+ });
116
+ }
117
+ })();
118
+ return {
119
+ path: target + "/" + filePath,
120
+ code: formatted
121
+ };
122
+ }
123
+ async function writeCodeToPathEachTarget(pathAndCode) {
124
+ const { targets } = Sonamu.config.sync;
125
+ const { appRootPath } = Sonamu;
126
+ const filePath = `${Sonamu.appRootPath}/${pathAndCode.path}`;
127
+ const dstFilePaths = _.uniq(targets.map((target)=>filePath.replace("/:target/", `/${target}/`)));
128
+ return await Promise.all(dstFilePaths.map(async (dstFilePath)=>{
129
+ const dir = path.dirname(dstFilePath);
130
+ if (!await exists(dir)) {
131
+ await mkdir(dir, {
132
+ recursive: true
133
+ });
134
+ }
135
+ await writeFile(dstFilePath, pathAndCode.code);
136
+ console.log(chalk.bold("Generated: ") + chalk.blue(`${dstFilePath.replace(appRootPath + "/", "")}`));
137
+ return dstFilePath;
138
+ }));
139
+ }
140
+
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHtcbiAgR2VuZXJhdGVPcHRpb25zLFxuICBQYXRoQW5kQ29kZSxcbiAgVGVtcGxhdGVLZXksXG4gIFRlbXBsYXRlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgd3JhcElmIH0gZnJvbSBcIi4uL3V0aWxzL2xvZGFzaC1hYmxlXCI7XG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgdGVtcGxhdGVPcHRpb25zOiBhbnksXG4gIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnNcbik6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgY29uc3QgZ2VuZXJhdGVPcHRpb25zID0ge1xuICAgIG92ZXJ3cml0ZTogZmFsc2UsXG4gICAgLi4uX2dlbmVyYXRlT3B0aW9ucyxcbiAgfTtcblxuICAvLyDtgqQgY2hpbGRyZW5cbiAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFtrZXldO1xuXG4gIC8vIO2FnO2UjOumvyDroIzrjZRcbiAgY29uc3QgcGF0aEFuZENvZGVzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAga2V5cy5tYXAoYXN5bmMgKGtleSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICAgICAgfSlcbiAgICApXG4gICkuZmxhdCgpO1xuXG4gIGNvbnN0IGZpbHRlcmVkUGF0aEFuZENvZGVzOiBQYXRoQW5kQ29kZVtdID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoZ2VuZXJhdGVPcHRpb25zLm92ZXJ3cml0ZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHBhdGhBbmRDb2RlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IGZpbHRlckFzeW5jKHBhdGhBbmRDb2RlcywgYXN5bmMgKHBhdGhBbmRDb2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWA7XG4gICAgICAgIGNvbnN0IGRzdEZpbGVQYXRocyA9IHRhcmdldHMubWFwKCh0YXJnZXQpID0+XG4gICAgICAgICAgZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYXdhaXQgZXZlcnlBc3luYyhcbiAgICAgICAgICBkc3RGaWxlUGF0aHMsXG4gICAgICAgICAgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KSgpO1xuICBcbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFwi7J2066+4IOqyveuhnOyXkCDrqqjrk6Ag7YyM7J287J20IOyhtOyerO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbHRlcmVkUGF0aEFuZENvZGVzLm1hcCgocGF0aEFuZENvZGUpID0+IHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGUpKVxuICApKS5mbGF0KCk7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J2EIOugjOuNlOunge2VmOyXrCBQYXRoQW5kQ29kZSDqsJ3ssrTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICog7YyM7J2866GcIOyTsOyngCDslYrqs6Ag66mU66qo66as7IOB7JeQ7ISc66eMIOugjOuNlOunge2VqeuLiOuLpC5cbiAqIEBwYXJhbSBrZXkgLSDthZztlIzrpr8g7YKkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIO2FnO2UjOumvyDroIzrjZTrp4Eg7Ji17IWYXG4gKiBAcmV0dXJucyDqsr3roZzsmYAg7L2U65OcIOyMjeydmCDrsLDsl7RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICBrZXk6IFQsXG4gIG9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXVxuKTogUHJvbWlzZTxQYXRoQW5kQ29kZVtdPiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZmluZChrZXkpO1xuXG4gIGNvbnN0IHJlbmRlcmVkID0gYXdhaXQgdGVtcGxhdGUucmVuZGVyKG9wdGlvbnMpO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlKGtleSwgcmVuZGVyZWQpO1xuXG4gIGxldCBwcmVUZW1wbGF0ZVJlc29sdmVkOiBQYXRoQW5kQ29kZVtdID0gW107XG4gIGlmIChyZW5kZXJlZC5wcmVUZW1wbGF0ZXMpIHtcbiAgICBwcmVUZW1wbGF0ZVJlc29sdmVkID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJlbmRlcmVkLnByZVRlbXBsYXRlcy5tYXAoKHsga2V5LCBvcHRpb25zIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVuZGVyVGVtcGxhdGUoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzb2x2ZWQsIC4uLnByZVRlbXBsYXRlUmVzb2x2ZWRdO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgcmVzdWx0OiBSZW5kZXJlZFRlbXBsYXRlXG4pOiBQcm9taXNlPFBhdGhBbmRDb2RlPiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBmaWxlUGF0aCwgYm9keSwgaW1wb3J0S2V5cywgY3VzdG9tSGVhZGVycyB9ID0gcmVzdWx0O1xuXG4gIC8vIGltcG9ydCDtlaAg64yA7IOB7J2YIOuMgOyDgSBwYXRoIOy2lOy2nFxuICBjb25zdCBpbXBvcnREZWZzID0gaW1wb3J0S2V5c1xuICAgIC5yZWR1Y2UoXG4gICAgICAociwgaW1wb3J0S2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoaW1wb3J0S2V5KTtcbiAgICAgICAgbGV0IGltcG9ydFBhdGggPSBtb2R1bGVQYXRoO1xuICAgICAgICBpZiAobW9kdWxlUGF0aC5pbmNsdWRlcyhcIi9cIikgfHwgbW9kdWxlUGF0aC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICBpbXBvcnRQYXRoID0gd3JhcElmKFxuICAgICAgICAgICAgcGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBtb2R1bGVQYXRoKSxcbiAgICAgICAgICAgIChwKSA9PiBbcC5zdGFydHNXaXRoKFwiLlwiKSA9PT0gZmFsc2UsIFwiLi9cIiArIHBdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOqwmeydgCDtjIzsnbzsl5DshJwgaW1wb3J0IO2VmOuKlCDqsr3smrAga2V5cyDroZwg64KY7Je0IOyymOumrFxuICAgICAgICBjb25zdCBleGlzdHNPbmUgPSByLmZpbmQoKGltcG9ydERlZikgPT4gaW1wb3J0RGVmLmZyb20gPT09IGltcG9ydFBhdGgpO1xuICAgICAgICBpZiAoZXhpc3RzT25lKSB7XG4gICAgICAgICAgZXhpc3RzT25lLmtleXMgPSBfLnVuaXEoZXhpc3RzT25lLmtleXMuY29uY2F0KGltcG9ydEtleSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHIucHVzaCh7XG4gICAgICAgICAgICBrZXlzOiBbaW1wb3J0S2V5XSxcbiAgICAgICAgICAgIGZyb206IGltcG9ydFBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAgW10gYXMge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgfVtdXG4gICAgKVxuICAgIC8vIOyFgO2UhCDssLjsobAg67Cp7KeAXG4gICAgLmZpbHRlcihcbiAgICAgIChpbXBvcnREZWYpID0+XG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKGltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKSArIFwiLnRzXCIpID09PSBmYWxzZVxuICAgICk7XG5cbiAgLy8g7Luk7Iqk7YWAIO2XpOuNlCDtj6ztlajtlZjsl6wg7Zek642UIOyDneyEsVxuICBjb25zdCBoZWFkZXIgPSBbXG4gICAgLi4uKGN1c3RvbUhlYWRlcnMgPz8gW10pLFxuICAgIC4uLmltcG9ydERlZnMubWFwKFxuICAgICAgKGltcG9ydERlZikgPT5cbiAgICAgICAgYGltcG9ydCB7ICR7aW1wb3J0RGVmLmtleXMuam9pbihcIiwgXCIpfSB9IGZyb20gJyR7aW1wb3J0RGVmLmZyb219J2BcbiAgICApLFxuICBdLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoa2V5ID09PSBcImdlbmVyYXRlZF9odHRwXCIpIHtcbiAgICAgIHJldHVybiBbaGVhZGVyLCBib2R5XS5qb2luKFwiXFxuXFxuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldHRpZXIuZm9ybWF0KFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIiksIHtcbiAgICAgICAgcGFyc2VyOiBrZXkgPT09IFwiZW50aXR5XCIgPyBcImpzb25cIiA6IFwidHlwZXNjcmlwdFwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiB7XG4gICAgcGF0aDogdGFyZ2V0ICsgXCIvXCIgKyBmaWxlUGF0aCxcbiAgICBjb2RlOiBmb3JtYXR0ZWQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQoXG4gIHBhdGhBbmRDb2RlOiBQYXRoQW5kQ29kZVxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBhcHBSb290UGF0aCB9ID0gU29uYW11O1xuICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWAgYXMgQWJzb2x1dGVQYXRoO1xuXG4gIGNvbnN0IGRzdEZpbGVQYXRocyA9IF8udW5pcShcbiAgICB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PlxuICAgICAgZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKVxuICAgICkgYXMgQWJzb2x1dGVQYXRoW11cbiAgKTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRzdEZpbGVQYXRocy5tYXAoYXN5bmMgKGRzdEZpbGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0RmlsZVBhdGgpO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZHN0RmlsZVBhdGgsIHBhdGhBbmRDb2RlLmNvZGUpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJvbGQoXCJHZW5lcmF0ZWQ6IFwiKSArXG4gICAgICAgICAgY2hhbGsuYmx1ZShgJHtkc3RGaWxlUGF0aC5yZXBsYWNlKGFwcFJvb3RQYXRoICsgXCIvXCIsIFwiXCIpfWApXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRzdEZpbGVQYXRoO1xuICAgIH0pXG4gICk7XG59XG4iXSwibmFtZXMiOlsicGF0aCIsIlNvbmFtdSIsIkFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24iLCJldmVyeUFzeW5jIiwiZmlsdGVyQXN5bmMiLCJleGlzdHMiLCJjaGFsayIsIm1rZGlyIiwid3JpdGVGaWxlIiwiXyIsIlRlbXBsYXRlIiwiRW50aXR5TWFuYWdlciIsIndyYXBJZiIsInByZXR0aWVyIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsImtleSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiLCJnZW5lcmF0ZU9wdGlvbnMiLCJvdmVyd3JpdGUiLCJrZXlzIiwicGF0aEFuZENvZGVzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsInJlbmRlclRlbXBsYXRlIiwiZmxhdCIsImZpbHRlcmVkUGF0aEFuZENvZGVzIiwicGF0aEFuZENvZGUiLCJ0YXJnZXRzIiwiY29uZmlnIiwic3luYyIsImZpbGVQYXRoIiwiYXBwUm9vdFBhdGgiLCJkc3RGaWxlUGF0aHMiLCJ0YXJnZXQiLCJyZXBsYWNlIiwiZHN0UGF0aCIsImxlbmd0aCIsIndyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQiLCJvcHRpb25zIiwidGVtcGxhdGUiLCJmaW5kIiwicmVuZGVyZWQiLCJyZW5kZXIiLCJyZXNvbHZlZCIsInJlc29sdmVSZW5kZXJlZFRlbXBsYXRlIiwicHJlVGVtcGxhdGVSZXNvbHZlZCIsInByZVRlbXBsYXRlcyIsInJlc3VsdCIsImJvZHkiLCJpbXBvcnRLZXlzIiwiY3VzdG9tSGVhZGVycyIsImltcG9ydERlZnMiLCJyZWR1Y2UiLCJyIiwiaW1wb3J0S2V5IiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJpbXBvcnRQYXRoIiwiaW5jbHVkZXMiLCJyZWxhdGl2ZSIsImRpcm5hbWUiLCJwIiwic3RhcnRzV2l0aCIsImV4aXN0c09uZSIsImltcG9ydERlZiIsImZyb20iLCJ1bmlxIiwiY29uY2F0IiwicHVzaCIsImZpbHRlciIsImVuZHNXaXRoIiwiaGVhZGVyIiwiam9pbiIsImZvcm1hdHRlZCIsImZvcm1hdCIsInBhcnNlciIsImNvZGUiLCJkc3RGaWxlUGF0aCIsImRpciIsInJlY3Vyc2l2ZSIsImNvbnNvbGUiLCJsb2ciLCJib2xkIiwiYmx1ZSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MseUJBQXlCLFFBQVEsaUNBQThCO0FBT3hFLFNBQVNDLFVBQVUsRUFBRUMsV0FBVyxRQUFRLDBCQUF1QjtBQUMvRCxTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBQzNDLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUMvQyxZQUFZQyxPQUFPLFlBQVk7QUFDL0IsU0FBU0MsUUFBUSxRQUFRLDBCQUF1QjtBQUVoRCxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQVNDLE1BQU0sUUFBUSwwQkFBdUI7QUFDOUMsT0FBT0MsY0FBYyxXQUFXO0FBR2hDOzs7Ozs7O0NBT0MsR0FDRCxPQUFPLGVBQWVDLGlCQUNwQkMsR0FBZ0IsRUFDaEJDLGVBQW9CLEVBQ3BCQyxnQkFBa0M7SUFFbEMsTUFBTUMsa0JBQWtCO1FBQ3RCQyxXQUFXO1FBQ1gsR0FBR0YsZ0JBQWdCO0lBQ3JCO0lBRUEsYUFBYTtJQUNiLE1BQU1HLE9BQXNCO1FBQUNMO0tBQUk7SUFFakMsU0FBUztJQUNULE1BQU1NLGVBQWUsQUFDbkIsQ0FBQSxNQUFNQyxRQUFRQyxHQUFHLENBQ2ZILEtBQUtJLEdBQUcsQ0FBQyxPQUFPVDtRQUNkLE9BQU8sTUFBTVUsZUFBZVYsS0FBS0M7SUFDbkMsR0FDRixFQUNBVSxJQUFJ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
@@ -0,0 +1,17 @@
1
+ import { TemplateOptions } from "../types/types";
2
+ /**
3
+ * 새로운 엔티티를 생성합니다.
4
+ * entityId는 반드시 CamelCase 형식이어야 합니다.
5
+ */
6
+ export declare function createEntity(form: Omit<TemplateOptions["entity"], "title"> & {
7
+ title?: string;
8
+ }): Promise<void>;
9
+ /**
10
+ * 엔티티를 삭제합니다.
11
+ * parentId가 있는 서브 엔티티의 경우 entity.json만 삭제하고,
12
+ * 루트 엔티티의 경우 디렉토리 전체와 타겟 디렉토리를 삭제합니다.
13
+ */
14
+ export declare function delEntity(entityId: string): Promise<{
15
+ delPaths: string[];
16
+ }>;
17
+ //# sourceMappingURL=entity-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-operations.d.ts","sourceRoot":"","sources":["../../src/syncer/entity-operations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKjD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,iBAUpE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkCjC"}
@@ -0,0 +1,58 @@
1
+ import { rm } from "node:fs/promises";
2
+ import { exists } from "../utils/fs-utils.js";
3
+ import chalk from "chalk";
4
+ import { EntityManager } from "../entity/entity-manager.js";
5
+ import { BadRequestException } from "../exceptions/so-exceptions.js";
6
+ import { Sonamu } from "../api/sonamu.js";
7
+ import { generateTemplate } from "./code-generator.js";
8
+ /**
9
+ * 새로운 엔티티를 생성합니다.
10
+ * entityId는 반드시 CamelCase 형식이어야 합니다.
11
+ */ export async function createEntity(form) {
12
+ if (!/^[A-Z][a-zA-Z0-9]*$/.test(form.entityId)) {
13
+ throw new BadRequestException("entityId는 CamelCase 형식이어야 합니다.");
14
+ }
15
+ await generateTemplate("entity", form);
16
+ // reload entities
17
+ await EntityManager.reload();
18
+ }
19
+ /**
20
+ * 엔티티를 삭제합니다.
21
+ * parentId가 있는 서브 엔티티의 경우 entity.json만 삭제하고,
22
+ * 루트 엔티티의 경우 디렉토리 전체와 타겟 디렉토리를 삭제합니다.
23
+ */ export async function delEntity(entityId) {
24
+ const entity = EntityManager.get(entityId);
25
+ const delPaths = (()=>{
26
+ if (entity.parentId) {
27
+ return [
28
+ `${Sonamu.apiRootPath}/src/application/${entity.names.parentFs}/${entity.names.fs}.entity.json`
29
+ ];
30
+ } else {
31
+ return [
32
+ `${Sonamu.apiRootPath}/src/application/${entity.names.fs}`,
33
+ `${Sonamu.apiRootPath}/dist/application/${entity.names.fs}`,
34
+ ...Sonamu.config.sync.targets.map((target)=>[
35
+ `${Sonamu.appRootPath}/${target}/src/services/${entity.names.fs}`
36
+ ]).flat()
37
+ ];
38
+ }
39
+ })(); // iife
40
+ for await (const delPath of delPaths){
41
+ if (await exists(delPath)) {
42
+ console.log(chalk.red(`DELETE ${delPath}`));
43
+ await rm(delPath, {
44
+ recursive: true,
45
+ force: true
46
+ });
47
+ } else {
48
+ console.log(chalk.yellow(`NOT_EXISTS ${delPath}`));
49
+ }
50
+ }
51
+ // reload entities
52
+ await EntityManager.reload();
53
+ return {
54
+ delPaths
55
+ };
56
+ }
57
+
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvZW50aXR5LW9wZXJhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcm0gfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0b3JcIjtcblxuLyoqXG4gKiDsg4jroZzsmrQg7JeU7Yuw7Yuw66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIGVudGl0eUlk64qUIOuwmOuTnOyLnCBDYW1lbENhc2Ug7ZiV7Iud7J207Ja07JW8IO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUVudGl0eShcbiAgZm9ybTogT21pdDxUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0sIFwidGl0bGVcIj4gJiB7IHRpdGxlPzogc3RyaW5nIH1cbikge1xuICBpZiAoIS9eW0EtWl1bYS16QS1aMC05XSokLy50ZXN0KGZvcm0uZW50aXR5SWQpKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXCJlbnRpdHlJZOuKlCBDYW1lbENhc2Ug7ZiV7Iud7J207Ja07JW8IO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiZW50aXR5XCIsIGZvcm0pO1xuXG4gIC8vIHJlbG9hZCBlbnRpdGllc1xuICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xufVxuXG4vKipcbiAqIOyXlO2LsO2LsOulvCDsgq3soJztlanri4jri6QuXG4gKiBwYXJlbnRJZOqwgCDsnojripQg7ISc67iMIOyXlO2LsO2LsOydmCDqsr3smrAgZW50aXR5Lmpzb27rp4wg7IKt7KCc7ZWY6rOgLFxuICog66Oo7Yq4IOyXlO2LsO2LsOydmCDqsr3smrAg65SU66CJ7Yag66asIOyghOyytOyZgCDtg4Dqsp8g65SU66CJ7Yag66as66W8IOyCreygnO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbEVudGl0eShcbiAgZW50aXR5SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICBjb25zdCBkZWxQYXRocyA9ICgoKSA9PiB7XG4gICAgaWYgKGVudGl0eS5wYXJlbnRJZCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMucGFyZW50RnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS5lbnRpdHkuanNvbmAsXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc31gLFxuICAgICAgICBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L2Rpc3QvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9YCxcbiAgICAgICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHNcbiAgICAgICAgICAubWFwKCh0YXJnZXQpID0+IFtcbiAgICAgICAgICAgIGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHt0YXJnZXR9L3NyYy9zZXJ2aWNlcy8ke2VudGl0eS5uYW1lcy5mc31gLFxuICAgICAgICAgIF0pXG4gICAgICAgICAgLmZsYXQoKSxcbiAgICAgIF07XG4gICAgfVxuICB9KSgpOyAvLyBpaWZlXG5cbiAgZm9yIGF3YWl0IChjb25zdCBkZWxQYXRoIG9mIGRlbFBhdGhzKSB7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhkZWxQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGBERUxFVEUgJHtkZWxQYXRofWApKTtcbiAgICAgIGF3YWl0IHJtKGRlbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGBOT1RfRVhJU1RTICR7ZGVsUGF0aH1gKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVsb2FkIGVudGl0aWVzXG4gIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgcmV0dXJuIHsgZGVsUGF0aHMgfTtcbn1cbiJdLCJuYW1lcyI6WyJybSIsImV4aXN0cyIsImNoYWxrIiwiRW50aXR5TWFuYWdlciIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJTb25hbXUiLCJnZW5lcmF0ZVRlbXBsYXRlIiwiY3JlYXRlRW50aXR5IiwiZm9ybSIsInRlc3QiLCJlbnRpdHlJZCIsInJlbG9hZCIsImRlbEVudGl0eSIsImVudGl0eSIsImdldCIsImRlbFBhdGhzIiwicGFyZW50SWQiLCJhcGlSb290UGF0aCIsIm5hbWVzIiwicGFyZW50RnMiLCJmcyIsImNvbmZpZyIsInN5bmMiLCJ0YXJnZXRzIiwibWFwIiwidGFyZ2V0IiwiYXBwUm9vdFBhdGgiLCJmbGF0IiwiZGVsUGF0aCIsImNvbnNvbGUiLCJsb2ciLCJyZWQiLCJyZWN1cnNpdmUiLCJmb3JjZSIsInllbGxvdyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsRUFBRSxRQUFRLG1CQUFjO0FBQ2pDLFNBQVNDLE1BQU0sUUFBUSx1QkFBb0I7QUFDM0MsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFFekQsU0FBU0MsbUJBQW1CLFFBQVEsaUNBQThCO0FBQ2xFLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsZ0JBQWdCLFFBQVEsc0JBQW1CO0FBRXBEOzs7Q0FHQyxHQUNELE9BQU8sZUFBZUMsYUFDcEJDLElBQW1FO0lBRW5FLElBQUksQ0FBQyxzQkFBc0JDLElBQUksQ0FBQ0QsS0FBS0UsUUFBUSxHQUFHO1FBQzlDLE1BQU0sSUFBSU4sb0JBQW9CO0lBQ2hDO0lBRUEsTUFBTUUsaUJBQWlCLFVBQVVFO0lBRWpDLGtCQUFrQjtJQUNsQixNQUFNTCxjQUFjUSxNQUFNO0FBQzVCO0FBRUE7Ozs7Q0FJQyxHQUNELE9BQU8sZUFBZUMsVUFDcEJGLFFBQWdCO0lBRWhCLE1BQU1HLFNBQVNWLGNBQWNXLEdBQUcsQ0FBQ0o7SUFFakMsTUFBTUssV0FBVyxBQUFDLENBQUE7UUFDaEIsSUFBSUYsT0FBT0csUUFBUSxFQUFFO1lBQ25CLE9BQU87Z0JBQ0wsR0FBR1gsT0FBT1ksV0FBVyxDQUFDLGlCQUFpQixFQUFFSixPQUFPSyxLQUFLLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQUVOLE9BQU9LLEtBQUssQ0FBQ0UsRUFBRSxDQUFDLFlBQVksQ0FBQzthQUNoRztRQUNILE9BQU87WUFDTCxPQUFPO2dCQUNMLEdBQUdmLE9BQU9ZLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRUosT0FBT0ssS0FBSyxDQUFDRSxFQUFFLEVBQUU7Z0JBQzFELEdBQUdmLE9BQU9ZLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRUosT0FBT0ssS0FBSyxDQUFDRSxFQUFFLEVBQUU7bUJBQ3hEZixPQUFPZ0IsTUFBTSxDQUFDQyxJQUFJLENBQUNDLE9BQU8sQ0FDMUJDLEdBQUcsQ0FBQyxDQUFDQyxTQUFXO3dCQUNmLEdBQUdwQixPQUFPcUIsV0FBVyxDQUFDLENBQUMsRUFBRUQsT0FBTyxjQUFjLEVBQUVaLE9BQU9LLEtBQUssQ0FBQ0UsRUFBRSxFQUFFO3FCQUNsRSxFQUNBTyxJQUFJO2FBQ1I7UUFDSDtJQUNGLENBQUEsS0FBTSxPQUFPO0lBRWIsV0FBVyxNQUFNQyxXQUFXYixTQUFVO1FBQ3BDLElBQUksTUFBTWQsT0FBTzJCLFVBQVU7WUFDekJDLFFBQVFDLEdBQUcsQ0FBQzVCLE1BQU02QixHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUVILFNBQVM7WUFDekMsTUFBTTVCLEdBQUc0QixTQUFTO2dCQUFFSSxXQUFXO2dCQUFNQyxPQUFPO1lBQUs7UUFDbkQsT0FBTztZQUNMSixRQUFRQyxHQUFHLENBQUM1QixNQUFNZ0MsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFTixTQUFTO1FBQ2xEO0lBQ0Y7SUFFQSxrQkFBa0I7SUFDbEIsTUFBTXpCLGNBQWNRLE1BQU07SUFFMUIsT0FBTztRQUFFSTtJQUFTO0FBQ3BCIn0=
@@ -0,0 +1,29 @@
1
+ import { AbsolutePath, ApiRelativePath } from "../utils/path-utils";
2
+ export type FileType = "model" | "types" | "functions" | "generated" | "entity" | "frame" | "config";
3
+ export type GlobPattern<T extends ApiRelativePath | AbsolutePath> = {
4
+ [key in FileType]: T;
5
+ };
6
+ /**
7
+ * Syncer가 관심 가지고 지켜보는 파일들입니다.
8
+ * 이 파일들에 변경이 생기면 추가적인 작업(이하 "싱크" 또는 "싱크 액션")을 수행합니다.
9
+ * 이 작업이라 함은 파일 복사 또는 템플릿 렌더링을 통한 code generation을 의미합니다.
10
+ *
11
+ * **경로 형식**: API 상대 경로 (src/로 시작)
12
+ * **사용**: getChecksumPatternGroupInAbsolutePath()로 절대 경로 변환 후 glob 사용
13
+ */
14
+ export declare const checksumPatternGroup: GlobPattern<ApiRelativePath>;
15
+ /**
16
+ * API 상대 경로 패턴을 절대 경로 패턴으로 변환합니다.
17
+ *
18
+ * **목적**: Glob 패턴을 파일시스템에서 사용할 수 있는 절대 경로로 변환
19
+ *
20
+ * **사용처**: checksum.ts에서 실제 파일을 찾을 때
21
+ *
22
+ * @returns 절대 경로 기반 Glob 패턴 맵
23
+ *
24
+ * @example
25
+ * // 입력: { entity: "src/application/**\/*.entity.json" }
26
+ * // 출력: { entity: "/Users/.../api/src/application/**\/*.entity.json" }
27
+ */
28
+ export declare function getChecksumPatternGroupInAbsolutePath(): GlobPattern<AbsolutePath>;
29
+ //# sourceMappingURL=file-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-patterns.d.ts","sourceRoot":"","sources":["../../src/syncer/file-patterns.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,OAAO,GACP,WAAW,GACX,WAAW,GACX,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,YAAY,IAAI;KACjE,GAAG,IAAI,QAAQ,GAAG,CAAC;CACrB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAQ7D,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,qCAAqC,IAAI,WAAW,CAAC,YAAY,CAAC,CAOjF"}
@@ -0,0 +1,38 @@
1
+ import path from "path";
2
+ import { Sonamu } from "../api/sonamu.js";
3
+ /**
4
+ * Syncer가 관심 가지고 지켜보는 파일들입니다.
5
+ * 이 파일들에 변경이 생기면 추가적인 작업(이하 "싱크" 또는 "싱크 액션")을 수행합니다.
6
+ * 이 작업이라 함은 파일 복사 또는 템플릿 렌더링을 통한 code generation을 의미합니다.
7
+ *
8
+ * **경로 형식**: API 상대 경로 (src/로 시작)
9
+ * **사용**: getChecksumPatternGroupInAbsolutePath()로 절대 경로 변환 후 glob 사용
10
+ */ export const checksumPatternGroup = {
11
+ entity: "src/application/**/*.entity.json",
12
+ types: "src/application/**/*.types.ts",
13
+ generated: "src/application/sonamu.generated.ts",
14
+ model: "src/application/**/*.model.ts",
15
+ frame: "src/application/**/*.frame.ts",
16
+ functions: "src/application/**/*.functions.ts",
17
+ config: "sonamu.config.ts"
18
+ };
19
+ /**
20
+ * API 상대 경로 패턴을 절대 경로 패턴으로 변환합니다.
21
+ *
22
+ * **목적**: Glob 패턴을 파일시스템에서 사용할 수 있는 절대 경로로 변환
23
+ *
24
+ * **사용처**: checksum.ts에서 실제 파일을 찾을 때
25
+ *
26
+ * @returns 절대 경로 기반 Glob 패턴 맵
27
+ *
28
+ * @example
29
+ * // 입력: { entity: "src/application/**\/*.entity.json" }
30
+ * // 출력: { entity: "/Users/.../api/src/application/**\/*.entity.json" }
31
+ */ export function getChecksumPatternGroupInAbsolutePath() {
32
+ return Object.fromEntries(Object.entries(checksumPatternGroup).map(([key, value])=>[
33
+ key,
34
+ path.join(Sonamu.apiRootPath, value)
35
+ ]));
36
+ }
37
+
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvZmlsZS1wYXR0ZXJucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEFic29sdXRlUGF0aCwgQXBpUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgRmlsZVR5cGUgPVxuICB8IFwibW9kZWxcIlxuICB8IFwidHlwZXNcIlxuICB8IFwiZnVuY3Rpb25zXCJcbiAgfCBcImdlbmVyYXRlZFwiXG4gIHwgXCJlbnRpdHlcIlxuICB8IFwiZnJhbWVcIlxuICB8IFwiY29uZmlnXCI7XG5cbmV4cG9ydCB0eXBlIEdsb2JQYXR0ZXJuPFQgZXh0ZW5kcyBBcGlSZWxhdGl2ZVBhdGggfCBBYnNvbHV0ZVBhdGg+ID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogVDtcbn07XG5cbi8qKlxuICogU3luY2Vy6rCAIOq0gOyLrCDqsIDsp4Dqs6Ag7KeA7Lyc67O064qUIO2MjOydvOuTpOyeheuLiOuLpC5cbiAqIOydtCDtjIzsnbzrk6Tsl5Ag67OA6rK97J20IOyDneq4sOuptCDstpTqsIDsoIHsnbgg7J6R7JeFKOydtO2VmCBcIuyLse2BrFwiIOuYkOuKlCBcIuyLse2BrCDslaHshZhcIinsnYQg7IiY7ZaJ7ZWp64uI64ukLlxuICog7J20IOyekeyXheydtOudvCDtlajsnYAg7YyM7J28IOuzteyCrCDrmJDripQg7YWc7ZSM66a/IOugjOuNlOungeydhCDthrXtlZwgY29kZSBnZW5lcmF0aW9u7J2EIOydmOuvuO2VqeuLiOuLpC5cbiAqXG4gKiAqKuqyveuhnCDtmJXsi50qKjogQVBJIOyDgeuMgCDqsr3roZwgKHNyYy/roZwg7Iuc7J6RKVxuICogKirsgqzsmqkqKjogZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgp66GcIOygiOuMgCDqsr3roZwg67OA7ZmYIO2bhCBnbG9iIOyCrOyaqVxuICovXG5leHBvcnQgY29uc3QgY2hlY2tzdW1QYXR0ZXJuR3JvdXA6IEdsb2JQYXR0ZXJuPEFwaVJlbGF0aXZlUGF0aD4gPSB7XG4gIGVudGl0eTogXCJzcmMvYXBwbGljYXRpb24vKiovKi5lbnRpdHkuanNvblwiLFxuICB0eXBlczogXCJzcmMvYXBwbGljYXRpb24vKiovKi50eXBlcy50c1wiLFxuICBnZW5lcmF0ZWQ6IFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIixcbiAgbW9kZWw6IFwic3JjL2FwcGxpY2F0aW9uLyoqLyoubW9kZWwudHNcIixcbiAgZnJhbWU6IFwic3JjL2FwcGxpY2F0aW9uLyoqLyouZnJhbWUudHNcIixcbiAgZnVuY3Rpb25zOiBcInNyYy9hcHBsaWNhdGlvbi8qKi8qLmZ1bmN0aW9ucy50c1wiLFxuICBjb25maWc6IFwic29uYW11LmNvbmZpZy50c1wiLFxufTtcblxuLyoqXG4gKiBBUEkg7IOB64yAIOqyveuhnCDtjKjthLTsnYQg7KCI64yAIOqyveuhnCDtjKjthLTsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICpcbiAqICoq66qp7KCBKio6IEdsb2Ig7Yyo7YS07J2EIO2MjOydvOyLnOyKpO2FnOyXkOyEnCDsgqzsmqntlaAg7IiYIOyeiOuKlCDsoIjrjIAg6rK966Gc66GcIOuzgO2ZmFxuICpcbiAqICoq7IKs7Jqp7LKYKio6IGNoZWNrc3VtLnRz7JeQ7IScIOyLpOygnCDtjIzsnbzsnYQg7LC+7J2EIOuVjFxuICpcbiAqIEByZXR1cm5zIOygiOuMgCDqsr3roZwg6riw67CYIEdsb2Ig7Yyo7YS0IOuntVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyDsnoXroKU6IHsgZW50aXR5OiBcInNyYy9hcHBsaWNhdGlvbi8qKlxcLyouZW50aXR5Lmpzb25cIiB9XG4gKiAvLyDstpzroKU6IHsgZW50aXR5OiBcIi9Vc2Vycy8uLi4vYXBpL3NyYy9hcHBsaWNhdGlvbi8qKlxcLyouZW50aXR5Lmpzb25cIiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk6IEdsb2JQYXR0ZXJuPEFic29sdXRlUGF0aD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGNoZWNrc3VtUGF0dGVybkdyb3VwKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgdmFsdWUpLCAvLyBBUEkg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgIF0pXG4gICkgYXMgR2xvYlBhdHRlcm48QWJzb2x1dGVQYXRoPjtcbn1cbiJdLCJuYW1lcyI6WyJwYXRoIiwiU29uYW11IiwiY2hlY2tzdW1QYXR0ZXJuR3JvdXAiLCJlbnRpdHkiLCJ0eXBlcyIsImdlbmVyYXRlZCIsIm1vZGVsIiwiZnJhbWUiLCJmdW5jdGlvbnMiLCJjb25maWciLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwibWFwIiwia2V5IiwidmFsdWUiLCJqb2luIiwiYXBpUm9vdFBhdGgiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFVBQVUsT0FBTztBQUN4QixTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBZ0J2Qzs7Ozs7OztDQU9DLEdBQ0QsT0FBTyxNQUFNQyx1QkFBcUQ7SUFDaEVDLFFBQVE7SUFDUkMsT0FBTztJQUNQQyxXQUFXO0lBQ1hDLE9BQU87SUFDUEMsT0FBTztJQUNQQyxXQUFXO0lBQ1hDLFFBQVE7QUFDVixFQUFFO0FBRUY7Ozs7Ozs7Ozs7OztDQVlDLEdBQ0QsT0FBTyxTQUFTQztJQUNkLE9BQU9DLE9BQU9DLFdBQVcsQ0FDdkJELE9BQU9FLE9BQU8sQ0FBQ1gsc0JBQXNCWSxHQUFHLENBQUMsQ0FBQyxDQUFDQyxLQUFLQyxNQUFNLEdBQUs7WUFDekREO1lBQ0FmLEtBQUtpQixJQUFJLENBQUNoQixPQUFPaUIsV0FBVyxFQUFFRjtTQUMvQjtBQUVMIn0=
@@ -1,2 +1,8 @@
1
1
  export * from "./syncer";
2
+ export * from "./code-generator";
3
+ export * from "./module-loader";
4
+ export * from "./entity-operations";
5
+ export * from "./file-patterns";
6
+ export * from "./checksum";
7
+ export * from "./api-parser";
2
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/syncer/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/syncer/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -1,2 +1,9 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./syncer"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
2
- //# sourceMappingURL=index.js.map
1
+ export * from "./syncer.js";
2
+ export * from "./code-generator.js";
3
+ export * from "./module-loader.js";
4
+ export * from "./entity-operations.js";
5
+ export * from "./file-patterns.js";
6
+ export * from "./checksum.js";
7
+ export * from "./api-parser.js";
8
+
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc3luY2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5LW9wZXJhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NoZWNrc3VtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGktcGFyc2VyXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFXO0FBQ3pCLGNBQWMsc0JBQW1CO0FBQ2pDLGNBQWMscUJBQWtCO0FBQ2hDLGNBQWMseUJBQXNCO0FBQ3BDLGNBQWMscUJBQWtCO0FBQ2hDLGNBQWMsZ0JBQWE7QUFDM0IsY0FBYyxrQkFBZSJ9
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ import { BaseFrameClass } from "../api/base-frame";
3
+ import { BaseModelClass } from "../database/base-model";
4
+ import { ApiParam, ApiParamType } from "../types/types";
5
+ import { ApiDecoratorOptions } from "../api/decorators";
6
+ export type LoadedApis = {
7
+ typeParameters: ApiParamType.TypeParam[];
8
+ parameters: ApiParam[];
9
+ returnType: ApiParamType;
10
+ modelName: string;
11
+ methodName: string;
12
+ path: string;
13
+ options: ApiDecoratorOptions;
14
+ }[];
15
+ export type LoadedTypes = {
16
+ [typeName: string]: z.ZodObject<any>;
17
+ };
18
+ export type LoadedModels = {
19
+ [modelName: string]: BaseModelClass | BaseFrameClass;
20
+ };
21
+ /**
22
+ * *.model.ts와 *.frame.ts 파일들에서 API 메소드를 파싱하여 로드합니다.
23
+ * registeredApis에 API가 등록되어 있어야 하기 때문에, *.model.ts 파일들을 먼저 import해야 합니다.
24
+ * 따라서 loadModels()를 먼저 호출해야 합니다.
25
+ */
26
+ export declare function loadApis(): Promise<LoadedApis>;
27
+ /**
28
+ * *.model.ts와 *.frame.ts 파일들에서 Model/Frame 클래스 인스턴스를 로드합니다.
29
+ */
30
+ export declare function loadModels(): Promise<LoadedModels>;
31
+ /**
32
+ * *.types.ts와 *.generated.ts 파일들에서 Zod 스키마를 로드합니다.
33
+ */
34
+ export declare function loadTypes(): Promise<LoadedTypes>;
35
+ //# sourceMappingURL=module-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-loader.d.ts","sourceRoot":"","sources":["../../src/syncer/module-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG;IACvB,cAAc,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;IACzC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;CAC9B,EAAE,CAAC;AAEJ,MAAM,MAAM,WAAW,GAAG;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,cAAc,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAuBpD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,CA4BxD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,CA8BtD"}
@@ -0,0 +1,82 @@
1
+ import path from "path";
2
+ import { globAsync } from "../utils/async-utils.js";
3
+ import { importMembers } from "../utils/esm-utils.js";
4
+ import { z } from "zod";
5
+ import { Sonamu } from "../api/sonamu.js";
6
+ import { readApisFromFile } from "./api-parser.js";
7
+ import { runtimePath } from "../utils/path-utils.js";
8
+ /**
9
+ * *.model.ts와 *.frame.ts 파일들에서 API 메소드를 파싱하여 로드합니다.
10
+ * registeredApis에 API가 등록되어 있어야 하기 때문에, *.model.ts 파일들을 먼저 import해야 합니다.
11
+ * 따라서 loadModels()를 먼저 호출해야 합니다.
12
+ */ export async function loadApis() {
13
+ // 얘는 특이하게도 환경에 따라 .ts나 .js를 import하는 경우가 아니고,
14
+ // 타입이 살아있는 .ts 소스 코드만을 읽어야 합니다.
15
+ // 이것은 dev서버(hot reload)가 아닌 production 환경에서도 동일합니다.
16
+ // 모델들의 .ts 파일이 있어야 이를 읽어서 라우트를 등록할 수 있어요!
17
+ const modelPathsPattern = path.join(Sonamu.apiRootPath, "src/application/**/*.{model,frame}.ts" // !! runtimePath 안 씀 주의 !!
18
+ );
19
+ const modelPaths = await globAsync(modelPathsPattern);
20
+ const apis = [];
21
+ let count = 0;
22
+ for (const filePath of modelPaths){
23
+ const parsedApis = await readApisFromFile(filePath);
24
+ apis.push(...parsedApis);
25
+ count++;
26
+ }
27
+ // console.log(
28
+ // chalk.gray(`[Loading] Loaded APIs from "*.model.ts" files: ${count} files.`)
29
+ // );
30
+ return apis;
31
+ }
32
+ /**
33
+ * *.model.ts와 *.frame.ts 파일들에서 Model/Frame 클래스 인스턴스를 로드합니다.
34
+ */ export async function loadModels() {
35
+ const modelPathsPattern = path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.{model,frame}.ts"));
36
+ const modelPaths = await globAsync(modelPathsPattern);
37
+ const models = {};
38
+ let count = 0;
39
+ for (const filePath of modelPaths){
40
+ const importedMembers = await importMembers(filePath);
41
+ for (const { name, value } of importedMembers){
42
+ if (name.endsWith("Model") || name.endsWith("Frame")) {
43
+ models[name] = value;
44
+ }
45
+ }
46
+ count++;
47
+ }
48
+ // console.log(
49
+ // chalk.gray(
50
+ // `[Loading] Loaded model/frame instances from ${runtimePath("*.{model,frame}.ts")} files: ${count} files.`
51
+ // )
52
+ // );
53
+ return models;
54
+ }
55
+ /**
56
+ * *.types.ts와 *.generated.ts 파일들에서 Zod 스키마를 로드합니다.
57
+ */ export async function loadTypes() {
58
+ const typePathsPatterns = [
59
+ path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.types.ts")),
60
+ path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.generated.ts"))
61
+ ];
62
+ const typePaths = (await Promise.all(typePathsPatterns.map(globAsync))).flat();
63
+ const types = {};
64
+ let count = 0;
65
+ for (const filePath of typePaths){
66
+ const importedMembers = await importMembers(filePath);
67
+ for (const { name, value } of importedMembers){
68
+ if (value instanceof z.ZodObject) {
69
+ types[name] = value;
70
+ }
71
+ }
72
+ count++;
73
+ }
74
+ // console.log(
75
+ // chalk.gray(
76
+ // `[Loading] Loaded zod types from ${runtimePath("*.types.ts")} and ${runtimePath("*.generated.ts")} files: ${count} files.`
77
+ // )
78
+ // );
79
+ return types;
80
+ }
81
+
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvbW9kdWxlLWxvYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ2xvYkFzeW5jIH0gZnJvbSBcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyByZWFkQXBpc0Zyb21GaWxlIH0gZnJvbSBcIi4vYXBpLXBhcnNlclwiO1xuaW1wb3J0IHsgQmFzZUZyYW1lQ2xhc3MgfSBmcm9tIFwiLi4vYXBpL2Jhc2UtZnJhbWVcIjtcbmltcG9ydCB7IEJhc2VNb2RlbENsYXNzIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIjtcbmltcG9ydCB7IEFic29sdXRlUGF0aCwgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgQXBpRGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBMb2FkZWRBcGlzID0ge1xuICB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdO1xuICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgb3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucztcbn1bXTtcblxuZXhwb3J0IHR5cGUgTG9hZGVkVHlwZXMgPSB7IFt0eXBlTmFtZTogc3RyaW5nXTogei5ab2RPYmplY3Q8YW55PiB9O1xuXG5leHBvcnQgdHlwZSBMb2FkZWRNb2RlbHMgPSB7XG4gIFttb2RlbE5hbWU6IHN0cmluZ106IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3M7XG59O1xuXG4vKipcbiAqICoubW9kZWwudHPsmYAgKi5mcmFtZS50cyDtjIzsnbzrk6Tsl5DshJwgQVBJIOuplOyGjOuTnOulvCDtjIzsi7HtlZjsl6wg66Gc65Oc7ZWp64uI64ukLlxuICogcmVnaXN0ZXJlZEFwaXPsl5AgQVBJ6rCAIOuTseuhneuQmOyWtCDsnojslrTslbwg7ZWY6riwIOuVjOusuOyXkCwgKi5tb2RlbC50cyDtjIzsnbzrk6TsnYQg66i87KCAIGltcG9ydO2VtOyVvCDtlanri4jri6QuXG4gKiDrlLDrnbzshJwgbG9hZE1vZGVscygp66W8IOuovOyggCDtmLjstpztlbTslbwg7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEFwaXMoKTogUHJvbWlzZTxMb2FkZWRBcGlzPiB7XG4gIC8vIOyWmOuKlCDtirnsnbTtlZjqsozrj4Qg7ZmY6rK97JeQIOuUsOudvCAudHPrgpggLmpz66W8IGltcG9ydO2VmOuKlCDqsr3smrDqsIAg7JWE64uI6rOgLFxuICAvLyDtg4DsnoXsnbQg7IK07JWE7J6I64qUIC50cyDshozsiqQg7L2U65Oc66eM7J2EIOydveyWtOyVvCDtlanri4jri6QuXG4gIC8vIOydtOqyg+ydgCBkZXbshJzrsoQoaG90IHJlbG9hZCnqsIAg7JWE64uMIHByb2R1Y3Rpb24g7ZmY6rK97JeQ7ISc64+EIOuPmeydvO2VqeuLiOuLpC5cbiAgLy8g66qo642465Ok7J2YIC50cyDtjIzsnbzsnbQg7J6I7Ja07JW8IOydtOulvCDsnb3slrTshJwg65287Jqw7Yq466W8IOuTseuhne2VoCDsiJgg7J6I7Ja07JqUIVxuICBjb25zdCBtb2RlbFBhdGhzUGF0dGVybiA9IHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgXCJzcmMvYXBwbGljYXRpb24vKiovKi57bW9kZWwsZnJhbWV9LnRzXCIgLy8gISEgcnVudGltZVBhdGgg7JWIIOyUgCDso7zsnZggISFcbiAgKTtcbiAgY29uc3QgbW9kZWxQYXRocyA9IChhd2FpdCBnbG9iQXN5bmMobW9kZWxQYXRoc1BhdHRlcm4pKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICBjb25zdCBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgbW9kZWxQYXRocykge1xuICAgIGNvbnN0IHBhcnNlZEFwaXMgPSBhd2FpdCByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoKTtcbiAgICBhcGlzLnB1c2goLi4ucGFyc2VkQXBpcyk7XG4gICAgY291bnQrKztcbiAgfVxuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBjaGFsay5ncmF5KGBbTG9hZGluZ10gTG9hZGVkIEFQSXMgZnJvbSBcIioubW9kZWwudHNcIiBmaWxlczogJHtjb3VudH0gZmlsZXMuYClcbiAgLy8gKTtcblxuICByZXR1cm4gYXBpcztcbn1cblxuLyoqXG4gKiAqLm1vZGVsLnRz7JmAICouZnJhbWUudHMg7YyM7J2865Ok7JeQ7IScIE1vZGVsL0ZyYW1lIO2BtOuemOyKpCDsnbjsiqTthLTsiqTrpbwg66Gc65Oc7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZE1vZGVscygpOiBQcm9taXNlPExvYWRlZE1vZGVscz4ge1xuICBjb25zdCBtb2RlbFBhdGhzUGF0dGVybiA9IHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi57bW9kZWwsZnJhbWV9LnRzXCIpXG4gICk7XG4gIGNvbnN0IG1vZGVsUGF0aHMgPSBhd2FpdCBnbG9iQXN5bmMobW9kZWxQYXRoc1BhdHRlcm4pO1xuXG4gIGNvbnN0IG1vZGVsczogTG9hZGVkTW9kZWxzID0ge307XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgbW9kZWxQYXRocykge1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8XG4gICAgICBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzXG4gICAgPihmaWxlUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBpbXBvcnRlZE1lbWJlcnMpIHtcbiAgICAgIGlmIChuYW1lLmVuZHNXaXRoKFwiTW9kZWxcIikgfHwgbmFtZS5lbmRzV2l0aChcIkZyYW1lXCIpKSB7XG4gICAgICAgIG1vZGVsc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb3VudCsrO1xuICB9XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIGNoYWxrLmdyYXkoXG4gIC8vICAgICBgW0xvYWRpbmddIExvYWRlZCBtb2RlbC9mcmFtZSBpbnN0YW5jZXMgZnJvbSAke3J1bnRpbWVQYXRoKFwiKi57bW9kZWwsZnJhbWV9LnRzXCIpfSBmaWxlczogJHtjb3VudH0gZmlsZXMuYFxuICAvLyAgIClcbiAgLy8gKTtcblxuICByZXR1cm4gbW9kZWxzO1xufVxuXG4vKipcbiAqICoudHlwZXMudHPsmYAgKi5nZW5lcmF0ZWQudHMg7YyM7J2865Ok7JeQ7IScIFpvZCDsiqTtgqTrp4jrpbwg66Gc65Oc7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFR5cGVzKCk6IFByb21pc2U8TG9hZGVkVHlwZXM+IHtcbiAgY29uc3QgdHlwZVBhdGhzUGF0dGVybnMgPSBbXG4gICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi50eXBlcy50c1wiKSksXG4gICAgcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoXCJzcmMvYXBwbGljYXRpb24vKiovKi5nZW5lcmF0ZWQudHNcIilcbiAgICApLFxuICBdO1xuICBjb25zdCB0eXBlUGF0aHMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodHlwZVBhdGhzUGF0dGVybnMubWFwKGdsb2JBc3luYykpXG4gICkuZmxhdCgpO1xuXG4gIGNvbnN0IHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHR5cGVQYXRocykge1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RPYmplY3Q8YW55Pj4oZmlsZVBhdGgpO1xuICAgIGZvciAoY29uc3QgeyBuYW1lLCB2YWx1ZSB9IG9mIGltcG9ydGVkTWVtYmVycykge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICAgICAgdHlwZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY291bnQrKztcbiAgfVxuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBjaGFsay5ncmF5KFxuICAvLyAgICAgYFtMb2FkaW5nXSBMb2FkZWQgem9kIHR5cGVzIGZyb20gJHtydW50aW1lUGF0aChcIioudHlwZXMudHNcIil9IGFuZCAke3J1bnRpbWVQYXRoKFwiKi5nZW5lcmF0ZWQudHNcIil9IGZpbGVzOiAke2NvdW50fSBmaWxlcy5gXG4gIC8vICAgKVxuICAvLyApO1xuXG4gIHJldHVybiB0eXBlcztcbn1cbiJdLCJuYW1lcyI6WyJwYXRoIiwiZ2xvYkFzeW5jIiwiaW1wb3J0TWVtYmVycyIsInoiLCJTb25hbXUiLCJyZWFkQXBpc0Zyb21GaWxlIiwicnVudGltZVBhdGgiLCJsb2FkQXBpcyIsIm1vZGVsUGF0aHNQYXR0ZXJuIiwiam9pbiIsImFwaVJvb3RQYXRoIiwibW9kZWxQYXRocyIsImFwaXMiLCJjb3VudCIsImZpbGVQYXRoIiwicGFyc2VkQXBpcyIsInB1c2giLCJsb2FkTW9kZWxzIiwibW9kZWxzIiwiaW1wb3J0ZWRNZW1iZXJzIiwibmFtZSIsInZhbHVlIiwiZW5kc1dpdGgiLCJsb2FkVHlwZXMiLCJ0eXBlUGF0aHNQYXR0ZXJucyIsInR5cGVQYXRocyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJmbGF0IiwidHlwZXMiLCJab2RPYmplY3QiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFVBQVUsT0FBTztBQUN4QixTQUFTQyxTQUFTLFFBQVEsMEJBQXVCO0FBQ2pELFNBQVNDLGFBQWEsUUFBUSx3QkFBcUI7QUFDbkQsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxnQkFBZ0IsUUFBUSxrQkFBZTtBQUdoRCxTQUF1QkMsV0FBVyxRQUFRLHlCQUFzQjtBQW9CaEU7Ozs7Q0FJQyxHQUNELE9BQU8sZUFBZUM7SUFDcEIsOENBQThDO0lBQzlDLGdDQUFnQztJQUNoQyxvREFBb0Q7SUFDcEQsMENBQTBDO0lBQzFDLE1BQU1DLG9CQUFvQlIsS0FBS1MsSUFBSSxDQUNqQ0wsT0FBT00sV0FBVyxFQUNsQix3Q0FBd0MsMkJBQTJCOztJQUVyRSxNQUFNQyxhQUFjLE1BQU1WLFVBQVVPO0lBRXBDLE1BQU1JLE9BQW1CLEVBQUU7SUFDM0IsSUFBSUMsUUFBUTtJQUNaLEtBQUssTUFBTUMsWUFBWUgsV0FBWTtRQUNqQyxNQUFNSSxhQUFhLE1BQU1WLGlCQUFpQlM7UUFDMUNGLEtBQUtJLElBQUksSUFBSUQ7UUFDYkY7SUFDRjtJQUNBLGVBQWU7SUFDZixpRkFBaUY7SUFDakYsS0FBSztJQUVMLE9BQU9EO0FBQ1Q7QUFFQTs7Q0FFQyxHQUNELE9BQU8sZUFBZUs7SUFDcEIsTUFBTVQsb0JBQW9CUixLQUFLUyxJQUFJLENBQ2pDTCxPQUFPTSxXQUFXLEVBQ2xCSixZQUFZO0lBRWQsTUFBTUssYUFBYSxNQUFNVixVQUFVTztJQUVuQyxNQUFNVSxTQUF1QixDQUFDO0lBQzlCLElBQUlMLFFBQVE7SUFDWixLQUFLLE1BQU1DLFlBQVlILFdBQVk7UUFDakMsTUFBTVEsa0JBQWtCLE1BQU1qQixjQUU1Qlk7UUFFRixLQUFLLE1BQU0sRUFBRU0sSUFBSSxFQUFFQyxLQUFLLEVBQUUsSUFBSUYsZ0JBQWlCO1lBQzdDLElBQUlDLEtBQUtFLFFBQVEsQ0FBQyxZQUFZRixLQUFLRSxRQUFRLENBQUMsVUFBVTtnQkFDcERKLE1BQU0sQ0FBQ0UsS0FBSyxHQUFHQztZQUNqQjtRQUNGO1FBQ0FSO0lBQ0Y7SUFDQSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGdIQUFnSDtJQUNoSCxNQUFNO0lBQ04sS0FBSztJQUVMLE9BQU9LO0FBQ1Q7QUFFQTs7Q0FFQyxHQUNELE9BQU8sZUFBZUs7SUFDcEIsTUFBTUMsb0JBQW9CO1FBQ3hCeEIsS0FBS1MsSUFBSSxDQUFDTCxPQUFPTSxXQUFXLEVBQUVKLFlBQVk7UUFDMUNOLEtBQUtTLElBQUksQ0FDUEwsT0FBT00sV0FBVyxFQUNsQkosWUFBWTtLQUVmO0lBQ0QsTUFBTW1CLFlBQVksQUFDaEIsQ0FBQSxNQUFNQyxRQUFRQyxHQUFHLENBQUNILGtCQUFrQkksR0FBRyxDQUFDM0IsV0FBVSxFQUNsRDRCLElBQUk7SUFFTixNQUFNQyxRQUFxQixDQUFDO0lBQzVCLElBQUlqQixRQUFRO0lBQ1osS0FBSyxNQUFNQyxZQUFZVyxVQUFXO1FBQ2hDLE1BQU1OLGtCQUFrQixNQUFNakIsY0FBZ0NZO1FBQzlELEtBQUssTUFBTSxFQUFFTSxJQUFJLEVBQUVDLEtBQUssRUFBRSxJQUFJRixnQkFBaUI7WUFDN0MsSUFBSUUsaUJBQWlCbEIsRUFBRTRCLFNBQVMsRUFBRTtnQkFDaENELEtBQUssQ0FBQ1YsS0FBSyxHQUFHQztZQUNoQjtRQUNGO1FBQ0FSO0lBQ0Y7SUFDQSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGlJQUFpSTtJQUNqSSxNQUFNO0lBQ04sS0FBSztJQUVMLE9BQU9pQjtBQUNUIn0=