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
@@ -1,2 +1,3 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});
2
- //# sourceMappingURL=types.js.map
1
+ export { };
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEdlbk1pZ3JhdGlvbkNvZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgTWlncmF0aW9uQ29kZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQ29ublN0cmluZyA9XG4gIGAke1wibXlzcWwyXCJ9Oi8vJHtzdHJpbmd9QCR7c3RyaW5nfToke251bWJlcn0vJHtzdHJpbmd9YDsgLy8gbXlzcWwyOi8vYWNjb3VudEBob3N0OnBvcnQvZGF0YWJhc2VcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvblN0YXR1cyA9IHtcbiAgY29kZXM6IE1pZ3JhdGlvbkNvZGVbXTtcbiAgY29ubnM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29ubktleToga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgY29ublN0cmluZzogQ29ublN0cmluZztcbiAgICBjdXJyZW50VmVyc2lvbjogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHBlbmRpbmc6IHN0cmluZ1tdO1xuICB9W107XG4gIHByZXBhcmVkQ29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXTtcbn07XG5leHBvcnQgdHlwZSBEQkNvbHVtbiA9IHtcbiAgRmllbGQ6IHN0cmluZztcbiAgVHlwZTogc3RyaW5nO1xuICBOdWxsOiBzdHJpbmc7XG4gIEtleTogc3RyaW5nO1xuICBEZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBFeHRyYTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIERCSW5kZXggPSB7XG4gIFRhYmxlOiBzdHJpbmc7XG4gIE5vbl91bmlxdWU6IG51bWJlcjtcbiAgS2V5X25hbWU6IHN0cmluZztcbiAgU2VxX2luX2luZGV4OiBudW1iZXI7XG4gIENvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIENvbGxhdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgQ2FyZGluYWxpdHk6IG51bWJlciB8IG51bGw7XG4gIFN1Yl9wYXJ0OiBudW1iZXIgfCBudWxsO1xuICBQYWNrZWQ6IHN0cmluZyB8IG51bGw7XG4gIE51bGw6IHN0cmluZztcbiAgSW5kZXhfdHlwZTogc3RyaW5nO1xuICBDb21tZW50OiBzdHJpbmc7XG4gIEluZGV4X2NvbW1lbnQ6IHN0cmluZztcbiAgVmlzaWJsZTogc3RyaW5nO1xuICBFeHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIERCRm9yZWlnbiA9IHtcbiAga2V5TmFtZTogc3RyaW5nO1xuICBmcm9tOiBzdHJpbmc7XG4gIHJlZmVyZW5jZXNUYWJsZTogc3RyaW5nO1xuICByZWZlcmVuY2VzRmllbGQ6IHN0cmluZztcbiAgb25EZWxldGU6IHN0cmluZztcbiAgb25VcGRhdGU6IHN0cmluZztcbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBOENBLFdBT0UifQ==
@@ -0,0 +1,12 @@
1
+ export declare class Naite {
2
+ static t(name: string, value: any): void;
3
+ static get(name: string): any;
4
+ static getAll(): {
5
+ [key: string]: any;
6
+ };
7
+ static d(_message: string): void;
8
+ static i(_message: string): void;
9
+ static w(_message: string): void;
10
+ static e(_message: string): void;
11
+ }
12
+ //# sourceMappingURL=naite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naite.d.ts","sourceRoot":"","sources":["../../src/naite/naite.ts"],"names":[],"mappings":"AAEA,qBAAa,KAAK;IAEhB,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAuBjC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAS7B,MAAM,CAAC,MAAM,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAiBvC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;IAIzB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;IAIzB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;IAIzB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;CAI1B"}
@@ -0,0 +1,72 @@
1
+ import { Sonamu } from "../api/sonamu.js";
2
+ export class Naite {
3
+ // 테스트 로그 기록
4
+ static t(name, value) {
5
+ const context = Sonamu.getContext();
6
+ const store = context?.naiteStore;
7
+ if (!store) {
8
+ return;
9
+ }
10
+ if (store.has(name)) {
11
+ // 이미 값이 있는 경우
12
+ if (Array.isArray(store.get(name))) {
13
+ // 배열에 추가
14
+ store.set(name, [
15
+ ...store.get(name),
16
+ value
17
+ ]);
18
+ } else {
19
+ // 배열이 아닌 경우 배열로 변환
20
+ store.set(name, [
21
+ store.get(name),
22
+ value
23
+ ]);
24
+ }
25
+ } else {
26
+ // 값이 없는 경우 추가
27
+ store.set(name, value);
28
+ }
29
+ }
30
+ // 테스트에서 값 가져오기
31
+ static get(name) {
32
+ const context = Sonamu.getContext();
33
+ if (!context?.naiteStore || !context.naiteStore.has(name)) {
34
+ throw new Error(`Naite.get: \`${name}\` not found`);
35
+ }
36
+ return context?.naiteStore?.get(name);
37
+ }
38
+ // 전체 리스트 가져오기
39
+ static getAll() {
40
+ const context = Sonamu.getContext();
41
+ if (!context?.naiteStore) {
42
+ return {};
43
+ }
44
+ return Object.fromEntries(context.naiteStore.entries());
45
+ }
46
+ // expect 래퍼 (CJS-ESM 이슈로 현재 사용불가)
47
+ // static expect(name: string) {
48
+ // if (!this.vitestExpect) {
49
+ // throw new Error("Vitest is not initialized");
50
+ // }
51
+ // return this.vitestExpect(this.get(name));
52
+ // }
53
+ // 일반 로그 레벨
54
+ static d(_message) {
55
+ // TODO: Logger 연결
56
+ console.log(`[DEBUG] ${_message}`);
57
+ }
58
+ static i(_message) {
59
+ // TODO: Logger 연결
60
+ console.log(`[INFO] ${_message}`);
61
+ }
62
+ static w(_message) {
63
+ // TODO: Logger 연결
64
+ console.log(`[WARN] ${_message}`);
65
+ }
66
+ static e(_message) {
67
+ // TODO: Logger 연결
68
+ console.log(`[ERROR] ${_message}`);
69
+ }
70
+ }
71
+
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYWl0ZS9uYWl0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuXG5leHBvcnQgY2xhc3MgTmFpdGUge1xuICAvLyDthYzsiqTtirgg66Gc6re4IOq4sOuhnVxuICBzdGF0aWMgdChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdG9yZS5oYXMobmFtZSkpIHtcbiAgICAgIC8vIOydtOuvuCDqsJLsnbQg7J6I64qUIOqyveyasFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RvcmUuZ2V0KG5hbWUpKSkge1xuICAgICAgICAvLyDrsLDsl7Tsl5Ag7LaU6rCAXG4gICAgICAgIHN0b3JlLnNldChuYW1lLCBbLi4uc3RvcmUuZ2V0KG5hbWUpLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g67Cw7Je07J20IOyVhOuLjCDqsr3smrAg67Cw7Je066GcIOuzgO2ZmFxuICAgICAgICBzdG9yZS5zZXQobmFtZSwgW3N0b3JlLmdldChuYW1lKSwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6rCS7J20IOyXhuuKlCDqsr3smrAg7LaU6rCAXG4gICAgICBzdG9yZS5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIO2FjOyKpO2KuOyXkOyEnCDqsJIg6rCA7KC47Jik6riwXG4gIHN0YXRpYyBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUgfHwgIWNvbnRleHQubmFpdGVTdG9yZS5oYXMobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTmFpdGUuZ2V0OiBcXGAke25hbWV9XFxgIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dD8ubmFpdGVTdG9yZT8uZ2V0KG5hbWUpO1xuICB9XG5cbiAgLy8g7KCE7LK0IOumrOyKpO2KuCDqsIDsoLjsmKTquLBcbiAgc3RhdGljIGdldEFsbCgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhjb250ZXh0Lm5haXRlU3RvcmUuZW50cmllcygpKTtcbiAgfVxuXG4gIC8vIGV4cGVjdCDrnpjtjbwgKENKUy1FU00g7J207IqI66GcIO2YhOyerCDsgqzsmqnrtojqsIApXG4gIC8vIHN0YXRpYyBleHBlY3QobmFtZTogc3RyaW5nKSB7XG4gIC8vICAgaWYgKCF0aGlzLnZpdGVzdEV4cGVjdCkge1xuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVml0ZXN0IGlzIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIHRoaXMudml0ZXN0RXhwZWN0KHRoaXMuZ2V0KG5hbWUpKTtcbiAgLy8gfVxuXG4gIC8vIOydvOuwmCDroZzqt7gg66CI67KoXG4gIHN0YXRpYyBkKF9tZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBMb2dnZXIg7Jew6rKwXG4gICAgY29uc29sZS5sb2coYFtERUJVR10gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICBzdGF0aWMgaShfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbSU5GT10gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICBzdGF0aWMgdyhfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbV0FSTl0gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICBzdGF0aWMgZShfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbRVJST1JdICR7X21lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTb25hbXUiLCJOYWl0ZSIsInQiLCJuYW1lIiwidmFsdWUiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsInN0b3JlIiwibmFpdGVTdG9yZSIsImhhcyIsIkFycmF5IiwiaXNBcnJheSIsImdldCIsInNldCIsIkVycm9yIiwiZ2V0QWxsIiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiZCIsIl9tZXNzYWdlIiwiY29uc29sZSIsImxvZyIsImkiLCJ3IiwiZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBTSxRQUFRLG1CQUFnQjtBQUV2QyxPQUFPLE1BQU1DO0lBQ1gsWUFBWTtJQUNaLE9BQU9DLEVBQUVDLElBQVksRUFBRUMsS0FBVSxFQUFFO1FBQ2pDLE1BQU1DLFVBQVVMLE9BQU9NLFVBQVU7UUFDakMsTUFBTUMsUUFBUUYsU0FBU0c7UUFFdkIsSUFBSSxDQUFDRCxPQUFPO1lBQ1Y7UUFDRjtRQUNBLElBQUlBLE1BQU1FLEdBQUcsQ0FBQ04sT0FBTztZQUNuQixjQUFjO1lBQ2QsSUFBSU8sTUFBTUMsT0FBTyxDQUFDSixNQUFNSyxHQUFHLENBQUNULFFBQVE7Z0JBQ2xDLFNBQVM7Z0JBQ1RJLE1BQU1NLEdBQUcsQ0FBQ1YsTUFBTTt1QkFBSUksTUFBTUssR0FBRyxDQUFDVDtvQkFBT0M7aUJBQU07WUFDN0MsT0FBTztnQkFDTCxtQkFBbUI7Z0JBQ25CRyxNQUFNTSxHQUFHLENBQUNWLE1BQU07b0JBQUNJLE1BQU1LLEdBQUcsQ0FBQ1Q7b0JBQU9DO2lCQUFNO1lBQzFDO1FBQ0YsT0FBTztZQUNMLGNBQWM7WUFDZEcsTUFBTU0sR0FBRyxDQUFDVixNQUFNQztRQUNsQjtJQUNGO0lBRUEsZUFBZTtJQUNmLE9BQU9RLElBQUlULElBQVksRUFBTztRQUM1QixNQUFNRSxVQUFVTCxPQUFPTSxVQUFVO1FBQ2pDLElBQUksQ0FBQ0QsU0FBU0csY0FBYyxDQUFDSCxRQUFRRyxVQUFVLENBQUNDLEdBQUcsQ0FBQ04sT0FBTztZQUN6RCxNQUFNLElBQUlXLE1BQU0sQ0FBQyxhQUFhLEVBQUVYLEtBQUssWUFBWSxDQUFDO1FBQ3BEO1FBQ0EsT0FBT0UsU0FBU0csWUFBWUksSUFBSVQ7SUFDbEM7SUFFQSxjQUFjO0lBQ2QsT0FBT1ksU0FBaUM7UUFDdEMsTUFBTVYsVUFBVUwsT0FBT00sVUFBVTtRQUNqQyxJQUFJLENBQUNELFNBQVNHLFlBQVk7WUFDeEIsT0FBTyxDQUFDO1FBQ1Y7UUFDQSxPQUFPUSxPQUFPQyxXQUFXLENBQUNaLFFBQVFHLFVBQVUsQ0FBQ1UsT0FBTztJQUN0RDtJQUVBLGtDQUFrQztJQUNsQyxnQ0FBZ0M7SUFDaEMsOEJBQThCO0lBQzlCLG9EQUFvRDtJQUNwRCxNQUFNO0lBQ04sOENBQThDO0lBQzlDLElBQUk7SUFFSixXQUFXO0lBQ1gsT0FBT0MsRUFBRUMsUUFBZ0IsRUFBRTtRQUN6QixrQkFBa0I7UUFDbEJDLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRUYsVUFBVTtJQUNuQztJQUNBLE9BQU9HLEVBQUVILFFBQWdCLEVBQUU7UUFDekIsa0JBQWtCO1FBQ2xCQyxRQUFRQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUVGLFVBQVU7SUFDbEM7SUFDQSxPQUFPSSxFQUFFSixRQUFnQixFQUFFO1FBQ3pCLGtCQUFrQjtRQUNsQkMsUUFBUUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFRixVQUFVO0lBQ2xDO0lBQ0EsT0FBT0ssRUFBRUwsUUFBZ0IsRUFBRTtRQUN6QixrQkFBa0I7UUFDbEJDLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRUYsVUFBVTtJQUNuQztBQUNGIn0=
@@ -1,2 +1,3 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./sse"),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 "./sse.js";
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc3NlXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFRIn0=
@@ -1,2 +1,38 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"createSSEFactory",{enumerable:true,get:function(){return createSSEFactory}});function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}function createSSEFactory(socket,reply,_events){return new SSEConnection(socket,reply)}var SSEConnection=/*#__PURE__*/function(){"use strict";function SSEConnection(socket,reply){var _this=this;_class_call_check(this,SSEConnection);_define_property(this,"socket",void 0);_define_property(this,"reply",void 0);_define_property(this,"_closed",void 0);this.socket=socket;this.reply=reply;this._closed=false;this.socket.on("close",function(){_this._closed=true})}_create_class(SSEConnection,[{key:"publish",value:function publish(event,data){if(this._closed){return}this.reply.sse({event:event,data:JSON.stringify(data)})}},{key:"end",value:function end(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(this._closed){return[2]}this.reply.sse({event:"end",data:"END"});return[4,new Promise(function(resolve){return setTimeout(resolve,200)})];case 1:_state.sent();this.reply.raw.end();return[2]}})}).call(this)}}]);return SSEConnection}();
2
- //# sourceMappingURL=sse.js.map
1
+ // NOTE(Haze, 251106): context provider에서 인자를 채워주면 createSSE(events)만으로 사용 가능
2
+ export function createSSEFactory(socket, reply, _events) {
3
+ return new SSEConnection(socket, reply);
4
+ }
5
+ class SSEConnection {
6
+ socket;
7
+ reply;
8
+ _closed = false;
9
+ constructor(socket, reply){
10
+ this.socket = socket;
11
+ this.reply = reply;
12
+ this.socket.on("close", ()=>{
13
+ this._closed = true;
14
+ });
15
+ }
16
+ publish(event, data) {
17
+ if (this._closed) {
18
+ return;
19
+ }
20
+ this.reply.sse({
21
+ event: event,
22
+ data: JSON.stringify(data)
23
+ });
24
+ }
25
+ async end() {
26
+ if (this._closed) {
27
+ return;
28
+ }
29
+ this.reply.sse({
30
+ event: "end",
31
+ data: "END"
32
+ });
33
+ await new Promise((resolve)=>setTimeout(resolve, 200));
34
+ this.reply.raw.end();
35
+ }
36
+ }
37
+
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vc3NlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlSZXF1ZXN0LCBGYXN0aWZ5UmVwbHkgfSBmcm9tIFwiZmFzdGlmeVwiO1xuXG4vLyBOT1RFKEhhemUsIDI1MTEwNik6IGNvbnRleHQgcHJvdmlkZXLsl5DshJwg7J247J6Q66W8IOyxhOybjOyjvOuptCBjcmVhdGVTU0UoZXZlbnRzKeunjOycvOuhnCDsgqzsmqkg6rCA64qlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU1NFRmFjdG9yeTxUIGV4dGVuZHMgei5ab2RPYmplY3Q+KFxuICBzb2NrZXQ6IEZhc3RpZnlSZXF1ZXN0W1wic29ja2V0XCJdLFxuICByZXBseTogRmFzdGlmeVJlcGx5LFxuICBfZXZlbnRzOiBUXG4pIHtcbiAgcmV0dXJuIG5ldyBTU0VDb25uZWN0aW9uPFQ+KHNvY2tldCwgcmVwbHkpO1xufVxuXG5jbGFzcyBTU0VDb25uZWN0aW9uPFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4ge1xuICBwcml2YXRlIF9jbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvY2tldDogRmFzdGlmeVJlcXVlc3RbXCJzb2NrZXRcIl0sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBseTogRmFzdGlmeVJlcGx5XG4gICkge1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIHouaW5mZXI8VD4+KGV2ZW50OiBLLCBkYXRhOiB6LmluZmVyPFQ+W0tdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVwbHkuc3NlKHtcbiAgICAgIGV2ZW50OiBldmVudCBhcyBzdHJpbmcsXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGVuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXBseS5zc2Uoe1xuICAgICAgZXZlbnQ6IFwiZW5kXCIsXG4gICAgICBkYXRhOiBcIkVORFwiLFxuICAgIH0pO1xuICAgIFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpO1xuICAgIHRoaXMucmVwbHkucmF3LmVuZCgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlU1NFRmFjdG9yeSIsInNvY2tldCIsInJlcGx5IiwiX2V2ZW50cyIsIlNTRUNvbm5lY3Rpb24iLCJfY2xvc2VkIiwib24iLCJwdWJsaXNoIiwiZXZlbnQiLCJkYXRhIiwic3NlIiwiSlNPTiIsInN0cmluZ2lmeSIsImVuZCIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsInJhdyJdLCJtYXBwaW5ncyI6IkFBR0EsNkVBQTZFO0FBQzdFLE9BQU8sU0FBU0EsaUJBQ2RDLE1BQWdDLEVBQ2hDQyxLQUFtQixFQUNuQkMsT0FBVTtJQUVWLE9BQU8sSUFBSUMsY0FBaUJILFFBQVFDO0FBQ3RDO0FBRUEsTUFBTUU7OztJQUNJQyxVQUFVLE1BQU07SUFFeEIsWUFDRSxBQUFpQkosTUFBZ0MsRUFDakQsQUFBaUJDLEtBQW1CLENBQ3BDO2FBRmlCRCxTQUFBQTthQUNBQyxRQUFBQTtRQUVqQixJQUFJLENBQUNELE1BQU0sQ0FBQ0ssRUFBRSxDQUFDLFNBQVM7WUFDdEIsSUFBSSxDQUFDRCxPQUFPLEdBQUc7UUFDakI7SUFDRjtJQUVBRSxRQUFvQ0MsS0FBUSxFQUFFQyxJQUFtQixFQUFRO1FBQ3ZFLElBQUksSUFBSSxDQUFDSixPQUFPLEVBQUU7WUFDaEI7UUFDRjtRQUVBLElBQUksQ0FBQ0gsS0FBSyxDQUFDUSxHQUFHLENBQUM7WUFDYkYsT0FBT0E7WUFDUEMsTUFBTUUsS0FBS0MsU0FBUyxDQUFDSDtRQUN2QjtJQUNGO0lBRUEsTUFBTUksTUFBcUI7UUFDekIsSUFBSSxJQUFJLENBQUNSLE9BQU8sRUFBRTtZQUNoQjtRQUNGO1FBRUEsSUFBSSxDQUFDSCxLQUFLLENBQUNRLEdBQUcsQ0FBQztZQUNiRixPQUFPO1lBQ1BDLE1BQU07UUFDUjtRQUVBLE1BQU0sSUFBSUssUUFBUSxDQUFDQyxVQUFZQyxXQUFXRCxTQUFTO1FBQ25ELElBQUksQ0FBQ2IsS0FBSyxDQUFDZSxHQUFHLENBQUNKLEdBQUc7SUFDcEI7QUFDRiJ9
@@ -0,0 +1,20 @@
1
+ import { ApiParam, ApiParamType } from "../types/types";
2
+ import { AbsolutePath } from "../utils/path-utils";
3
+ /**
4
+ * TypeScript 파일을 파싱하여 API 메소드 정보를 추출합니다.
5
+ * @api 데코레이터가 붙은 메소드들의 타입 정보를 분석합니다.
6
+ * @param filePath - 파싱할 TypeScript 파일의 절대 경로
7
+ * @returns API 메소드 정보 배열 (타입 파라미터, 파라미터, 리턴 타입 등)
8
+ */
9
+ export declare function readApisFromFile(filePath: AbsolutePath): Promise<{
10
+ typeParameters: ApiParamType.TypeParam[];
11
+ parameters: ApiParam[];
12
+ returnType: ApiParamType;
13
+ modelName: string;
14
+ methodName: string;
15
+ path: string;
16
+ options: import("..").ApiDecoratorOptions;
17
+ streamOptions?: import("..").StreamDecoratorOptions;
18
+ uploadOptions?: import("..").UploadDecoratorOptions;
19
+ }[]>;
20
+ //# sourceMappingURL=api-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-parser.d.ts","sourceRoot":"","sources":["../../src/syncer/api-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,YAAY;;;;;;;;;;KA4G5D"}
@@ -0,0 +1,229 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import ts from "typescript";
3
+ import { registeredApis } from "../api/decorators.js";
4
+ import inflection from "inflection";
5
+ import assert from "assert";
6
+ /**
7
+ * TypeScript 파일을 파싱하여 API 메소드 정보를 추출합니다.
8
+ * @api 데코레이터가 붙은 메소드들의 타입 정보를 분석합니다.
9
+ * @param filePath - 파싱할 TypeScript 파일의 절대 경로
10
+ * @returns API 메소드 정보 배열 (타입 파라미터, 파라미터, 리턴 타입 등)
11
+ */ export async function readApisFromFile(filePath) {
12
+ if (!filePath.endsWith(".ts")) {
13
+ throw new Error(`${filePath} does not seem to be a TypeScript file. Please check the file path. We only support parsing TypeScript files.`);
14
+ }
15
+ const sourceFile = ts.createSourceFile(filePath, (await readFile(filePath)).toString(), ts.ScriptTarget.Latest);
16
+ const methods = [];
17
+ let modelName = "UnknownModel";
18
+ let methodName = "unknownMethod";
19
+ const visitor = (node)=>{
20
+ if (ts.isClassDeclaration(node)) {
21
+ if (node.name && ts.isIdentifier(node.name)) {
22
+ modelName = node.name.escapedText.toString().replace(/Class$/, "");
23
+ }
24
+ }
25
+ if (ts.isMethodDeclaration(node)) {
26
+ if (ts.isIdentifier(node.name)) {
27
+ methodName = node.name.escapedText.toString();
28
+ }
29
+ const typeParameters = (node.typeParameters ?? []).map((typeParam)=>{
30
+ const tp = typeParam;
31
+ return {
32
+ t: "type-param",
33
+ id: tp.name.escapedText.toString(),
34
+ constraint: tp.constraint ? resolveTypeNode(tp.constraint) : undefined
35
+ };
36
+ });
37
+ const parameters = node.parameters.map((paramDec, index)=>{
38
+ const defaultDef = printNode(paramDec.initializer, sourceFile);
39
+ // 기본값이 있는 경우 paramDec.type가 undefined로 나옴
40
+ return resolveParamDec({
41
+ name: paramDec.name,
42
+ type: paramDec.type,
43
+ optional: paramDec.questionToken !== undefined || paramDec.initializer !== undefined,
44
+ defaultDef
45
+ }, index);
46
+ });
47
+ if (node.type === undefined) {
48
+ throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
49
+ }
50
+ const returnType = resolveTypeNode(node.type);
51
+ methods.push({
52
+ modelName,
53
+ methodName,
54
+ typeParameters,
55
+ parameters,
56
+ returnType
57
+ });
58
+ }
59
+ ts.forEachChild(node, visitor);
60
+ };
61
+ visitor(sourceFile);
62
+ if (methods.length === 0) {
63
+ return [];
64
+ }
65
+ // 현재 파일의 등록된 API 필터
66
+ const currentModelApis = registeredApis.filter((api)=>{
67
+ return methods.find((method)=>method.modelName === api.modelName && method.methodName === api.methodName);
68
+ });
69
+ if (currentModelApis.length === 0) {
70
+ // const p = path.join(tmpdir(), "sonamu-syncer-error.json");
71
+ // writeFileSync(p, JSON.stringify(registeredApis, null, 2));
72
+ // execSync(`open ${p}`);
73
+ throw new Error(`현재 파일에 사전 등록된 API가 없습니다. ${filePath}`);
74
+ }
75
+ // 등록된 API에 현재 메소드 타입 정보 확장
76
+ const extendedApis = currentModelApis.map((api)=>{
77
+ const foundMethod = methods.find((method)=>method.modelName === api.modelName && method.methodName === api.methodName);
78
+ return {
79
+ ...api,
80
+ typeParameters: foundMethod.typeParameters,
81
+ parameters: foundMethod.parameters,
82
+ returnType: foundMethod.returnType
83
+ };
84
+ });
85
+ return extendedApis;
86
+ }
87
+ function resolveTypeNode(typeNode) {
88
+ switch(typeNode?.kind){
89
+ case ts.SyntaxKind.AnyKeyword:
90
+ return "any";
91
+ case ts.SyntaxKind.UnknownKeyword:
92
+ return "unknown";
93
+ case ts.SyntaxKind.StringKeyword:
94
+ return "string";
95
+ case ts.SyntaxKind.NumberKeyword:
96
+ return "number";
97
+ case ts.SyntaxKind.BooleanKeyword:
98
+ return "boolean";
99
+ case ts.SyntaxKind.UndefinedKeyword:
100
+ return "undefined";
101
+ case ts.SyntaxKind.NullKeyword:
102
+ return "null";
103
+ case ts.SyntaxKind.VoidKeyword:
104
+ return "void";
105
+ case ts.SyntaxKind.LiteralType:
106
+ const literal = typeNode.literal;
107
+ if (ts.isStringLiteral(literal)) {
108
+ return {
109
+ t: "string-literal",
110
+ value: literal.text
111
+ };
112
+ } else if (ts.isNumericLiteral(literal)) {
113
+ return {
114
+ t: "numeric-literal",
115
+ value: Number(literal.text)
116
+ };
117
+ } else {
118
+ if (literal.kind === ts.SyntaxKind.NullKeyword) {
119
+ return "null";
120
+ } else if (literal.kind === ts.SyntaxKind.UndefinedKeyword) {
121
+ return "undefined";
122
+ } else if (literal.kind === ts.SyntaxKind.TrueKeyword) {
123
+ return "true";
124
+ } else if (literal.kind === ts.SyntaxKind.FalseKeyword) {
125
+ return "false";
126
+ }
127
+ throw new Error("알 수 없는 리터럴");
128
+ }
129
+ case ts.SyntaxKind.ArrayType:
130
+ const arrNode = typeNode;
131
+ return {
132
+ t: "array",
133
+ elementsType: resolveTypeNode(arrNode.elementType)
134
+ };
135
+ case ts.SyntaxKind.TypeLiteral:
136
+ const literalNode = typeNode;
137
+ return {
138
+ t: "object",
139
+ props: literalNode.members.map((member)=>{
140
+ if (ts.isIndexSignatureDeclaration(member)) {
141
+ assert(member.parameters[0]);
142
+ const res = resolveParamDec({
143
+ name: member.parameters[0].name,
144
+ type: member.parameters[0].type
145
+ });
146
+ return resolveParamDec({
147
+ name: {
148
+ escapedText: `[${res.name}${res.optional ? "?" : ""}: ${res.type}]`
149
+ },
150
+ type: member.type
151
+ });
152
+ } else {
153
+ return resolveParamDec({
154
+ name: member.name,
155
+ type: member.type,
156
+ optional: member.questionToken !== undefined
157
+ });
158
+ }
159
+ })
160
+ };
161
+ case ts.SyntaxKind.TypeReference:
162
+ return {
163
+ t: "ref",
164
+ id: typeNode.typeName.escapedText.toString(),
165
+ args: typeNode.typeArguments?.map((typeArg)=>resolveTypeNode(typeArg))
166
+ };
167
+ case ts.SyntaxKind.UnionType:
168
+ return {
169
+ t: "union",
170
+ types: typeNode.types.map((type)=>resolveTypeNode(type))
171
+ };
172
+ case ts.SyntaxKind.IntersectionType:
173
+ return {
174
+ t: "intersection",
175
+ types: typeNode.types.map((type)=>resolveTypeNode(type))
176
+ };
177
+ case ts.SyntaxKind.IndexedAccessType:
178
+ return {
179
+ t: "indexed-access",
180
+ object: resolveTypeNode(typeNode.objectType),
181
+ index: resolveTypeNode(typeNode.indexType)
182
+ };
183
+ case ts.SyntaxKind.TupleType:
184
+ if (ts.isTupleTypeNode(typeNode)) {
185
+ return {
186
+ t: "tuple-type",
187
+ elements: typeNode.elements.map((elem)=>resolveTypeNode(elem))
188
+ };
189
+ }
190
+ break;
191
+ case undefined:
192
+ throw new Error(`typeNode undefined`);
193
+ }
194
+ console.debug(typeNode);
195
+ throw new Error(`알 수 없는 SyntaxKind ${typeNode.kind}`);
196
+ }
197
+ function resolveParamDec(paramDec, index = 0) {
198
+ const name = paramDec.name;
199
+ const type = resolveTypeNode(paramDec.type);
200
+ if (name === undefined) {
201
+ console.debug({
202
+ name,
203
+ type,
204
+ paramDec
205
+ });
206
+ }
207
+ const result = {
208
+ name: name.escapedText ? name.escapedText.toString() : `nonameAt${index}`,
209
+ type,
210
+ optional: paramDec.optional === true,
211
+ defaultDef: paramDec?.defaultDef
212
+ };
213
+ // 구조분해할당의 경우 타입이름 사용
214
+ if (ts.isObjectBindingPattern(name) && ts.isTypeReferenceNode(paramDec.type) && ts.isIdentifier(paramDec.type.typeName)) {
215
+ result.name = inflection.camelize(paramDec.type.typeName.text, true);
216
+ }
217
+ return result;
218
+ }
219
+ function printNode(node, sourceFile) {
220
+ if (node === undefined) {
221
+ return undefined;
222
+ }
223
+ const printer = ts.createPrinter({
224
+ newLine: ts.NewLineKind.LineFeed
225
+ });
226
+ return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
227
+ }
228
+
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvYXBpLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlQYXJhbSwgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7IEV4dGVuZGVkQXBpLCByZWdpc3RlcmVkQXBpcyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IO2MjOydvOydhCDtjIzsi7HtlZjsl6wgQVBJIOuplOyGjOuTnCDsoJXrs7Trpbwg7LaU7Lac7ZWp64uI64ukLlxuICogQGFwaSDrjbDsvZTroIjsnbTthLDqsIAg67aZ7J2AIOuplOyGjOuTnOuTpOydmCDtg4DsnoUg7KCV67O066W8IOu2hOyEne2VqeuLiOuLpC5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIO2MjOyLse2VoCBUeXBlU2NyaXB0IO2MjOydvOydmCDsoIjrjIAg6rK966GcXG4gKiBAcmV0dXJucyBBUEkg66mU7IaM65OcIOygleuztCDrsLDsl7QgKO2DgOyehSDtjIzrnbzrr7jthLAsIO2MjOudvOuvuO2EsCwg66as7YS0IO2DgOyehSDrk7EpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpIHtcbiAgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkgeyBcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmlsZVBhdGh9IGRvZXMgbm90IHNlZW0gdG8gYmUgYSBUeXBlU2NyaXB0IGZpbGUuIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoLiBXZSBvbmx5IHN1cHBvcnQgcGFyc2luZyBUeXBlU2NyaXB0IGZpbGVzLmApO1xuICB9XG4gIFxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICAoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3RcbiAgKTtcblxuICBjb25zdCBtZXRob2RzOiBPbWl0PEV4dGVuZGVkQXBpLCBcInBhdGhcIiB8IFwib3B0aW9uc1wiPltdID0gW107XG4gIGxldCBtb2RlbE5hbWU6IHN0cmluZyA9IFwiVW5rbm93bk1vZGVsXCI7XG4gIGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcInVua25vd25NZXRob2RcIjtcbiAgY29uc3QgdmlzaXRvciA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUubmFtZSAmJiB0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtb2RlbE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKS5yZXBsYWNlKC9DbGFzcyQvLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtZXRob2ROYW1lID0gbm9kZS5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW10gPSAoXG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPz8gW11cbiAgICAgICkubWFwKCh0eXBlUGFyYW0pID0+IHtcbiAgICAgICAgY29uc3QgdHAgPSB0eXBlUGFyYW0gYXMgdHMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0eXBlLXBhcmFtXCIsXG4gICAgICAgICAgaWQ6IHRwLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjb25zdHJhaW50OiB0cC5jb25zdHJhaW50XG4gICAgICAgICAgICA/IHJlc29sdmVUeXBlTm9kZSh0cC5jb25zdHJhaW50KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEFwaVBhcmFtW10gPSBub2RlLnBhcmFtZXRlcnMubWFwKChwYXJhbURlYywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdERlZiA9IHByaW50Tm9kZShwYXJhbURlYy5pbml0aWFsaXplciwgc291cmNlRmlsZSk7XG5cbiAgICAgICAgLy8g6riw67O46rCS7J20IOyeiOuKlCDqsr3smrAgcGFyYW1EZWMudHlwZeqwgCB1bmRlZmluZWTroZwg64KY7Ji0XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBwYXJhbURlYy5uYW1lLFxuICAgICAgICAgICAgdHlwZTogcGFyYW1EZWMudHlwZSBhcyB0cy5UeXBlTm9kZSxcbiAgICAgICAgICAgIG9wdGlvbmFsOlxuICAgICAgICAgICAgICBwYXJhbURlYy5xdWVzdGlvblRva2VuICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgcGFyYW1EZWMuaW5pdGlhbGl6ZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHREZWYsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGDrpqzthLQg7YOA7J6F7J20IOq4sOyerOuQmOyngCDslYrsnYAg66mU7IaM65OcICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHJlc29sdmVUeXBlTm9kZShub2RlLnR5cGUhKTtcblxuICAgICAgbWV0aG9kcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICB0eXBlUGFyYW1ldGVycyxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXRvcik7XG4gIH07XG4gIHZpc2l0b3Ioc291cmNlRmlsZSk7XG5cbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2MjOydvOydmCDrk7HroZ3rkJwgQVBJIO2VhO2EsFxuICBjb25zdCBjdXJyZW50TW9kZWxBcGlzID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IHtcbiAgICByZXR1cm4gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT5cbiAgICAgICAgbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJlxuICAgICAgICBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWVcbiAgICApO1xuICB9KTtcbiAgaWYgKGN1cnJlbnRNb2RlbEFwaXMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gY29uc3QgcCA9IHBhdGguam9pbih0bXBkaXIoKSwgXCJzb25hbXUtc3luY2VyLWVycm9yLmpzb25cIik7XG4gICAgLy8gd3JpdGVGaWxlU3luYyhwLCBKU09OLnN0cmluZ2lmeShyZWdpc3RlcmVkQXBpcywgbnVsbCwgMikpO1xuICAgIC8vIGV4ZWNTeW5jKGBvcGVuICR7cH1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2YhOyerCDtjIzsnbzsl5Ag7IKs7KCEIOuTseuhneuQnCBBUEnqsIAg7JeG7Iq164uI64ukLiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgLy8g65Ox66Gd65CcIEFQSeyXkCDtmITsnqwg66mU7IaM65OcIO2DgOyehSDsoJXrs7Qg7ZmV7J6lXG4gIGNvbnN0IGV4dGVuZGVkQXBpcyA9IGN1cnJlbnRNb2RlbEFwaXMubWFwKChhcGkpID0+IHtcbiAgICBjb25zdCBmb3VuZE1ldGhvZCA9IG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiZcbiAgICAgICAgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXBpLFxuICAgICAgdHlwZVBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kIS50eXBlUGFyYW1ldGVycyxcbiAgICAgIHBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kIS5wYXJhbWV0ZXJzLFxuICAgICAgcmV0dXJuVHlwZTogZm91bmRNZXRob2QhLnJldHVyblR5cGUsXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBleHRlbmRlZEFwaXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlTm9kZSh0eXBlTm9kZTogdHMuVHlwZU5vZGUpOiBBcGlQYXJhbVR5cGUge1xuICBzd2l0Y2ggKHR5cGVOb2RlPy5raW5kKSB7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJhbnlcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVm9pZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ2b2lkXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkxpdGVyYWxUeXBlOlxuICAgICAgY29uc3QgbGl0ZXJhbCA9ICh0eXBlTm9kZSBhcyB0cy5MaXRlcmFsVHlwZU5vZGUpLmxpdGVyYWw7XG4gICAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGxpdGVyYWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJzdHJpbmctbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBsaXRlcmFsLnRleHQsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRzLmlzTnVtZXJpY0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBOdW1iZXIobGl0ZXJhbC50ZXh0KSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7JWMIOyImCDsl4bripQg66as7YSw65+0XCIpO1xuICAgICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJheVR5cGU6XG4gICAgICBjb25zdCBhcnJOb2RlID0gdHlwZU5vZGUgYXMgdHMuQXJyYXlUeXBlTm9kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudHNUeXBlOiByZXNvbHZlVHlwZU5vZGUoYXJyTm9kZS5lbGVtZW50VHlwZSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDpcbiAgICAgIGNvbnN0IGxpdGVyYWxOb2RlID0gdHlwZU5vZGUgYXMgdHMuVHlwZUxpdGVyYWxOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcHM6IGxpdGVyYWxOb2RlLm1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAodHMuaXNJbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgIGFzc2VydChtZW1iZXIucGFyYW1ldGVyc1swXSk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiBtZW1iZXIucGFyYW1ldGVyc1swXS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVGV4dDogYFske3Jlcy5uYW1lfSR7cmVzLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHtcbiAgICAgICAgICAgICAgICAgIHJlcy50eXBlXG4gICAgICAgICAgICAgICAgfV1gLFxuICAgICAgICAgICAgICB9IGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IChtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmUpLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICAgIG9wdGlvbmFsOlxuICAgICAgICAgICAgICAgIChtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmUpLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJyZWZcIixcbiAgICAgICAgaWQ6IChcbiAgICAgICAgICAodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVOYW1lIGFzIHRzLklkZW50aWZpZXJcbiAgICAgICAgKS5lc2NhcGVkVGV4dC50b1N0cmluZygpLFxuICAgICAgICBhcmdzOiAodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVBcmd1bWVudHM/Lm1hcCgodHlwZUFyZykgPT5cbiAgICAgICAgICByZXNvbHZlVHlwZU5vZGUodHlwZUFyZylcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwidW5pb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5VbmlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+XG4gICAgICAgICAgcmVzb2x2ZVR5cGVOb2RlKHR5cGUpXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbnRlcnNlY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5JbnRlcnNlY3Rpb25UeXBlTm9kZSkudHlwZXMubWFwKCh0eXBlKSA9PlxuICAgICAgICAgIHJlc29sdmVUeXBlTm9kZSh0eXBlKVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImluZGV4ZWQtYWNjZXNzXCIsXG4gICAgICAgIG9iamVjdDogcmVzb2x2ZVR5cGVOb2RlKFxuICAgICAgICAgICh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLm9iamVjdFR5cGVcbiAgICAgICAgKSxcbiAgICAgICAgaW5kZXg6IHJlc29sdmVUeXBlTm9kZShcbiAgICAgICAgICAodHlwZU5vZGUgYXMgdHMuSW5kZXhlZEFjY2Vzc1R5cGVOb2RlKS5pbmRleFR5cGVcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR1cGxlVHlwZTpcbiAgICAgIGlmICh0cy5pc1R1cGxlVHlwZU5vZGUodHlwZU5vZGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0dXBsZS10eXBlXCIsXG4gICAgICAgICAgZWxlbWVudHM6IHR5cGVOb2RlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT4gcmVzb2x2ZVR5cGVOb2RlKGVsZW0pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eXBlTm9kZSB1bmRlZmluZWRgKTtcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcodHlwZU5vZGUpO1xuICB0aHJvdyBuZXcgRXJyb3IoYOyVjCDsiJgg7JeG64qUIFN5bnRheEtpbmQgJHt0eXBlTm9kZS5raW5kfWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFyYW1EZWMoXG4gIHBhcmFtRGVjOiB7XG4gICAgbmFtZTogdHMuQmluZGluZ05hbWU7XG4gICAgdHlwZTogdHMuVHlwZU5vZGU7XG4gICAgb3B0aW9uYWw/OiBib29sZWFuO1xuICAgIGRlZmF1bHREZWY/OiBzdHJpbmc7XG4gIH0sXG4gIGluZGV4OiBudW1iZXIgPSAwXG4pOiBBcGlQYXJhbSB7XG4gIGNvbnN0IG5hbWUgPSBwYXJhbURlYy5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gIGNvbnN0IHR5cGUgPSByZXNvbHZlVHlwZU5vZGUocGFyYW1EZWMudHlwZSk7XG5cbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUuZGVidWcoeyBuYW1lLCB0eXBlLCBwYXJhbURlYyB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQXBpUGFyYW0gPSB7XG4gICAgbmFtZTogbmFtZS5lc2NhcGVkVGV4dCA/IG5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSA6IGBub25hbWVBdCR7aW5kZXh9YCxcbiAgICB0eXBlLFxuICAgIG9wdGlvbmFsOiBwYXJhbURlYy5vcHRpb25hbCA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0RGVmOiBwYXJhbURlYz8uZGVmYXVsdERlZixcbiAgfTtcblxuICAvLyDqtazsobDrtoTtlbTtlaDri7nsnZgg6rK97JqwIO2DgOyeheydtOumhCDsgqzsmqlcbiAgaWYgKFxuICAgIHRzLmlzT2JqZWN0QmluZGluZ1BhdHRlcm4obmFtZSkgJiZcbiAgICB0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKHBhcmFtRGVjLnR5cGUpICYmXG4gICAgdHMuaXNJZGVudGlmaWVyKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUpXG4gICkge1xuICAgIHJlc3VsdC5uYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShwYXJhbURlYy50eXBlLnR5cGVOYW1lLnRleHQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcHJpbnROb2RlKFxuICBub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkLFxuICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHsgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWQgfSk7XG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSk7XG59XG4iXSwibmFtZXMiOlsicmVhZEZpbGUiLCJ0cyIsInJlZ2lzdGVyZWRBcGlzIiwiaW5mbGVjdGlvbiIsImFzc2VydCIsInJlYWRBcGlzRnJvbUZpbGUiLCJmaWxlUGF0aCIsImVuZHNXaXRoIiwiRXJyb3IiLCJzb3VyY2VGaWxlIiwiY3JlYXRlU291cmNlRmlsZSIsInRvU3RyaW5nIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwibWV0aG9kcyIsIm1vZGVsTmFtZSIsIm1ldGhvZE5hbWUiLCJ2aXNpdG9yIiwibm9kZSIsImlzQ2xhc3NEZWNsYXJhdGlvbiIsIm5hbWUiLCJpc0lkZW50aWZpZXIiLCJlc2NhcGVkVGV4dCIsInJlcGxhY2UiLCJpc01ldGhvZERlY2xhcmF0aW9uIiwidHlwZVBhcmFtZXRlcnMiLCJtYXAiLCJ0eXBlUGFyYW0iLCJ0cCIsInQiLCJpZCIsImNvbnN0cmFpbnQiLCJyZXNvbHZlVHlwZU5vZGUiLCJ1bmRlZmluZWQiLCJwYXJhbWV0ZXJzIiwicGFyYW1EZWMiLCJpbmRleCIsImRlZmF1bHREZWYiLCJwcmludE5vZGUiLCJpbml0aWFsaXplciIsInJlc29sdmVQYXJhbURlYyIsInR5cGUiLCJvcHRpb25hbCIsInF1ZXN0aW9uVG9rZW4iLCJyZXR1cm5UeXBlIiwicHVzaCIsImZvckVhY2hDaGlsZCIsImxlbmd0aCIsImN1cnJlbnRNb2RlbEFwaXMiLCJmaWx0ZXIiLCJhcGkiLCJmaW5kIiwibWV0aG9kIiwiZXh0ZW5kZWRBcGlzIiwiZm91bmRNZXRob2QiLCJ0eXBlTm9kZSIsImtpbmQiLCJTeW50YXhLaW5kIiwiQW55S2V5d29yZCIsIlVua25vd25LZXl3b3JkIiwiU3RyaW5nS2V5d29yZCIsIk51bWJlcktleXdvcmQiLCJCb29sZWFuS2V5d29yZCIsIlVuZGVmaW5lZEtleXdvcmQiLCJOdWxsS2V5d29yZCIsIlZvaWRLZXl3b3JkIiwiTGl0ZXJhbFR5cGUiLCJsaXRlcmFsIiwiaXNTdHJpbmdMaXRlcmFsIiwidmFsdWUiLCJ0ZXh0IiwiaXNOdW1lcmljTGl0ZXJhbCIsIk51bWJlciIsIlRydWVLZXl3b3JkIiwiRmFsc2VLZXl3b3JkIiwiQXJyYXlUeXBlIiwiYXJyTm9kZSIsImVsZW1lbnRzVHlwZSIsImVsZW1lbnRUeXBlIiwiVHlwZUxpdGVyYWwiLCJsaXRlcmFsTm9kZSIsInByb3BzIiwibWVtYmVycyIsIm1lbWJlciIsImlzSW5kZXhTaWduYXR1cmVEZWNsYXJhdGlvbiIsInJlcyIsIlR5cGVSZWZlcmVuY2UiLCJ0eXBlTmFtZSIsImFyZ3MiLCJ0eXBlQXJndW1lbnRzIiwidHlwZUFyZyIsIlVuaW9uVHlwZSIsInR5cGVzIiwiSW50ZXJzZWN0aW9uVHlwZSIsIkluZGV4ZWRBY2Nlc3NUeXBlIiwib2JqZWN0Iiwib2JqZWN0VHlwZSIsImluZGV4VHlwZSIsIlR1cGxlVHlwZSIsImlzVHVwbGVUeXBlTm9kZSIsImVsZW1lbnRzIiwiZWxlbSIsImNvbnNvbGUiLCJkZWJ1ZyIsInJlc3VsdCIsImlzT2JqZWN0QmluZGluZ1BhdHRlcm4iLCJpc1R5cGVSZWZlcmVuY2VOb2RlIiwiY2FtZWxpemUiLCJwcmludGVyIiwiY3JlYXRlUHJpbnRlciIsIm5ld0xpbmUiLCJOZXdMaW5lS2luZCIsIkxpbmVGZWVkIiwiRW1pdEhpbnQiLCJVbnNwZWNpZmllZCJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsUUFBUSxRQUFRLG1CQUFjO0FBRXZDLE9BQU9DLFFBQVEsYUFBYTtBQUM1QixTQUFzQkMsY0FBYyxRQUFRLHVCQUFvQjtBQUNoRSxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxPQUFPQyxZQUFZLFNBQVM7QUFHNUI7Ozs7O0NBS0MsR0FDRCxPQUFPLGVBQWVDLGlCQUFpQkMsUUFBc0I7SUFDM0QsSUFBSSxDQUFDQSxTQUFTQyxRQUFRLENBQUMsUUFBUTtRQUM3QixNQUFNLElBQUlDLE1BQU0sR0FBR0YsU0FBUyw2R0FBNkcsQ0FBQztJQUM1STtJQUVBLE1BQU1HLGFBQWFSLEdBQUdTLGdCQUFnQixDQUNwQ0osVUFDQSxBQUFDLENBQUEsTUFBTU4sU0FBU00sU0FBUSxFQUFHSyxRQUFRLElBQ25DVixHQUFHVyxZQUFZLENBQUNDLE1BQU07SUFHeEIsTUFBTUMsVUFBbUQsRUFBRTtJQUMzRCxJQUFJQyxZQUFvQjtJQUN4QixJQUFJQyxhQUFxQjtJQUN6QixNQUFNQyxVQUFVLENBQUNDO1FBQ2YsSUFBSWpCLEdBQUdrQixrQkFBa0IsQ0FBQ0QsT0FBTztZQUMvQixJQUFJQSxL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
@@ -0,0 +1,21 @@
1
+ import { PathLike } from "fs";
2
+ import { AbsolutePath } from "../utils/path-utils";
3
+ /**
4
+ * 체크섬 파일에 저장된 내용과 현재 실제 파일의 체크섬을 비교하여 변경된 파일을 찾습니다.
5
+ * @returns 변경된 파일 경로 배열. 프로젝트 루트부터 슬래시로 시작합니다. 예시: "/src/application/user/user.model.ts"
6
+ */
7
+ export declare function findChangedFilesUsingChecksums(): Promise<AbsolutePath[]>;
8
+ /**
9
+ * 체크섬을 갱신합니다.
10
+ * 현재 파일들의 체크섬을 계산해서 구한 다음, 체크섬 파일에 저장된 내용과 다르면 체크섬 파일을 갱신합니다.
11
+ */
12
+ export declare function renewChecksums(): Promise<void>;
13
+ /**
14
+ * 두 파일의 내용이 같은지 체크섬으로 비교합니다.
15
+ * 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
16
+ * @param one 파일 경로
17
+ * @param two 파일 경로
18
+ * @returns boolean
19
+ */
20
+ export declare function areFilesSame(one: PathLike, two: PathLike): Promise<boolean>;
21
+ //# sourceMappingURL=checksum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,QAAQ,EAAE,MAAM,IAAI,CAAC;AAQhD,OAAO,EACL,YAAY,EAEb,MAAM,qBAAqB,CAAC;AAQ7B;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAC7D,YAAY,EAAE,CACf,CAYA;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,CASlB"}
@@ -0,0 +1,98 @@
1
+ import path from "path";
2
+ import { globAsync } from "../utils/async-utils.js";
3
+ import { createReadStream } from "fs";
4
+ import { readFile, writeFile } from "node:fs/promises";
5
+ import { exists } from "../utils/fs-utils.js";
6
+ import crypto from "crypto";
7
+ import equal from "fast-deep-equal";
8
+ import * as _ from "lodash-es";
9
+ import { Sonamu } from "../api/sonamu.js";
10
+ import { getChecksumPatternGroupInAbsolutePath } from "./file-patterns.js";
11
+ /**
12
+ * 체크섬 파일에 저장된 내용과 현재 실제 파일의 체크섬을 비교하여 변경된 파일을 찾습니다.
13
+ * @returns 변경된 파일 경로 배열. 프로젝트 루트부터 슬래시로 시작합니다. 예시: "/src/application/user/user.model.ts"
14
+ */ export async function findChangedFilesUsingChecksums() {
15
+ const calculatedChecksums = await getCurrentChecksums();
16
+ const savedChecksums = await getPreviousChecksums();
17
+ const isSame = equal(calculatedChecksums, savedChecksums);
18
+ if (isSame) {
19
+ return [];
20
+ }
21
+ const diff = _.differenceWith(calculatedChecksums, savedChecksums, _.isEqual);
22
+ return diff.map((r)=>r.path);
23
+ }
24
+ /**
25
+ * 체크섬을 갱신합니다.
26
+ * 현재 파일들의 체크섬을 계산해서 구한 다음, 체크섬 파일에 저장된 내용과 다르면 체크섬 파일을 갱신합니다.
27
+ */ export async function renewChecksums() {
28
+ const calculatedChecksums = await getCurrentChecksums();
29
+ const savedChecksums = await getPreviousChecksums();
30
+ const isSame = equal(calculatedChecksums, savedChecksums);
31
+ if (isSame) {
32
+ return;
33
+ }
34
+ await saveChecksums(calculatedChecksums);
35
+ }
36
+ /**
37
+ * 두 파일의 내용이 같은지 체크섬으로 비교합니다.
38
+ * 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
39
+ * @param one 파일 경로
40
+ * @param two 파일 경로
41
+ * @returns boolean
42
+ */ export async function areFilesSame(one, two) {
43
+ if (!await exists(one) || !await exists(two)) {
44
+ return false;
45
+ }
46
+ const oneChecksum = await getChecksumOfFile(one);
47
+ const twoChecksum = await getChecksumOfFile(two);
48
+ return oneChecksum === twoChecksum;
49
+ }
50
+ async function getCurrentChecksums() {
51
+ const filePaths = (await Promise.all(Object.entries(getChecksumPatternGroupInAbsolutePath()).map(async ([_fileType, pattern])=>{
52
+ return globAsync(pattern);
53
+ }))).flat().sort();
54
+ const fileChecksums = await Promise.all(filePaths.map(async (filePath)=>{
55
+ return {
56
+ path: filePath,
57
+ checksum: await getChecksumOfFile(filePath)
58
+ };
59
+ }));
60
+ return fileChecksums;
61
+ }
62
+ async function getPreviousChecksums() {
63
+ const checksumFilePath = getChecksumFilePath();
64
+ if (!await exists(checksumFilePath)) {
65
+ return [];
66
+ }
67
+ const previousChecksums = JSON.parse(await readFile(checksumFilePath, "utf-8")).map((r)=>({
68
+ path: path.join(Sonamu.apiRootPath, r.path),
69
+ checksum: r.checksum
70
+ }));
71
+ return previousChecksums;
72
+ }
73
+ function getChecksumFilePath() {
74
+ return path.join(Sonamu.apiRootPath, "sonamu.lock");
75
+ }
76
+ async function saveChecksums(checksums) {
77
+ const checksumFilePath = getChecksumFilePath();
78
+ await writeFile(checksumFilePath, JSON.stringify(checksums.map((r)=>({
79
+ path: path.relative(Sonamu.apiRootPath, r.path),
80
+ checksum: r.checksum
81
+ })), null, 2), "utf-8");
82
+ console.log("checksum saved", checksumFilePath);
83
+ }
84
+ async function getChecksumOfFile(filePath) {
85
+ return new Promise((resolve, reject)=>{
86
+ const hash = crypto.createHash("sha1");
87
+ const input = createReadStream(filePath);
88
+ input.on("error", reject);
89
+ input.on("data", function(chunk) {
90
+ hash.update(chunk);
91
+ });
92
+ input.on("close", function() {
93
+ resolve(hash.digest("hex"));
94
+ });
95
+ });
96
+ }
97
+
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY2hlY2tzdW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICBBYnNvbHV0ZVBhdGgsXG4gIEFwaVJlbGF0aXZlUGF0aCxcbn0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5cbnR5cGUgUGF0aEFuZENoZWNrc3VtID0ge1xuICBwYXRoOiBBYnNvbHV0ZVBhdGg7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDtmITsnqwg7Iuk7KCcIO2MjOydvOydmCDssrTtgazshKzsnYQg67mE6rWQ7ZWY7JesIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7Iq164uI64ukLlxuICogQHJldHVybnMg67OA6rK965CcIO2MjOydvCDqsr3roZwg67Cw7Je0LiDtlITroZzsoJ3tirgg66Oo7Yq467aA7YSwIOyKrOuemOyLnOuhnCDsi5zsnpHtlanri4jri6QuIOyYiOyLnDogXCIvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTogUHJvbWlzZTxcbiAgQWJzb2x1dGVQYXRoW11cbj4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZGlmZiA9IF8uZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIF8uaXNFcXVhbCk7XG5cbiAgcmV0dXJuIGRpZmYubWFwKChyKSA9PiByLnBhdGgpO1xufVxuXG4vKipcbiAqIOyytO2BrOyErOydhCDqsLHsi6Dtlanri4jri6QuXG4gKiDtmITsnqwg7YyM7J2865Ok7J2YIOyytO2BrOyErOydhCDqs4TsgrDtlbTshJwg6rWs7ZWcIOuLpOydjCwg7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IOuLpOultOuptCDssrTtgazshKwg7YyM7J287J2EIOqwseyLoO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc2F2ZUNoZWNrc3VtcyhjYWxjdWxhdGVkQ2hlY2tzdW1zKTtcbn1cblxuLyoqXG4gKiDrkZAg7YyM7J287J2YIOuCtOyaqeydtCDqsJnsnYDsp4Ag7LK07YGs7ISs7Jy866GcIOu5hOq1kO2VqeuLiOuLpC5cbiAqIOunjOyVvSDtjIzsnbzsnbQg65GYIOykkSDtlZjrgpjrnbzrj4Qg7JeG64uk66m0IOu5hOq1kCDrtojqsIDroZwgZmFsc2Ug67CY7ZmY7ZWp64uI64ukLlxuICogQHBhcmFtIG9uZSDtjIzsnbwg6rK966GcXG4gKiBAcGFyYW0gdHdvIO2MjOydvCDqsr3roZxcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyZUZpbGVzU2FtZShcbiAgb25lOiBQYXRoTGlrZSxcbiAgdHdvOiBQYXRoTGlrZVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhvbmUpKSB8fCAhKGF3YWl0IGV4aXN0cyh0d28pKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG9uZUNoZWNrc3VtID0gYXdhaXQgZ2V0Q2hlY2tzdW1PZkZpbGUob25lKTtcbiAgY29uc3QgdHdvQ2hlY2tzdW0gPSBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZSh0d28pO1xuXG4gIHJldHVybiBvbmVDaGVja3N1bSA9PT0gdHdvQ2hlY2tzdW07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBPYmplY3QuZW50cmllcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLm1hcChcbiAgICAgICAgYXN5bmMgKFtfZmlsZVR5cGUsIHBhdHRlcm5dKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGdsb2JBc3luYyhwYXR0ZXJuKSBhcyBQcm9taXNlPEFic29sdXRlUGF0aFtdPjtcbiAgICAgICAgfVxuICAgICAgKVxuICAgIClcbiAgKVxuICAgIC5mbGF0KClcbiAgICAuc29ydCgpO1xuXG4gIGNvbnN0IGZpbGVDaGVja3N1bXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlUGF0aHMubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIGNoZWNrc3VtOiBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aCksXG4gICAgICB9O1xuICAgIH0pXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVDaGVja3N1bXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHByZXZpb3VzQ2hlY2tzdW1zID0gSlNPTi5wYXJzZShcbiAgICBhd2FpdCByZWFkRmlsZShjaGVja3N1bUZpbGVQYXRoLCBcInV0Zi04XCIpXG4gICkubWFwKChyOiB7IHBhdGg6IEFwaVJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgIHBhdGg6IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIHIucGF0aCksIC8vIOyytO2BrOyErCDtjIzsnbzsl5DshJwg7J297J2EIOuVjDogQVBJIOyDgeuMgCDqsr3roZwg4oaSIOygiOuMgCDqsr3roZxcbiAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgfSkpIGFzIFBhdGhBbmRDaGVja3N1bVtdO1xuICByZXR1cm4gcHJldmlvdXNDaGVja3N1bXM7XG59XG5cbmZ1bmN0aW9uIGdldENoZWNrc3VtRmlsZVBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic29uYW11LmxvY2tcIikgYXMgQWJzb2x1dGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlQ2hlY2tzdW1zKGNoZWNrc3VtczogUGF0aEFuZENoZWNrc3VtW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgYXdhaXQgd3JpdGVGaWxlKFxuICAgIGNoZWNrc3VtRmlsZVBhdGgsXG4gICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICBjaGVja3N1bXMubWFwKChyKSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXtlaAg65WMOiDsoIjrjIAg6rK966GcIOKGkiBBUEkg7IOB64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pKSxcbiAgICAgIG51bGwsXG4gICAgICAyXG4gICAgKSxcbiAgICBcInV0Zi04XCJcbiAgKTtcbiAgY29uc29sZS5sb2coXCJjaGVja3N1bSBzYXZlZFwiLCBjaGVja3N1bUZpbGVQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW1PZkZpbGUoZmlsZVBhdGg6IFBhdGhMaWtlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIik7XG4gICAgY29uc3QgaW5wdXQgPSBjcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcbiAgICBpbnB1dC5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgaW5wdXQub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChjaHVuazogYW55KSB7XG4gICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgaW5wdXQub24oXCJjbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXNvbHZlKGhhc2guZGlnZXN0KFwiaGV4XCIpKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsicGF0aCIsImdsb2JBc3luYyIsImNyZWF0ZVJlYWRTdHJlYW0iLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImV4aXN0cyIsImNyeXB0byIsImVxdWFsIiwiXyIsIlNvbmFtdSIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJjYWxjdWxhdGVkQ2hlY2tzdW1zIiwiZ2V0Q3VycmVudENoZWNrc3VtcyIsInNhdmVkQ2hlY2tzdW1zIiwiZ2V0UHJldmlvdXNDaGVja3N1bXMiLCJpc1NhbWUiLCJkaWZmIiwiZGlmZmVyZW5jZVdpdGgiLCJpc0VxdWFsIiwibWFwIiwiciIsInJlbmV3Q2hlY2tzdW1zIiwic2F2ZUNoZWNrc3VtcyIsImFyZUZpbGVzU2FtZSIsIm9uZSIsInR3byIsIm9uZUNoZWNrc3VtIiwiZ2V0Q2hlY2tzdW1PZkZpbGUiLCJ0d29DaGVja3N1bSIsImZpbGVQYXRocyIsIlByb21pc2UiLCJhbGwiLCJPYmplY3QiLCJlbnRyaWVzIiwiX2ZpbGVUeXBlIiwicGF0dGVybiIsImZsYXQiLCJzb3J0IiwiZmlsZUNoZWNrc3VtcyIsImZpbGVQYXRoIiwiY2hlY2tzdW0iLCJjaGVja3N1bUZpbGVQYXRoIiwiZ2V0Q2hlY2tzdW1GaWxlUGF0aCIsInByZXZpb3VzQ2hlY2tzdW1zIiwiSlNPTiIsInBhcnNlIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiY2hlY2tzdW1zIiwic3RyaW5naWZ5IiwicmVsYXRpdmUiLCJjb25zb2xlIiwibG9nIiwicmVzb2x2ZSIsInJlamVjdCIsImhhc2giLCJjcmVhdGVIYXNoIiwiaW5wdXQiLCJvbiIsImNodW5rIiwidXBkYXRlIiwiZGlnZXN0Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxVQUFVLE9BQU87QUFDeEIsU0FBU0MsU0FBUyxRQUFRLDBCQUF1QjtBQUNqRCxTQUFTQyxnQkFBZ0IsUUFBa0IsS0FBSztBQUNoRCxTQUFTQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUNsRCxTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBRTNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLGtCQUFrQjtBQUNwQyxZQUFZQyxPQUFPLFlBQVk7QUFDL0IsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUt2QyxTQUFTQyxxQ0FBcUMsUUFBUSxxQkFBa0I7QUFPeEU7OztDQUdDLEdBQ0QsT0FBTyxlQUFlQztJQUdwQixNQUFNQyxzQkFBc0IsTUFBTUM7SUFDbEMsTUFBTUMsaUJBQWlCLE1BQU1DO0lBRTdCLE1BQU1DLFNBQVNULE1BQU1LLHFCQUFxQkU7SUFDMUMsSUFBSUUsUUFBUTtRQUNWLE9BQU8sRUFBRTtJQUNYO0lBRUEsTUFBTUMsT0FBT1QsRUFBRVUsY0FBYyxDQUFDTixxQkFBcUJFLGdCQUFnQk4sRUFBRVcsT0FBTztJQUU1RSxPQUFPRixLQUFLRyxHQUFHLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRXJCLElBQUk7QUFDL0I7QUFFQTs7O0NBR0MsR0FDRCxPQUFPLGVBQWVzQjtJQUNwQixNQUFNVixzQkFBc0IsTUFBTUM7SUFDbEMsTUFBTUMsaUJBQWlCLE1BQU1DO0lBRTdCLE1BQU1DLFNBQVNULE1BQU1LLHFCQUFxQkU7SUFDMUMsSUFBSUUsUUFBUTtRQUNWO0lBQ0Y7SUFFQSxNQUFNTyxjQUFjWDtBQUN0QjtBQUVBOzs7Ozs7Q0FNQyxHQUNELE9BQU8sZUFBZVksYUFDcEJDLEdBQWEsRUFDYkMsR0FBYTtJQUViLElBQUksQ0FBRSxNQUFNckIsT0FBT29CLFFBQVMsQ0FBRSxNQUFNcEIsT0FBT3FCLE1BQU87UUFDaEQsT0FBTztJQUNUO0lBRUEsTUFBTUMsY0FBYyxNQUFNQyxrQkFBa0JIO0lBQzVDLE1BQU1JLGNBQWMsTUFBTUQsa0JBQWtCRjtJQUU1QyxPQUFPQyxnQkFBZ0JFO0FBQ3pCO0FBRUEsZUFBZWhCO0lBQ2IsTUFBTWlCLFlBQVksQUFDaEIsQ0FBQSxNQUFNQyxRQUFRQyxHQUFHLENBQ2ZDLE9BQU9DLE9BQU8sQ0FBQ3hCLHlDQUF5Q1UsR0FBRyxDQUN6RCxPQUFPLENBQUNlLFdBQVdDLFFBQVE7UUFDekIsT0FBT25DLFVBQVVtQztJQUNuQixHQUVKLEVBRUNDLElBQUksR0FDSkMsSUFBSTtJQUVQLE1BQU1DLGdCQUFnQixNQUFNUixRQUFRQyxHQUFHLENBQ3JDRixVQUFVVixHQUFHLENBQUMsT0FBT29CO1FBQ25CLE9BQU87WUFDTHhDLE1BQU13QztZQUNOQyxVQUFVLE1BQU1iLGtCQUFrQlk7UUFDcEM7SUFDRjtJQUdGLE9BQU9EO0FBQ1Q7QUFFQSxlQUFleEI7SUFDYixNQUFNMkIsbUJBQW1CQztJQUN6QixJQUFJLENBQUUsTUFBTXRDLE9BQU9xQyxtQkFBb0I7UUFDckMsT0FBTyxFQUFFO0lBQ1g7SUFFQSxNQUFNRSxvQkFBb0JDLEtBQUtDLEtBQUssQ0FDbEMsTUFBTTNDLFNBQVN1QyxrQkFBa0IsVUFDakN0QixHQUFHLENBQUMsQ0FBQ0MsSUFBb0QsQ0FBQTtZQUN6RHJCLE1BQU1BLEtBQUsrQyxJQUFJLENBQUN0QyxPQUFPdUMsV0FBVyxFQUFFM0IsRUFBRXJCLElBQUk7WUFDMUN5QyxVQUFVcEIsRUFBRW9CLFFBQVE7UUFDdEIsQ0FBQTtJQUNBLE9BQU9HO0FBQ1Q7QUFFQSxTQUFTRDtJQUNQLE9BQU8zQyxLQUFLK0MsSUFBSSxDQUFDdEMsT0FBT3VDLFdBQVcsRUFBRTtBQUN2QztBQUVBLGVBQWV6QixjQUFjMEIsU0FBNEI7SUFDdkQsTUFBTVAsbUJBQW1CQztJQUN6QixNQUFNdkMsVUFDSnNDLGtCQUNBRyxLQUFLSyxTQUFTLENBQ1pELFVBQVU3QixHQUFHLENBQUMsQ0FBQ0MsSUFBTyxDQUFBO1lBQ3BCckIsTUFBTUEsS0FBS21ELFFBQVEsQ0FBQzFDLE9BQU91QyxXQUFXLEVBQUUzQixFQUFFckIsSUFBSTtZQUM5Q3lDLFVBQVVwQixFQUFFb0IsUUFBUTtRQUN0QixDQUFBLElBQ0EsTUFDQSxJQUVGO0lBRUZXLFFBQVFDLEdBQUcsQ0FBQyxrQkFBa0JYO0FBQ2hDO0FBRUEsZUFBZWQsa0JBQWtCWSxRQUFrQjtJQUNqRCxPQUFPLElBQUlULFFBQWdCLENBQUN1QixTQUFTQztRQUNuQyxNQUFNQyxPQUFPbEQsT0FBT21ELFVBQVUsQ0FBQztRQUMvQixNQUFNQyxRQUFReEQsaUJBQWlCc0M7UUFDL0JrQixNQUFNQyxFQUFFLENBQUMsU0FBU0o7UUFDbEJHLE1BQU1DLEVBQUUsQ0FBQyxRQUFRLFNBQVVDLEtBQVU7WUFDbkNKLEtBQUtLLE1BQU0sQ0FBQ0Q7UUFDZDtRQUNBRixNQUFNQyxFQUFFLENBQUMsU0FBUztZQUNoQkwsUUFBUUUsS0FBS00sTUFBTSxDQUFDO1FBQ3RCO0lBQ0Y7QUFDRiJ9
@@ -0,0 +1,20 @@
1
+ import { GenerateOptions, PathAndCode, TemplateKey, TemplateOptions } from "../types/types";
2
+ import { AbsolutePath } from "../utils/path-utils";
3
+ /**
4
+ * 템플릿을 렌더링하고 파일로 생성합니다.
5
+ * overwrite 옵션이 false인 경우, 이미 존재하는 파일은 건너뜁니다.
6
+ * @param key - 템플릿 키 (예: "entity", "model", "service" 등)
7
+ * @param templateOptions - 템플릿 렌더링에 필요한 옵션
8
+ * @param _generateOptions - 생성 옵션 (overwrite 여부)
9
+ * @returns 생성된 파일 경로 배열
10
+ */
11
+ export declare function generateTemplate(key: TemplateKey, templateOptions: any, _generateOptions?: GenerateOptions): Promise<AbsolutePath[]>;
12
+ /**
13
+ * 템플릿을 렌더링하여 PathAndCode 객체를 반환합니다.
14
+ * 파일로 쓰지 않고 메모리상에서만 렌더링합니다.
15
+ * @param key - 템플릿 키
16
+ * @param options - 템플릿 렌더링 옵션
17
+ * @returns 경로와 코드 쌍의 배열
18
+ */
19
+ export declare function renderTemplate<T extends keyof TemplateOptions>(key: T, options: TemplateOptions[T]): Promise<PathAndCode[]>;
20
+ //# sourceMappingURL=code-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/syncer/code-generator.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,WAAW,EACX,WAAW,EACX,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,eAAe,EAAE,GAAG,EACpB,gBAAgB,CAAC,EAAE,eAAe,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CA2CzB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,eAAe,EAClE,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAkBxB"}