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,144 +0,0 @@
1
- import Fastify from "fastify";
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- // vi.hoisted를 사용하여 mock 객체를 vi.mock 호이스팅 이전에 초기화
4
- const mockManager = vi.hoisted(()=>({
5
- start: vi.fn(),
6
- run: vi.fn(),
7
- getStatus: vi.fn(),
8
- shutdown: vi.fn()
9
- }));
10
- // DevVitestManager를 모킹하여 new DevVitestManager()가 mockManager 인스턴스를 반환하도록 설정
11
- vi.mock("../dev-vitest-manager", ()=>{
12
- // biome-ignore lint/complexity/useArrowFunction: vi.fn 생성자 모킹에는 function 키워드가 필요
13
- const MockDevVitestManager = vi.fn(function() {
14
- return mockManager;
15
- });
16
- return {
17
- DevVitestManager: MockDevVitestManager
18
- };
19
- });
20
- import { registerDevTestRoutes } from "../dev-test-routes.js";
21
- const defaultConfig = {
22
- enabled: true,
23
- routePrefix: "/__test__"
24
- };
25
- const okRunResult = {
26
- ok: true,
27
- summary: {
28
- total: 3,
29
- passed: 2,
30
- failed: 0,
31
- skipped: 1,
32
- durationMs: 42
33
- },
34
- failed: [],
35
- traces: []
36
- };
37
- const okStatus = {
38
- ready: true,
39
- running: false,
40
- lastRunAt: null
41
- };
42
- describe("registerDevTestRoutes", ()=>{
43
- let app;
44
- beforeEach(async ()=>{
45
- vi.clearAllMocks();
46
- app = Fastify();
47
- mockManager.start.mockResolvedValue(undefined);
48
- mockManager.run.mockResolvedValue(okRunResult);
49
- mockManager.getStatus.mockReturnValue(okStatus);
50
- mockManager.shutdown.mockResolvedValue(undefined);
51
- await registerDevTestRoutes(app, defaultConfig);
52
- });
53
- afterEach(async ()=>{
54
- await app.close();
55
- });
56
- it("라우트 등록 시 manager.start()가 호출된다", ()=>{
57
- expect(mockManager.start).toHaveBeenCalledTimes(1);
58
- });
59
- describe("POST /__test__/run", ()=>{
60
- it("정상 실행 시 RunResult를 반환한다", async ()=>{
61
- const res = await app.inject({
62
- method: "POST",
63
- url: "/__test__/run",
64
- payload: {}
65
- });
66
- expect(res.statusCode).toBe(200);
67
- const body = res.json();
68
- expect(body.ok).toBe(true);
69
- expect(body.summary.total).toBe(3);
70
- expect(body.summary.skipped).toBe(1);
71
- });
72
- it("files와 pattern을 manager.run()에 전달한다", async ()=>{
73
- await app.inject({
74
- method: "POST",
75
- url: "/__test__/run",
76
- payload: {
77
- files: [
78
- "foo.test.ts"
79
- ],
80
- pattern: "my test"
81
- }
82
- });
83
- expect(mockManager.run).toHaveBeenCalledWith({
84
- files: [
85
- "foo.test.ts"
86
- ],
87
- pattern: "my test"
88
- });
89
- });
90
- it("manager.run()이 오류를 던지면 500을 반환한다", async ()=>{
91
- mockManager.run.mockRejectedValueOnce(new Error("DevVitestManager is not started"));
92
- const res = await app.inject({
93
- method: "POST",
94
- url: "/__test__/run",
95
- payload: {}
96
- });
97
- expect(res.statusCode).toBe(500);
98
- const body = res.json();
99
- expect(body.ok).toBe(false);
100
- expect(body.error).toContain("not started");
101
- });
102
- });
103
- describe("GET /__test__/status", ()=>{
104
- it("ManagerStatus 구조를 반환한다", async ()=>{
105
- const res = await app.inject({
106
- method: "GET",
107
- url: "/__test__/status"
108
- });
109
- expect(res.statusCode).toBe(200);
110
- const body = res.json();
111
- expect(body).toMatchObject({
112
- ready: true,
113
- running: false,
114
- lastRunAt: null
115
- });
116
- });
117
- });
118
- describe("server.close() onClose hook", ()=>{
119
- it("서버 종료 시 manager.shutdown()이 호출된다", async ()=>{
120
- await app.close();
121
- expect(mockManager.shutdown).toHaveBeenCalledTimes(1);
122
- });
123
- });
124
- describe("커스텀 routePrefix", ()=>{
125
- it("routePrefix가 지정되면 해당 경로에 라우트가 등록된다", async ()=>{
126
- const customApp = Fastify();
127
- mockManager.start.mockResolvedValue(undefined);
128
- mockManager.getStatus.mockReturnValue(okStatus);
129
- mockManager.shutdown.mockResolvedValue(undefined);
130
- await registerDevTestRoutes(customApp, {
131
- enabled: true,
132
- routePrefix: "/api/test"
133
- });
134
- const res = await customApp.inject({
135
- method: "GET",
136
- url: "/api/test/status"
137
- });
138
- expect(res.statusCode).toBe(200);
139
- await customApp.close();
140
- });
141
- });
142
- });
143
-
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL19fdGVzdHNfXy9kZXYtdGVzdC1yb3V0ZXMudGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmFzdGlmeSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IHsgYWZ0ZXJFYWNoLCBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZXJTdGF0dXMsIFJ1blJlc3VsdCB9IGZyb20gXCIuLi9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcblxuLy8gdmkuaG9pc3RlZOulvCDsgqzsmqntlZjsl6wgbW9jayDqsJ3ssrTrpbwgdmkubW9jayDtmLjsnbTsiqTtjIUg7J207KCE7JeQIOy0iOq4sO2ZlFxuY29uc3QgbW9ja01hbmFnZXIgPSB2aS5ob2lzdGVkKCgpID0+ICh7XG4gIHN0YXJ0OiB2aS5mbigpLFxuICBydW46IHZpLmZuKCksXG4gIGdldFN0YXR1czogdmkuZm4oKSxcbiAgc2h1dGRvd246IHZpLmZuKCksXG59KSk7XG5cbi8vIERldlZpdGVzdE1hbmFnZXLrpbwg66qo7YK57ZWY7JesIG5ldyBEZXZWaXRlc3RNYW5hZ2VyKCnqsIAgbW9ja01hbmFnZXIg7J247Iqk7YS07Iqk66W8IOuwmO2ZmO2VmOuPhOuhnSDshKTsoJVcbnZpLm1vY2soXCIuLi9kZXYtdml0ZXN0LW1hbmFnZXJcIiwgKCkgPT4ge1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUFycm93RnVuY3Rpb246IHZpLmZuIOyDneyEseyekCDrqqjtgrnsl5DripQgZnVuY3Rpb24g7YKk7JuM65Oc6rCAIO2VhOyalFxuICBjb25zdCBNb2NrRGV2Vml0ZXN0TWFuYWdlciA9IHZpLmZuKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbW9ja01hbmFnZXI7XG4gIH0pO1xuICByZXR1cm4geyBEZXZWaXRlc3RNYW5hZ2VyOiBNb2NrRGV2Vml0ZXN0TWFuYWdlciB9O1xufSk7XG5cbmltcG9ydCB7IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyB9IGZyb20gXCIuLi9kZXYtdGVzdC1yb3V0ZXNcIjtcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgZW5hYmxlZDogdHJ1ZSBhcyBjb25zdCxcbiAgcm91dGVQcmVmaXg6IFwiL19fdGVzdF9fXCIsXG59O1xuXG5jb25zdCBva1J1blJlc3VsdDogUnVuUmVzdWx0ID0ge1xuICBvazogdHJ1ZSxcbiAgc3VtbWFyeTogeyB0b3RhbDogMywgcGFzc2VkOiAyLCBmYWlsZWQ6IDAsIHNraXBwZWQ6IDEsIGR1cmF0aW9uTXM6IDQyIH0sXG4gIGZhaWxlZDogW10sXG4gIHRyYWNlczogW10sXG59O1xuXG5jb25zdCBva1N0YXR1czogTWFuYWdlclN0YXR1cyA9IHtcbiAgcmVhZHk6IHRydWUsXG4gIHJ1bm5pbmc6IGZhbHNlLFxuICBsYXN0UnVuQXQ6IG51bGwsXG59O1xuXG5kZXNjcmliZShcInJlZ2lzdGVyRGV2VGVzdFJvdXRlc1wiLCAoKSA9PiB7XG4gIGxldCBhcHA6IFJldHVyblR5cGU8dHlwZW9mIEZhc3RpZnk+O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIHZpLmNsZWFyQWxsTW9ja3MoKTtcbiAgICBhcHAgPSBGYXN0aWZ5KCk7XG4gICAgbW9ja01hbmFnZXIuc3RhcnQubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcbiAgICBtb2NrTWFuYWdlci5ydW4ubW9ja1Jlc29sdmVkVmFsdWUob2tSdW5SZXN1bHQpO1xuICAgIG1vY2tNYW5hZ2VyLmdldFN0YXR1cy5tb2NrUmV0dXJuVmFsdWUob2tTdGF0dXMpO1xuICAgIG1vY2tNYW5hZ2VyLnNodXRkb3duLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgYXdhaXQgcmVnaXN0ZXJEZXZUZXN0Um91dGVzKGFwcCwgZGVmYXVsdENvbmZpZyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYXBwLmNsb3NlKCk7XG4gIH0pO1xuXG4gIGl0KFwi65287Jqw7Yq4IOuTseuhnSDsi5wgbWFuYWdlci5zdGFydCgp6rCAIO2YuOy2nOuQnOuLpFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG1vY2tNYW5hZ2VyLnN0YXJ0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiUE9TVCAvX190ZXN0X18vcnVuXCIsICgpID0+IHtcbiAgICBpdChcIuygleyDgSDsi6Ttlokg7IucIFJ1blJlc3VsdOulvCDrsJjtmZjtlZzri6RcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBwLmluamVjdCh7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIHVybDogXCIvX190ZXN0X18vcnVuXCIsXG4gICAgICAgIHBheWxvYWQ6IHt9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXMuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgICAgY29uc3QgYm9keSA9IHJlcy5qc29uKCk7XG4gICAgICBleHBlY3QoYm9keS5vaykudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChib2R5LnN1bW1hcnkudG90YWwpLnRvQmUoMyk7XG4gICAgICBleHBlY3QoYm9keS5zdW1tYXJ5LnNraXBwZWQpLnRvQmUoMSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbGVz7JmAIHBhdHRlcm7snYQgbWFuYWdlci5ydW4oKeyXkCDsoITri6ztlZzri6RcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXBwLmluamVjdCh7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIHVybDogXCIvX190ZXN0X18vcnVuXCIsXG4gICAgICAgIHBheWxvYWQ6IHsgZmlsZXM6IFtcImZvby50ZXN0LnRzXCJdLCBwYXR0ZXJuOiBcIm15IHRlc3RcIiB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrTWFuYWdlci5ydW4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgZmlsZXM6IFtcImZvby50ZXN0LnRzXCJdLFxuICAgICAgICBwYXR0ZXJuOiBcIm15IHRlc3RcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJtYW5hZ2VyLnJ1bigp7J20IOyYpOulmOulvCDrjZjsp4DrqbQgNTAw7J2EIOuwmO2ZmO2VnOuLpFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBtb2NrTWFuYWdlci5ydW4ubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkRldlZpdGVzdE1hbmFnZXIgaXMgbm90IHN0YXJ0ZWRcIikpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBhcHAuaW5qZWN0KHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgdXJsOiBcIi9fX3Rlc3RfXy9ydW5cIixcbiAgICAgICAgcGF5bG9hZDoge30sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlcy5zdGF0dXNDb2RlKS50b0JlKDUwMCk7XG4gICAgICBjb25zdCBib2R5ID0gcmVzLmpzb24oKTtcbiAgICAgIGV4cGVjdChib2R5Lm9rKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChib2R5LmVycm9yKS50b0NvbnRhaW4oXCJub3Qgc3RhcnRlZFwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJHRVQgL19fdGVzdF9fL3N0YXR1c1wiLCAoKSA9PiB7XG4gICAgaXQoXCJNYW5hZ2VyU3RhdHVzIOq1rOyhsOulvCDrsJjtmZjtlZzri6RcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBwLmluamVjdCh7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgdXJsOiBcIi9fX3Rlc3RfXy9zdGF0dXNcIixcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVzLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICAgIGNvbnN0IGJvZHkgPSByZXMuanNvbigpO1xuICAgICAgZXhwZWN0KGJvZHkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcnVubmluZzogZmFsc2UsXG4gICAgICAgIGxhc3RSdW5BdDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcInNlcnZlci5jbG9zZSgpIG9uQ2xvc2UgaG9va1wiLCAoKSA9PiB7XG4gICAgaXQoXCLshJzrsoQg7KKF66OMIOyLnCBtYW5hZ2VyLnNodXRkb3duKCnsnbQg7Zi47Lac65Cc64ukXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFwcC5jbG9zZSgpO1xuICAgICAgZXhwZWN0KG1vY2tNYW5hZ2VyLnNodXRkb3duKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwi7Luk7Iqk7YWAIHJvdXRlUHJlZml4XCIsICgpID0+IHtcbiAgICBpdChcInJvdXRlUHJlZml46rCAIOyngOygleuQmOuptCDtlbTri7kg6rK966Gc7JeQIOudvOyasO2KuOqwgCDrk7HroZ3rkJzri6RcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tQXBwID0gRmFzdGlmeSgpO1xuICAgICAgbW9ja01hbmFnZXIuc3RhcnQubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcbiAgICAgIG1vY2tNYW5hZ2VyLmdldFN0YXR1cy5tb2NrUmV0dXJuVmFsdWUob2tTdGF0dXMpO1xuICAgICAgbW9ja01hbmFnZXIuc2h1dGRvd24ubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcblxuICAgICAgYXdhaXQgcmVnaXN0ZXJEZXZUZXN0Um91dGVzKGN1c3RvbUFwcCwge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICByb3V0ZVByZWZpeDogXCIvYXBpL3Rlc3RcIixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBjdXN0b21BcHAuaW5qZWN0KHsgbWV0aG9kOiBcIkdFVFwiLCB1cmw6IFwiL2FwaS90ZXN0L3N0YXR1c1wiIH0pO1xuICAgICAgZXhwZWN0KHJlcy5zdGF0dXNDb2RlKS50b0JlKDIwMCk7XG5cbiAgICAgIGF3YWl0IGN1c3RvbUFwcC5jbG9zZSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm5hbWVzIjpbIkZhc3RpZnkiLCJhZnRlckVhY2giLCJiZWZvcmVFYWNoIiwiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwibW9ja01hbmFnZXIiLCJob2lzdGVkIiwic3RhcnQiLCJmbiIsInJ1biIsImdldFN0YXR1cyIsInNodXRkb3duIiwibW9jayIsIk1vY2tEZXZWaXRlc3RNYW5hZ2VyIiwiRGV2Vml0ZXN0TWFuYWdlciIsInJlZ2lzdGVyRGV2VGVzdFJvdXRlcyIsImRlZmF1bHRDb25maWciLCJlbmFibGVkIiwicm91dGVQcmVmaXgiLCJva1J1blJlc3VsdCIsIm9rIiwic3VtbWFyeSIsInRvdGFsIiwicGFzc2VkIiwiZmFpbGVkIiwic2tpcHBlZCIsImR1cmF0aW9uTXMiLCJ0cmFjZXMiLCJva1N0YXR1cyIsInJlYWR5IiwicnVubmluZyIsImxhc3RSdW5BdCIsImFwcCIsImNsZWFyQWxsTW9ja3MiLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInVuZGVmaW5lZCIsIm1vY2tSZXR1cm5WYWx1ZSIsImNsb3NlIiwidG9IYXZlQmVlbkNhbGxlZFRpbWVzIiwicmVzIiwiaW5qZWN0IiwibWV0aG9kIiwidXJsIiwicGF5bG9hZCIsInN0YXR1c0NvZGUiLCJ0b0JlIiwiYm9keSIsImpzb24iLCJmaWxlcyIsInBhdHRlcm4iLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIm1vY2tSZWplY3RlZFZhbHVlT25jZSIsIkVycm9yIiwiZXJyb3IiLCJ0b0NvbnRhaW4iLCJ0b01hdGNoT2JqZWN0IiwiY3VzdG9tQXBwIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxhQUFhLFVBQVU7QUFDOUIsU0FBU0MsU0FBUyxFQUFFQyxVQUFVLEVBQUVDLFFBQVEsRUFBRUMs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
@@ -1,152 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from "vitest";
2
- // vitest/node 모킹 - createVitest가 mock Vitest 인스턴스를 반환하도록 설정
3
- const mockVitest = {
4
- onFilterWatchedSpecification: vi.fn(),
5
- setGlobalTestNamePattern: vi.fn(),
6
- resetGlobalTestNamePattern: vi.fn(),
7
- globTestSpecifications: vi.fn(),
8
- runTestSpecifications: vi.fn(),
9
- close: vi.fn()
10
- };
11
- vi.mock("vitest/node", ()=>({
12
- createVitest: vi.fn().mockResolvedValue(mockVitest)
13
- }));
14
- import { DevVitestManager } from "../dev-vitest-manager.js";
15
- describe("DevVitestManager", ()=>{
16
- let manager;
17
- beforeEach(()=>{
18
- vi.clearAllMocks();
19
- manager = new DevVitestManager();
20
- // 기본 mock: 빈 테스트 결과
21
- const mockTestModule = {
22
- moduleId: "test.ts",
23
- children: {
24
- allTests: ()=>[]
25
- }
26
- };
27
- mockVitest.globTestSpecifications.mockResolvedValue([]);
28
- mockVitest.runTestSpecifications.mockResolvedValue({
29
- testModules: [
30
- mockTestModule
31
- ]
32
- });
33
- mockVitest.close.mockResolvedValue(undefined);
34
- });
35
- it("start()가 vitest 인스턴스를 초기화한다", async ()=>{
36
- await manager.start();
37
- expect(mockVitest.onFilterWatchedSpecification).toHaveBeenCalledWith(expect.any(Function));
38
- const status = manager.getStatus();
39
- expect(status.ready).toBe(true);
40
- expect(status.running).toBe(false);
41
- });
42
- it("run()이 테스트를 실행하고 결과를 반환한다", async ()=>{
43
- await manager.start();
44
- const result = await manager.run({});
45
- expect(result.ok).toBe(true);
46
- expect(result.summary.total).toBe(0);
47
- });
48
- it("동시 run() 2회 호출은 순차적으로 실행된다", async ()=>{
49
- await manager.start();
50
- const order = [];
51
- mockVitest.runTestSpecifications.mockImplementationOnce(async ()=>{
52
- order.push(1);
53
- await new Promise((r)=>setTimeout(r, 10));
54
- return {
55
- testModules: [
56
- {
57
- moduleId: "a.ts",
58
- children: {
59
- allTests: ()=>[]
60
- }
61
- }
62
- ]
63
- };
64
- }).mockImplementationOnce(async ()=>{
65
- order.push(2);
66
- return {
67
- testModules: [
68
- {
69
- moduleId: "b.ts",
70
- children: {
71
- allTests: ()=>[]
72
- }
73
- }
74
- ]
75
- };
76
- });
77
- const [r1, r2] = await Promise.all([
78
- manager.run({}),
79
- manager.run({})
80
- ]);
81
- expect(order).toEqual([
82
- 1,
83
- 2
84
- ]); // 병렬이 아닌 순차 실행
85
- expect(r1.ok).toBe(true);
86
- expect(r2.ok).toBe(true);
87
- });
88
- it("오류 발생 시에도 pattern이 finally에서 항상 리셋된다", async ()=>{
89
- await manager.start();
90
- mockVitest.runTestSpecifications.mockRejectedValueOnce(new Error("boom"));
91
- await expect(manager.run({
92
- pattern: "my-pattern"
93
- })).rejects.toThrow("boom");
94
- expect(mockVitest.setGlobalTestNamePattern).toHaveBeenCalledWith("my-pattern");
95
- expect(mockVitest.resetGlobalTestNamePattern).toHaveBeenCalled();
96
- });
97
- it("shutdown() 이후 재호출은 멱등성을 보장한다", async ()=>{
98
- await manager.start();
99
- await manager.shutdown();
100
- await manager.shutdown(); // 오류 없이 재호출 가능
101
- expect(mockVitest.close).toHaveBeenCalledTimes(1);
102
- });
103
- it("shutdown() 이후 run() 호출은 오류를 던진다", async ()=>{
104
- await manager.start();
105
- await manager.shutdown();
106
- await expect(manager.run({})).rejects.toThrow("shut down");
107
- });
108
- it("files 미지정 시 globTestSpecifications를 인수 없이 호출한다", async ()=>{
109
- await manager.start();
110
- await manager.run({});
111
- expect(mockVitest.globTestSpecifications).toHaveBeenCalledWith();
112
- });
113
- it("files 지정 시 globTestSpecifications를 files 인수와 함께 호출한다", async ()=>{
114
- await manager.start();
115
- await manager.run({
116
- files: [
117
- "foo.test.ts"
118
- ]
119
- });
120
- expect(mockVitest.globTestSpecifications).toHaveBeenCalledWith([
121
- "foo.test.ts"
122
- ]);
123
- });
124
- it("동일 moduleId 결과가 중복되어도 최종 results는 파일당 1건만 유지한다", async ()=>{
125
- await manager.start();
126
- mockVitest.globTestSpecifications.mockResolvedValue([
127
- {
128
- moduleId: "dup.test.ts"
129
- }
130
- ]);
131
- const createModule = (duration)=>({
132
- moduleId: "dup.test.ts",
133
- children: [],
134
- state: ()=>"passed",
135
- diagnostic: ()=>({
136
- duration
137
- })
138
- });
139
- mockVitest.runTestSpecifications.mockResolvedValue({
140
- testModules: [
141
- createModule(10),
142
- createModule(25)
143
- ]
144
- });
145
- const result = await manager.run({});
146
- expect(result.results).toHaveLength(1);
147
- expect(result.results[0]?.id).toBe("dup.test.ts");
148
- expect(result.results[0]?.durationMs).toBe(25);
149
- });
150
- });
151
-
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL19fdGVzdHNfXy9kZXYtdml0ZXN0LW1hbmFnZXIudGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5cbi8vIHZpdGVzdC9ub2RlIOuqqO2CuSAtIGNyZWF0ZVZpdGVzdOqwgCBtb2NrIFZpdGVzdCDsnbjsiqTthLTsiqTrpbwg67CY7ZmY7ZWY64+E66GdIOyEpOyglVxuY29uc3QgbW9ja1ZpdGVzdCA9IHtcbiAgb25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvbjogdmkuZm4oKSxcbiAgc2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuOiB2aS5mbigpLFxuICByZXNldEdsb2JhbFRlc3ROYW1lUGF0dGVybjogdmkuZm4oKSxcbiAgZ2xvYlRlc3RTcGVjaWZpY2F0aW9uczogdmkuZm4oKSxcbiAgcnVuVGVzdFNwZWNpZmljYXRpb25zOiB2aS5mbigpLFxuICBjbG9zZTogdmkuZm4oKSxcbn07XG5cbnZpLm1vY2soXCJ2aXRlc3Qvbm9kZVwiLCAoKSA9PiAoe1xuICBjcmVhdGVWaXRlc3Q6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobW9ja1ZpdGVzdCksXG59KSk7XG5cbmltcG9ydCB7IERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5cbmRlc2NyaWJlKFwiRGV2Vml0ZXN0TWFuYWdlclwiLCAoKSA9PiB7XG4gIGxldCBtYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHZpLmNsZWFyQWxsTW9ja3MoKTtcbiAgICBtYW5hZ2VyID0gbmV3IERldlZpdGVzdE1hbmFnZXIoKTtcblxuICAgIC8vIOq4sOuzuCBtb2NrOiDruYgg7YWM7Iqk7Yq4IOqysOqzvFxuICAgIGNvbnN0IG1vY2tUZXN0TW9kdWxlID0ge1xuICAgICAgbW9kdWxlSWQ6IFwidGVzdC50c1wiLFxuICAgICAgY2hpbGRyZW46IHtcbiAgICAgICAgYWxsVGVzdHM6ICgpID0+IFtdLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vY2tWaXRlc3QuZ2xvYlRlc3RTcGVjaWZpY2F0aW9ucy5tb2NrUmVzb2x2ZWRWYWx1ZShbXSk7XG4gICAgbW9ja1ZpdGVzdC5ydW5UZXN0U3BlY2lmaWNhdGlvbnMubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgdGVzdE1vZHVsZXM6IFttb2NrVGVzdE1vZHVsZV0sXG4gICAgfSk7XG4gICAgbW9ja1ZpdGVzdC5jbG9zZS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdChcInN0YXJ0KCnqsIAgdml0ZXN0IOyduOyKpO2EtOyKpOulvCDstIjquLDtmZTtlZzri6RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG1hbmFnZXIuc3RhcnQoKTtcbiAgICBleHBlY3QobW9ja1ZpdGVzdC5vbkZpbHRlcldhdGNoZWRTcGVjaWZpY2F0aW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgY29uc3Qgc3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKTtcbiAgICBleHBlY3Qoc3RhdHVzLnJlYWR5KS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzdGF0dXMucnVubmluZykudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KFwicnVuKCnsnbQg7YWM7Iqk7Yq466W8IOyLpO2Wie2VmOqzoCDqsrDqs7zrpbwg67CY7ZmY7ZWc64ukXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWFuYWdlci5ydW4oe30pO1xuICAgIGV4cGVjdChyZXN1bHQub2spLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHJlc3VsdC5zdW1tYXJ5LnRvdGFsKS50b0JlKDApO1xuICB9KTtcblxuICBpdChcIuuPmeyLnCBydW4oKSAy7ZqMIO2YuOy2nOydgCDsiJzssKjsoIHsnLzroZwg7Iuk7ZaJ65Cc64ukXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KCk7XG4gICAgY29uc3Qgb3JkZXI6IG51bWJlcltdID0gW107XG5cbiAgICBtb2NrVml0ZXN0LnJ1blRlc3RTcGVjaWZpY2F0aW9uc1xuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbk9uY2UoYXN5bmMgKCkgPT4ge1xuICAgICAgICBvcmRlci5wdXNoKDEpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gc2V0VGltZW91dChyLCAxMCkpO1xuICAgICAgICByZXR1cm4geyB0ZXN0TW9kdWxlczogW3sgbW9kdWxlSWQ6IFwiYS50c1wiLCBjaGlsZHJlbjogeyBhbGxUZXN0czogKCkgPT4gW10gfSB9XSB9O1xuICAgICAgfSlcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb25PbmNlKGFzeW5jICgpID0+IHtcbiAgICAgICAgb3JkZXIucHVzaCgyKTtcbiAgICAgICAgcmV0dXJuIHsgdGVzdE1vZHVsZXM6IFt7IG1vZHVsZUlkOiBcImIudHNcIiwgY2hpbGRyZW46IHsgYWxsVGVzdHM6ICgpID0+IFtdIH0gfV0gfTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgW3IxLCByMl0gPSBhd2FpdCBQcm9taXNlLmFsbChbbWFuYWdlci5ydW4oe30pLCBtYW5hZ2VyLnJ1bih7fSldKTtcblxuICAgIGV4cGVjdChvcmRlcikudG9FcXVhbChbMSwgMl0pOyAvLyDrs5HroKzsnbQg7JWE64uMIOyInOywqCDsi6TtlolcbiAgICBleHBlY3QocjEub2spLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHIyLm9rKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdChcIuyYpOulmCDrsJzsg50g7Iuc7JeQ64+EIHBhdHRlcm7snbQgZmluYWxseeyXkOyEnCDtla3sg4Eg66as7IWL65Cc64ukXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KCk7XG4gICAgbW9ja1ZpdGVzdC5ydW5UZXN0U3BlY2lmaWNhdGlvbnMubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcImJvb21cIikpO1xuXG4gICAgYXdhaXQgZXhwZWN0KG1hbmFnZXIucnVuKHsgcGF0dGVybjogXCJteS1wYXR0ZXJuXCIgfSkpLnJlamVjdHMudG9UaHJvdyhcImJvb21cIik7XG5cbiAgICBleHBlY3QobW9ja1ZpdGVzdC5zZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwibXktcGF0dGVyblwiKTtcbiAgICBleHBlY3QobW9ja1ZpdGVzdC5yZXNldEdsb2JhbFRlc3ROYW1lUGF0dGVybikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdChcInNodXRkb3duKCkg7J207ZuEIOyerO2YuOy2nOydgCDrqbHrk7HshLHsnYQg67O07J6l7ZWc64ukXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KCk7XG4gICAgYXdhaXQgbWFuYWdlci5zaHV0ZG93bigpO1xuICAgIGF3YWl0IG1hbmFnZXIuc2h1dGRvd24oKTsgLy8g7Jik66WYIOyXhuydtCDsnqztmLjstpwg6rCA64qlXG4gICAgZXhwZWN0KG1vY2tWaXRlc3QuY2xvc2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgaXQoXCJzaHV0ZG93bigpIOydtO2bhCBydW4oKSDtmLjstpzsnYAg7Jik66WY66W8IOuNmOynhOuLpFwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgbWFuYWdlci5zdGFydCgpO1xuICAgIGF3YWl0IG1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICBhd2FpdCBleHBlY3QobWFuYWdlci5ydW4oe30pKS5yZWplY3RzLnRvVGhyb3coXCJzaHV0IGRvd25cIik7XG4gIH0pO1xuXG4gIGl0KFwiZmlsZXMg66+47KeA7KCVIOyLnCBnbG9iVGVzdFNwZWNpZmljYXRpb25z66W8IOyduOyImCDsl4bsnbQg7Zi47Lac7ZWc64ukXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KCk7XG4gICAgYXdhaXQgbWFuYWdlci5ydW4oe30pO1xuICAgIGV4cGVjdChtb2NrVml0ZXN0Lmdsb2JUZXN0U3BlY2lmaWNhdGlvbnMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCk7XG4gIH0pO1xuXG4gIGl0KFwiZmlsZXMg7KeA7KCVIOyLnCBnbG9iVGVzdFNwZWNpZmljYXRpb25z66W8IGZpbGVzIOyduOyImOyZgCDtlajqu5gg7Zi47Lac7ZWc64ukXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KCk7XG4gICAgYXdhaXQgbWFuYWdlci5ydW4oeyBmaWxlczogW1wiZm9vLnRlc3QudHNcIl0gfSk7XG4gICAgZXhwZWN0KG1vY2tWaXRlc3QuZ2xvYlRlc3RTcGVjaWZpY2F0aW9ucykudG9IYXZlQmVlbkNhbGxlZFdpdGgoW1wiZm9vLnRlc3QudHNcIl0pO1xuICB9KTtcblxuICBpdChcIuuPmeydvCBtb2R1bGVJZCDqsrDqs7zqsIAg7KSR67O165CY7Ja064+EIOy1nOyihSByZXN1bHRz64qUIO2MjOydvOuLuSAx6rG066eMIOycoOyngO2VnOuLpFwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgbWFuYWdlci5zdGFydCgpO1xuICAgIG1vY2tWaXRlc3QuZ2xvYlRlc3RTcGVjaWZpY2F0aW9ucy5tb2NrUmVzb2x2ZWRWYWx1ZShbeyBtb2R1bGVJZDogXCJkdXAudGVzdC50c1wiIH1dKTtcblxuICAgIGNvbnN0IGNyZWF0ZU1vZHVsZSA9IChkdXJhdGlvbjogbnVtYmVyKSA9PiAoe1xuICAgICAgbW9kdWxlSWQ6IFwiZHVwLnRlc3QudHNcIixcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIHN0YXRlOiAoKSA9PiBcInBhc3NlZFwiIGFzIGNvbnN0LFxuICAgICAgZGlhZ25vc3RpYzogKCkgPT4gKHsgZHVyYXRpb24gfSksXG4gICAgfSk7XG5cbiAgICBtb2NrVml0ZXN0LnJ1blRlc3RTcGVjaWZpY2F0aW9ucy5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICB0ZXN0TW9kdWxlczogW2NyZWF0ZU1vZHVsZSgxMCksIGNyZWF0ZU1vZHVsZSgyNSldLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWFuYWdlci5ydW4oe30pO1xuICAgIGV4cGVjdChyZXN1bHQucmVzdWx0cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGV4cGVjdChyZXN1bHQucmVzdWx0c1swXT8uaWQpLnRvQmUoXCJkdXAudGVzdC50c1wiKTtcbiAgICBleHBlY3QocmVzdWx0LnJlc3VsdHNbMF0/LmR1cmF0aW9uTXMpLnRvQmUoMjUpO1xuICB9KTtcbn0pO1xuIl0sIm5hbWVzIjpbImJlZm9yZUVhY2giLCJkZXNjcmliZSIsImV4cGVjdCIsIml0IiwidmkiLCJtb2NrVml0ZXN0Iiwib25GaWx0ZXJXYXRjaGVkU3BlY2lmaWNhdGlvbiIsImZuIiwic2V0R2xvYmFsVGVzdE5hbWVQYXR0ZXJuIiwicmVzZXRHbG9iYWxUZXN0TmFtZVBhdHRlcm4iLCJnbG9iVGVzdFNwZWNpZmljYXRpb25zIiwicnVuVGVzdFNwZWNpZmljYXRpb25zIiwiY2xvc2UiLCJtb2NrIiwiY3JlYXRlVml0ZXN0IiwibW9ja1Jlc29sdmVkVmFsdWUiLCJEZXZWaXRlc3RNYW5hZ2VyIiwibWFuYWdlciIsImNsZWFyQWxsTW9ja3MiLCJtb2NrVGVzdE1vZHVsZSIsIm1vZHVsZUlkIiwiY2hpbGRyZW4iLCJhbGxUZXN0cyIsInRlc3RNb2R1bGVzIiwidW5kZWZpbmVkIiwic3RhcnQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsImFueSIsIkZ1bmN0aW9uIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwicmVhZHkiLCJ0b0JlIiwicnVubmluZyIsInJlc3VsdCIsInJ1biIsIm9rIiwic3VtbWFyeSIsInRvdGFsIiwib3JkZXIiLCJtb2NrSW1wbGVtZW50YXRpb25PbmNlIiwicHVzaCIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsInIxIiwicjIiLCJhbGwiLCJ0b0VxdWFsIiwibW9ja1JlamVjdGVkVmFsdWVPbmNlIiwiRXJyb3IiLCJwYXR0ZXJuIiwicmVqZWN0cyIsInRvVGhyb3ciLCJ0b0hhdmVCZWVuQ2FsbGVkIiwic2h1dGRvd24iLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJmaWxlcyIsImNyZWF0ZU1vZHVsZSIsImR1cmF0aW9uIiwic3RhdGUiLCJkaWFnbm9zdGljIiwicmVzdWx0cyIsInRvSGF2ZUxlbmd0aCIsImlkIiwiZHVyYXRpb25NcyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsRUFBRSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQUU5RCw0REFBNEQ7QUFDNUQsTUFBTUMsYUFBYTtJQUNqQkMsOEJBQThCRixHQUFHRyxFQUFFO0lBQ25DQywwQkFBMEJKLEdBQUdHLEVBQUU7SUFDL0JFLDRCQUE0QkwsR0FBR0csRUFBRTtJQUNqQ0csd0JBQXdCTixHQUFHRyxFQUFFO0lBQzdCSSx1QkFBdUJQLEdBQUdHLEVBQUU7SUFDNUJLLE9BQU9SLEdBQUdHLEVBQUU7QUFDZDtBQUVBSCxHQUFHUyxJQUFJLENBQUMsZUFBZSxJQUFPLENBQUE7UUFDNUJDLGNBQWNWLEdBQUdHLEVBQUUsR0FBR1EsaUJBQWlCLENBQUNWO0lBQzFDLENBQUE7QUFFQSxTQUFTVyxnQkFBZ0IsUUFBUSwyQkFBd0I7QUFFekRmLFNBQVMsb0JBQW9CO0lBQzNCLElBQUlnQjtJQUVKakIsV0FBVztRQUNUSSxHQUFHYyxhQUFhO1FBQ2hCRCxVQUFVLElBQUlEO1FBRWQsb0JBQW9CO1FBQ3BCLE1BQU1HLGlCQUFpQjtZQUNyQkMsVUFBVTtZQUNWQyxVQUFVO2dCQUNSQyxVQUFVLElBQU0sRUFBRTtZQUNwQjtRQUNGO1FBQ0FqQixXQUFXSyxzQkFBc0IsQ0FBQ0ssaUJBQWlCLENBQUMsRUFBRTtRQUN0RFYsV0FBV00scUJBQXFCLENBQUNJLGlCQUFpQixDQUFD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
@@ -1,256 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { z } from "zod";
3
- import { EntityJsonSchema, isSearchTextJsonSourceZodType, TemplateOptions } from "../types.js";
4
- function createBaseEntity() {
5
- return {
6
- id: "SearchTextTest",
7
- title: "SearchText Test",
8
- table: "search_text_tests",
9
- props: [
10
- {
11
- name: "id",
12
- type: "integer"
13
- },
14
- {
15
- name: "title",
16
- type: "string"
17
- },
18
- {
19
- name: "tags",
20
- type: "string[]"
21
- },
22
- {
23
- name: "aliases",
24
- type: "json",
25
- id: "StringArray"
26
- },
27
- {
28
- name: "search_text",
29
- type: "searchText",
30
- sourceColumns: [
31
- {
32
- name: "title",
33
- caseInsensitive: true
34
- }
35
- ]
36
- }
37
- ],
38
- indexes: [
39
- {
40
- type: "index",
41
- name: "search_text_tests_search_text_index",
42
- using: "gin",
43
- columns: [
44
- {
45
- name: "search_text",
46
- opclass: "gin_trgm_ops"
47
- }
48
- ]
49
- }
50
- ],
51
- subsets: {
52
- A: [
53
- "id",
54
- "title",
55
- "tags",
56
- "aliases",
57
- "search_text"
58
- ]
59
- },
60
- enums: {}
61
- };
62
- }
63
- describe("EntityJsonSchema searchText/opclass validation", ()=>{
64
- test("opclass known/free string과 vectorOps 하위호환을 허용해야 한다", ()=>{
65
- const knownOpclass = createBaseEntity();
66
- const knownResult = EntityJsonSchema.safeParse(knownOpclass);
67
- expect(knownResult.success).toBe(true);
68
- const freeOpclass = createBaseEntity();
69
- freeOpclass.indexes[0] = {
70
- ...freeOpclass.indexes[0],
71
- columns: [
72
- {
73
- name: "search_text",
74
- opclass: "custom_text_ops"
75
- }
76
- ]
77
- };
78
- const freeResult = EntityJsonSchema.safeParse(freeOpclass);
79
- expect(freeResult.success).toBe(true);
80
- const legacyVectorOps = createBaseEntity();
81
- legacyVectorOps.indexes[0] = {
82
- type: "hnsw",
83
- name: "search_text_tests_embedding_hnsw",
84
- columns: [
85
- {
86
- name: "embedding",
87
- vectorOps: "vector_cosine_ops"
88
- }
89
- ],
90
- m: 16,
91
- efConstruction: 64
92
- };
93
- const legacyResult = EntityJsonSchema.safeParse(legacyVectorOps);
94
- expect(legacyResult.success).toBe(true);
95
- });
96
- test("searchText source column 존재/타입 검증이 동작해야 한다", ()=>{
97
- const unknownSource = createBaseEntity();
98
- unknownSource.props[4] = {
99
- name: "search_text",
100
- type: "searchText",
101
- sourceColumns: [
102
- {
103
- name: "missing_col",
104
- caseInsensitive: true
105
- }
106
- ]
107
- };
108
- const unknownResult = EntityJsonSchema.safeParse(unknownSource);
109
- expect(unknownResult.success).toBe(false);
110
- const unsupportedSourceType = createBaseEntity();
111
- unsupportedSourceType.props[4] = {
112
- name: "search_text",
113
- type: "searchText",
114
- sourceColumns: [
115
- {
116
- name: "id",
117
- caseInsensitive: true
118
- }
119
- ]
120
- };
121
- const unsupportedResult = EntityJsonSchema.safeParse(unsupportedSourceType);
122
- expect(unsupportedResult.success).toBe(false);
123
- });
124
- test("schema 단계에서는 searchText json source id naming을 강제하지 않아야 한다", ()=>{
125
- const nullableWrapper = createBaseEntity();
126
- nullableWrapper.props[3] = {
127
- name: "aliases",
128
- type: "json",
129
- id: "NullableStringArray"
130
- };
131
- nullableWrapper.props[4] = {
132
- name: "search_text",
133
- type: "searchText",
134
- sourceColumns: [
135
- {
136
- name: "aliases",
137
- caseInsensitive: true
138
- }
139
- ]
140
- };
141
- const wrapperResult = EntityJsonSchema.safeParse(nullableWrapper);
142
- expect(wrapperResult.success).toBe(true);
143
- const nullableElement = createBaseEntity();
144
- nullableElement.props[3] = {
145
- name: "aliases",
146
- type: "json",
147
- id: "StringNullableArray"
148
- };
149
- nullableElement.props[4] = {
150
- name: "search_text",
151
- type: "searchText",
152
- sourceColumns: [
153
- {
154
- name: "aliases",
155
- caseInsensitive: true
156
- }
157
- ]
158
- };
159
- const nullableElementResult = EntityJsonSchema.safeParse(nullableElement);
160
- expect(nullableElementResult.success).toBe(true);
161
- const customNamedType = createBaseEntity();
162
- customNamedType.props[3] = {
163
- name: "aliases",
164
- type: "json",
165
- id: "CustomAliasType"
166
- };
167
- customNamedType.props[4] = {
168
- name: "search_text",
169
- type: "searchText",
170
- sourceColumns: [
171
- {
172
- name: "aliases",
173
- caseInsensitive: true
174
- }
175
- ]
176
- };
177
- const customNamedTypeResult = EntityJsonSchema.safeParse(customNamedType);
178
- expect(customNamedTypeResult.success).toBe(true);
179
- });
180
- test("TemplateOptions.entity 경로도 searchText source 검증을 동일하게 적용해야 한다", ()=>{
181
- const validEntity = createBaseEntity();
182
- const validTemplateEntity = {
183
- entityId: validEntity.id,
184
- title: validEntity.title,
185
- table: validEntity.table,
186
- props: validEntity.props,
187
- indexes: validEntity.indexes,
188
- subsets: validEntity.subsets,
189
- enums: validEntity.enums
190
- };
191
- const validResult = TemplateOptions.shape.entity.safeParse(validTemplateEntity);
192
- expect(validResult.success).toBe(true);
193
- const invalidEntity = createBaseEntity();
194
- invalidEntity.props[4] = {
195
- name: "search_text",
196
- type: "searchText",
197
- sourceColumns: [
198
- {
199
- name: "missing_col",
200
- caseInsensitive: true
201
- }
202
- ]
203
- };
204
- const invalidTemplateEntity = {
205
- entityId: invalidEntity.id,
206
- title: invalidEntity.title,
207
- table: invalidEntity.table,
208
- props: invalidEntity.props,
209
- indexes: invalidEntity.indexes,
210
- subsets: invalidEntity.subsets,
211
- enums: invalidEntity.enums
212
- };
213
- const invalidResult = TemplateOptions.shape.entity.safeParse(invalidTemplateEntity);
214
- expect(invalidResult.success).toBe(false);
215
- });
216
- test("TemplateOptions.entity 경로도 json id naming에 의존하지 않아야 한다", ()=>{
217
- const customNamedType = createBaseEntity();
218
- customNamedType.props[3] = {
219
- name: "aliases",
220
- type: "json",
221
- id: "CustomAliasType"
222
- };
223
- customNamedType.props[4] = {
224
- name: "search_text",
225
- type: "searchText",
226
- sourceColumns: [
227
- {
228
- name: "aliases",
229
- caseInsensitive: true
230
- }
231
- ]
232
- };
233
- const customTemplateEntity = {
234
- entityId: customNamedType.id,
235
- title: customNamedType.title,
236
- table: customNamedType.table,
237
- props: customNamedType.props,
238
- indexes: customNamedType.indexes,
239
- subsets: customNamedType.subsets,
240
- enums: customNamedType.enums
241
- };
242
- const customTemplateResult = TemplateOptions.shape.entity.safeParse(customTemplateEntity);
243
- expect(customTemplateResult.success).toBe(true);
244
- });
245
- test("searchText json source Zod 구조 검증 유틸이 wrapper/element 타입을 정확히 판정해야 한다", ()=>{
246
- expect(isSearchTextJsonSourceZodType(z.array(z.string()))).toBe(true);
247
- expect(isSearchTextJsonSourceZodType(z.array(z.string()).optional())).toBe(true);
248
- expect(isSearchTextJsonSourceZodType(z.array(z.string()).nullable())).toBe(true);
249
- expect(isSearchTextJsonSourceZodType(z.array(z.string()).nullish())).toBe(true);
250
- expect(isSearchTextJsonSourceZodType(z.array(z.string().nullable()))).toBe(false);
251
- expect(isSearchTextJsonSourceZodType(z.array(z.number()))).toBe(false);
252
- expect(isSearchTextJsonSourceZodType(z.string())).toBe(false);
253
- });
254
- });
255
-
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy9fX3Rlc3RzX18vZW50aXR5LWpzb24tc2NoZW1hLXNlYXJjaC10ZXh0LnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgdGVzdCB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBFbnRpdHlKc29uU2NoZW1hLCBpc1NlYXJjaFRleHRKc29uU291cmNlWm9kVHlwZSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VFbnRpdHkoKSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFwiU2VhcmNoVGV4dFRlc3RcIixcbiAgICB0aXRsZTogXCJTZWFyY2hUZXh0IFRlc3RcIixcbiAgICB0YWJsZTogXCJzZWFyY2hfdGV4dF90ZXN0c1wiLFxuICAgIHByb3BzOiBbXG4gICAgICB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIgfSxcbiAgICAgIHsgbmFtZTogXCJ0aXRsZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICB7IG5hbWU6IFwidGFnc1wiLCB0eXBlOiBcInN0cmluZ1tdXCIgfSxcbiAgICAgIHsgbmFtZTogXCJhbGlhc2VzXCIsIHR5cGU6IFwianNvblwiLCBpZDogXCJTdHJpbmdBcnJheVwiIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwic2VhcmNoX3RleHRcIixcbiAgICAgICAgdHlwZTogXCJzZWFyY2hUZXh0XCIsXG4gICAgICAgIHNvdXJjZUNvbHVtbnM6IFt7IG5hbWU6IFwidGl0bGVcIiwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH1dLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGluZGV4ZXM6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbmRleFwiLFxuICAgICAgICBuYW1lOiBcInNlYXJjaF90ZXh0X3Rlc3RzX3NlYXJjaF90ZXh0X2luZGV4XCIsXG4gICAgICAgIHVzaW5nOiBcImdpblwiLFxuICAgICAgICBjb2x1bW5zOiBbeyBuYW1lOiBcInNlYXJjaF90ZXh0XCIsIG9wY2xhc3M6IFwiZ2luX3RyZ21fb3BzXCIgfV0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgc3Vic2V0czoge1xuICAgICAgQTogW1wiaWRcIiwgXCJ0aXRsZVwiLCBcInRhZ3NcIiwgXCJhbGlhc2VzXCIsIFwic2VhcmNoX3RleHRcIl0sXG4gICAgfSxcbiAgICBlbnVtczoge30sXG4gIH0gYXMgY29uc3Q7XG59XG5cbmRlc2NyaWJlKFwiRW50aXR5SnNvblNjaGVtYSBzZWFyY2hUZXh0L29wY2xhc3MgdmFsaWRhdGlvblwiLCAoKSA9PiB7XG4gIHRlc3QoXCJvcGNsYXNzIGtub3duL2ZyZWUgc3RyaW5n6rO8IHZlY3Rvck9wcyDtlZjsnITtmLjtmZjsnYQg7ZeI7Jqp7ZW07JW8IO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgY29uc3Qga25vd25PcGNsYXNzID0gY3JlYXRlQmFzZUVudGl0eSgpO1xuICAgIGNvbnN0IGtub3duUmVzdWx0ID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2Uoa25vd25PcGNsYXNzKTtcbiAgICBleHBlY3Qoa25vd25SZXN1bHQuc3VjY2VzcykudG9CZSh0cnVlKTtcblxuICAgIGNvbnN0IGZyZWVPcGNsYXNzID0gY3JlYXRlQmFzZUVudGl0eSgpO1xuICAgIGZyZWVPcGNsYXNzLmluZGV4ZXNbMF0gPSB7XG4gICAgICAuLi5mcmVlT3BjbGFzcy5pbmRleGVzWzBdLFxuICAgICAgY29sdW1uczogW3sgbmFtZTogXCJzZWFyY2hfdGV4dFwiLCBvcGNsYXNzOiBcImN1c3RvbV90ZXh0X29wc1wiIH1dLFxuICAgIH07XG4gICAgY29uc3QgZnJlZVJlc3VsdCA9IEVudGl0eUpzb25TY2hlbWEuc2FmZVBhcnNlKGZyZWVPcGNsYXNzKTtcbiAgICBleHBlY3QoZnJlZVJlc3VsdC5zdWNjZXNzKS50b0JlKHRydWUpO1xuXG4gICAgY29uc3QgbGVnYWN5VmVjdG9yT3BzID0gY3JlYXRlQmFzZUVudGl0eSgpO1xuICAgIGxlZ2FjeVZlY3Rvck9wcy5pbmRleGVzWzBdID0ge1xuICAgICAgdHlwZTogXCJobnN3XCIsXG4gICAgICBuYW1lOiBcInNlYXJjaF90ZXh0X3Rlc3RzX2VtYmVkZGluZ19obnN3XCIsXG4gICAgICBjb2x1bW5zOiBbeyBuYW1lOiBcImVtYmVkZGluZ1wiLCB2ZWN0b3JPcHM6IFwidmVjdG9yX2Nvc2luZV9vcHNcIiB9XSxcbiAgICAgIG06IDE2LFxuICAgICAgZWZDb25zdHJ1Y3Rpb246IDY0LFxuICAgIH07XG4gICAgY29uc3QgbGVnYWN5UmVzdWx0ID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2UobGVnYWN5VmVjdG9yT3BzKTtcbiAgICBleHBlY3QobGVnYWN5UmVzdWx0LnN1Y2Nlc3MpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIHRlc3QoXCJzZWFyY2hUZXh0IHNvdXJjZSBjb2x1bW4g7KG07J6sL+2DgOyehSDqsoDspp3snbQg64+Z7J6R7ZW07JW8IO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdW5rbm93blNvdXJjZSA9IGNyZWF0ZUJhc2VFbnRpdHkoKTtcbiAgICB1bmtub3duU291cmNlLnByb3BzWzRdID0ge1xuICAgICAgbmFtZTogXCJzZWFyY2hfdGV4dFwiLFxuICAgICAgdHlwZTogXCJzZWFyY2hUZXh0XCIsXG4gICAgICBzb3VyY2VDb2x1bW5zOiBbeyBuYW1lOiBcIm1pc3NpbmdfY29sXCIsIGNhc2VJbnNlbnNpdGl2ZTogdHJ1ZSB9XSxcbiAgICB9O1xuICAgIGNvbnN0IHVua25vd25SZXN1bHQgPSBFbnRpdHlKc29uU2NoZW1hLnNhZmVQYXJzZSh1bmtub3duU291cmNlKTtcbiAgICBleHBlY3QodW5rbm93blJlc3VsdC5zdWNjZXNzKS50b0JlKGZhbHNlKTtcblxuICAgIGNvbnN0IHVuc3VwcG9ydGVkU291cmNlVHlwZSA9IGNyZWF0ZUJhc2VFbnRpdHkoKTtcbiAgICB1bnN1cHBvcnRlZFNvdXJjZVR5cGUucHJvcHNbNF0gPSB7XG4gICAgICBuYW1lOiBcInNlYXJjaF90ZXh0XCIsXG4gICAgICB0eXBlOiBcInNlYXJjaFRleHRcIixcbiAgICAgIHNvdXJjZUNvbHVtbnM6IFt7IG5hbWU6IFwiaWRcIiwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH1dLFxuICAgIH07XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRSZXN1bHQgPSBFbnRpdHlKc29uU2NoZW1hLnNhZmVQYXJzZSh1bnN1cHBvcnRlZFNvdXJjZVR5cGUpO1xuICAgIGV4cGVjdCh1bnN1cHBvcnRlZFJlc3VsdC5zdWNjZXNzKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgdGVzdChcInNjaGVtYSDri6jqs4Tsl5DshJzripQgc2VhcmNoVGV4dCBqc29uIHNvdXJjZSBpZCBuYW1pbmfsnYQg6rCV7KCc7ZWY7KeAIOyViuyVhOyVvCDtlZzri6RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG51bGxhYmxlV3JhcHBlciA9IGNyZWF0ZUJhc2VFbnRpdHkoKTtcbiAgICBudWxsYWJsZVdyYXBwZXIucHJvcHNbM10gPSB7IG5hbWU6IFwiYWxpYXNlc1wiLCB0eXBlOiBcImpzb25cIiwgaWQ6IFwiTnVsbGFibGVTdHJpbmdBcnJheVwiIH07XG4gICAgbnVsbGFibGVXcmFwcGVyLnByb3BzWzRdID0ge1xuICAgICAgbmFtZTogXCJzZWFyY2hfdGV4dFwiLFxuICAgICAgdHlwZTogXCJzZWFyY2hUZXh0XCIsXG4gICAgICBzb3VyY2VDb2x1bW5zOiBbeyBuYW1lOiBcImFsaWFzZXNcIiwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH1dLFxuICAgIH07XG4gICAgY29uc3Qgd3JhcHBlclJlc3VsdCA9IEVudGl0eUpzb25TY2hlbWEuc2FmZVBhcnNlKG51bGxhYmxlV3JhcHBlcik7XG4gICAgZXhwZWN0KHdyYXBwZXJSZXN1bHQuc3VjY2VzcykudG9CZSh0cnVlKTtcblxuICAgIGNvbnN0IG51bGxhYmxlRWxlbWVudCA9IGNyZWF0ZUJhc2VFbnRpdHkoKTtcbiAgICBudWxsYWJsZUVsZW1lbnQucHJvcHNbM10gPSB7IG5hbWU6IFwiYWxpYXNlc1wiLCB0eXBlOiBcImpzb25cIiwgaWQ6IFwiU3RyaW5nTnVsbGFibGVBcnJheVwiIH07XG4gICAgbnVsbGFibGVFbGVtZW50LnByb3BzWzRdID0ge1xuICAgICAgbmFtZTogXCJzZWFyY2hfdGV4dFwiLFxuICAgICAgdHlwZTogXCJzZWFyY2hUZXh0XCIsXG4gICAgICBzb3VyY2VDb2x1bW5zOiBbeyBuYW1lOiBcImFsaWFzZXNcIiwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH1dLFxuICAgIH07XG4gICAgY29uc3QgbnVsbGFibGVFbGVtZW50UmVzdWx0ID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2UobnVsbGFibGVFbGVtZW50KTtcbiAgICBleHBlY3QobnVsbGFibGVFbGVtZW50UmVzdWx0LnN1Y2Nlc3MpLnRvQmUodHJ1ZSk7XG5cbiAgICBjb25zdCBjdXN0b21OYW1lZFR5cGUgPSBjcmVhdGVCYXNlRW50aXR5KCk7XG4gICAgY3VzdG9tTmFtZWRUeXBlLnByb3BzWzNdID0geyBuYW1lOiBcImFsaWFzZXNcIiwgdHlwZTogXCJqc29uXCIsIGlkOiBcIkN1c3RvbUFsaWFzVHlwZVwiIH07XG4gICAgY3VzdG9tTmFtZWRUeXBlLnByb3BzWzRdID0ge1xuICAgICAgbmFtZTogXCJzZWFyY2hfdGV4dFwiLFxuICAgICAgdHlwZTogXCJzZWFyY2hUZXh0XCIsXG4gICAgICBzb3VyY2VDb2x1bW5zOiBbeyBuYW1lOiBcImFsaWFzZXNcIiwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH1dLFxuICAgIH07XG4gICAgY29uc3QgY3VzdG9tTmFtZWRUeXBlUmVzdWx0ID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2UoY3VzdG9tTmFtZWRUeXBlKTtcbiAgICBleHBlY3QoY3VzdG9tTmFtZWRUeXBlUmVzdWx0LnN1Y2Nlc3MpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIHRlc3QoXCJUZW1wbGF0ZU9wdGlvbnMuZW50aXR5IOqyveuhnOuPhCBzZWFyY2hUZXh0IHNvdXJjZSDqsoDspp3snYQg64+Z7J287ZWY6rKMIOyggeyaqe2VtOyVvCDtlZzri6RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkRW50aXR5ID0gY3JlYXRlQmFzZUVudGl0eSgpO1xuICAgIGNvbnN0IHZhbGlkVGVtcGxhdGVFbnRpdHkgPSB7XG4gICAgICBlbnRpdHlJZDogdmFsaWRFbnRpdHkuaWQsXG4gICAgICB0aXRsZTogdmFsaWRFbnRpdHkudGl0bGUsXG4gICAgICB0YWJsZTogdmFsaWRFbnRpdHkudGFibGUsXG4gICAgICBwcm9wczogdmFsaWRFbnRpdHkucHJvcHMsXG4gICAgICBpbmRleGVzOiB2YWxpZEVudGl0eS5pbmRleGVzLFxuICAgICAgc3Vic2V0czogdmFsaWRFbnRpdHkuc3Vic2V0cyxcbiAgICAgIGVudW1zOiB2YWxpZEVudGl0eS5lbnVtcyxcbiAgICB9O1xuICAgIGNvbnN0IHZhbGlkUmVzdWx0ID0gVGVtcGxhdGVPcHRpb25zLnNoYXBlLmVudGl0eS5zYWZlUGFyc2UodmFsaWRUZW1wbGF0ZUVudGl0eSk7XG4gICAgZXhwZWN0KHZhbGlkUmVzdWx0LnN1Y2Nlc3MpLnRvQmUodHJ1ZSk7XG5cbiAgICBjb25zdCBpbnZhbGlkRW50aXR5ID0gY3JlYXRlQmFzZUVudGl0eSgpO1xuICAgIGludmFsaWRFbnRpdHkucHJvcHNbNF0gPSB7XG4gICAgICBuYW1lOiBcInNlYXJjaF90ZXh0XCIsXG4gICAgICB0eXBlOiBcInNlYXJjaFRleHRcIixcbiAgICAgIHNvdXJjZUNvbHVtbnM6IFt7IG5hbWU6IFwibWlzc2luZ19jb2xcIiwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH1dLFxuICAgIH07XG4gICAgY29uc3QgaW52YWxpZFRlbXBsYXRlRW50aXR5ID0ge1xuICAgICAgZW50aXR5SWQ6IGludmFsaWRFbnRpdHkuaWQsXG4gICAgICB0aXRsZTogaW52YWxpZEVudGl0eS50aXRsZSxcbiAgICAgIHRhYmxlOiBpbnZhbGlkRW50aXR5LnRhYmxlLFxuICAgICAgcHJvcHM6IGludmFsaWRFbnRpdHkucHJvcHMsXG4gICAgICBpbmRleGVzOiBpbnZhbGlkRW50aXR5LmluZGV4ZXMsXG4gICAgICBzdWJzZXRzOiBpbnZhbGlkRW50aXR5LnN1YnNldHMsXG4gICAgICBlbnVtczogaW52YWxpZEVudGl0eS5lbnVtcyxcbiAgICB9O1xuICAgIGNvbnN0IGludmFsaWRSZXN1bHQgPSBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5LnNhZmVQYXJzZShpbnZhbGlkVGVtcGxhdGVFbnRpdHkpO1xuICAgIGV4cGVjdChpbnZhbGlkUmVzdWx0LnN1Y2Nlc3MpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICB0ZXN0KFwiVGVtcGxhdGVPcHRpb25zLmVudGl0eSDqsr3roZzrj4QganNvbiBpZCBuYW1pbmfsl5Ag7J2Y7KG07ZWY7KeAIOyViuyVhOyVvCDtlZzri6RcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGN1c3RvbU5hbWVkVHlwZSA9IGNyZWF0ZUJhc2VFbnRpdHkoKTtcbiAgICBjdXN0b21OYW1lZFR5cGUucHJvcHNbM10gPSB7IG5hbWU6IFwiYWxpYXNlc1wiLCB0eXBlOiBcImpzb25cIiwgaWQ6IFwiQ3VzdG9tQWxpYXNUeXBlXCIgfTtcbiAgICBjdXN0b21OYW1lZFR5cGUucHJvcHNbNF0gPSB7XG4gICAgICBuYW1lOiBcInNlYXJjaF90ZXh0XCIsXG4gICAgICB0eXBlOiBcInNlYXJjaFRleHRcIixcbiAgICAgIHNvdXJjZUNvbHVtbnM6IFt7IG5hbWU6IFwiYWxpYXNlc1wiLCBjYXNlSW5zZW5zaXRpdmU6IHRydWUgfV0sXG4gICAgfTtcblxuICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlRW50aXR5ID0ge1xuICAgICAgZW50aXR5SWQ6IGN1c3RvbU5hbWVkVHlwZS5pZCxcbiAgICAgIHRpdGxlOiBjdXN0b21OYW1lZFR5cGUudGl0bGUsXG4gICAgICB0YWJsZTogY3VzdG9tTmFtZWRUeXBlLnRhYmxlLFxuICAgICAgcHJvcHM6IGN1c3RvbU5hbWVkVHlwZS5wcm9wcyxcbiAgICAgIGluZGV4ZXM6IGN1c3RvbU5hbWVkVHlwZS5pbmRleGVzLFxuICAgICAgc3Vic2V0czogY3VzdG9tTmFtZWRUeXBlLnN1YnNldHMsXG4gICAgICBlbnVtczogY3VzdG9tTmFtZWRUeXBlLmVudW1zLFxuICAgIH07XG4gICAgY29uc3QgY3VzdG9tVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5LnNhZmVQYXJzZShjdXN0b21UZW1wbGF0ZUVudGl0eSk7XG4gICAgZXhwZWN0KGN1c3RvbVRlbXBsYXRlUmVzdWx0LnN1Y2Nlc3MpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIHRlc3QoXCJzZWFyY2hUZXh0IGpzb24gc291cmNlIFpvZCDqtazsobAg6rKA7KadIOycoO2LuOydtCB3cmFwcGVyL2VsZW1lbnQg7YOA7J6F7J2EIOygle2Zle2eiCDtjJDsoJXtlbTslbwg7ZWc64ukXCIsICgpID0+IHtcbiAgICBleHBlY3QoaXNTZWFyY2hUZXh0SnNvblNvdXJjZVpvZFR5cGUoei5hcnJheSh6LnN0cmluZygpKSkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KGlzU2VhcmNoVGV4dEpzb25Tb3VyY2Vab2RUeXBlKHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGlzaCgpKSkudG9CZSh0cnVlKTtcblxuICAgIGV4cGVjdChpc1NlYXJjaFRleHRKc29uU291cmNlWm9kVHlwZSh6LmFycmF5KHouc3RyaW5nKCkubnVsbGFibGUoKSkpKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3QoaXNTZWFyY2hUZXh0SnNvblNvdXJjZVpvZFR5cGUoei5hcnJheSh6Lm51bWJlcigpKSkpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChpc1NlYXJjaFRleHRKc29uU291cmNlWm9kVHlwZSh6LnN0cmluZygpKSkudG9CZShmYWxzZSk7XG4gIH0pO1xufSk7XG4iXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJleHBlY3QiLCJ0ZXN0IiwieiIsIkVudGl0eUpzb25TY2hlbWEiLCJpc1NlYXJjaFRleHRKc29uU291cmNlWm9kVHlwZSIsIlRlbXBsYXRlT3B0aW9ucyIsImNyZWF0ZUJhc2VFbnRpdHkiLCJpZCIsInRpdGxlIiwidGFibGUiLCJwcm9wcyIsIm5hbWUiLCJ0eXBlIiwic291cmNlQ29sdW1ucyIsImNhc2VJbnNlbnNpdGl2ZSIsImluZGV4ZXMiLCJ1c2luZyIsImNvbHVtbnMiLCJvcGNsYXNzIiwic3Vic2V0cyIsIkEiLCJlbnVtcyIsImtub3duT3BjbGFzcyIsImtub3duUmVzdWx0Iiwic2FmZVBhcnNlIiwic3VjY2VzcyIsInRvQmUiLCJmcmVlT3BjbGFzcyIsImZyZWVSZXN1bHQiLCJsZWdhY3lWZWN0b3JPcHMiLCJ2ZWN0b3JPcHMiLCJtIiwiZWZDb25zdHJ1Y3Rpb24iLCJsZWdhY3lSZXN1bHQiLCJ1bmtub3duU291cmNlIiwidW5rbm93blJlc3VsdCIsInVuc3VwcG9ydGVkU291cmNlVHlwZSIsInVuc3VwcG9ydGVkUmVzdWx0IiwibnVsbGFibGVXcmFwcGVyIiwid3JhcHBlclJlc3VsdCIsIm51bGxhYmxlRWxlbWVudCIsIm51bGxhYmxlRWxlbWVudFJlc3VsdCIsImN1c3RvbU5hbWVkVHlwZSIsImN1c3RvbU5hbWVkVHlwZVJlc3VsdCIsInZhbGlkRW50aXR5IiwidmFsaWRUZW1wbGF0ZUVudGl0eSIsImVudGl0eUlkIiwidmFsaWRSZXN1bHQiLCJzaGFwZSIsImVudGl0eSIsImludmFsaWRFbnRpdHkiLCJpbnZhbGlkVGVtcGxhdGVFbnRpdHkiLCJpbnZhbGlkUmVzdWx0IiwiY3VzdG9tVGVtcGxhdGVFbnRpdHkiLCJjdXN0b21UZW1wbGF0ZVJlc3VsdCIsImFycmF5Iiwic3RyaW5nIiwib3B0aW9uYWwiLCJudWxsYWJsZSIsIm51bGxpc2giLCJudW1iZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxJQUFJLFFBQVEsU0FBUztBQUNoRCxTQUFTQyxDQUFDLFFBQVEsTUFBTTtBQUN4QixTQUFTQyxnQkFBZ0IsRUFBRUMsNkJBQTZCLEVBQUVDLGVBQWUsUUFBUSxjQUFXO0FBRTVGLFNBQVNDO0lBQ1AsT0FBTztRQUNMQyxJQUFJO1FBQ0pDLE9BQU87UUFDUEMsT0FBTztRQUNQQyxPQUFPO1lBQ0w7Z0JBQUVDLE1BQU07Z0JBQU1DLE1BQU07WUFBVTtZQUM5QjtnQkFBRUQsTUFBTTtnQkFBU0MsTUFBTTtZQUFTO1lBQ2hDO2dCQUFFRCxNQUFNO2dCQUFRQyxNQUFNO1lBQVc7WUFDakM7Z0JBQUVELE1BQU07Z0JBQVdDLE1BQU07Z0JBQVFMLElBQUk7WUFBYztZQUNuRDtnQkFDRUksTUFBTTtnQkFDTkMsTUFBTTtnQkFDTkMsZUFBZTtvQkFBQzt3QkFBRUYsTUFBTTt3QkFBU0csaUJBQWlCO29CQUFLO2lCQUFFO1lBQzNEO1NBQ0Q7UUFDREMsU0FBUztZQUNQO2dCQUNFSCxNQUFNO2dCQUNORCxNQUFNO2dCQUNOSyxPQUFPO2dCQUNQQyxTQUFTO29CQUFDO3dCQUFFTixNQUFNO3dCQUFlTyxTQUFTO29CQUFlO2lCQUFFO1lBQzdEO1NBQ0Q7UUFDREMsU0FBUztZQUNQQyxHQUFHO2dCQUFDO2dCQUFNO2dCQUFTO2dCQUFRO2dCQUFXO2FBQWM7UUFDdEQ7UUFDQUMsT0FBTyxDQUFDO0lBQ1Y7QUFDRjtBQUVBdEIsU0FBUyxrREFBa0Q7SUFDekRFLEtBQUssc0RBQXNEO1FBQ3pELE1BQU1xQixlQUFlaEI7UUFDckIsTUFBTWlCLGNBQWNwQixpQkFBaUJxQixTQUFTLENBQUNGO1FBQy9DdEIsT0FBT3VCLFlBQVlFLE9BQU8sRUFBRUMsSUFBSSxDQUFDO1FBRWpDLE1BQU1DLGNBQWNyQjtRQUNwQnFCLFlBQVla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
@@ -1,3 +0,0 @@
1
- /** biome-ignore-all lint/correctness/noUnusedImports: d.ts */ /** biome-ignore-all lint/suspicious/noExplicitAny: d.ts */ /** biome-ignore-all lint/correctness/noUnusedVariables: d.ts */ export { };
2
-
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBpbmdzL2tuZXguZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L2NvcnJlY3RuZXNzL25vVW51c2VkSW1wb3J0czogZC50cyAqL1xuLyoqIGJpb21lLWlnbm9yZS1hbGwgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGQudHMgKi9cbi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvY29ycmVjdG5lc3Mvbm9VbnVzZWRWYXJpYWJsZXM6IGQudHMgKi9cblxuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJrbmV4XCIge1xuICBuYW1lc3BhY2UgS25leCB7XG4gICAgaW50ZXJmYWNlIFF1ZXJ5QnVpbGRlciB7XG4gICAgICBjb2x1bW5JbmZvPFRSZWNvcmQ+KGNvbHVtbj86IGtleW9mIFRSZWNvcmQpOiBQcm9taXNlPEtuZXguQ29sdW1uSW5mbyB8IENvbHVtbkluZm9zT2JqPjtcblxuICAgICAgd2hlcmVCZXR3ZWVuPFRSZWNvcmQsIFRSZXN1bHQ+KFxuICAgICAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgICAgIHJhbmdlOiByZWFkb25seSBbYW55LCBhbnldLFxuICAgICAgKTogS25leC5RdWVyeUJ1aWxkZXI7XG4gICAgfVxuXG4gICAgdHlwZSBDb2x1bW5JbmZvc09iaiA9IHtcbiAgICAgIFtjb2x1bW5OYW1lOiBzdHJpbmddOiBLbmV4LkNvbHVtbkluZm87XG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RCxHQUM1RCx5REFBeUQsR0FDekQsOERBQThELEdBRTlELFdBQWlDIn0=