sonamu 0.8.26 → 0.9.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 (684) hide show
  1. package/bin/cli.js +60 -13
  2. package/dist/_virtual/rolldown_runtime.js +39 -0
  3. package/dist/ai/agents/agent.d.ts +3 -3
  4. package/dist/ai/agents/agent.d.ts.map +1 -1
  5. package/dist/ai/agents/agent.js +76 -73
  6. package/dist/ai/agents/index.js +3 -3
  7. package/dist/ai/agents/types.d.ts +3 -3
  8. package/dist/ai/agents/types.d.ts.map +1 -1
  9. package/dist/ai/agents/types.js +1 -3
  10. package/dist/ai/index.js +3 -2
  11. package/dist/ai/providers/rtzr/api.js +25 -25
  12. package/dist/ai/providers/rtzr/error.js +25 -26
  13. package/dist/ai/providers/rtzr/index.js +5 -5
  14. package/dist/ai/providers/rtzr/model.d.ts +1 -1
  15. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/model.js +117 -133
  17. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  18. package/dist/ai/providers/rtzr/options.js +35 -41
  19. package/dist/ai/providers/rtzr/provider.d.ts +1 -1
  20. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  21. package/dist/ai/providers/rtzr/provider.js +53 -51
  22. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  23. package/dist/ai/providers/rtzr/utils.js +84 -84
  24. package/dist/api/base-frame.d.ts +2 -2
  25. package/dist/api/base-frame.d.ts.map +1 -1
  26. package/dist/api/base-frame.js +29 -19
  27. package/dist/api/caster.d.ts +1 -1
  28. package/dist/api/caster.d.ts.map +1 -1
  29. package/dist/api/caster.js +51 -61
  30. package/dist/api/code-converters.d.ts +4 -3
  31. package/dist/api/code-converters.d.ts.map +1 -1
  32. package/dist/api/code-converters.js +226 -249
  33. package/dist/api/config.d.ts +17 -17
  34. package/dist/api/config.d.ts.map +1 -1
  35. package/dist/api/config.js +37 -30
  36. package/dist/api/context.d.ts +10 -10
  37. package/dist/api/context.d.ts.map +1 -1
  38. package/dist/api/context.js +8 -2
  39. package/dist/api/decorators.d.ts +8 -8
  40. package/dist/api/decorators.d.ts.map +1 -1
  41. package/dist/api/decorators.js +245 -268
  42. package/dist/api/index.js +39 -7
  43. package/dist/api/secret.js +22 -15
  44. package/dist/api/sonamu.d.ts +15 -15
  45. package/dist/api/sonamu.d.ts.map +1 -1
  46. package/dist/api/sonamu.js +1012 -1131
  47. package/dist/api/validator.js +88 -79
  48. package/dist/auth/auth-generator.d.ts.map +1 -1
  49. package/dist/auth/auth-generator.js +203 -200
  50. package/dist/auth/better-auth-entities.d.ts +2 -2
  51. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  52. package/dist/auth/better-auth-entities.js +369 -429
  53. package/dist/auth/index.js +21 -6
  54. package/dist/auth/knex-adapter.d.ts +2 -2
  55. package/dist/auth/knex-adapter.d.ts.map +1 -1
  56. package/dist/auth/knex-adapter.js +153 -157
  57. package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
  58. package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
  59. package/dist/auth/plugins/entity-definitions/admin.js +58 -56
  60. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
  61. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
  62. package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
  63. package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
  64. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
  65. package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
  66. package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
  67. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  68. package/dist/auth/plugins/entity-definitions/index.js +26 -29
  69. package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
  70. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
  71. package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
  72. package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
  73. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
  74. package/dist/auth/plugins/entity-definitions/organization.js +362 -421
  75. package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
  76. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
  77. package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
  78. package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
  79. package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
  80. package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
  81. package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
  82. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
  83. package/dist/auth/plugins/entity-definitions/sso.js +94 -107
  84. package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
  85. package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
  86. package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
  87. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  88. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  89. package/dist/auth/plugins/entity-definitions/types.js +1 -10
  90. package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
  91. package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
  92. package/dist/auth/plugins/entity-definitions/username.js +31 -40
  93. package/dist/auth/plugins/index.js +12 -3
  94. package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
  95. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  96. package/dist/auth/plugins/wrappers/admin.js +28 -29
  97. package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
  98. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  99. package/dist/auth/plugins/wrappers/anonymous.js +23 -22
  100. package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
  101. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  102. package/dist/auth/plugins/wrappers/api-key.js +39 -34
  103. package/dist/auth/plugins/wrappers/index.js +11 -11
  104. package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
  105. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  106. package/dist/auth/plugins/wrappers/jwt.js +31 -26
  107. package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
  108. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  109. package/dist/auth/plugins/wrappers/organization.js +65 -62
  110. package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
  111. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  112. package/dist/auth/plugins/wrappers/passkey.js +33 -28
  113. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  114. package/dist/auth/plugins/wrappers/phone-number.js +26 -23
  115. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  116. package/dist/auth/plugins/wrappers/sso.js +37 -31
  117. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  118. package/dist/auth/plugins/wrappers/two-factor.js +31 -28
  119. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  120. package/dist/auth/plugins/wrappers/username.js +23 -23
  121. package/dist/bin/build-config.js +31 -31
  122. package/dist/bin/cli.js +1063 -1204
  123. package/dist/bin/fixture.d.ts.map +1 -1
  124. package/dist/bin/fixture.js +266 -259
  125. package/dist/bin/hmr-hook-register.d.ts.map +1 -1
  126. package/dist/bin/hmr-hook-register.js +19 -18
  127. package/dist/bin/test-command.d.ts.map +1 -1
  128. package/dist/bin/test-command.js +180 -177
  129. package/dist/bin/ts-loader-register.js +13 -6
  130. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  131. package/dist/bin/ts-loader-registration.js +28 -38
  132. package/dist/cache/cache-manager.d.ts +1 -1
  133. package/dist/cache/cache-manager.d.ts.map +1 -1
  134. package/dist/cache/cache-manager.js +20 -15
  135. package/dist/cache/decorator.d.ts +1 -1
  136. package/dist/cache/decorator.d.ts.map +1 -1
  137. package/dist/cache/decorator.js +84 -76
  138. package/dist/cache/drivers.js +21 -34
  139. package/dist/cache/index.js +10 -7
  140. package/dist/cache/types.d.ts +2 -2
  141. package/dist/cache/types.d.ts.map +1 -1
  142. package/dist/cache/types.js +1 -6
  143. package/dist/cache-control/cache-control.d.ts +2 -2
  144. package/dist/cache-control/cache-control.d.ts.map +1 -1
  145. package/dist/cache-control/cache-control.js +106 -122
  146. package/dist/cache-control/types.d.ts +2 -2
  147. package/dist/cache-control/types.d.ts.map +1 -1
  148. package/dist/cache-control/types.js +1 -19
  149. package/dist/compress/compress.d.ts +1 -1
  150. package/dist/compress/compress.d.ts.map +1 -1
  151. package/dist/compress/compress.js +58 -56
  152. package/dist/compress/index.js +7 -2
  153. package/dist/compress/types.js +1 -11
  154. package/dist/cone/cone-generator.d.ts +1 -1
  155. package/dist/cone/cone-generator.d.ts.map +1 -1
  156. package/dist/cone/cone-generator.js +216 -219
  157. package/dist/database/_batch_update.d.ts +1 -1
  158. package/dist/database/_batch_update.d.ts.map +1 -1
  159. package/dist/database/_batch_update.js +107 -102
  160. package/dist/database/base-model.d.ts +8 -9
  161. package/dist/database/base-model.d.ts.map +1 -1
  162. package/dist/database/base-model.js +371 -392
  163. package/dist/database/base-model.types.d.ts +5 -5
  164. package/dist/database/base-model.types.d.ts.map +1 -1
  165. package/dist/database/base-model.types.js +1 -20
  166. package/dist/database/db.d.ts +5 -2
  167. package/dist/database/db.d.ts.map +1 -1
  168. package/dist/database/db.js +185 -171
  169. package/dist/database/knex.d.ts +1 -1
  170. package/dist/database/knex.d.ts.map +1 -1
  171. package/dist/database/knex.js +48 -42
  172. package/dist/database/puri-subset.types.d.ts +6 -7
  173. package/dist/database/puri-subset.types.d.ts.map +1 -1
  174. package/dist/database/puri-subset.types.js +1 -16
  175. package/dist/database/puri-wrapper.d.ts +6 -6
  176. package/dist/database/puri-wrapper.d.ts.map +1 -1
  177. package/dist/database/puri-wrapper.js +99 -101
  178. package/dist/database/puri.d.ts +4 -5
  179. package/dist/database/puri.d.ts.map +1 -1
  180. package/dist/database/puri.js +1021 -1227
  181. package/dist/database/puri.types.d.ts +6 -6
  182. package/dist/database/puri.types.d.ts.map +1 -1
  183. package/dist/database/puri.types.js +15 -6
  184. package/dist/database/transaction-context.d.ts +2 -2
  185. package/dist/database/transaction-context.d.ts.map +1 -1
  186. package/dist/database/transaction-context.js +22 -13
  187. package/dist/database/upsert-builder.d.ts +3 -3
  188. package/dist/database/upsert-builder.d.ts.map +1 -1
  189. package/dist/database/upsert-builder.js +405 -465
  190. package/dist/dict/en.js +72 -74
  191. package/dist/dict/index.js +13 -13
  192. package/dist/dict/ko.js +72 -74
  193. package/dist/dict/rc-keys.js +150 -168
  194. package/dist/dict/sd.d.ts +3 -1
  195. package/dist/dict/sd.d.ts.map +1 -1
  196. package/dist/dict/sd.js +54 -40
  197. package/dist/dict/sonamu-dictionary.d.ts +1 -1
  198. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  199. package/dist/dict/sonamu-dictionary.js +887 -955
  200. package/dist/dict/types.js +1 -7
  201. package/dist/dict/utils.js +26 -24
  202. package/dist/entity/entity-manager.d.ts +9 -9
  203. package/dist/entity/entity-manager.d.ts.map +1 -1
  204. package/dist/entity/entity-manager.js +226 -223
  205. package/dist/entity/entity-template-cone.d.ts +1 -1
  206. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  207. package/dist/entity/entity-template-cone.js +152 -151
  208. package/dist/entity/entity.d.ts.map +1 -1
  209. package/dist/entity/entity.js +952 -1089
  210. package/dist/exceptions/error-handler.d.ts +1 -1
  211. package/dist/exceptions/error-handler.d.ts.map +1 -1
  212. package/dist/exceptions/error-handler.js +32 -27
  213. package/dist/exceptions/so-exceptions.d.ts +1 -1
  214. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  215. package/dist/exceptions/so-exceptions.js +61 -68
  216. package/dist/filter/index.js +9 -3
  217. package/dist/filter/types.js +92 -88
  218. package/dist/filter/utils.d.ts +1 -1
  219. package/dist/filter/utils.d.ts.map +1 -1
  220. package/dist/filter/utils.js +147 -161
  221. package/dist/index.js +87 -40
  222. package/dist/logger/category.d.ts.map +1 -1
  223. package/dist/logger/category.js +30 -29
  224. package/dist/logger/configure.d.ts.map +1 -1
  225. package/dist/logger/configure.js +83 -107
  226. package/dist/migration/code-generation.d.ts +2 -2
  227. package/dist/migration/code-generation.d.ts.map +1 -1
  228. package/dist/migration/code-generation.js +1385 -1578
  229. package/dist/migration/migration-set.d.ts +1 -1
  230. package/dist/migration/migration-set.d.ts.map +1 -1
  231. package/dist/migration/migration-set.js +177 -227
  232. package/dist/migration/migrator.d.ts +4 -3
  233. package/dist/migration/migrator.d.ts.map +1 -1
  234. package/dist/migration/migrator.js +340 -345
  235. package/dist/migration/postgresql-schema-reader.d.ts +2 -2
  236. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  237. package/dist/migration/postgresql-schema-reader.js +506 -564
  238. package/dist/migration/slack-confirm.d.ts +2 -2
  239. package/dist/migration/slack-confirm.d.ts.map +1 -1
  240. package/dist/migration/slack-confirm.js +205 -193
  241. package/dist/migration/types.d.ts +2 -2
  242. package/dist/migration/types.d.ts.map +1 -1
  243. package/dist/migration/types.js +1 -3
  244. package/dist/naite/messaging-types.d.ts +1 -0
  245. package/dist/naite/messaging-types.d.ts.map +1 -1
  246. package/dist/naite/messaging-types.js +1 -7
  247. package/dist/naite/naite-reporter.d.ts +2 -2
  248. package/dist/naite/naite-reporter.d.ts.map +1 -1
  249. package/dist/naite/naite-reporter.js +127 -120
  250. package/dist/naite/naite.d.ts +3 -2
  251. package/dist/naite/naite.d.ts.map +1 -1
  252. package/dist/naite/naite.js +266 -300
  253. package/dist/ssr/index.d.ts +2 -2
  254. package/dist/ssr/index.d.ts.map +1 -1
  255. package/dist/ssr/index.js +13 -3
  256. package/dist/ssr/registry.d.ts +1 -1
  257. package/dist/ssr/registry.d.ts.map +1 -1
  258. package/dist/ssr/registry.js +45 -37
  259. package/dist/ssr/renderer.d.ts +4 -4
  260. package/dist/ssr/renderer.d.ts.map +1 -1
  261. package/dist/ssr/renderer.js +84 -91
  262. package/dist/ssr/types.d.ts +2 -2
  263. package/dist/ssr/types.d.ts.map +1 -1
  264. package/dist/ssr/types.js +1 -3
  265. package/dist/storage/base-file.js +54 -41
  266. package/dist/storage/buffered-file.d.ts +2 -2
  267. package/dist/storage/buffered-file.d.ts.map +1 -1
  268. package/dist/storage/buffered-file.js +51 -44
  269. package/dist/storage/drivers.d.ts +2 -2
  270. package/dist/storage/drivers.d.ts.map +1 -1
  271. package/dist/storage/drivers.js +12 -7
  272. package/dist/storage/index.js +14 -7
  273. package/dist/storage/s3-driver.d.ts +2 -2
  274. package/dist/storage/s3-driver.d.ts.map +1 -1
  275. package/dist/storage/s3-driver.js +52 -48
  276. package/dist/storage/storage-manager.d.ts +2 -2
  277. package/dist/storage/storage-manager.d.ts.map +1 -1
  278. package/dist/storage/storage-manager.js +33 -25
  279. package/dist/storage/types.d.ts +2 -2
  280. package/dist/storage/types.d.ts.map +1 -1
  281. package/dist/storage/types.js +1 -5
  282. package/dist/storage/uploaded-file.d.ts +1 -1
  283. package/dist/storage/uploaded-file.d.ts.map +1 -1
  284. package/dist/storage/uploaded-file.js +45 -35
  285. package/dist/stream/index.js +7 -2
  286. package/dist/stream/sse.d.ts +2 -2
  287. package/dist/stream/sse.d.ts.map +1 -1
  288. package/dist/stream/sse.js +72 -67
  289. package/dist/syncer/api-parser.d.ts +1 -1
  290. package/dist/syncer/api-parser.d.ts.map +1 -1
  291. package/dist/syncer/api-parser.js +224 -245
  292. package/dist/syncer/checksum.d.ts +1 -1
  293. package/dist/syncer/checksum.d.ts.map +1 -1
  294. package/dist/syncer/checksum.js +86 -72
  295. package/dist/syncer/code-generator.d.ts +2 -2
  296. package/dist/syncer/code-generator.d.ts.map +1 -1
  297. package/dist/syncer/code-generator.js +154 -160
  298. package/dist/syncer/entity-operations.d.ts +1 -1
  299. package/dist/syncer/entity-operations.d.ts.map +1 -1
  300. package/dist/syncer/entity-operations.js +63 -54
  301. package/dist/syncer/file-patterns.d.ts +1 -1
  302. package/dist/syncer/file-patterns.d.ts.map +1 -1
  303. package/dist/syncer/file-patterns.js +38 -38
  304. package/dist/syncer/index.js +19 -8
  305. package/dist/syncer/module-loader.d.ts +5 -5
  306. package/dist/syncer/module-loader.d.ts.map +1 -1
  307. package/dist/syncer/module-loader.js +83 -78
  308. package/dist/syncer/syncer-actions.d.ts +2 -2
  309. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  310. package/dist/syncer/syncer-actions.js +76 -91
  311. package/dist/syncer/syncer.d.ts +7 -6
  312. package/dist/syncer/syncer.d.ts.map +1 -1
  313. package/dist/syncer/syncer.js +426 -492
  314. package/dist/tasks/decorator.d.ts +3 -3
  315. package/dist/tasks/decorator.d.ts.map +1 -1
  316. package/dist/tasks/decorator.js +32 -28
  317. package/dist/tasks/step-wrapper.d.ts +1 -1
  318. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  319. package/dist/tasks/step-wrapper.js +42 -41
  320. package/dist/tasks/workflow-manager.d.ts +2 -2
  321. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  322. package/dist/tasks/workflow-manager.js +192 -221
  323. package/dist/template/entity-converter.d.ts +1 -1
  324. package/dist/template/entity-converter.d.ts.map +1 -1
  325. package/dist/template/entity-converter.js +103 -103
  326. package/dist/template/helpers.d.ts.map +1 -1
  327. package/dist/template/helpers.js +163 -163
  328. package/dist/template/implementations/entity.template.d.ts +1 -1
  329. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  330. package/dist/template/implementations/entity.template.js +76 -85
  331. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  332. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  333. package/dist/template/implementations/entry-server.template.js +32 -27
  334. package/dist/template/implementations/generated.template.d.ts +1 -1
  335. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  336. package/dist/template/implementations/generated.template.js +254 -275
  337. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  338. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  339. package/dist/template/implementations/generated_http.template.js +114 -133
  340. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  341. package/dist/template/implementations/generated_sso.template.js +249 -275
  342. package/dist/template/implementations/init_types.template.d.ts +1 -1
  343. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  344. package/dist/template/implementations/init_types.template.js +40 -34
  345. package/dist/template/implementations/model.template.d.ts +1 -1
  346. package/dist/template/implementations/model.template.d.ts.map +1 -1
  347. package/dist/template/implementations/model.template.js +56 -53
  348. package/dist/template/implementations/model_test.template.d.ts +1 -1
  349. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  350. package/dist/template/implementations/model_test.template.js +32 -24
  351. package/dist/template/implementations/queries.template.d.ts +1 -1
  352. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  353. package/dist/template/implementations/queries.template.js +84 -89
  354. package/dist/template/implementations/sd.template.d.ts +1 -1
  355. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  356. package/dist/template/implementations/sd.template.js +137 -144
  357. package/dist/template/implementations/services.template.d.ts +1 -1
  358. package/dist/template/implementations/services.template.d.ts.map +1 -1
  359. package/dist/template/implementations/services.template.js +164 -189
  360. package/dist/template/implementations/view_form.template.d.ts +1 -1
  361. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  362. package/dist/template/implementations/view_form.template.js +258 -285
  363. package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
  364. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  365. package/dist/template/implementations/view_id_all_select.template.js +31 -25
  366. package/dist/template/implementations/view_list.template.d.ts +1 -1
  367. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  368. package/dist/template/implementations/view_list.template.js +304 -355
  369. package/dist/template/implementations/view_search_input.template.d.ts +1 -1
  370. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  371. package/dist/template/implementations/view_search_input.template.js +31 -27
  372. package/dist/template/index.js +21 -7
  373. package/dist/template/template-manager.d.ts +1 -1
  374. package/dist/template/template-manager.d.ts.map +1 -1
  375. package/dist/template/template-manager.js +132 -123
  376. package/dist/template/template-types.js +8 -6
  377. package/dist/template/template.d.ts +2 -2
  378. package/dist/template/template.d.ts.map +1 -1
  379. package/dist/template/template.js +73 -68
  380. package/dist/template/zod-converter.d.ts.map +1 -1
  381. package/dist/template/zod-converter.js +603 -657
  382. package/dist/testing/_relation-graph.d.ts +1 -1
  383. package/dist/testing/_relation-graph.d.ts.map +1 -1
  384. package/dist/testing/_relation-graph.js +93 -88
  385. package/dist/testing/bootstrap.d.ts +22 -13
  386. package/dist/testing/bootstrap.d.ts.map +1 -1
  387. package/dist/testing/bootstrap.js +114 -114
  388. package/dist/testing/data-explorer.d.ts +3 -3
  389. package/dist/testing/data-explorer.d.ts.map +1 -1
  390. package/dist/testing/data-explorer.js +237 -265
  391. package/dist/testing/dev-test-routes.d.ts +2 -2
  392. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  393. package/dist/testing/dev-test-routes.js +258 -249
  394. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  395. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  396. package/dist/testing/dev-vitest-manager.js +514 -539
  397. package/dist/testing/faker-mappings.js +422 -420
  398. package/dist/testing/fixture-generator.d.ts +3 -3
  399. package/dist/testing/fixture-generator.d.ts.map +1 -1
  400. package/dist/testing/fixture-generator.js +1216 -1346
  401. package/dist/testing/fixture-loader.js +26 -25
  402. package/dist/testing/fixture-manager.d.ts +3 -3
  403. package/dist/testing/fixture-manager.d.ts.map +1 -1
  404. package/dist/testing/fixture-manager.js +706 -776
  405. package/dist/testing/global-setup.js +53 -49
  406. package/dist/testing/index.js +19 -11
  407. package/dist/testing/naite-vitest-reporter.js +18 -13
  408. package/dist/testing/parallel-db-manager.d.ts +1 -1
  409. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  410. package/dist/testing/parallel-db-manager.js +63 -78
  411. package/dist/testing/vitest-helpers.d.ts +1 -1
  412. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  413. package/dist/testing/vitest-helpers.js +37 -33
  414. package/dist/types/types.d.ts +28 -28
  415. package/dist/types/types.d.ts.map +1 -1
  416. package/dist/types/types.js +764 -890
  417. package/dist/ui/ai-api.d.ts +1 -1
  418. package/dist/ui/ai-api.d.ts.map +1 -1
  419. package/dist/ui/ai-api.js +52 -42
  420. package/dist/ui/ai-client.d.ts +1 -2
  421. package/dist/ui/ai-client.d.ts.map +1 -1
  422. package/dist/ui/ai-client.js +353 -388
  423. package/dist/ui/api.d.ts +1 -1
  424. package/dist/ui/api.d.ts.map +1 -1
  425. package/dist/ui/api.js +903 -1145
  426. package/dist/ui/cdd-service.d.ts +1 -1
  427. package/dist/ui/cdd-service.d.ts.map +1 -1
  428. package/dist/ui/cdd-service.js +406 -407
  429. package/dist/ui/cdd-types.js +1 -3
  430. package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
  431. package/dist/ui-web/assets/index-DejDON8K.js +238 -0
  432. package/dist/ui-web/index.html +3 -3
  433. package/dist/utils/async-utils.js +57 -45
  434. package/dist/utils/console-util.d.ts.map +1 -1
  435. package/dist/utils/console-util.js +104 -87
  436. package/dist/utils/controller.js +26 -19
  437. package/dist/utils/esm-utils.js +49 -38
  438. package/dist/utils/formatter.d.ts +1 -2
  439. package/dist/utils/formatter.d.ts.map +1 -1
  440. package/dist/utils/formatter.js +89 -115
  441. package/dist/utils/fs-utils.d.ts.map +1 -1
  442. package/dist/utils/fs-utils.js +68 -65
  443. package/dist/utils/lodash-able.js +11 -4
  444. package/dist/utils/model.d.ts +1 -1
  445. package/dist/utils/model.d.ts.map +1 -1
  446. package/dist/utils/model.js +21 -19
  447. package/dist/utils/object-utils.js +148 -186
  448. package/dist/utils/path-utils.js +67 -57
  449. package/dist/utils/process-utils.d.ts.map +1 -1
  450. package/dist/utils/process-utils.js +37 -31
  451. package/dist/utils/sql-parser.d.ts +1 -1
  452. package/dist/utils/sql-parser.d.ts.map +1 -1
  453. package/dist/utils/sql-parser.js +40 -40
  454. package/dist/utils/type-utils.js +44 -43
  455. package/dist/utils/utils.d.ts +2 -3
  456. package/dist/utils/utils.d.ts.map +1 -1
  457. package/dist/utils/utils.js +81 -93
  458. package/dist/utils/zod-error.d.ts +1 -1
  459. package/dist/utils/zod-error.d.ts.map +1 -1
  460. package/dist/utils/zod-error.js +24 -17
  461. package/dist/vector/chunking.d.ts +1 -1
  462. package/dist/vector/chunking.d.ts.map +1 -1
  463. package/dist/vector/chunking.js +100 -94
  464. package/dist/vector/config.d.ts +1 -1
  465. package/dist/vector/config.d.ts.map +1 -1
  466. package/dist/vector/config.js +76 -78
  467. package/dist/vector/embedding.d.ts +1 -1
  468. package/dist/vector/embedding.d.ts.map +1 -1
  469. package/dist/vector/embedding.js +128 -125
  470. package/dist/vector/index.js +5 -5
  471. package/dist/vector/types.js +1 -5
  472. package/package.json +31 -36
  473. package/src/ai/agents/agent.ts +12 -5
  474. package/src/ai/agents/types.ts +5 -5
  475. package/src/ai/providers/rtzr/model.ts +8 -10
  476. package/src/ai/providers/rtzr/options.ts +2 -1
  477. package/src/ai/providers/rtzr/provider.ts +5 -3
  478. package/src/ai/providers/rtzr/utils.ts +2 -7
  479. package/src/api/__tests__/config.test.ts +15 -8
  480. package/src/api/base-frame.ts +5 -3
  481. package/src/api/caster.ts +7 -6
  482. package/src/api/code-converters.ts +23 -26
  483. package/src/api/config.ts +23 -17
  484. package/src/api/context.ts +18 -11
  485. package/src/api/decorators.ts +17 -18
  486. package/src/api/sonamu.ts +44 -49
  487. package/src/auth/auth-generator.ts +4 -6
  488. package/src/auth/better-auth-entities.ts +3 -2
  489. package/src/auth/knex-adapter.ts +6 -5
  490. package/src/auth/plugins/entity-definitions/admin.ts +1 -1
  491. package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
  492. package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
  493. package/src/auth/plugins/entity-definitions/index.ts +1 -1
  494. package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
  495. package/src/auth/plugins/entity-definitions/organization.ts +1 -1
  496. package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
  497. package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
  498. package/src/auth/plugins/entity-definitions/sso.ts +1 -1
  499. package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
  500. package/src/auth/plugins/entity-definitions/types.ts +1 -1
  501. package/src/auth/plugins/entity-definitions/username.ts +1 -1
  502. package/src/auth/plugins/wrappers/admin.ts +3 -1
  503. package/src/auth/plugins/wrappers/anonymous.ts +3 -1
  504. package/src/auth/plugins/wrappers/api-key.ts +3 -1
  505. package/src/auth/plugins/wrappers/jwt.ts +3 -1
  506. package/src/auth/plugins/wrappers/organization.ts +3 -1
  507. package/src/auth/plugins/wrappers/passkey.ts +3 -1
  508. package/src/auth/plugins/wrappers/phone-number.ts +3 -1
  509. package/src/auth/plugins/wrappers/sso.ts +2 -1
  510. package/src/auth/plugins/wrappers/two-factor.ts +3 -1
  511. package/src/auth/plugins/wrappers/username.ts +3 -1
  512. package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
  513. package/src/bin/build-config.ts +3 -3
  514. package/src/bin/cli.ts +27 -25
  515. package/src/bin/fixture.ts +4 -2
  516. package/src/bin/hmr-hook-register.ts +1 -0
  517. package/src/bin/test-command.ts +4 -2
  518. package/src/bin/ts-loader-registration.ts +6 -22
  519. package/src/cache/cache-manager.ts +2 -1
  520. package/src/cache/decorator.ts +2 -2
  521. package/src/cache/types.ts +3 -3
  522. package/src/cache-control/cache-control.ts +3 -2
  523. package/src/cache-control/types.ts +2 -2
  524. package/src/compress/compress.ts +1 -1
  525. package/src/cone/cone-generator.ts +5 -3
  526. package/src/database/_batch_update.ts +1 -1
  527. package/src/database/base-model.ts +20 -14
  528. package/src/database/base-model.types.ts +12 -11
  529. package/src/database/db.ts +56 -21
  530. package/src/database/knex.ts +2 -2
  531. package/src/database/puri-subset.test-d.ts +33 -32
  532. package/src/database/puri-subset.types.ts +6 -7
  533. package/src/database/puri-wrapper.ts +29 -26
  534. package/src/database/puri.ts +36 -34
  535. package/src/database/puri.types.test-d.ts +6 -5
  536. package/src/database/puri.types.ts +9 -12
  537. package/src/database/transaction-context.ts +2 -2
  538. package/src/database/upsert-builder.ts +17 -10
  539. package/src/dict/sd.ts +17 -4
  540. package/src/dict/sonamu-dictionary.ts +23 -17
  541. package/src/entity/entity-manager.ts +9 -7
  542. package/src/entity/entity-template-cone.ts +10 -3
  543. package/src/entity/entity.ts +20 -16
  544. package/src/exceptions/error-handler.ts +2 -1
  545. package/src/exceptions/so-exceptions.ts +1 -1
  546. package/src/filter/utils.ts +3 -2
  547. package/src/logger/category.ts +1 -0
  548. package/src/logger/configure.ts +5 -5
  549. package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
  550. package/src/migration/code-generation.ts +26 -25
  551. package/src/migration/migration-set.ts +16 -18
  552. package/src/migration/migrator.ts +38 -33
  553. package/src/migration/postgresql-schema-reader.ts +12 -12
  554. package/src/migration/slack-confirm.ts +5 -4
  555. package/src/migration/types.ts +2 -2
  556. package/src/naite/messaging-types.ts +1 -1
  557. package/src/naite/naite-reporter.ts +5 -3
  558. package/src/naite/naite.ts +12 -7
  559. package/src/shared/app.shared.ts.txt +2 -2
  560. package/src/shared/web.shared.ts.txt +2 -2
  561. package/src/skills/AGENTS.md +19 -18
  562. package/src/skills/commands/sonamu-skills.md +9 -9
  563. package/src/skills/sonamu/SKILL.md +111 -104
  564. package/src/skills/sonamu/ai-agents.md +27 -26
  565. package/src/skills/sonamu/api.md +81 -69
  566. package/src/skills/sonamu/auth-migration.md +13 -27
  567. package/src/skills/sonamu/auth-plugins.md +41 -31
  568. package/src/skills/sonamu/auth.md +30 -24
  569. package/src/skills/sonamu/cdd.md +26 -17
  570. package/src/skills/sonamu/cone.md +50 -50
  571. package/src/skills/sonamu/config.md +74 -51
  572. package/src/skills/sonamu/create-sonamu.md +31 -19
  573. package/src/skills/sonamu/database.md +43 -26
  574. package/src/skills/sonamu/entity-basic.md +61 -61
  575. package/src/skills/sonamu/entity-relations.md +84 -80
  576. package/src/skills/sonamu/entity-validation-checklist.md +19 -15
  577. package/src/skills/sonamu/fixture-cli.md +52 -30
  578. package/src/skills/sonamu/framework-change.md +9 -7
  579. package/src/skills/sonamu/frontend.md +64 -82
  580. package/src/skills/sonamu/i18n.md +45 -37
  581. package/src/skills/sonamu/migration.md +54 -31
  582. package/src/skills/sonamu/model.md +98 -66
  583. package/src/skills/sonamu/naite.md +34 -32
  584. package/src/skills/sonamu/project-init.md +28 -8
  585. package/src/skills/sonamu/puri.md +82 -91
  586. package/src/skills/sonamu/scaffolding.md +44 -32
  587. package/src/skills/sonamu/skill-contribution.md +50 -45
  588. package/src/skills/sonamu/subset.md +13 -13
  589. package/src/skills/sonamu/tasks.md +73 -58
  590. package/src/skills/sonamu/testing-devrunner.md +56 -36
  591. package/src/skills/sonamu/testing.md +23 -58
  592. package/src/skills/sonamu/upsert.md +32 -31
  593. package/src/skills/sonamu/vector.md +37 -36
  594. package/src/ssr/index.ts +2 -12
  595. package/src/ssr/registry.ts +1 -1
  596. package/src/ssr/renderer.ts +7 -5
  597. package/src/ssr/types.ts +2 -2
  598. package/src/storage/buffered-file.ts +4 -2
  599. package/src/storage/drivers.ts +3 -2
  600. package/src/storage/s3-driver.ts +7 -4
  601. package/src/storage/storage-manager.ts +3 -2
  602. package/src/storage/types.ts +3 -2
  603. package/src/storage/uploaded-file.ts +1 -1
  604. package/src/stream/sse.ts +2 -2
  605. package/src/syncer/api-parser.ts +8 -5
  606. package/src/syncer/checksum.ts +9 -5
  607. package/src/syncer/code-generator.ts +16 -8
  608. package/src/syncer/entity-operations.ts +5 -3
  609. package/src/syncer/file-patterns.ts +2 -1
  610. package/src/syncer/module-loader.ts +9 -6
  611. package/src/syncer/syncer-actions.ts +5 -3
  612. package/src/syncer/syncer.ts +18 -24
  613. package/src/tasks/decorator.ts +10 -8
  614. package/src/tasks/step-wrapper.ts +1 -1
  615. package/src/tasks/workflow-manager.ts +18 -15
  616. package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
  617. package/src/template/entity-converter.ts +4 -2
  618. package/src/template/generated.template.test-d.ts +2 -1
  619. package/src/template/helpers.ts +5 -2
  620. package/src/template/implementations/entity.template.ts +9 -8
  621. package/src/template/implementations/entry-server.template.ts +1 -1
  622. package/src/template/implementations/generated.template.ts +21 -29
  623. package/src/template/implementations/generated_http.template.ts +9 -6
  624. package/src/template/implementations/generated_sso.template.ts +6 -4
  625. package/src/template/implementations/init_types.template.ts +3 -2
  626. package/src/template/implementations/model.template.ts +4 -2
  627. package/src/template/implementations/model_test.template.ts +3 -2
  628. package/src/template/implementations/queries.template.ts +6 -14
  629. package/src/template/implementations/sd.template.ts +4 -2
  630. package/src/template/implementations/services.template.ts +7 -11
  631. package/src/template/implementations/view_form.template.ts +5 -3
  632. package/src/template/implementations/view_id_all_select.template.ts +3 -2
  633. package/src/template/implementations/view_list.template.ts +7 -5
  634. package/src/template/implementations/view_search_input.template.ts +3 -2
  635. package/src/template/template-manager.ts +4 -3
  636. package/src/template/template.ts +4 -3
  637. package/src/template/zod-converter.ts +10 -7
  638. package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
  639. package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
  640. package/src/testing/_relation-graph.ts +2 -2
  641. package/src/testing/bootstrap.ts +55 -27
  642. package/src/testing/data-explorer.ts +5 -4
  643. package/src/testing/dev-test-routes.ts +8 -5
  644. package/src/testing/dev-vitest-manager.ts +13 -12
  645. package/src/testing/fixture-generator.ts +11 -17
  646. package/src/testing/fixture-manager.ts +21 -17
  647. package/src/testing/parallel-db-manager.ts +2 -1
  648. package/src/testing/vitest-helpers.ts +2 -1
  649. package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
  650. package/src/types/types.ts +8 -8
  651. package/src/typings/knex.d.ts +4 -4
  652. package/src/ui/ai-api.ts +5 -3
  653. package/src/ui/ai-client.ts +6 -5
  654. package/src/ui/api.ts +25 -23
  655. package/src/ui/cdd-service.ts +12 -11
  656. package/src/utils/console-util.ts +3 -1
  657. package/src/utils/formatter.ts +94 -102
  658. package/src/utils/fs-utils.ts +2 -1
  659. package/src/utils/model.ts +2 -2
  660. package/src/utils/object-utils.ts +3 -3
  661. package/src/utils/process-utils.ts +2 -1
  662. package/src/utils/sql-parser.ts +10 -1
  663. package/src/utils/type-utils.ts +3 -3
  664. package/src/utils/utils.ts +9 -7
  665. package/src/utils/zod-error.ts +1 -1
  666. package/src/vector/chunking.ts +1 -1
  667. package/src/vector/config.ts +1 -1
  668. package/src/vector/embedding.ts +11 -9
  669. package/tsdown.api.config.ts +50 -0
  670. package/.swcrc.project-default +0 -18
  671. package/dist/api/__tests__/config.test.js +0 -189
  672. package/dist/bin/__tests__/test-command.test.js +0 -112
  673. package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
  674. package/dist/database/puri-subset.test-d.js +0 -89
  675. package/dist/database/puri.types.test-d.js +0 -129
  676. package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
  677. package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
  678. package/dist/template/generated.template.test-d.js +0 -24
  679. package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
  680. package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
  681. package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
  682. package/dist/typings/knex.d.js +0 -3
  683. package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
  684. package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
@@ -1 +1 @@
1
- {"version":3,"file":"hmr-hook-register.d.ts","sourceRoot":"","sources":["../../src/bin/hmr-hook-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"hmr-hook-register.d.ts","sourceRoot":"","sources":["../../src/bin/hmr-hook-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,EAAE,CAAC"}
@@ -1,21 +1,22 @@
1
+ //#region src/bin/hmr-hook-register.ts
1
2
  /**
2
- * hmr-hook 초기화하는 모듈입니다.
3
- *
4
- * 이 파일은 --import 플래그로 프로세스 시작 시 로드되어야 합니다.
5
- *
6
- * 환경변수:
7
- * - API_ROOT_PATH: 사용자 프로젝트의 API 루트 경로
8
- * - HOT: 'yes'일 때만 hmr-hook 활성화
9
- */ if (process.env.HOT === "yes" && process.env.API_ROOT_PATH) {
10
- const { hot } = await import("@sonamu-kit/hmr-hook");
11
- await hot.init({
12
- rootDirectory: process.env.API_ROOT_PATH,
13
- boundaries: [
14
- `./src/**/*.ts`
15
- ]
16
- });
17
- console.log("🔥 HMR-hook initialized");
3
+ * hmr-hook 초기화하는 모듈입니다.
4
+ *
5
+ * 이 파일은 --import 플래그로 프로세스 시작 시 로드되어야 합니다.
6
+ *
7
+ * 환경변수:
8
+ * - API_ROOT_PATH: 사용자 프로젝트의 API 루트 경로
9
+ * - HOT: 'yes'일 때만 hmr-hook 활성화
10
+ */
11
+ if (process.env.HOT === "yes" && process.env.API_ROOT_PATH) {
12
+ const { hot } = await import("@sonamu-kit/hmr-hook");
13
+ await hot.init({
14
+ rootDirectory: process.env.API_ROOT_PATH,
15
+ boundaries: [`./src/**/*.ts`]
16
+ });
17
+ console.log("🔥 HMR-hook initialized");
18
18
  }
19
- export { };
20
19
 
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vaG1yLWhvb2stcmVnaXN0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBobXItaG9vayDstIjquLDtmZTtlZjripQg66qo65OI7J6F64uI64ukLlxuICpcbiAqIOydtCDtjIzsnbzsnYAgLS1pbXBvcnQg7ZSM656Y6re466GcIO2UhOuhnOyEuOyKpCDsi5zsnpEg7IucIOuhnOuTnOuQmOyWtOyVvCDtlanri4jri6QuXG4gKlxuICog7ZmY6rK967OA7IiYOlxuICogLSBBUElfUk9PVF9QQVRIOiDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIEFQSSDro6jtirgg6rK966GcXG4gKiAtIEhPVDogJ3llcyfsnbwg65WM66eMIGhtci1ob29rIO2ZnOyEse2ZlFxuICovXG5cbmlmIChwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgJiYgcHJvY2Vzcy5lbnYuQVBJX1JPT1RfUEFUSCkge1xuICBjb25zdCB7IGhvdCB9ID0gYXdhaXQgaW1wb3J0KFwiQHNvbmFtdS1raXQvaG1yLWhvb2tcIik7XG5cbiAgYXdhaXQgaG90LmluaXQoe1xuICAgIHJvb3REaXJlY3Rvcnk6IHByb2Nlc3MuZW52LkFQSV9ST09UX1BBVEgsIC8vIOydtCDsuZzqtazqsIAg7ZSE66Gc7KCd7Yq4IEFQSSDqsr3roZzroZwg7J6YIOyEpOygleuQmOyWtOyVvCDslYTrnpgg67CU7Jq0642U66as6rCAIOyekeuPme2VqeuLiOuLpC5cbiAgICBib3VuZGFyaWVzOiBbYC4vc3JjLyoqLyoudHNgXSwgLy8g7ZSE66Gc7KCd7Yq47J2YIOydtCDsuZzqtazrk6TsnbQg67CU7Jq0642U66as6rCAIOuQqeuLiOuLpC5cbiAgfSk7XG5cbiAgY29uc29sZS5sb2coXCLwn5SlIEhNUi1ob29rIGluaXRpYWxpemVkXCIpO1xufVxuXG5leHBvcnQge307XG4iXSwibmFtZXMiOlsicHJvY2VzcyIsImVudiIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJob3QiLCJpbml0Iiwicm9vdERpcmVjdG9yeSIsImJvdW5kYXJpZXMiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Q0FRQyxHQUVELElBQUlBLFFBQVFDLEdBQUcsQ0FBQ0MsR0FBRyxLQUFLLFNBQVNGLFFBQVFDLEdBQUcsQ0FBQ0UsYUFBYSxFQUFFO0lBQzFELE1BQU0sRUFBRUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7SUFFN0IsTUFBTUEsSUFBSUMsSUFBSSxDQUFDO1FBQ2JDLGVBQWVOLFFBQVFDLEdBQUcsQ0FBQ0UsYUFBYTtRQUN4Q0ksWUFBWTtZQUFDLENBQUMsYUFBYSxDQUFDO1NBQUM7SUFDL0I7SUFFQUMsUUFBUUMsR0FBRyxDQUFDO0FBQ2Q7QUFFQSxXQUFVIn0=
20
+ //#endregion
21
+ export { };
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG1yLWhvb2stcmVnaXN0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9obXItaG9vay1yZWdpc3Rlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGhtci1ob29rIOy0iOq4sO2ZlO2VmOuKlCDrqqjrk4jsnoXri4jri6QuXG4gKlxuICog7J20IO2MjOydvOydgCAtLWltcG9ydCDtlIzrnpjqt7jroZwg7ZSE66Gc7IS47IqkIOyLnOyekSDsi5wg66Gc65Oc65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAqXG4gKiDtmZjqsr3rs4DsiJg6XG4gKiAtIEFQSV9ST09UX1BBVEg6IOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZggQVBJIOujqO2KuCDqsr3roZxcbiAqIC0gSE9UOiAneWVzJ+ydvCDrlYzrp4wgaG1yLWhvb2sg7Zmc7ISx7ZmUXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiAmJiBwcm9jZXNzLmVudi5BUElfUk9PVF9QQVRIKSB7XG4gIGNvbnN0IHsgaG90IH0gPSBhd2FpdCBpbXBvcnQoXCJAc29uYW11LWtpdC9obXItaG9va1wiKTtcblxuICBhd2FpdCBob3QuaW5pdCh7XG4gICAgcm9vdERpcmVjdG9yeTogcHJvY2Vzcy5lbnYuQVBJX1JPT1RfUEFUSCwgLy8g7J20IOy5nOq1rOqwgCDtlITroZzsoJ3tirggQVBJIOqyveuhnOuhnCDsnpgg7ISk7KCV65CY7Ja07JW8IOyVhOuemCDrsJTsmrTrjZTrpqzqsIAg7J6R64+Z7ZWp64uI64ukLlxuICAgIGJvdW5kYXJpZXM6IFtgLi9zcmMvKiovKi50c2BdLCAvLyDtlITroZzsoJ3tirjsnZgg7J20IOy5nOq1rOuTpOydtCDrsJTsmrTrjZTrpqzqsIAg65Cp64uI64ukLlxuICB9KTtcblxuICBjb25zb2xlLmxvZyhcIvCflKUgSE1SLWhvb2sgaW5pdGlhbGl6ZWRcIik7XG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZVxuZXhwb3J0IHt9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBVUEsSUFBSSxRQUFRLElBQUksUUFBUSxTQUFTLFFBQVEsSUFBSSxlQUFlO0NBQzFELE1BQU0sRUFBRSxRQUFRLE1BQU0sT0FBTztBQUU3QixPQUFNLElBQUksS0FBSztFQUNiLGVBQWUsUUFBUSxJQUFJO0VBQzNCLFlBQVksQ0FBQyxnQkFBZ0I7RUFDOUIsQ0FBQztBQUVGLFNBQVEsSUFBSSwwQkFBMEIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"test-command.d.ts","sourceRoot":"","sources":["../../src/bin/test-command.ts"],"names":[],"mappings":"AAkCA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmIjD"}
1
+ {"version":3,"file":"test-command.d.ts","sourceRoot":"","sources":["../../src/bin/test-command.ts"],"names":[],"mappings":"AAoCA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmIjD"}
@@ -1,190 +1,193 @@
1
- import path from "node:path";
1
+ import { findApiRootPath, init_utils } from "../utils/utils.js";
2
+ import { init_config, loadConfig } from "../api/config.js";
2
3
  import chalk from "chalk";
3
- import { loadConfig } from "../api/config.js";
4
- import { findApiRootPath } from "../utils/utils.js";
4
+ import path from "node:path";
5
+
6
+ //#region src/bin/test-command.ts
7
+ init_config();
8
+ init_utils();
5
9
  async function loadTestConfig() {
6
- const prevVitest = process.env.VITEST;
7
- process.env.VITEST = "true";
8
- try {
9
- const apiRootPath = findApiRootPath();
10
- return await loadConfig(apiRootPath);
11
- } finally{
12
- if (prevVitest === undefined) {
13
- delete process.env.VITEST;
14
- } else {
15
- process.env.VITEST = prevVitest;
16
- }
17
- }
10
+ const prevVitest = process.env.VITEST;
11
+ process.env.VITEST = "true";
12
+ try {
13
+ const apiRootPath = findApiRootPath();
14
+ return await loadConfig(apiRootPath);
15
+ } finally {
16
+ if (prevVitest === undefined) {
17
+ delete process.env.VITEST;
18
+ } else {
19
+ process.env.VITEST = prevVitest;
20
+ }
21
+ }
18
22
  }
19
23
  function resolveTestBaseUrl(config) {
20
- const port = config.server.listen?.port ?? 3000;
21
- const host = config.server.listen?.host ?? "localhost";
22
- const routePrefix = config.test?.devRunner?.routePrefix ?? "/__test__";
23
- return {
24
- host,
25
- port,
26
- routePrefix,
27
- baseUrl: `http://${host}:${port}${routePrefix}`
28
- };
24
+ const port = config.server.listen?.port ?? 3e3;
25
+ const host = config.server.listen?.host ?? "localhost";
26
+ const routePrefix = config.test?.devRunner?.routePrefix ?? "/__test__";
27
+ return {
28
+ host,
29
+ port,
30
+ routePrefix,
31
+ baseUrl: `http://${host}:${port}${routePrefix}`
32
+ };
29
33
  }
30
- export async function testCommand() {
31
- const args = process.argv.slice(3);
32
- const config = await loadTestConfig();
33
- // process.argv 파싱: sonamu test [file...] --pattern "이름" --traces --status
34
- const files = [];
35
- let pattern;
36
- let showTraces = false;
37
- let showStatus = false;
38
- for(let i = 0; i < args.length; i++){
39
- const arg = args[i];
40
- if (arg === "--pattern" || arg === "-p") {
41
- pattern = args[++i];
42
- } else if (arg === "--traces" || arg === "-t") {
43
- showTraces = true;
44
- } else if (arg === "--status" || arg === "-s") {
45
- showStatus = true;
46
- } else if (!arg.startsWith("-")) {
47
- files.push(arg);
48
- }
49
- }
50
- if (showStatus) {
51
- return testStatusCommand(config);
52
- }
53
- if (!config.test?.devRunner?.enabled) {
54
- console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
55
- process.exit(1);
56
- }
57
- const { baseUrl } = resolveTestBaseUrl(config);
58
- const url = `${baseUrl}/run`;
59
- const payload = {};
60
- if (files.length > 0) {
61
- payload.files = files;
62
- }
63
- if (pattern) {
64
- payload.pattern = pattern;
65
- }
66
- try {
67
- const response = await fetch(url, {
68
- method: "POST",
69
- headers: {
70
- "Content-Type": "application/json"
71
- },
72
- body: JSON.stringify(payload)
73
- });
74
- if (response.status === 404) {
75
- console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
76
- process.exit(1);
77
- }
78
- if (response.status === 500) {
79
- const errorBody = await response.json();
80
- console.error(chalk.red("Vitest 인스턴스가 아직 준비되지 않았습니다"));
81
- if (errorBody.error) {
82
- console.error(chalk.red(errorBody.error));
83
- }
84
- process.exit(1);
85
- }
86
- if (!response.ok) {
87
- console.error(chalk.red(`예상하지 못한 응답: ${response.status}`));
88
- process.exit(1);
89
- }
90
- const result = await response.json();
91
- const { passed, failed: failedCount, total, durationMs } = result.summary;
92
- const passedStr = chalk.green(`${passed} passed`);
93
- const failedStr = failedCount > 0 ? chalk.red(`${failedCount} failed`) : `${failedCount} failed`;
94
- console.log(`\nTests: ${passedStr}, ${failedStr}, ${total} total`);
95
- console.log(chalk.dim(`Duration: ${durationMs}ms`));
96
- const failedTests = collectFailedFromResults(result.results);
97
- if (failedTests.length > 0) {
98
- console.log(chalk.red.bold("\nFailed tests:"));
99
- for (const f of failedTests){
100
- console.log(` ${chalk.red("x")} ${f.fullName} ${chalk.dim(`(${f.file})`)}`);
101
- if (f.error) {
102
- console.log(` ${chalk.red(f.error.message)}`);
103
- }
104
- }
105
- }
106
- if (showTraces) {
107
- const testsWithTraces = collectTracesFromResults(result.results);
108
- if (testsWithTraces.length > 0) {
109
- console.log(chalk.cyan.bold("\nTraces:"));
110
- for (const { testName, file, traces } of testsWithTraces){
111
- console.log(`\n ${chalk.bold(testName)}`);
112
- console.log(` ${chalk.dim(path.basename(file))}`);
113
- for (const trace of traces){
114
- const loc = `${path.basename(trace.filePath)}:${trace.lineNumber}`;
115
- const valueStr = typeof trace.value === "string" ? trace.value : JSON.stringify(trace.value, null, 2) ?? "undefined";
116
- console.log(`\n ${chalk.yellow(`[${trace.key}]`)} ${chalk.dim(loc)}`);
117
- const indented = valueStr.split("\n").join("\n ");
118
- console.log(` ${indented}`);
119
- }
120
- }
121
- }
122
- }
123
- if (!result.ok) {
124
- process.exit(1);
125
- }
126
- } catch (err) {
127
- if (err instanceof TypeError && err.cause) {
128
- console.error(chalk.red("dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요"));
129
- process.exit(1);
130
- }
131
- throw err;
132
- }
34
+ async function testCommand() {
35
+ const args = process.argv.slice(3);
36
+ const config = await loadTestConfig();
37
+ const files = [];
38
+ let pattern;
39
+ let showTraces = false;
40
+ let showStatus = false;
41
+ for (let i = 0; i < args.length; i++) {
42
+ const arg = args[i];
43
+ if (arg === "--pattern" || arg === "-p") {
44
+ pattern = args[++i];
45
+ } else if (arg === "--traces" || arg === "-t") {
46
+ showTraces = true;
47
+ } else if (arg === "--status" || arg === "-s") {
48
+ showStatus = true;
49
+ } else if (!arg.startsWith("-")) {
50
+ files.push(arg);
51
+ }
52
+ }
53
+ if (showStatus) {
54
+ return testStatusCommand(config);
55
+ }
56
+ if (!config.test?.devRunner?.enabled) {
57
+ console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
58
+ process.exit(1);
59
+ }
60
+ const { baseUrl } = resolveTestBaseUrl(config);
61
+ const url = `${baseUrl}/run`;
62
+ const payload = {};
63
+ if (files.length > 0) {
64
+ payload.files = files;
65
+ }
66
+ if (pattern) {
67
+ payload.pattern = pattern;
68
+ }
69
+ try {
70
+ const response = await fetch(url, {
71
+ method: "POST",
72
+ headers: { "Content-Type": "application/json" },
73
+ body: JSON.stringify(payload)
74
+ });
75
+ if (response.status === 404) {
76
+ console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
77
+ process.exit(1);
78
+ }
79
+ if (response.status === 500) {
80
+ const errorBody = await response.json();
81
+ console.error(chalk.red("Vitest 인스턴스가 아직 준비되지 않았습니다"));
82
+ if (errorBody.error) {
83
+ console.error(chalk.red(errorBody.error));
84
+ }
85
+ process.exit(1);
86
+ }
87
+ if (!response.ok) {
88
+ console.error(chalk.red(`예상하지 못한 응답: ${response.status}`));
89
+ process.exit(1);
90
+ }
91
+ const result = await response.json();
92
+ const { passed, failed: failedCount, total, durationMs } = result.summary;
93
+ const passedStr = chalk.green(`${passed} passed`);
94
+ const failedStr = failedCount > 0 ? chalk.red(`${failedCount} failed`) : `${failedCount} failed`;
95
+ console.log(`\nTests: ${passedStr}, ${failedStr}, ${total} total`);
96
+ console.log(chalk.dim(`Duration: ${durationMs}ms`));
97
+ const failedTests = collectFailedFromResults(result.results);
98
+ if (failedTests.length > 0) {
99
+ console.log(chalk.red.bold("\nFailed tests:"));
100
+ for (const f of failedTests) {
101
+ console.log(` ${chalk.red("x")} ${f.fullName} ${chalk.dim(`(${f.file})`)}`);
102
+ if (f.error) {
103
+ console.log(` ${chalk.red(f.error.message)}`);
104
+ }
105
+ }
106
+ }
107
+ if (showTraces) {
108
+ const testsWithTraces = collectTracesFromResults(result.results);
109
+ if (testsWithTraces.length > 0) {
110
+ console.log(chalk.cyan.bold("\nTraces:"));
111
+ for (const { testName, file, traces } of testsWithTraces) {
112
+ console.log(`\n ${chalk.bold(testName)}`);
113
+ console.log(` ${chalk.dim(path.basename(file))}`);
114
+ for (const trace of traces) {
115
+ const loc = `${path.basename(trace.filePath)}:${trace.lineNumber}`;
116
+ const valueStr = typeof trace.value === "string" ? trace.value : JSON.stringify(trace.value, null, 2) ?? "undefined";
117
+ console.log(`\n ${chalk.yellow(`[${trace.key}]`)} ${chalk.dim(loc)}`);
118
+ const indented = valueStr.split("\n").join("\n ");
119
+ console.log(` ${indented}`);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ if (!result.ok) {
125
+ process.exit(1);
126
+ }
127
+ } catch (err) {
128
+ if (err instanceof TypeError && err.cause) {
129
+ console.error(chalk.red("dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요"));
130
+ process.exit(1);
131
+ }
132
+ throw err;
133
+ }
133
134
  }
134
135
  function collectFailedFromResults(nodes) {
135
- const result = [];
136
- for (const node of nodes){
137
- if (node.kind === "test" && node.state === "failed") {
138
- result.push(node);
139
- }
140
- if (node.children.length > 0) {
141
- result.push(...collectFailedFromResults(node.children));
142
- }
143
- }
144
- return result;
136
+ const result = [];
137
+ for (const node of nodes) {
138
+ if (node.kind === "test" && node.state === "failed") {
139
+ result.push(node);
140
+ }
141
+ if (node.children.length > 0) {
142
+ result.push(...collectFailedFromResults(node.children));
143
+ }
144
+ }
145
+ return result;
145
146
  }
146
147
  function collectTracesFromResults(nodes) {
147
- const result = [];
148
- for (const node of nodes){
149
- if (node.kind === "test" && node.traces.length > 0) {
150
- result.push({
151
- testName: node.fullName,
152
- file: node.file,
153
- traces: node.traces
154
- });
155
- }
156
- if (node.children.length > 0) {
157
- result.push(...collectTracesFromResults(node.children));
158
- }
159
- }
160
- return result;
148
+ const result = [];
149
+ for (const node of nodes) {
150
+ if (node.kind === "test" && node.traces.length > 0) {
151
+ result.push({
152
+ testName: node.fullName,
153
+ file: node.file,
154
+ traces: node.traces
155
+ });
156
+ }
157
+ if (node.children.length > 0) {
158
+ result.push(...collectTracesFromResults(node.children));
159
+ }
160
+ }
161
+ return result;
161
162
  }
162
163
  async function testStatusCommand(config) {
163
- if (!config.test?.devRunner?.enabled) {
164
- console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
165
- process.exit(1);
166
- }
167
- const { baseUrl } = resolveTestBaseUrl(config);
168
- const url = `${baseUrl}/status`;
169
- try {
170
- const response = await fetch(url);
171
- if (!response.ok) {
172
- console.error(chalk.red(`예상하지 못한 응답: ${response.status}`));
173
- process.exit(1);
174
- }
175
- const status = await response.json();
176
- console.log(chalk.bold("DevRunner 상태:"));
177
- console.log(` ready: ${status.ready ? chalk.green("true") : chalk.red("false")}`);
178
- console.log(` running: ${status.running ? chalk.yellow("true") : "false"}`);
179
- console.log(` lastRunAt: ${status.lastRunAt ?? chalk.dim("없음")}`);
180
- console.log(` sseAvailable: ${status.sseAvailable ? chalk.green("true") : "false"}`);
181
- } catch (err) {
182
- if (err instanceof TypeError && err.cause) {
183
- console.error(chalk.red("dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요"));
184
- process.exit(1);
185
- }
186
- throw err;
187
- }
164
+ if (!config.test?.devRunner?.enabled) {
165
+ console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
166
+ process.exit(1);
167
+ }
168
+ const { baseUrl } = resolveTestBaseUrl(config);
169
+ const url = `${baseUrl}/status`;
170
+ try {
171
+ const response = await fetch(url);
172
+ if (!response.ok) {
173
+ console.error(chalk.red(`예상하지 못한 응답: ${response.status}`));
174
+ process.exit(1);
175
+ }
176
+ const status = await response.json();
177
+ console.log(chalk.bold("DevRunner 상태:"));
178
+ console.log(` ready: ${status.ready ? chalk.green("true") : chalk.red("false")}`);
179
+ console.log(` running: ${status.running ? chalk.yellow("true") : "false"}`);
180
+ console.log(` lastRunAt: ${status.lastRunAt ?? chalk.dim("없음")}`);
181
+ console.log(` sseAvailable: ${status.sseAvailable ? chalk.green("true") : "false"}`);
182
+ } catch (err) {
183
+ if (err instanceof TypeError && err.cause) {
184
+ console.error(chalk.red("dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요"));
185
+ process.exit(1);
186
+ }
187
+ throw err;
188
+ }
188
189
  }
189
190
 
190
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11Q29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBSdW5SZXN1bHQsIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkVGVzdENvbmZpZygpOiBQcm9taXNlPFNvbmFtdUNvbmZpZz4ge1xuICBjb25zdCBwcmV2Vml0ZXN0ID0gcHJvY2Vzcy5lbnYuVklURVNUO1xuICBwcm9jZXNzLmVudi5WSVRFU1QgPSBcInRydWVcIjtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICAgIHJldHVybiBhd2FpdCBsb2FkQ29uZmlnKGFwaVJvb3RQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAocHJldlZpdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuVklURVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5WSVRFU1QgPSBwcmV2Vml0ZXN0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnOiBTb25hbXVDb25maWcpOiB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICByb3V0ZVByZWZpeDogc3RyaW5nO1xuICBiYXNlVXJsOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICBjb25zdCByb3V0ZVByZWZpeCA9IGNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LnJvdXRlUHJlZml4ID8/IFwiL19fdGVzdF9fXCI7XG4gIHJldHVybiB7IGhvc3QsIHBvcnQsIHJvdXRlUHJlZml4LCBiYXNlVXJsOiBgaHR0cDovLyR7aG9zdH06JHtwb3J0fSR7cm91dGVQcmVmaXh9YCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMyk7XG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZFRlc3RDb25maWcoKTtcblxuICAvLyBwcm9jZXNzLmFyZ3Yg7YyM7IuxOiBzb25hbXUgdGVzdCBbZmlsZS4uLl0gLS1wYXR0ZXJuIFwi7J2066aEXCIgLS10cmFjZXMgLS1zdGF0dXNcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBwYXR0ZXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaG93VHJhY2VzID0gZmFsc2U7XG4gIGxldCBzaG93U3RhdHVzID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoYXJnID09PSBcIi0tcGF0dGVyblwiIHx8IGFyZyA9PT0gXCItcFwiKSB7XG4gICAgICBwYXR0ZXJuID0gYXJnc1srK2ldO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tdHJhY2VzXCIgfHwgYXJnID09PSBcIi10XCIpIHtcbiAgICAgIHNob3dUcmFjZXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tc3RhdHVzXCIgfHwgYXJnID09PSBcIi1zXCIpIHtcbiAgICAgIHNob3dTdGF0dXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgZmlsZXMucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG93U3RhdHVzKSB7XG4gICAgcmV0dXJuIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoIWNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHsgYmFzZVVybCB9ID0gcmVzb2x2ZVRlc3RCYXNlVXJsKGNvbmZpZyk7XG4gIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3J1bmA7XG5cbiAgY29uc3QgcGF5bG9hZDogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0gPSB7fTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBwYXlsb2FkLmZpbGVzID0gZmlsZXM7XG4gIH1cbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBwYXlsb2FkLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgXCJkZXZSdW5uZXLqsIAg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4gc29uYW11LmNvbmZpZy50c+yXkOyEnCB0ZXN0LmRldlJ1bm5lci5lbmFibGVkOiB0cnVlIOyEpOygleydtCDtlYTsmpTtlanri4jri6RcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICBjb25zdCBlcnJvckJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGVycm9yPzogc3RyaW5nIH07XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlZpdGVzdCDsnbjsiqTthLTsiqTqsIAg7JWE7KeBIOykgOu5hOuQmOyngCDslYrslZjsirXri4jri6RcIikpO1xuICAgICAgaWYgKGVycm9yQm9keS5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvckJvZHkuZXJyb3IpKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg7JiI7IOB7ZWY7KeAIOuqu+2VnCDsnZHri7U6ICR7cmVzcG9uc2Uuc3RhdHVzfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSdW5SZXN1bHQ7XG5cbiAgICBjb25zdCB7IHBhc3NlZCwgZmFpbGVkOiBmYWlsZWRDb3VudCwgdG90YWwsIGR1cmF0aW9uTXMgfSA9IHJlc3VsdC5zdW1tYXJ5O1xuICAgIGNvbnN0IHBhc3NlZFN0ciA9IGNoYWxrLmdyZWVuKGAke3Bhc3NlZH0gcGFzc2VkYCk7XG4gICAgY29uc3QgZmFpbGVkU3RyID1cbiAgICAgIGZhaWxlZENvdW50ID4gMCA/IGNoYWxrLnJlZChgJHtmYWlsZWRDb3VudH0gZmFpbGVkYCkgOiBgJHtmYWlsZWRDb3VudH0gZmFpbGVkYDtcbiAgICBjb25zb2xlLmxvZyhgXFxuVGVzdHM6ICR7cGFzc2VkU3RyfSwgJHtmYWlsZWRTdHJ9LCAke3RvdGFsfSB0b3RhbGApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRHVyYXRpb246ICR7ZHVyYXRpb25Nc31tc2ApKTtcblxuICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKHJlc3VsdC5yZXN1bHRzKTtcbiAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkLmJvbGQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKTtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmYWlsZWRUZXN0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLnJlZChcInhcIil9ICR7Zi5mdWxsTmFtZX0gJHtjaGFsay5kaW0oYCgke2YuZmlsZX0pYCl9YCk7XG4gICAgICAgIGlmIChmLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2NoYWxrLnJlZChmLmVycm9yLm1lc3NhZ2UpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dUcmFjZXMpIHtcbiAgICAgIGNvbnN0IHRlc3RzV2l0aFRyYWNlcyA9IGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhyZXN1bHQucmVzdWx0cyk7XG4gICAgICBpZiAodGVzdHNXaXRoVHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKFwiXFxuVHJhY2VzOlwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0ZXN0TmFtZSwgZmlsZSwgdHJhY2VzIH0gb2YgdGVzdHNXaXRoVHJhY2VzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtjaGFsay5ib2xkKHRlc3ROYW1lKX1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmRpbShwYXRoLmJhc2VuYW1lKGZpbGUpKX1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgICAgICAgY29uc3QgbG9jID0gYCR7cGF0aC5iYXNlbmFtZSh0cmFjZS5maWxlUGF0aCl9OiR7dHJhY2UubGluZU51bWJlcn1gO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPVxuICAgICAgICAgICAgICB0eXBlb2YgdHJhY2UudmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IHRyYWNlLnZhbHVlXG4gICAgICAgICAgICAgICAgOiAoSlNPTi5zdHJpbmdpZnkodHJhY2UudmFsdWUsIG51bGwsIDIpID8/IFwidW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgICAke2NoYWxrLnllbGxvdyhgWyR7dHJhY2Uua2V5fV1gKX0gJHtjaGFsay5kaW0obG9jKX1gKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGVudGVkID0gdmFsdWVTdHIuc3BsaXQoXCJcXG5cIikuam9pbihcIlxcbiAgICBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7aW5kZW50ZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlczogVGVzdENhc2VSZXN1bHRbXSk6IFRlc3RDYXNlUmVzdWx0W10ge1xuICBjb25zdCByZXN1bHQ6IFRlc3RDYXNlUmVzdWx0W10gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gXCJ0ZXN0XCIgJiYgbm9kZS5zdGF0ZSA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhcbiAgbm9kZXM6IFRlc3RDYXNlUmVzdWx0W10sXG4pOiB7IHRlc3ROYW1lOiBzdHJpbmc7IGZpbGU6IHN0cmluZzsgdHJhY2VzOiBUZXN0Q2FzZVJlc3VsdFtcInRyYWNlc1wiXSB9W10ge1xuICBjb25zdCByZXN1bHQ6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBpZiAobm9kZS5raW5kID09PSBcInRlc3RcIiAmJiBub2RlLnRyYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHRlc3ROYW1lOiBub2RlLmZ1bGxOYW1lLCBmaWxlOiBub2RlLmZpbGUsIHRyYWNlczogbm9kZS50cmFjZXMgfSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZzogU29uYW11Q29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgeyBiYXNlVXJsIH0gPSByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnKTtcbiAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vc3RhdHVzYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDsmIjsg4HtlZjsp4Ag66q77ZWcIOydkeuLtTogJHtyZXNwb25zZS5zdGF0dXN9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgIHJlYWR5OiBib29sZWFuO1xuICAgICAgcnVubmluZzogYm9vbGVhbjtcbiAgICAgIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNzZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkRldlJ1bm5lciDsg4Htg5w6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICByZWFkeTogICAgICAgICR7c3RhdHVzLnJlYWR5ID8gY2hhbGsuZ3JlZW4oXCJ0cnVlXCIpIDogY2hhbGsucmVkKFwiZmFsc2VcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgcnVubmluZzogICAgICAke3N0YXR1cy5ydW5uaW5nID8gY2hhbGsueWVsbG93KFwidHJ1ZVwiKSA6IFwiZmFsc2VcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBsYXN0UnVuQXQ6ICAgICR7c3RhdHVzLmxhc3RSdW5BdCA/PyBjaGFsay5kaW0oXCLsl4bsnYxcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgc3NlQXZhaWxhYmxlOiAke3N0YXR1cy5zc2VBdmFpbGFibGUgPyBjaGFsay5ncmVlbihcInRydWVcIikgOiBcImZhbHNlXCJ9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iXSwibmFtZXMiOlsicGF0aCIsImNoYWxrIiwibG9hZENvbmZpZyIsImZpbmRBcGlSb290UGF0aCIsImxvYWRUZXN0Q29uZmlnIiwicHJldlZpdGVzdCIsInByb2Nlc3MiLCJlbnYiLCJWSVRFU1QiLCJhcGlSb290UGF0aCIsInVuZGVmaW5lZCIsInJlc29sdmVUZXN0QmFzZVVybCIsImNvbmZpZyIsInBvcnQiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJob3N0Iiwicm91dGVQcmVmaXgiLCJ0ZXN0IiwiZGV2UnVubmVyIiwiYmFzZVVybCIsInRlc3RDb21tYW5kIiwiYXJncyIsImFyZ3YiLCJzbGljZSIsImZpbGVzIiwicGF0dGVybiIsInNob3dUcmFjZXMiLCJzaG93U3RhdHVzIiwiaSIsImxlbmd0aCIsImFyZyIsInN0YXJ0c1dpdGgiLCJwdXNoIiwidGVzdFN0YXR1c0NvbW1hbmQiLCJlbmFibGVkIiwiY29uc29sZSIsImVycm9yIiwicmVkIiwiZXhpdCIsInVybCIsInBheWxvYWQiLCJyZXNwb25zZSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhdHVzIiwiZXJyb3JCb2R5IiwianNvbiIsIm9rIiwicmVzdWx0IiwicGFzc2VkIiwiZmFpbGVkIiwiZmFpbGVkQ291bnQiLCJ0b3RhbCIsImR1cmF0aW9uTXMiLCJzdW1tYXJ5IiwicGFzc2VkU3RyIiwiZ3JlZW4iLCJmYWlsZWRTdHIiLCJsb2ciLCJkaW0iLCJmYWlsZWRUZXN0cyIsImNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyIsInJlc3VsdHMiLCJib2xkIiwiZiIsImZ1bGxOYW1lIiwiZmlsZSIsIm1lc3NhZ2UiLCJ0ZXN0c1dpdGhUcmFjZXMiLCJjb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMiLCJjeWFuIiwidGVzdE5hbWUiLCJ0cmFjZXMiLCJiYXNlbmFtZSIsInRyYWNlIiwibG9jIiwiZmlsZVBhdGgiLCJsaW5lTnVtYmVyIiwidmFsdWVTdHIiLCJ2YWx1ZSIsInllbGxvdyIsImtleSIsImluZGVudGVkIiwic3BsaXQiLCJqb2luIiwiZXJyIiwiVHlwZUVycm9yIiwiY2F1c2UiLCJub2RlcyIsIm5vZGUiLCJraW5kIiwic3RhdGUiLCJjaGlsZHJlbiIsInJlYWR5IiwicnVubmluZyIsImxhc3RSdW5BdCIsInNzZUF2YWls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
191
+ //#endregion
192
+ export { testCommand };
193
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jb21tYW5kLmpzIiwibmFtZXMiOlsiZmlsZXM6IHN0cmluZ1tdIiwicGF0dGVybjogc3RyaW5nIHwgdW5kZWZpbmVkIiwicGF5bG9hZDogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0iLCJyZXN1bHQ6IFRlc3RDYXNlUmVzdWx0W10iLCJyZXN1bHQ6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdUNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgUnVuUmVzdWx0LCB0eXBlIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkVGVzdENvbmZpZygpOiBQcm9taXNlPFNvbmFtdUNvbmZpZz4ge1xuICBjb25zdCBwcmV2Vml0ZXN0ID0gcHJvY2Vzcy5lbnYuVklURVNUO1xuICBwcm9jZXNzLmVudi5WSVRFU1QgPSBcInRydWVcIjtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICAgIHJldHVybiBhd2FpdCBsb2FkQ29uZmlnKGFwaVJvb3RQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAocHJldlZpdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuVklURVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5WSVRFU1QgPSBwcmV2Vml0ZXN0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnOiBTb25hbXVDb25maWcpOiB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICByb3V0ZVByZWZpeDogc3RyaW5nO1xuICBiYXNlVXJsOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICBjb25zdCByb3V0ZVByZWZpeCA9IGNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LnJvdXRlUHJlZml4ID8/IFwiL19fdGVzdF9fXCI7XG4gIHJldHVybiB7IGhvc3QsIHBvcnQsIHJvdXRlUHJlZml4LCBiYXNlVXJsOiBgaHR0cDovLyR7aG9zdH06JHtwb3J0fSR7cm91dGVQcmVmaXh9YCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMyk7XG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZFRlc3RDb25maWcoKTtcblxuICAvLyBwcm9jZXNzLmFyZ3Yg7YyM7IuxOiBzb25hbXUgdGVzdCBbZmlsZS4uLl0gLS1wYXR0ZXJuIFwi7J2066aEXCIgLS10cmFjZXMgLS1zdGF0dXNcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBwYXR0ZXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaG93VHJhY2VzID0gZmFsc2U7XG4gIGxldCBzaG93U3RhdHVzID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoYXJnID09PSBcIi0tcGF0dGVyblwiIHx8IGFyZyA9PT0gXCItcFwiKSB7XG4gICAgICBwYXR0ZXJuID0gYXJnc1srK2ldO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tdHJhY2VzXCIgfHwgYXJnID09PSBcIi10XCIpIHtcbiAgICAgIHNob3dUcmFjZXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tc3RhdHVzXCIgfHwgYXJnID09PSBcIi1zXCIpIHtcbiAgICAgIHNob3dTdGF0dXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgZmlsZXMucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG93U3RhdHVzKSB7XG4gICAgcmV0dXJuIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoIWNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHsgYmFzZVVybCB9ID0gcmVzb2x2ZVRlc3RCYXNlVXJsKGNvbmZpZyk7XG4gIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3J1bmA7XG5cbiAgY29uc3QgcGF5bG9hZDogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0gPSB7fTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBwYXlsb2FkLmZpbGVzID0gZmlsZXM7XG4gIH1cbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBwYXlsb2FkLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgXCJkZXZSdW5uZXLqsIAg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4gc29uYW11LmNvbmZpZy50c+yXkOyEnCB0ZXN0LmRldlJ1bm5lci5lbmFibGVkOiB0cnVlIOyEpOygleydtCDtlYTsmpTtlanri4jri6RcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICBjb25zdCBlcnJvckJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGVycm9yPzogc3RyaW5nIH07XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlZpdGVzdCDsnbjsiqTthLTsiqTqsIAg7JWE7KeBIOykgOu5hOuQmOyngCDslYrslZjsirXri4jri6RcIikpO1xuICAgICAgaWYgKGVycm9yQm9keS5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvckJvZHkuZXJyb3IpKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg7JiI7IOB7ZWY7KeAIOuqu+2VnCDsnZHri7U6ICR7cmVzcG9uc2Uuc3RhdHVzfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSdW5SZXN1bHQ7XG5cbiAgICBjb25zdCB7IHBhc3NlZCwgZmFpbGVkOiBmYWlsZWRDb3VudCwgdG90YWwsIGR1cmF0aW9uTXMgfSA9IHJlc3VsdC5zdW1tYXJ5O1xuICAgIGNvbnN0IHBhc3NlZFN0ciA9IGNoYWxrLmdyZWVuKGAke3Bhc3NlZH0gcGFzc2VkYCk7XG4gICAgY29uc3QgZmFpbGVkU3RyID1cbiAgICAgIGZhaWxlZENvdW50ID4gMCA/IGNoYWxrLnJlZChgJHtmYWlsZWRDb3VudH0gZmFpbGVkYCkgOiBgJHtmYWlsZWRDb3VudH0gZmFpbGVkYDtcbiAgICBjb25zb2xlLmxvZyhgXFxuVGVzdHM6ICR7cGFzc2VkU3RyfSwgJHtmYWlsZWRTdHJ9LCAke3RvdGFsfSB0b3RhbGApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRHVyYXRpb246ICR7ZHVyYXRpb25Nc31tc2ApKTtcblxuICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKHJlc3VsdC5yZXN1bHRzKTtcbiAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkLmJvbGQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKTtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmYWlsZWRUZXN0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLnJlZChcInhcIil9ICR7Zi5mdWxsTmFtZX0gJHtjaGFsay5kaW0oYCgke2YuZmlsZX0pYCl9YCk7XG4gICAgICAgIGlmIChmLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2NoYWxrLnJlZChmLmVycm9yLm1lc3NhZ2UpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dUcmFjZXMpIHtcbiAgICAgIGNvbnN0IHRlc3RzV2l0aFRyYWNlcyA9IGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhyZXN1bHQucmVzdWx0cyk7XG4gICAgICBpZiAodGVzdHNXaXRoVHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKFwiXFxuVHJhY2VzOlwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0ZXN0TmFtZSwgZmlsZSwgdHJhY2VzIH0gb2YgdGVzdHNXaXRoVHJhY2VzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtjaGFsay5ib2xkKHRlc3ROYW1lKX1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmRpbShwYXRoLmJhc2VuYW1lKGZpbGUpKX1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgICAgICAgY29uc3QgbG9jID0gYCR7cGF0aC5iYXNlbmFtZSh0cmFjZS5maWxlUGF0aCl9OiR7dHJhY2UubGluZU51bWJlcn1gO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPVxuICAgICAgICAgICAgICB0eXBlb2YgdHJhY2UudmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IHRyYWNlLnZhbHVlXG4gICAgICAgICAgICAgICAgOiAoSlNPTi5zdHJpbmdpZnkodHJhY2UudmFsdWUsIG51bGwsIDIpID8/IFwidW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgICAke2NoYWxrLnllbGxvdyhgWyR7dHJhY2Uua2V5fV1gKX0gJHtjaGFsay5kaW0obG9jKX1gKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGVudGVkID0gdmFsdWVTdHIuc3BsaXQoXCJcXG5cIikuam9pbihcIlxcbiAgICBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7aW5kZW50ZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlczogVGVzdENhc2VSZXN1bHRbXSk6IFRlc3RDYXNlUmVzdWx0W10ge1xuICBjb25zdCByZXN1bHQ6IFRlc3RDYXNlUmVzdWx0W10gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gXCJ0ZXN0XCIgJiYgbm9kZS5zdGF0ZSA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhcbiAgbm9kZXM6IFRlc3RDYXNlUmVzdWx0W10sXG4pOiB7IHRlc3ROYW1lOiBzdHJpbmc7IGZpbGU6IHN0cmluZzsgdHJhY2VzOiBUZXN0Q2FzZVJlc3VsdFtcInRyYWNlc1wiXSB9W10ge1xuICBjb25zdCByZXN1bHQ6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBpZiAobm9kZS5raW5kID09PSBcInRlc3RcIiAmJiBub2RlLnRyYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHRlc3ROYW1lOiBub2RlLmZ1bGxOYW1lLCBmaWxlOiBub2RlLmZpbGUsIHRyYWNlczogbm9kZS50cmFjZXMgfSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZzogU29uYW11Q29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgeyBiYXNlVXJsIH0gPSByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnKTtcbiAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vc3RhdHVzYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDsmIjsg4HtlZjsp4Ag66q77ZWcIOydkeuLtTogJHtyZXNwb25zZS5zdGF0dXN9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgIHJlYWR5OiBib29sZWFuO1xuICAgICAgcnVubmluZzogYm9vbGVhbjtcbiAgICAgIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNzZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkRldlJ1bm5lciDsg4Htg5w6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICByZWFkeTogICAgICAgICR7c3RhdHVzLnJlYWR5ID8gY2hhbGsuZ3JlZW4oXCJ0cnVlXCIpIDogY2hhbGsucmVkKFwiZmFsc2VcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgcnVubmluZzogICAgICAke3N0YXR1cy5ydW5uaW5nID8gY2hhbGsueWVsbG93KFwidHJ1ZVwiKSA6IFwiZmFsc2VcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBsYXN0UnVuQXQ6ICAgICR7c3RhdHVzLmxhc3RSdW5BdCA/PyBjaGFsay5kaW0oXCLsl4bsnYxcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgc3NlQXZhaWxhYmxlOiAke3N0YXR1cy5zc2VBdmFpbGFibGUgPyBjaGFsay5ncmVlbihcInRydWVcIikgOiBcImZhbHNlXCJ9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OzthQUsyQztZQUVNO0FBRWpELGVBQWUsaUJBQXdDO0NBQ3JELE1BQU0sYUFBYSxRQUFRLElBQUk7QUFDL0IsU0FBUSxJQUFJLFNBQVM7QUFDckIsS0FBSTtFQUNGLE1BQU0sY0FBYyxpQkFBaUI7QUFDckMsU0FBTyxNQUFNLFdBQVcsWUFBWTtXQUM1QjtBQUNSLE1BQUksZUFBZSxXQUFXO0FBQzVCLFVBQU8sUUFBUSxJQUFJO1NBQ2Q7QUFDTCxXQUFRLElBQUksU0FBUzs7OztBQUszQixTQUFTLG1CQUFtQixRQUsxQjtDQUNBLE1BQU0sT0FBTyxPQUFPLE9BQU8sUUFBUSxRQUFRO0NBQzNDLE1BQU0sT0FBTyxPQUFPLE9BQU8sUUFBUSxRQUFRO0NBQzNDLE1BQU0sY0FBYyxPQUFPLE1BQU0sV0FBVyxlQUFlO0FBQzNELFFBQU87RUFBRTtFQUFNO0VBQU07RUFBYSxTQUFTLFVBQVUsS0FBSyxHQUFHLE9BQU87RUFBZTs7QUFHckYsZUFBc0IsY0FBNkI7Q0FDakQsTUFBTSxPQUFPLFFBQVEsS0FBSyxNQUFNLEVBQUU7Q0FFbEMsTUFBTSxTQUFTLE1BQU0sZ0JBQWdCO0NBR3JDLE1BQU1BLFFBQWtCLEVBQUU7Q0FDMUIsSUFBSUM7Q0FDSixJQUFJLGFBQWE7Q0FDakIsSUFBSSxhQUFhO0FBRWpCLE1BQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztFQUNwQyxNQUFNLE1BQU0sS0FBSztBQUNqQixNQUFJLFFBQVEsZUFBZSxRQUFRLE1BQU07QUFDdkMsYUFBVSxLQUFLLEVBQUU7YUFDUixRQUFRLGNBQWMsUUFBUSxNQUFNO0FBQzdDLGdCQUFhO2FBQ0osUUFBUSxjQUFjLFFBQVEsTUFBTTtBQUM3QyxnQkFBYTthQUNKLENBQUMsSUFB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
@@ -1,8 +1,15 @@
1
- import { findApiRootPath } from "../utils/utils.js";
2
- import { ensureTsLoaderRegistered } from "./ts-loader-registration.js";
1
+ import { findApiRootPath, init_utils } from "../utils/utils.js";
2
+ import { ensureTsLoaderRegistered, init_ts_loader_registration } from "./ts-loader-registration.js";
3
+
4
+ //#region src/bin/ts-loader-register.ts
5
+ await init_utils();
6
+ await init_ts_loader_registration();
3
7
  /**
4
- * @sonamu-kit/ts-loader/loader를 등록하는 스크립트입니다.
5
- * 이 스크립트는 sonamu cli로 dev 실행할 때 --import로 실행됩니다.
6
- */ await ensureTsLoaderRegistered(findApiRootPath());
8
+ * @sonamu-kit/ts-loader/loader를 등록하는 스크립트입니다.
9
+ * 이 스크립트는 sonamu cli로 dev 실행할 때 --import로 실행됩니다.
10
+ */
11
+ await ensureTsLoaderRegistered(findApiRootPath());
7
12
 
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdHMtbG9hZGVyLXJlZ2lzdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlscy5qc1wiO1xuaW1wb3J0IHsgZW5zdXJlVHNMb2FkZXJSZWdpc3RlcmVkIH0gZnJvbSBcIi4vdHMtbG9hZGVyLXJlZ2lzdHJhdGlvbi5qc1wiO1xuXG4vKipcbiAqIEBzb25hbXUta2l0L3RzLWxvYWRlci9sb2FkZXLrpbwg65Ox66Gd7ZWY64qUIOyKpO2BrOumve2KuOyeheuLiOuLpC5cbiAqIOydtCDsiqTtgazrpr3tirjripQgc29uYW11IGNsaeuhnCBkZXYg7Iuk7ZaJ7ZWgIOuVjCAtLWltcG9ydOuhnCDsi6TtlonrkKnri4jri6QuXG4gKi9cbmF3YWl0IGVuc3VyZVRzTG9hZGVyUmVnaXN0ZXJlZChmaW5kQXBpUm9vdFBhdGgoKSk7XG4iXSwibmFtZXMiOlsiZmluZEFwaVJvb3RQYXRoIiwiZW5zdXJlVHNMb2FkZXJSZWdpc3RlcmVkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxlQUFlLFFBQVEsb0JBQW9CO0FBQ3BELFNBQVNDLHdCQUF3QixRQUFRLDhCQUE4QjtBQUV2RTs7O0NBR0MsR0FDRCxNQUFNQSx5QkFBeUJEIn0=
13
+ //#endregion
14
+ export { };
15
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMtbG9hZGVyLXJlZ2lzdGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdHMtbG9hZGVyLXJlZ2lzdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlscy5qc1wiO1xuaW1wb3J0IHsgZW5zdXJlVHNMb2FkZXJSZWdpc3RlcmVkIH0gZnJvbSBcIi4vdHMtbG9hZGVyLXJlZ2lzdHJhdGlvbi5qc1wiO1xuXG4vKipcbiAqIEBzb25hbXUta2l0L3RzLWxvYWRlci9sb2FkZXLrpbwg65Ox66Gd7ZWY64qUIOyKpO2BrOumve2KuOyeheuLiOuLpC5cbiAqIOydtCDsiqTtgazrpr3tirjripQgc29uYW11IGNsaeuhnCBkZXYg7Iuk7ZaJ7ZWgIOuVjCAtLWltcG9ydOuhnCDsi6TtlonrkKnri4jri6QuXG4gKi9cbmF3YWl0IGVuc3VyZVRzTG9hZGVyUmVnaXN0ZXJlZChmaW5kQXBpUm9vdFBhdGgoKSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7a0JBQW9EO21DQUNtQjs7Ozs7QUFNdkUsTUFBTSx5QkFBeUIsaUJBQWlCLENBQUMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"ts-loader-registration.d.ts","sourceRoot":"","sources":["../../src/bin/ts-loader-registration.ts"],"names":[],"mappings":"AA0CA,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY7E"}
1
+ {"version":3,"file":"ts-loader-registration.d.ts","sourceRoot":"","sources":["../../src/bin/ts-loader-registration.ts"],"names":[],"mappings":"AAyBA,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7E"}
@@ -1,42 +1,32 @@
1
- import { register } from "node:module";
2
- import * as path from "node:path";
3
- import { exists } from "../utils/fs-utils.js";
4
- const tsLoaderRegisterStateKey = Symbol.for("sonamu.ts-loader-register.state");
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+ import { createRequire, register } from "node:module";
3
+ import { pathToFileURL } from "node:url";
4
+
5
+ //#region src/bin/ts-loader-registration.ts
5
6
  function getTsLoaderRegisterState() {
6
- const globalState = globalThis;
7
- if (!globalState[tsLoaderRegisterStateKey]) {
8
- globalState[tsLoaderRegisterStateKey] = {
9
- registered: false
10
- };
11
- }
12
- return globalState[tsLoaderRegisterStateKey];
13
- }
14
- async function setupSwcConfig(apiRoot) {
15
- try {
16
- const projectSwcrcPath = path.join(apiRoot, ".swcrc");
17
- if (await exists(projectSwcrcPath)) {
18
- process.env.SWCRC_PATH = projectSwcrcPath;
19
- return;
20
- }
21
- const sonamuSwcrcPath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
22
- if (await exists(sonamuSwcrcPath)) {
23
- process.env.SWCRC_PATH = sonamuSwcrcPath;
24
- return;
25
- }
26
- } catch {
27
- // 환경 변수 설정 실패는 무시 (loader가 기본 설정 사용)
28
- }
7
+ const globalState = globalThis;
8
+ if (!globalState[tsLoaderRegisterStateKey]) {
9
+ globalState[tsLoaderRegisterStateKey] = { registered: false };
10
+ }
11
+ return globalState[tsLoaderRegisterStateKey];
29
12
  }
30
- export async function ensureTsLoaderRegistered(apiRoot) {
31
- const state = getTsLoaderRegisterState();
32
- if (state.registered) {
33
- return;
34
- }
35
- await setupSwcConfig(apiRoot);
36
- register("@sonamu-kit/ts-loader/loader", {
37
- parentURL: import.meta.url
38
- });
39
- state.registered = true;
13
+ async function ensureTsLoaderRegistered(apiRoot) {
14
+ const state = getTsLoaderRegisterState();
15
+ if (state.registered) {
16
+ return;
17
+ }
18
+ void apiRoot;
19
+ const loaderPath = require.resolve("@sonamu-kit/ts-loader/loader");
20
+ register(pathToFileURL(loaderPath).href, { parentURL: import.meta.url });
21
+ state.registered = true;
40
22
  }
23
+ var tsLoaderRegisterStateKey, require;
24
+ var init_ts_loader_registration = __esmMin((() => {
25
+ tsLoaderRegisterStateKey = Symbol.for("sonamu.ts-loader-register.state");
26
+ require = createRequire(import.meta.url);
27
+ }));
41
28
 
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdHMtbG9hZGVyLXJlZ2lzdHJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWdpc3RlciB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHMuanNcIjtcblxuY29uc3QgdHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5ID0gU3ltYm9sLmZvcihcInNvbmFtdS50cy1sb2FkZXItcmVnaXN0ZXIuc3RhdGVcIik7XG5cbnR5cGUgVHNMb2FkZXJSZWdpc3RlclN0YXRlID0ge1xuICByZWdpc3RlcmVkOiBib29sZWFuO1xufTtcblxudHlwZSBHbG9iYWxXaXRoVHNMb2FkZXJSZWdpc3RlclN0YXRlID0gdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gIFt0c0xvYWRlclJlZ2lzdGVyU3RhdGVLZXldPzogVHNMb2FkZXJSZWdpc3RlclN0YXRlO1xufTtcblxuZnVuY3Rpb24gZ2V0VHNMb2FkZXJSZWdpc3RlclN0YXRlKCk6IFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZSB7XG4gIGNvbnN0IGdsb2JhbFN0YXRlID0gZ2xvYmFsVGhpcyBhcyBHbG9iYWxXaXRoVHNMb2FkZXJSZWdpc3RlclN0YXRlO1xuXG4gIGlmICghZ2xvYmFsU3RhdGVbdHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5XSkge1xuICAgIGdsb2JhbFN0YXRlW3RzTG9hZGVyUmVnaXN0ZXJTdGF0ZUtleV0gPSB7IHJlZ2lzdGVyZWQ6IGZhbHNlIH07XG4gIH1cblxuICByZXR1cm4gZ2xvYmFsU3RhdGVbdHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5XTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBTd2NDb25maWcoYXBpUm9vdDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvamVjdFN3Y3JjUGF0aCA9IHBhdGguam9pbihhcGlSb290LCBcIi5zd2NyY1wiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHByb2plY3RTd2NyY1BhdGgpKSB7XG4gICAgICBwcm9jZXNzLmVudi5TV0NSQ19QQVRIID0gcHJvamVjdFN3Y3JjUGF0aDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb25hbXVTd2NyY1BhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHNvbmFtdVN3Y3JjUGF0aCkpIHtcbiAgICAgIHByb2Nlc3MuZW52LlNXQ1JDX1BBVEggPSBzb25hbXVTd2NyY1BhdGg7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyDtmZjqsr0g67OA7IiYIOyEpOyglSDsi6TtjKjripQg66y07IucIChsb2FkZXLqsIAg6riw67O4IOyEpOyglSDsgqzsmqkpXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVRzTG9hZGVyUmVnaXN0ZXJlZChhcGlSb290OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRUc0xvYWRlclJlZ2lzdGVyU3RhdGUoKTtcbiAgaWYgKHN0YXRlLnJlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBzZXR1cFN3Y0NvbmZpZyhhcGlSb290KTtcblxuICByZWdpc3RlcihcIkBzb25hbXUta2l0L3RzLWxvYWRlci9sb2FkZXJcIiwge1xuICAgIHBhcmVudFVSTDogaW1wb3J0Lm1ldGEudXJsLFxuICB9KTtcbiAgc3RhdGUucmVnaXN0ZXJlZCA9IHRydWU7XG59XG4iXSwibmFtZXMiOlsicmVnaXN0ZXIiLCJwYXRoIiwiZXhpc3RzIiwidHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5IiwiU3ltYm9sIiwiZm9yIiwiZ2V0VHNMb2FkZXJSZWdpc3RlclN0YXRlIiwiZ2xvYmFsU3RhdGUiLCJnbG9iYWxUaGlzIiwicmVnaXN0ZXJlZCIsInNldHVwU3djQ29uZmlnIiwiYXBpUm9vdCIsInByb2plY3RTd2NyY1BhdGgiLCJqb2luIiwicHJvY2VzcyIsImVudiIsIlNXQ1JDX1BBVEgiLCJzb25hbXVTd2NyY1BhdGgiLCJkaXJuYW1lIiwiZW5zdXJlVHNMb2FkZXJSZWdpc3RlcmVkIiwic3RhdGUiLCJwYXJlbnRVUkwiLCJ1cmwiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsUUFBUSxjQUFjO0FBQ3ZDLFlBQVlDLFVBQVUsWUFBWTtBQUNsQyxTQUFTQyxNQUFNLFFBQVEsdUJBQXVCO0FBRTlDLE1BQU1DLDJCQUEyQkMsT0FBT0MsR0FBRyxDQUFDO0FBVTVDLFNBQVNDO0lBQ1AsTUFBTUMsY0FBY0M7SUFFcEIsSUFBSSxDQUFDRCxXQUFXLENBQUNKLHlCQUF5QixFQUFFO1FBQzFDSSxXQUFXLENBQUNKLHlCQUF5QixHQUFHO1lBQUVNLFlBQVk7UUFBTTtJQUM5RDtJQUVBLE9BQU9GLFdBQVcsQ0FBQ0oseUJBQXlCO0FBQzlDO0FBRUEsZUFBZU8sZUFBZUMsT0FBZTtJQUMzQyxJQUFJO1FBQ0YsTUFBTUMsbUJBQW1CWCxLQUFLWSxJQUFJLENBQUNGLFNBQVM7UUFDNUMsSUFBSSxNQUFNVCxPQUFPVSxtQkFBbUI7WUFDbENFLFFBQVFDLEdBQUcsQ0FBQ0MsVUFBVSxHQUFHSjtZQUN6QjtRQUNGO1FBRUEsTUFBTUssa0JBQWtCaEIsS0FBS1ksSUFBSSxDQUFDLFlBQVlLLE9BQU8sRUFBRSxNQUFNLE1BQU07UUFDbkUsSUFBSSxNQUFNaEIsT0FBT2Usa0JBQWtCO1lBQ2pDSCxRQUFRQyxHQUFHLENBQUNDLFVBQVUsR0FBR0M7WUFDekI7UUFDRjtJQUNGLEVBQUUsT0FBTTtJQUNOLHFDQUFxQztJQUN2QztBQUNGO0FBRUEsT0FBTyxlQUFlRSx5QkFBeUJSLE9BQWU7SUFDNUQsTUFBTVMsUUFBUWQ7SUFDZCxJQUFJYyxNQUFNWCxVQUFVLEVBQUU7UUFDcEI7SUFDRjtJQUVBLE1BQU1DLGVBQWVDO0lBRXJCWCxTQUFTLGdDQUFnQztRQUN2Q3FCLFdBQVcsWUFBWUMsR0FBRztJQUM1QjtJQUNBRixNQUFNWCxVQUFVLEdBQUc7QUFDckIifQ==
29
+ //#endregion
30
+ init_ts_loader_registration();
31
+ export { ensureTsLoaderRegistered, init_ts_loader_registration };
32
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMtbG9hZGVyLXJlZ2lzdHJhdGlvbi5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL3RzLWxvYWRlci1yZWdpc3RyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuY29uc3QgdHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5ID0gU3ltYm9sLmZvcihcInNvbmFtdS50cy1sb2FkZXItcmVnaXN0ZXIuc3RhdGVcIik7XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG50eXBlIFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZSA9IHtcbiAgcmVnaXN0ZXJlZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgR2xvYmFsV2l0aFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZSA9IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbdHNMb2FkZXJSZWdpc3RlclN0YXRlS2V5XT86IFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZTtcbn07XG5cbmZ1bmN0aW9uIGdldFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZSgpOiBUc0xvYWRlclJlZ2lzdGVyU3RhdGUge1xuICBjb25zdCBnbG9iYWxTdGF0ZSA9IGdsb2JhbFRoaXMgYXMgR2xvYmFsV2l0aFRzTG9hZGVyUmVnaXN0ZXJTdGF0ZTtcblxuICBpZiAoIWdsb2JhbFN0YXRlW3RzTG9hZGVyUmVnaXN0ZXJTdGF0ZUtleV0pIHtcbiAgICBnbG9iYWxTdGF0ZVt0c0xvYWRlclJlZ2lzdGVyU3RhdGVLZXldID0geyByZWdpc3RlcmVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcmV0dXJuIGdsb2JhbFN0YXRlW3RzTG9hZGVyUmVnaXN0ZXJTdGF0ZUtleV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVUc0xvYWRlclJlZ2lzdGVyZWQoYXBpUm9vdDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0VHNMb2FkZXJSZWdpc3RlclN0YXRlKCk7XG4gIGlmIChzdGF0ZS5yZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdm9pZCBhcGlSb290O1xuICBjb25zdCBsb2FkZXJQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwiQHNvbmFtdS1raXQvdHMtbG9hZGVyL2xvYWRlclwiKTtcblxuICByZWdpc3RlcihwYXRoVG9GaWxlVVJMKGxvYWRlclBhdGgpLmhyZWYsIHtcbiAgICBwYXJlbnRVUkw6IGltcG9ydC5tZXRhLnVybCxcbiAgfSk7XG4gIHN0YXRlLnJlZ2lzdGVyZWQgPSB0cnVlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQWVBLFNBQVMsMkJBQWtEO0NBQ3pELE1BQU0sY0FBYztBQUVwQixLQUFJLENBQUMsWUFBWSwyQkFBMkI7QUFDMUMsY0FBWSw0QkFBNEIsRUFBRSxZQUFZLE9BQU87O0FBRy9ELFFBQU8sWUFBWTs7QUFHckIsZUFBc0IseUJBQXlCLFNBQWdDO0NBQzdFLE1BQU0sUUFBUSwwQkFBMEI7QUFDeEMsS0FBSSxNQUFNLFlBQVk7QUFDcEI7O0FBR0YsTUFBSztDQUNMLE1BQU0sYUFBYSxRQUFRLFFBQVEsK0JBQStCO0FBRWxFLFVBQVMsY0FBYyxXQUFXLENBQUMsTUFBTSxFQUN2QyxXQUFXLE9BQU8sS0FBSyxLQUN4QixDQUFDO0FBQ0YsT0FBTSxhQUFhOzs7O0NBakNmLDJCQUEyQixPQUFPLElBQUksa0NBQWtDO0NBQ3hFLFVBQVUsY0FBYyxPQUFPLEtBQUssSUFBSSJ9