sonamu 0.10.12 → 0.10.13

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 (513) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +131 -27
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +12 -6
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +3 -2
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +27 -21
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/naite/naite-reporter.js +2 -2
  149. package/dist/naite/naite.d.ts +74 -15
  150. package/dist/naite/naite.d.ts.map +1 -1
  151. package/dist/naite/naite.js +5 -19
  152. package/dist/runtime-type.d.ts +6 -0
  153. package/dist/runtime-type.d.ts.map +1 -0
  154. package/dist/runtime-type.js +26 -0
  155. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  156. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  157. package/dist/ssr/hmr-opt-out.js +59 -0
  158. package/dist/ssr/renderer.d.ts.map +1 -1
  159. package/dist/ssr/renderer.js +4 -1
  160. package/dist/storage/base-file.js +14 -14
  161. package/dist/storage/buffered-file.d.ts +2 -2
  162. package/dist/storage/buffered-file.d.ts.map +1 -1
  163. package/dist/storage/buffered-file.js +12 -12
  164. package/dist/storage/s3-driver.d.ts.map +1 -1
  165. package/dist/storage/s3-driver.js +1 -1
  166. package/dist/storage/uploaded-file.d.ts +2 -2
  167. package/dist/storage/uploaded-file.d.ts.map +1 -1
  168. package/dist/storage/uploaded-file.js +8 -8
  169. package/dist/stream/sse.js +11 -11
  170. package/dist/stream/ws-core.d.ts +1 -1
  171. package/dist/stream/ws-core.d.ts.map +1 -1
  172. package/dist/stream/ws-delivery.d.ts +1 -1
  173. package/dist/stream/ws-delivery.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.js +6 -4
  175. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  176. package/dist/stream/ws-local-connection-store.js +4 -2
  177. package/dist/stream/ws-presence-store.js +1 -1
  178. package/dist/stream/ws-registry.d.ts +4 -4
  179. package/dist/stream/ws-registry.d.ts.map +1 -1
  180. package/dist/stream/ws-registry.js +4 -2
  181. package/dist/stream/ws-telemetry.d.ts +16 -12
  182. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  183. package/dist/stream/ws-telemetry.js +22 -18
  184. package/dist/stream/ws.d.ts +18 -12
  185. package/dist/stream/ws.d.ts.map +1 -1
  186. package/dist/stream/ws.js +26 -22
  187. package/dist/syncer/api-parser.js +1 -1
  188. package/dist/syncer/checksum.d.ts.map +1 -1
  189. package/dist/syncer/checksum.js +7 -8
  190. package/dist/syncer/code-generator.d.ts.map +1 -1
  191. package/dist/syncer/code-generator.js +13 -14
  192. package/dist/syncer/entity-operations.d.ts.map +1 -1
  193. package/dist/syncer/entity-operations.js +5 -6
  194. package/dist/syncer/file-copy.d.ts +5 -0
  195. package/dist/syncer/file-copy.d.ts.map +1 -0
  196. package/dist/syncer/file-copy.js +36 -0
  197. package/dist/syncer/file-patterns.d.ts +1 -0
  198. package/dist/syncer/file-patterns.d.ts.map +1 -1
  199. package/dist/syncer/file-patterns.js +5 -2
  200. package/dist/syncer/file-tracking.d.ts.map +1 -1
  201. package/dist/syncer/file-tracking.js +5 -4
  202. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  203. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  204. package/dist/syncer/filesystem-dependencies.js +53 -0
  205. package/dist/syncer/module-loader.d.ts +1 -1
  206. package/dist/syncer/module-loader.d.ts.map +1 -1
  207. package/dist/syncer/module-loader.js +6 -4
  208. package/dist/syncer/syncer-actions.d.ts +4 -0
  209. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  210. package/dist/syncer/syncer-actions.js +34 -17
  211. package/dist/syncer/syncer.d.ts +17 -6
  212. package/dist/syncer/syncer.d.ts.map +1 -1
  213. package/dist/syncer/syncer.js +71 -29
  214. package/dist/syncer/watcher.d.ts.map +1 -1
  215. package/dist/syncer/watcher.js +3 -3
  216. package/dist/tasks/decorator.d.ts +6 -6
  217. package/dist/tasks/decorator.d.ts.map +1 -1
  218. package/dist/tasks/decorator.js +4 -4
  219. package/dist/tasks/step-wrapper.d.ts +6 -4
  220. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  221. package/dist/tasks/step-wrapper.js +5 -5
  222. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  223. package/dist/tasks/workflow-manager.js +13 -7
  224. package/dist/template/entity-converter.d.ts +1 -1
  225. package/dist/template/entity-converter.d.ts.map +1 -1
  226. package/dist/template/entity-converter.js +2 -2
  227. package/dist/template/helpers.d.ts +8 -6
  228. package/dist/template/helpers.d.ts.map +1 -1
  229. package/dist/template/helpers.js +1 -1
  230. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  231. package/dist/template/implementations/generated.template.js +4 -4
  232. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  233. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  234. package/dist/template/implementations/generated_http.template.js +21 -21
  235. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_sso.template.js +6 -3
  237. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  238. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  239. package/dist/template/implementations/http_validators.template.js +127 -0
  240. package/dist/template/implementations/model.template.d.ts.map +1 -1
  241. package/dist/template/implementations/model.template.js +1 -1
  242. package/dist/template/implementations/queries.template.js +1 -1
  243. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  244. package/dist/template/implementations/sd.template.js +79 -39
  245. package/dist/template/implementations/services.template.d.ts.map +1 -1
  246. package/dist/template/implementations/services.template.js +6 -4
  247. package/dist/template/implementations/view_form.template.d.ts +6 -1
  248. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  249. package/dist/template/implementations/view_form.template.js +23 -15
  250. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_list.template.js +11 -6
  252. package/dist/template/template-manager.d.ts.map +1 -1
  253. package/dist/template/template-manager.js +9 -7
  254. package/dist/template/template-types.d.ts +12 -5
  255. package/dist/template/template-types.d.ts.map +1 -1
  256. package/dist/template/template-types.js +1 -1
  257. package/dist/template/template.d.ts +2 -2
  258. package/dist/template/template.d.ts.map +1 -1
  259. package/dist/template/template.js +6 -4
  260. package/dist/template/zod-converter.d.ts +0 -19
  261. package/dist/template/zod-converter.d.ts.map +1 -1
  262. package/dist/template/zod-converter.js +100 -84
  263. package/dist/testing/_relation-graph.d.ts.map +1 -1
  264. package/dist/testing/_relation-graph.js +2 -1
  265. package/dist/testing/bootstrap.d.ts.map +1 -1
  266. package/dist/testing/bootstrap.js +9 -6
  267. package/dist/testing/data-explorer.d.ts +32 -7
  268. package/dist/testing/data-explorer.d.ts.map +1 -1
  269. package/dist/testing/data-explorer.js +77 -31
  270. package/dist/testing/dev-test-routes.d.ts +8 -1
  271. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  272. package/dist/testing/dev-test-routes.js +125 -108
  273. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  274. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  275. package/dist/testing/dev-vitest-manager.js +24 -9
  276. package/dist/testing/faker-mappings.d.ts +412 -1
  277. package/dist/testing/faker-mappings.d.ts.map +1 -1
  278. package/dist/testing/faker-mappings.js +1 -1
  279. package/dist/testing/filesystem.d.ts +2 -0
  280. package/dist/testing/filesystem.d.ts.map +1 -0
  281. package/dist/testing/filesystem.js +7 -0
  282. package/dist/testing/fixture-generator.d.ts +25 -8
  283. package/dist/testing/fixture-generator.d.ts.map +1 -1
  284. package/dist/testing/fixture-generator.js +132 -73
  285. package/dist/testing/fixture-loader.d.ts +3 -1
  286. package/dist/testing/fixture-loader.d.ts.map +1 -1
  287. package/dist/testing/fixture-loader.js +1 -20
  288. package/dist/testing/fixture-manager.d.ts +8 -7
  289. package/dist/testing/fixture-manager.d.ts.map +1 -1
  290. package/dist/testing/fixture-manager.js +91 -59
  291. package/dist/testing/global-setup.d.ts.map +1 -1
  292. package/dist/testing/global-setup.js +5 -2
  293. package/dist/testing/index.d.ts +2 -0
  294. package/dist/testing/index.d.ts.map +1 -1
  295. package/dist/testing/index.js +6 -3
  296. package/dist/types/types.d.ts +101 -99
  297. package/dist/types/types.d.ts.map +1 -1
  298. package/dist/types/types.js +234 -225
  299. package/dist/ui/ai-api.d.ts.map +1 -1
  300. package/dist/ui/ai-api.js +1 -1
  301. package/dist/ui/ai-client.d.ts.map +1 -1
  302. package/dist/ui/ai-client.js +28 -18
  303. package/dist/ui/api.d.ts.map +1 -1
  304. package/dist/ui/api.js +135 -128
  305. package/dist/ui/async-route.d.ts +3 -0
  306. package/dist/ui/async-route.d.ts.map +1 -0
  307. package/dist/ui/async-route.js +12 -0
  308. package/dist/ui/cdd-service.d.ts +9 -7
  309. package/dist/ui/cdd-service.d.ts.map +1 -1
  310. package/dist/ui/cdd-service.js +7 -5
  311. package/dist/ui/migrations-api.d.ts.map +1 -1
  312. package/dist/ui/migrations-api.js +17 -15
  313. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  314. package/dist/ui-web/index.html +1 -1
  315. package/dist/utils/formatter.d.ts.map +1 -1
  316. package/dist/utils/formatter.js +7 -5
  317. package/dist/utils/fs-utils.d.ts +3 -3
  318. package/dist/utils/fs-utils.d.ts.map +1 -1
  319. package/dist/utils/fs-utils.js +6 -6
  320. package/dist/utils/model.d.ts +3 -5
  321. package/dist/utils/model.d.ts.map +1 -1
  322. package/dist/utils/model.js +1 -1
  323. package/dist/utils/object-utils.d.ts +1 -1
  324. package/dist/utils/object-utils.d.ts.map +1 -1
  325. package/dist/utils/object-utils.js +17 -16
  326. package/dist/utils/process-utils.d.ts.map +1 -1
  327. package/dist/utils/process-utils.js +4 -2
  328. package/dist/utils/runtime-value.d.ts +13 -0
  329. package/dist/utils/runtime-value.d.ts.map +1 -0
  330. package/dist/utils/runtime-value.js +40 -0
  331. package/dist/utils/sql-parser.d.ts +8 -1
  332. package/dist/utils/sql-parser.d.ts.map +1 -1
  333. package/dist/utils/sql-parser.js +6 -3
  334. package/dist/utils/type-utils.d.ts.map +1 -1
  335. package/dist/utils/type-utils.js +10 -8
  336. package/dist/utils/utils.d.ts +2 -2
  337. package/dist/utils/utils.d.ts.map +1 -1
  338. package/dist/utils/utils.js +11 -8
  339. package/dist/utils/zod-error.d.ts.map +1 -1
  340. package/dist/utils/zod-error.js +7 -4
  341. package/dist/vector/chunking.d.ts.map +1 -1
  342. package/dist/vector/chunking.js +1 -1
  343. package/dist/vector/embedding.d.ts.map +1 -1
  344. package/dist/vector/embedding.js +1 -1
  345. package/dist/vector/types.d.ts +3 -2
  346. package/dist/vector/types.d.ts.map +1 -1
  347. package/package.json +5 -3
  348. package/src/ai/agents/agent.ts +5 -5
  349. package/src/ai/agents/types.ts +1 -1
  350. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  351. package/src/ai/providers/rtzr/error.ts +5 -3
  352. package/src/ai/providers/rtzr/model.ts +3 -2
  353. package/src/ai/providers/rtzr/options.ts +10 -5
  354. package/src/ai/providers/rtzr/provider.ts +10 -10
  355. package/src/ai/providers/rtzr/utils.ts +3 -1
  356. package/src/api/__tests__/config.test.ts +11 -21
  357. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  358. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  359. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  360. package/src/api/caster.ts +6 -8
  361. package/src/api/code-converters.ts +136 -36
  362. package/src/api/config.ts +62 -4
  363. package/src/api/context.ts +3 -3
  364. package/src/api/decorators.ts +28 -17
  365. package/src/api/http-validator.ts +149 -0
  366. package/src/api/sonamu.ts +459 -152
  367. package/src/api/websocket-helpers.ts +24 -17
  368. package/src/auth/audit-log/builders.ts +3 -2
  369. package/src/auth/audit-log/client-ip.ts +4 -2
  370. package/src/auth/audit-log/events.ts +15 -1
  371. package/src/auth/audit-log/plugin.ts +129 -200
  372. package/src/auth/audit-log-ingestor.ts +19 -15
  373. package/src/auth/auth-generator.ts +10 -5
  374. package/src/auth/better-auth-request.ts +4 -3
  375. package/src/auth/knex-adapter.ts +8 -2
  376. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  377. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  378. package/src/bin/__tests__/test-command.test.ts +9 -15
  379. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  380. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  381. package/src/bin/build-config.ts +167 -0
  382. package/src/bin/cli.ts +153 -36
  383. package/src/bin/compiler-policy.ts +35 -0
  384. package/src/bin/fixture.ts +14 -3
  385. package/src/bin/test-command.ts +74 -29
  386. package/src/bin/ts-loader-registration.ts +22 -4
  387. package/src/cache/decorator.ts +10 -3
  388. package/src/compress/compress.ts +17 -4
  389. package/src/cone/cone-generator.ts +34 -6
  390. package/src/database/__tests__/db.test.ts +1 -0
  391. package/src/database/__tests__/puri.test.ts +16 -15
  392. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  393. package/src/database/_batch_update.ts +1 -0
  394. package/src/database/base-model.ts +81 -50
  395. package/src/database/base-model.types.ts +6 -6
  396. package/src/database/db.ts +29 -19
  397. package/src/database/knex.ts +30 -17
  398. package/src/database/puri-subset.test-d.ts +17 -0
  399. package/src/database/puri.ts +181 -143
  400. package/src/database/puri.types.test-d.ts +31 -1
  401. package/src/database/puri.types.ts +23 -21
  402. package/src/database/upsert-builder.ts +75 -53
  403. package/src/dict/sd.ts +15 -5
  404. package/src/dict/sonamu-dictionary.ts +6 -6
  405. package/src/dict/utils.ts +9 -1
  406. package/src/entity/entity-manager.ts +26 -9
  407. package/src/entity/entity-template-cone.ts +5 -10
  408. package/src/entity/entity.ts +50 -34
  409. package/src/env.ts +7 -3
  410. package/src/exceptions/error-handler.ts +17 -2
  411. package/src/exceptions/so-exceptions.ts +26 -20
  412. package/src/filter/utils.ts +21 -11
  413. package/src/index.ts +3 -0
  414. package/src/logger/configure.ts +26 -18
  415. package/src/migration/__tests__/migrator.test.ts +50 -57
  416. package/src/migration/code-generation.ts +132 -104
  417. package/src/migration/index-where-predicate.ts +51 -24
  418. package/src/migration/migration-set.ts +11 -5
  419. package/src/migration/migrator.ts +68 -41
  420. package/src/migration/postgresql-schema-reader.ts +52 -47
  421. package/src/migration/slack-confirm.ts +17 -15
  422. package/src/naite/naite-reporter.ts +1 -1
  423. package/src/naite/naite.ts +97 -24
  424. package/src/runtime-type.ts +34 -0
  425. package/src/ssr/hmr-opt-out.ts +78 -0
  426. package/src/ssr/renderer.ts +6 -0
  427. package/src/storage/base-file.ts +13 -13
  428. package/src/storage/buffered-file.ts +11 -11
  429. package/src/storage/s3-driver.ts +4 -1
  430. package/src/storage/uploaded-file.ts +8 -8
  431. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  432. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  433. package/src/stream/__tests__/ws.test.ts +30 -6
  434. package/src/stream/sse.ts +12 -11
  435. package/src/stream/ws-core.ts +1 -1
  436. package/src/stream/ws-delivery.ts +16 -7
  437. package/src/stream/ws-local-connection-store.ts +2 -3
  438. package/src/stream/ws-presence-store.ts +6 -1
  439. package/src/stream/ws-registry.ts +16 -7
  440. package/src/stream/ws-telemetry.ts +66 -43
  441. package/src/stream/ws.ts +73 -39
  442. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  443. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  444. package/src/syncer/api-parser.ts +67 -27
  445. package/src/syncer/checksum.ts +17 -11
  446. package/src/syncer/code-generator.ts +25 -17
  447. package/src/syncer/entity-operations.ts +3 -5
  448. package/src/syncer/file-copy.ts +46 -0
  449. package/src/syncer/file-patterns.ts +11 -8
  450. package/src/syncer/file-tracking.ts +3 -4
  451. package/src/syncer/filesystem-dependencies.ts +73 -0
  452. package/src/syncer/module-loader.ts +8 -4
  453. package/src/syncer/syncer-actions.ts +56 -18
  454. package/src/syncer/syncer.ts +116 -43
  455. package/src/syncer/watcher.ts +8 -4
  456. package/src/tasks/decorator.ts +20 -12
  457. package/src/tasks/step-wrapper.ts +19 -9
  458. package/src/tasks/workflow-manager.ts +15 -9
  459. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  460. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  461. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  462. package/src/template/entity-converter.ts +5 -2
  463. package/src/template/helpers.ts +8 -9
  464. package/src/template/implementations/generated.template.ts +5 -4
  465. package/src/template/implementations/generated_http.template.ts +61 -15
  466. package/src/template/implementations/generated_sso.template.ts +15 -4
  467. package/src/template/implementations/http_validators.template.ts +175 -0
  468. package/src/template/implementations/model.template.ts +3 -1
  469. package/src/template/implementations/sd.template.ts +81 -41
  470. package/src/template/implementations/services.template.ts +2 -2
  471. package/src/template/implementations/view_form.template.ts +56 -39
  472. package/src/template/implementations/view_list.template.ts +31 -23
  473. package/src/template/template-manager.ts +15 -13
  474. package/src/template/template-types.ts +13 -5
  475. package/src/template/template.ts +4 -3
  476. package/src/template/zod-converter.ts +206 -91
  477. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  478. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  479. package/src/testing/_relation-graph.ts +4 -1
  480. package/src/testing/bootstrap.ts +12 -5
  481. package/src/testing/data-explorer.ts +102 -53
  482. package/src/testing/dev-test-routes.ts +87 -50
  483. package/src/testing/dev-vitest-manager.ts +88 -32
  484. package/src/testing/faker-mappings.ts +2 -2
  485. package/src/testing/filesystem.ts +1 -0
  486. package/src/testing/fixture-generator.ts +191 -131
  487. package/src/testing/fixture-loader.ts +5 -1
  488. package/src/testing/fixture-manager.ts +129 -90
  489. package/src/testing/global-setup.ts +7 -3
  490. package/src/testing/index.ts +5 -0
  491. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  492. package/src/types/types.ts +184 -158
  493. package/src/ui/ai-api.ts +9 -7
  494. package/src/ui/ai-client.ts +61 -56
  495. package/src/ui/api.ts +727 -616
  496. package/src/ui/async-route.ts +4 -0
  497. package/src/ui/cdd-service.ts +35 -12
  498. package/src/ui/migrations-api.ts +63 -51
  499. package/src/utils/formatter.ts +7 -3
  500. package/src/utils/fs-utils.ts +5 -5
  501. package/src/utils/model.ts +4 -5
  502. package/src/utils/object-utils.ts +32 -22
  503. package/src/utils/process-utils.ts +4 -1
  504. package/src/utils/runtime-value.ts +43 -0
  505. package/src/utils/sql-parser.ts +13 -6
  506. package/src/utils/type-utils.ts +9 -7
  507. package/src/utils/utils.ts +19 -21
  508. package/src/utils/zod-error.ts +4 -2
  509. package/src/vector/chunking.ts +6 -1
  510. package/src/vector/embedding.ts +2 -1
  511. package/src/vector/types.ts +4 -2
  512. package/tsdown.api.config.ts +5 -2
  513. package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
@@ -2,7 +2,7 @@ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { createSSEFactory, init_sse } from "../stream/sse.js";
3
3
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
4
  import { DevVitestManager, init_dev_vitest_manager } from "./dev-vitest-manager.js";
5
- import { z as z$1 } from "zod";
5
+ import { z } from "zod";
6
6
  import { randomUUID } from "crypto";
7
7
  //#region src/testing/dev-test-routes.ts
8
8
  function toPathPrefix(basePath) {
@@ -24,11 +24,6 @@ function relativizeNode(node, basePath) {
24
24
  children: node.children.map((c) => relativizeNode(c, prefix))
25
25
  };
26
26
  }
27
- function isRunNodeProgressData(data) {
28
- if (typeof data !== "object" || data === null) return false;
29
- const d = data;
30
- return d.schemaVersion === 1 && typeof d.runId === "string" && typeof d.startedAt === "string" && typeof d.at === "string" && (d.kind === "file" || d.kind === "suite" || d.kind === "test") && (d.phase === "ready" || d.phase === "result") && typeof d.fileId === "string" && typeof d.nodeId === "string" && (d.parentId === null || typeof d.parentId === "string") && typeof d.node === "object" && d.node !== null;
31
- }
32
27
  function relativizeResult(result, basePath) {
33
28
  const prefix = toPathPrefix(basePath);
34
29
  return {
@@ -36,19 +31,24 @@ function relativizeResult(result, basePath) {
36
31
  results: result.results.map((n) => relativizeNode(n, prefix))
37
32
  };
38
33
  }
39
- async function registerDevTestRoutes(server, config) {
34
+ async function registerDevTestRoutes(server, config, dependencies) {
40
35
  const prefix = config.routePrefix ?? "/__test__";
41
- const manager = new DevVitestManager();
36
+ const defaultManager = dependencies?.manager === void 0 ? new DevVitestManager() : null;
37
+ const manager = dependencies?.manager ?? defaultManager;
38
+ if (manager === null) throw new Error("DevVitestManager dependency is unavailable");
42
39
  await manager.start(config.vitestConfigPath);
43
- Sonamu.devVitestManager = manager;
44
- const sseAvailable = !!Sonamu.config.server.plugins?.sse;
40
+ if (defaultManager !== null) Sonamu.devVitestManager = defaultManager;
41
+ const sseAvailable = dependencies?.sseAvailable ?? !!Sonamu.config.server.plugins?.sse;
45
42
  if (sseAvailable) server.get(`${prefix}/events`, (request, reply) => {
46
43
  const sse = createSSEFactory(request.socket, reply, TestEventSchema);
47
44
  const status = manager.getStatus();
48
45
  sse.publish("snapshot", {
49
46
  schemaVersion: SCHEMA_VERSION,
50
47
  serverTime: (/* @__PURE__ */ new Date()).toISOString(),
51
- status
48
+ status: {
49
+ ...status,
50
+ sseAvailable
51
+ }
52
52
  });
53
53
  const heartbeatTimer = setInterval(() => {
54
54
  sse.publish("heartbeat", {
@@ -56,19 +56,26 @@ async function registerDevTestRoutes(server, config) {
56
56
  at: (/* @__PURE__ */ new Date()).toISOString()
57
57
  });
58
58
  }, HEARTBEAT_INTERVAL_MS);
59
- const basePath = Sonamu.apiRootPath;
59
+ const basePath = dependencies?.apiRootPath ?? Sonamu.apiRootPath;
60
60
  const listener = (event, data) => {
61
- const key = event;
61
+ const parsedKey = TestEventNameSchema.safeParse(event);
62
+ if (!parsedKey.success) return;
63
+ const key = parsedKey.data;
62
64
  if (key === "runNodeProgress") {
63
- if (!isRunNodeProgressData(data)) return;
65
+ const progressEnvelope = TestEventSchema.partial().safeParse({ runNodeProgress: data });
66
+ if (!progressEnvelope.success || progressEnvelope.data.runNodeProgress === void 0) return;
67
+ const progress = progressEnvelope.data.runNodeProgress;
64
68
  const relativized = {
65
- ...data,
66
- node: relativizeNode(data.node, basePath)
69
+ ...progress,
70
+ node: relativizeNode(progress.node, basePath)
67
71
  };
68
72
  sse.publish(key, relativized);
69
73
  return;
70
74
  }
71
- sse.publish(key, data);
75
+ const parsedEnvelope = TestEventSchema.partial().safeParse({ [key]: data });
76
+ if (!parsedEnvelope.success || parsedEnvelope.data[key] === void 0) return;
77
+ const parsedData = parsedEnvelope.data[key];
78
+ sse.publish(key, parsedData);
72
79
  };
73
80
  manager.addEventListener(listener);
74
81
  let cleaned = false;
@@ -82,19 +89,8 @@ async function registerDevTestRoutes(server, config) {
82
89
  request.socket.on("error", cleanup);
83
90
  });
84
91
  server.post(`${prefix}/run`, async (request, reply) => {
85
- if (!Sonamu.devVitestManager) {
86
- reply.status(503);
87
- return {
88
- ok: false,
89
- error: "DevVitestManager is not initialized"
90
- };
91
- }
92
92
  const runId = randomUUID();
93
- const body = request.body;
94
- const runRequest = {
95
- files: body?.files,
96
- pattern: body?.pattern
97
- };
93
+ const runRequest = RunRequestSchema.parse(request.body ?? {});
98
94
  manager.emitEvent("runQueued", {
99
95
  schemaVersion: SCHEMA_VERSION,
100
96
  runId,
@@ -108,7 +104,7 @@ async function registerDevTestRoutes(server, config) {
108
104
  runId,
109
105
  startedAt
110
106
  });
111
- const result = relativizeResult(await Sonamu.devVitestManager.run(runRequest, runId), Sonamu.apiRootPath);
107
+ const result = relativizeResult(await manager.run(runRequest, runId), dependencies?.apiRootPath ?? Sonamu.apiRootPath);
112
108
  const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
113
109
  manager.emitEvent("runCompleted", {
114
110
  schemaVersion: SCHEMA_VERSION,
@@ -138,20 +134,16 @@ async function registerDevTestRoutes(server, config) {
138
134
  });
139
135
  server.get(`${prefix}/status`, async () => {
140
136
  return {
141
- ...Sonamu.devVitestManager?.getStatus() ?? {
142
- ready: false,
143
- running: false,
144
- lastRunAt: null
145
- },
137
+ ...manager.getStatus(),
146
138
  sseAvailable
147
139
  };
148
140
  });
149
141
  server.addHook("onClose", async () => {
150
- await Sonamu.devVitestManager?.shutdown();
151
- Sonamu.devVitestManager = null;
142
+ await manager.shutdown();
143
+ if (defaultManager !== null) Sonamu.devVitestManager = null;
152
144
  });
153
145
  }
154
- var SCHEMA_VERSION, HEARTBEAT_INTERVAL_MS, SerializedTraceSchema, TestCaseResultSchema, TestEventSchema;
146
+ var SCHEMA_VERSION, HEARTBEAT_INTERVAL_MS, SerializedTraceSchema, TestCaseResultSchema, RunResultSchema, RunRequestSchema, TestEventSchema, TestEventNameSchema;
155
147
  //#endregion
156
148
  __esmMin((() => {
157
149
  init_sonamu();
@@ -159,24 +151,24 @@ __esmMin((() => {
159
151
  init_dev_vitest_manager();
160
152
  SCHEMA_VERSION = 1;
161
153
  HEARTBEAT_INTERVAL_MS = 3e4;
162
- SerializedTraceSchema = z$1.object({
163
- key: z$1.string(),
164
- value: z$1.unknown(),
165
- filePath: z$1.string(),
166
- lineNumber: z$1.number(),
167
- at: z$1.string()
154
+ SerializedTraceSchema = z.object({
155
+ key: z.string(),
156
+ value: z.unknown(),
157
+ filePath: z.string(),
158
+ lineNumber: z.number(),
159
+ at: z.string()
168
160
  });
169
- TestCaseResultSchema = z$1.lazy(() => z$1.object({
170
- id: z$1.string(),
171
- kind: z$1.enum([
161
+ TestCaseResultSchema = z.lazy(() => z.object({
162
+ id: z.string(),
163
+ kind: z.enum([
172
164
  "file",
173
165
  "suite",
174
166
  "test"
175
167
  ]),
176
- name: z$1.string(),
177
- fullName: z$1.string(),
178
- file: z$1.string(),
179
- state: z$1.enum([
168
+ name: z.string(),
169
+ fullName: z.string(),
170
+ file: z.string(),
171
+ state: z.enum([
180
172
  "passed",
181
173
  "failed",
182
174
  "skipped",
@@ -184,82 +176,107 @@ __esmMin((() => {
184
176
  "running",
185
177
  "unknown"
186
178
  ]),
187
- durationMs: z$1.number().nullable(),
188
- counts: z$1.object({
189
- total: z$1.number(),
190
- passed: z$1.number(),
191
- failed: z$1.number(),
192
- skipped: z$1.number()
179
+ durationMs: z.number().nullable(),
180
+ counts: z.object({
181
+ total: z.number(),
182
+ passed: z.number(),
183
+ failed: z.number(),
184
+ skipped: z.number()
193
185
  }),
194
- error: z$1.object({
195
- message: z$1.string(),
196
- stack: z$1.string().optional()
186
+ error: z.object({
187
+ message: z.string(),
188
+ stack: z.string().optional()
197
189
  }).nullable(),
198
- traces: z$1.array(SerializedTraceSchema),
199
- children: z$1.array(TestCaseResultSchema)
190
+ traces: z.array(SerializedTraceSchema),
191
+ children: z.array(TestCaseResultSchema)
200
192
  }));
201
- TestEventSchema = z$1.object({
202
- snapshot: z$1.object({
203
- schemaVersion: z$1.number(),
204
- serverTime: z$1.string(),
205
- status: z$1.object({
206
- ready: z$1.boolean(),
207
- running: z$1.boolean(),
208
- lastRunAt: z$1.string().nullable()
193
+ RunResultSchema = z.object({
194
+ ok: z.boolean(),
195
+ summary: z.object({
196
+ total: z.number(),
197
+ passed: z.number(),
198
+ failed: z.number(),
199
+ skipped: z.number(),
200
+ durationMs: z.number()
201
+ }),
202
+ results: z.array(TestCaseResultSchema)
203
+ });
204
+ RunRequestSchema = z.object({
205
+ files: z.array(z.string()).optional(),
206
+ pattern: z.string().optional()
207
+ });
208
+ TestEventSchema = z.object({
209
+ snapshot: z.object({
210
+ schemaVersion: z.number(),
211
+ serverTime: z.string(),
212
+ status: z.object({
213
+ ready: z.boolean(),
214
+ running: z.boolean(),
215
+ lastRunAt: z.string().nullable(),
216
+ sseAvailable: z.boolean()
209
217
  })
210
218
  }),
211
- runQueued: z$1.object({
212
- schemaVersion: z$1.number(),
213
- runId: z$1.string(),
214
- queuedAt: z$1.string(),
215
- request: z$1.object({
216
- files: z$1.array(z$1.string()).optional(),
217
- pattern: z$1.string().optional()
219
+ runQueued: z.object({
220
+ schemaVersion: z.number(),
221
+ runId: z.string(),
222
+ queuedAt: z.string(),
223
+ request: z.object({
224
+ files: z.array(z.string()).optional(),
225
+ pattern: z.string().optional()
218
226
  })
219
227
  }),
220
- runStarted: z$1.object({
221
- schemaVersion: z$1.number(),
222
- runId: z$1.string(),
223
- startedAt: z$1.string()
228
+ runStarted: z.object({
229
+ schemaVersion: z.number(),
230
+ runId: z.string(),
231
+ startedAt: z.string()
224
232
  }),
225
- runCompleted: z$1.object({
226
- schemaVersion: z$1.number(),
227
- runId: z$1.string(),
228
- startedAt: z$1.string(),
229
- finishedAt: z$1.string(),
230
- result: z$1.record(z$1.string(), z$1.unknown())
233
+ runCompleted: z.object({
234
+ schemaVersion: z.number(),
235
+ runId: z.string(),
236
+ startedAt: z.string(),
237
+ finishedAt: z.string(),
238
+ result: RunResultSchema
231
239
  }),
232
- runErrored: z$1.object({
233
- schemaVersion: z$1.number(),
234
- runId: z$1.string(),
235
- finishedAt: z$1.string(),
236
- error: z$1.object({
237
- message: z$1.string(),
238
- stack: z$1.string().optional()
240
+ runErrored: z.object({
241
+ schemaVersion: z.number(),
242
+ runId: z.string(),
243
+ finishedAt: z.string(),
244
+ error: z.object({
245
+ message: z.string(),
246
+ stack: z.string().optional()
239
247
  })
240
248
  }),
241
- runNodeProgress: z$1.object({
242
- schemaVersion: z$1.literal(1),
243
- runId: z$1.string(),
244
- startedAt: z$1.string(),
245
- at: z$1.string(),
246
- kind: z$1.enum([
249
+ runNodeProgress: z.object({
250
+ schemaVersion: z.literal(1),
251
+ runId: z.string(),
252
+ startedAt: z.string(),
253
+ at: z.string(),
254
+ kind: z.enum([
247
255
  "file",
248
256
  "suite",
249
257
  "test"
250
258
  ]),
251
- phase: z$1.enum(["ready", "result"]),
252
- fileId: z$1.string(),
253
- nodeId: z$1.string(),
254
- parentId: z$1.string().nullable(),
259
+ phase: z.enum(["ready", "result"]),
260
+ fileId: z.string(),
261
+ nodeId: z.string(),
262
+ parentId: z.string().nullable(),
255
263
  node: TestCaseResultSchema
256
264
  }),
257
- heartbeat: z$1.object({
258
- schemaVersion: z$1.number(),
259
- at: z$1.string()
265
+ heartbeat: z.object({
266
+ schemaVersion: z.number(),
267
+ at: z.string()
260
268
  })
261
269
  });
270
+ TestEventNameSchema = z.enum([
271
+ "snapshot",
272
+ "runQueued",
273
+ "runStarted",
274
+ "runCompleted",
275
+ "runErrored",
276
+ "runNodeProgress",
277
+ "heartbeat"
278
+ ]);
262
279
  }))();
263
280
  export { registerDevTestRoutes };
264
281
 
265
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXRlc3Qtcm91dGVzLmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlJbnN0YW5jZSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdURldlJ1bm5lckNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBTZXJpYWxpemVkVHJhY2UgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHsgdHlwZSBTU0VDb25uZWN0aW9uIH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IHR5cGUgTWFuYWdlclN0YXR1cywgdHlwZSBSdW5SZXN1bHQsIHR5cGUgVGVzdENhc2VSZXN1bHQgfSBmcm9tIFwiLi9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcbmltcG9ydCB7IERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcblxuY29uc3QgU0NIRU1BX1ZFUlNJT04gPSAxO1xuY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX01TID0gMzBfMDAwO1xuXG5jb25zdCBTZXJpYWxpemVkVHJhY2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgdmFsdWU6IHoudW5rbm93bigpLFxuICBmaWxlUGF0aDogei5zdHJpbmcoKSxcbiAgbGluZU51bWJlcjogei5udW1iZXIoKSxcbiAgYXQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgVGVzdENhc2VSZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxUZXN0Q2FzZVJlc3VsdD4gPSB6LmxhenkoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIGtpbmQ6IHouZW51bShbXCJmaWxlXCIsIFwic3VpdGVcIiwgXCJ0ZXN0XCJdKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGZ1bGxOYW1lOiB6LnN0cmluZygpLFxuICAgIGZpbGU6IHouc3RyaW5nKCksXG4gICAgc3RhdGU6IHouZW51bShbXCJwYXNzZWRcIiwgXCJmYWlsZWRcIiwgXCJza2lwcGVkXCIsIFwidG9kb1wiLCBcInJ1bm5pbmdcIiwgXCJ1bmtub3duXCJdKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgY291bnRzOiB6Lm9iamVjdCh7XG4gICAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICAgIGZhaWxlZDogei5udW1iZXIoKSxcbiAgICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgZXJyb3I6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5udWxsYWJsZSgpLFxuICAgIHRyYWNlczogei5hcnJheShTZXJpYWxpemVkVHJhY2VTY2hlbWEpLFxuICAgIGNoaWxkcmVuOiB6LmFycmF5KFRlc3RDYXNlUmVzdWx0U2NoZW1hKSxcbiAgfSksXG4pO1xuXG5jb25zdCBUZXN0RXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNuYXBzaG90OiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBzZXJ2ZXJUaW1lOiB6LnN0cmluZygpLFxuICAgIHN0YXR1czogei5vYmplY3Qoe1xuICAgICAgcmVhZHk6IHouYm9vbGVhbigpLFxuICAgICAgcnVubmluZzogei5ib29sZWFuKCksXG4gICAgICBsYXN0UnVuQXQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICB9KSxcbiAgfSksXG4gIHJ1blF1ZXVlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgcXVldWVkQXQ6IHouc3RyaW5nKCksXG4gICAgcmVxdWVzdDogei5vYmplY3Qoe1xuICAgICAgZmlsZXM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHBhdHRlcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgfSksXG4gIHJ1blN0YXJ0ZWQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIHN0YXJ0ZWRBdDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHJ1bkNvbXBsZXRlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgc3RhcnRlZEF0OiB6LnN0cmluZygpLFxuICAgIGZpbmlzaGVkQXQ6IHouc3RyaW5nKCksXG4gICAgcmVzdWx0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gIH0pLFxuICBydW5FcnJvcmVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBmaW5pc2hlZEF0OiB6LnN0cmluZygpLFxuICAgIGVycm9yOiB6Lm9iamVjdCh7XG4gICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgc3RhY2s6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgfSksXG4gIHJ1bk5vZGVQcm9ncmVzczogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubGl0ZXJhbCgxKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBzdGFydGVkQXQ6IHouc3RyaW5nKCksXG4gICAgYXQ6IHouc3RyaW5nKCksXG4gICAga2luZDogei5lbnVtKFtcImZpbGVcIiwgXCJzdWl0ZVwiLCBcInRlc3RcIl0pLFxuICAgIHBoYXNlOiB6LmVudW0oW1wicmVhZHlcIiwgXCJyZXN1bHRcIl0pLFxuICAgIGZpbGVJZDogei5zdHJpbmcoKSxcbiAgICBub2RlSWQ6IHouc3RyaW5nKCksXG4gICAgcGFyZW50SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICBub2RlOiBUZXN0Q2FzZVJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIGhlYXJ0YmVhdDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgYXQ6IHouc3RyaW5nKCksXG4gIH0pLFxufSk7XG5cbnR5cGUgVGVzdEV2ZW50cyA9IHouaW5mZXI8dHlwZW9mIFRlc3RFdmVudFNjaGVtYT47XG5cbmZ1bmN0aW9uIHRvUGF0aFByZWZpeChiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJhc2VQYXRoLmVuZHNXaXRoKFwiL1wiKSA/IGJhc2VQYXRoIDogYCR7YmFzZVBhdGh9L2A7XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZpemVUcmFjZSh0cmFjZTogU2VyaWFsaXplZFRyYWNlLCBwcmVmaXg6IHN0cmluZyk6IFNlcmlhbGl6ZWRUcmFjZSB7XG4gIHJldHVybiB7IC4uLnRyYWNlLCBmaWxlUGF0aDogdHJhY2UuZmlsZVBhdGgucmVwbGFjZShwcmVmaXgsIFwiXCIpIH07XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZpemVOb2RlKG5vZGU6IFRlc3RDYXNlUmVzdWx0LCBiYXNlUGF0aDogc3RyaW5nKTogVGVzdENhc2VSZXN1bHQge1xuICBjb25zdCBwcmVmaXggPSB0b1BhdGhQcmVmaXgoYmFzZVBhdGgpO1xuICByZXR1cm4ge1xuICAgIC4uLm5vZGUsXG4gICAgbmFtZTogbm9kZS5uYW1lLnJlcGxhY2UocHJlZml4LCBcIlwiKSxcbiAgICBmaWxlOiBub2RlLmZpbGUucmVwbGFjZShwcmVmaXgsIFwiXCIpLFxuICAgIHRyYWNlczogbm9kZS50cmFjZXMubWFwKCh0KSA9PiByZWxhdGl2aXplVHJhY2UodCwgcHJlZml4KSksXG4gICAgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4ubWFwKChjKSA9PiByZWxhdGl2aXplTm9kZShjLCBwcmVmaXgpKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNSdW5Ob2RlUHJvZ3Jlc3NEYXRhKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFRlc3RFdmVudHNbXCJydW5Ob2RlUHJvZ3Jlc3NcIl0ge1xuICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIChcbiAgICBkLnNjaGVtYVZlcnNpb24gPT09IDEgJiZcbiAgICB0eXBlb2YgZC5ydW5JZCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHR5cGVvZiBkLnN0YXJ0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHR5cGVvZiBkLmF0ID09PSBcInN0cmluZ1wiICYmXG4gICAgKGQua2luZCA9PT0gXCJmaWxlXCIgfHwgZC5raW5kID09PSBcInN1aXRlXCIgfHwgZC5raW5kID09PSBcInRlc3RcIikgJiZcbiAgICAoZC5waGFzZSA9PT0gXCJyZWFkeVwiIHx8IGQucGhhc2UgPT09IFwicmVzdWx0XCIpICYmXG4gICAgdHlwZW9mIGQuZmlsZUlkID09PSBcInN0cmluZ1wiICYmXG4gICAgdHlwZW9mIGQubm9kZUlkID09PSBcInN0cmluZ1wiICYmXG4gICAgKGQucGFyZW50SWQgPT09IG51bGwgfHwgdHlwZW9mIGQucGFyZW50SWQgPT09IFwic3RyaW5nXCIpICYmXG4gICAgdHlwZW9mIGQubm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIGQubm9kZSAhPT0gbnVsbFxuICApO1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplUmVzdWx0KHJlc3VsdDogUnVuUmVzdWx0LCBiYXNlUGF0aDogc3RyaW5nKTogUnVuUmVzdWx0IHtcbiAgY29uc3QgcHJlZml4ID0gdG9QYXRoUHJlZml4KGJhc2VQYXRoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgcmVzdWx0czogcmVzdWx0LnJlc3VsdHMubWFwKChuKSA9PiByZWxhdGl2aXplTm9kZShuLCBwcmVmaXgpKSxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhcbiAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gIGNvbmZpZzogU29uYW11RGV2UnVubmVyQ29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5yb3V0ZVByZWZpeCA/PyBcIi9fX3Rlc3RfX1wiO1xuXG4gIGNvbnN0IG1hbmFnZXIgPSBuZXcgRGV2Vml0ZXN0TWFuYWdlcigpO1xuICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KGNvbmZpZy52aXRlc3RDb25maWdQYXRoKTtcbiAgU29uYW11LmRldlZpdGVzdE1hbmFnZXIgPSBtYW5hZ2VyO1xuXG4gIGNvbnN0IHNzZUF2YWlsYWJsZSA9ICEhU29uYW11LmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8uc3NlO1xuXG4gIGlmIChzc2VBdmFpbGFibGUpIHtcbiAgICBzZXJ2ZXIuZ2V0KGAke3ByZWZpeH0vZXZlbnRzYCwgKHJlcXVlc3QsIHJlcGx5KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBzc2U6IFNTRUNvbm5lY3Rpb248dHlwZW9mIFRlc3RFdmVudFNjaGVtYT4gPSBjcmVhdGVTU0VGYWN0b3J5KFxuICAgICAgICByZXF1ZXN0LnNvY2tldCxcbiAgICAgICAgcmVwbHksXG4gICAgICAgIFRlc3RFdmVudFNjaGVtYSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0YXR1czogTWFuYWdlclN0YXR1cyA9IG1hbmFnZXIuZ2V0U3RhdHVzKCk7XG4gICAgICBzc2UucHVibGlzaChcInNuYXBzaG90XCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHNlcnZlclRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzc2UucHVibGlzaChcImhlYXJ0YmVhdFwiLCB7XG4gICAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgICAgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUxfTVMpO1xuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IFNvbmFtdS5hcGlSb290UGF0aDtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnQgYXMga2V5b2YgVGVzdEV2ZW50cztcbiAgICAgICAgaWYgKGtleSA9PT0gXCJydW5Ob2RlUHJvZ3Jlc3NcIikge1xuICAgICAgICAgIGlmICghaXNSdW5Ob2RlUHJvZ3Jlc3NEYXRhKGRhdGEpKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcmVsYXRpdml6ZWQgPSB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgbm9kZTogcmVsYXRpdml6ZU5vZGUoZGF0YS5ub2RlLCBiYXNlUGF0aCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzc2UucHVibGlzaChrZXksIHJlbGF0aXZpemVkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCBkYXRhIGFzIFRlc3RFdmVudHNbdHlwZW9mIGtleV0pO1xuICAgICAgfTtcbiAgICAgIG1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGxldCBjbGVhbmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgICAgICBjbGVhbmVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChoZWFydGJlYXRUaW1lcik7XG4gICAgICAgIG1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5zb2NrZXQub24oXCJjbG9zZVwiLCBjbGVhbnVwKTtcbiAgICAgIHJlcXVlc3Quc29ja2V0Lm9uKFwiZXJyb3JcIiwgY2xlYW51cCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXJ2ZXIucG9zdChgJHtwcmVmaXh9L3J1bmAsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgIGlmICghU29uYW11LmRldlZpdGVzdE1hbmFnZXIpIHtcbiAgICAgIHJlcGx5LnN0YXR1cyg1MDMpO1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogXCJEZXZWaXRlc3RNYW5hZ2VyIGlzIG5vdCBpbml0aWFsaXplZFwiIH07XG4gICAgfVxuXG4gICAgY29uc3QgcnVuSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keSBhcyB7IGZpbGVzPzogc3RyaW5nW107IHBhdHRlcm4/OiBzdHJpbmcgfSB8IG51bGw7XG4gICAgY29uc3QgcnVuUmVxdWVzdCA9IHtcbiAgICAgIGZpbGVzOiBib2R5Py5maWxlcyxcbiAgICAgIHBhdHRlcm46IGJvZHk/LnBhdHRlcm4sXG4gICAgfTtcblxuICAgIG1hbmFnZXIuZW1pdEV2ZW50KFwicnVuUXVldWVkXCIsIHtcbiAgICAgIHNjaGVtYVZlcnNpb246IFNDSEVNQV9WRVJTSU9OLFxuICAgICAgcnVuSWQsXG4gICAgICBxdWV1ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcmVxdWVzdDogcnVuUmVxdWVzdCxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1blN0YXJ0ZWRcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYXdSZXN1bHQ6IFJ1blJlc3VsdCA9IGF3YWl0IFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyLnJ1bihydW5SZXF1ZXN0LCBydW5JZCk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZWxhdGl2aXplUmVzdWx0KHJhd1Jlc3VsdCwgU29uYW11LmFwaVJvb3RQYXRoKTtcblxuICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIG1hbmFnZXIuZW1pdEV2ZW50KFwicnVuQ29tcGxldGVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgIHJlc3VsdCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIG1hbmFnZXIuZW1pdEV2ZW50KFwicnVuRXJyb3JlZFwiLCB7XG4gICAgICAgIHNjaGVtYVZlcnNpb246IFNDSEVNQV9WRVJTSU9OLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZmluaXNoZWRBdCxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgc3RhY2s6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH07XG4gICAgfVxuICB9KTtcblxuICBzZXJ2ZXIuZ2V0KGAke3ByZWZpeH0vc3RhdHVzYCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1czogTWFuYWdlclN0YXR1cyA9IFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyPy5nZXRTdGF0dXMoKSA/PyB7XG4gICAgICByZWFkeTogZmFsc2UsXG4gICAgICBydW5uaW5nOiBmYWxzZSxcbiAgICAgIGxhc3RSdW5BdDogbnVsbCxcbiAgICB9O1xuICAgIHJldHVybiB7IC4uLnN0YXR1cywgc3NlQXZhaWxhYmxlIH07XG4gIH0pO1xuXG4gIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgU29uYW11LmRldlZpdGVzdE1hbmFnZXI/LnNodXRkb3duKCk7XG4gICAgU29uYW11LmRldlZpdGVzdE1hbmFnZXIgPSBudWxsO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQThHQSxTQUFTLGFBQWEsVUFBMEI7Q0FDOUMsT0FBTyxTQUFTLFNBQVMsR0FBRyxJQUFJLFdBQVcsR0FBRyxTQUFTO0FBQ3pEO0FBRUEsU0FBUyxnQkFBZ0IsT0FBd0IsUUFBaUM7Q0FDaEYsT0FBTztFQUFFLEdBQUc7RUFBTyxVQUFVLE1BQU0sU0FBUyxRQUFRLFFBQVEsRUFBRTtDQUFFO0FBQ2xFO0FBRUEsU0FBUyxlQUFl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
282
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXRlc3Qtcm91dGVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlJbnN0YW5jZSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdURldlJ1bm5lckNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBTZXJpYWxpemVkVHJhY2UgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHsgdHlwZSBTU0VDb25uZWN0aW9uIH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlclN0YXR1cyxcbiAgdHlwZSBSdW5SZXN1bHQsXG4gIHR5cGUgVGVzdENhc2VSZXN1bHQsXG4gIHR5cGUgVGVzdEV2ZW50UGF5bG9hZCxcbn0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5cbmNvbnN0IFNDSEVNQV9WRVJTSU9OID0gMTtcbmNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDMwXzAwMDtcblxuZXhwb3J0IHR5cGUgRGV2VGVzdFJvdXRlTWFuYWdlciA9IFBpY2s8XG4gIERldlZpdGVzdE1hbmFnZXIsXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJydW5cIlxuICB8IFwiZ2V0U3RhdHVzXCJcbiAgfCBcImVtaXRFdmVudFwiXG4gIHwgXCJhZGRFdmVudExpc3RlbmVyXCJcbiAgfCBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIlxuICB8IFwic2h1dGRvd25cIlxuPjtcblxuZXhwb3J0IHR5cGUgRGV2VGVzdFJvdXRlRGVwZW5kZW5jaWVzID0ge1xuICBtYW5hZ2VyPzogRGV2VGVzdFJvdXRlTWFuYWdlcjtcbiAgYXBpUm9vdFBhdGg/OiBzdHJpbmc7XG4gIHNzZUF2YWlsYWJsZT86IGJvb2xlYW47XG59O1xuXG5jb25zdCBTZXJpYWxpemVkVHJhY2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgdmFsdWU6IHoudW5rbm93bigpLFxuICBmaWxlUGF0aDogei5zdHJpbmcoKSxcbiAgbGluZU51bWJlcjogei5udW1iZXIoKSxcbiAgYXQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgVGVzdENhc2VSZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxUZXN0Q2FzZVJlc3VsdD4gPSB6LmxhenkoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIGtpbmQ6IHouZW51bShbXCJmaWxlXCIsIFwic3VpdGVcIiwgXCJ0ZXN0XCJdKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGZ1bGxOYW1lOiB6LnN0cmluZygpLFxuICAgIGZpbGU6IHouc3RyaW5nKCksXG4gICAgc3RhdGU6IHouZW51bShbXCJwYXNzZWRcIiwgXCJmYWlsZWRcIiwgXCJza2lwcGVkXCIsIFwidG9kb1wiLCBcInJ1bm5pbmdcIiwgXCJ1bmtub3duXCJdKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgY291bnRzOiB6Lm9iamVjdCh7XG4gICAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICAgIGZhaWxlZDogei5udW1iZXIoKSxcbiAgICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgZXJyb3I6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5udWxsYWJsZSgpLFxuICAgIHRyYWNlczogei5hcnJheShTZXJpYWxpemVkVHJhY2VTY2hlbWEpLFxuICAgIGNoaWxkcmVuOiB6LmFycmF5KFRlc3RDYXNlUmVzdWx0U2NoZW1hKSxcbiAgfSksXG4pO1xuXG5jb25zdCBSdW5SZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxSdW5SZXN1bHQ+ID0gei5vYmplY3Qoe1xuICBvazogei5ib29sZWFuKCksXG4gIHN1bW1hcnk6IHoub2JqZWN0KHtcbiAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICBwYXNzZWQ6IHoubnVtYmVyKCksXG4gICAgZmFpbGVkOiB6Lm51bWJlcigpLFxuICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgZHVyYXRpb25Nczogei5udW1iZXIoKSxcbiAgfSksXG4gIHJlc3VsdHM6IHouYXJyYXkoVGVzdENhc2VSZXN1bHRTY2hlbWEpLFxufSk7XG5jb25zdCBSdW5SZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICBmaWxlczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBwYXR0ZXJuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgVGVzdEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICBzbmFwc2hvdDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgc2VydmVyVGltZTogei5zdHJpbmcoKSxcbiAgICBzdGF0dXM6IHoub2JqZWN0KHtcbiAgICAgIHJlYWR5OiB6LmJvb2xlYW4oKSxcbiAgICAgIHJ1bm5pbmc6IHouYm9vbGVhbigpLFxuICAgICAgbGFzdFJ1bkF0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICBzc2VBdmFpbGFibGU6IHouYm9vbGVhbigpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuUXVldWVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBxdWV1ZWRBdDogei5zdHJpbmcoKSxcbiAgICByZXF1ZXN0OiB6Lm9iamVjdCh7XG4gICAgICBmaWxlczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgcGF0dGVybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuU3RhcnRlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgc3RhcnRlZEF0OiB6LnN0cmluZygpLFxuICB9KSxcbiAgcnVuQ29tcGxldGVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBzdGFydGVkQXQ6IHouc3RyaW5nKCksXG4gICAgZmluaXNoZWRBdDogei5zdHJpbmcoKSxcbiAgICByZXN1bHQ6IFJ1blJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIHJ1bkVycm9yZWQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIGZpbmlzaGVkQXQ6IHouc3RyaW5nKCksXG4gICAgZXJyb3I6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICB9KSxcbiAgcnVuTm9kZVByb2dyZXNzOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5saXRlcmFsKDEpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIHN0YXJ0ZWRBdDogei5zdHJpbmcoKSxcbiAgICBhdDogei5zdHJpbmcoKSxcbiAgICBraW5kOiB6LmVudW0oW1wiZmlsZVwiLCBcInN1aXRlXCIsIFwidGVzdFwiXSksXG4gICAgcGhhc2U6IHouZW51bShbXCJyZWFkeVwiLCBcInJlc3VsdFwiXSksXG4gICAgZmlsZUlkOiB6LnN0cmluZygpLFxuICAgIG5vZGVJZDogei5zdHJpbmcoKSxcbiAgICBwYXJlbnRJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgIG5vZGU6IFRlc3RDYXNlUmVzdWx0U2NoZW1hLFxuICB9KSxcbiAgaGVhcnRiZWF0OiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBhdDogei5zdHJpbmcoKSxcbiAgfSksXG59KTtcblxudHlwZSBUZXN0RXZlbnRzID0gei5pbmZlcjx0eXBlb2YgVGVzdEV2ZW50U2NoZW1hPjtcbmNvbnN0IFRlc3RFdmVudE5hbWVTY2hlbWEgPSB6LmVudW0oW1xuICBcInNuYXBzaG90XCIsXG4gIFwicnVuUXVldWVkXCIsXG4gIFwicnVuU3RhcnRlZFwiLFxuICBcInJ1bkNvbXBsZXRlZFwiLFxuICBcInJ1bkVycm9yZWRcIixcbiAgXCJydW5Ob2RlUHJvZ3Jlc3NcIixcbiAgXCJoZWFydGJlYXRcIixcbl0pO1xuXG5mdW5jdGlvbiB0b1BhdGhQcmVmaXgoYmFzZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBiYXNlUGF0aC5lbmRzV2l0aChcIi9cIikgPyBiYXNlUGF0aCA6IGAke2Jhc2VQYXRofS9gO1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplVHJhY2UodHJhY2U6IFNlcmlhbGl6ZWRUcmFjZSwgcHJlZml4OiBzdHJpbmcpOiBTZXJpYWxpemVkVHJhY2Uge1xuICByZXR1cm4geyAuLi50cmFjZSwgZmlsZVBhdGg6IHRyYWNlLmZpbGVQYXRoLnJlcGxhY2UocHJlZml4LCBcIlwiKSB9O1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplTm9kZShub2RlOiBUZXN0Q2FzZVJlc3VsdCwgYmFzZVBhdGg6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgY29uc3QgcHJlZml4ID0gdG9QYXRoUHJlZml4KGJhc2VQYXRoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5ub2RlLFxuICAgIG5hbWU6IG5vZGUubmFtZS5yZXBsYWNlKHByZWZpeCwgXCJcIiksXG4gICAgZmlsZTogbm9kZS5maWxlLnJlcGxhY2UocHJlZml4LCBcIlwiKSxcbiAgICB0cmFjZXM6IG5vZGUudHJhY2VzLm1hcCgodCkgPT4gcmVsYXRpdml6ZVRyYWNlKHQsIHByZWZpeCkpLFxuICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gcmVsYXRpdml6ZU5vZGUoYywgcHJlZml4KSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZpemVSZXN1bHQocmVzdWx0OiBSdW5SZXN1bHQsIGJhc2VQYXRoOiBzdHJpbmcpOiBSdW5SZXN1bHQge1xuICBjb25zdCBwcmVmaXggPSB0b1BhdGhQcmVmaXgoYmFzZVBhdGgpO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICByZXN1bHRzOiByZXN1bHQucmVzdWx0cy5tYXAoKG4pID0+IHJlbGF0aXZpemVOb2RlKG4sIHByZWZpeCkpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJEZXZUZXN0Um91dGVzKFxuICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgY29uZmlnOiBTb25hbXVEZXZSdW5uZXJDb25maWcsXG4gIGRlcGVuZGVuY2llcz86IERldlRlc3RSb3V0ZURlcGVuZGVuY2llcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmVmaXggPSBjb25maWcucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcblxuICBjb25zdCBkZWZhdWx0TWFuYWdlciA9IGRlcGVuZGVuY2llcz8ubWFuYWdlciA9PT0gdW5kZWZpbmVkID8gbmV3IERldlZpdGVzdE1hbmFnZXIoKSA6IG51bGw7XG4gIGNvbnN0IG1hbmFnZXIgPSBkZXBlbmRlbmNpZXM/Lm1hbmFnZXIgPz8gZGVmYXVsdE1hbmFnZXI7XG4gIGlmIChtYW5hZ2VyID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGV2Vml0ZXN0TWFuYWdlciBkZXBlbmRlbmN5IGlzIHVuYXZhaWxhYmxlXCIpO1xuICB9XG4gIGF3YWl0IG1hbmFnZXIuc3RhcnQoY29uZmlnLnZpdGVzdENvbmZpZ1BhdGgpO1xuICBpZiAoZGVmYXVsdE1hbmFnZXIgIT09IG51bGwpIHtcbiAgICBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlciA9IGRlZmF1bHRNYW5hZ2VyO1xuICB9XG5cbiAgY29uc3Qgc3NlQXZhaWxhYmxlID0gZGVwZW5kZW5jaWVzPy5zc2VBdmFpbGFibGUgPz8gISFTb25hbXUuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5zc2U7XG5cbiAgaWYgKHNzZUF2YWlsYWJsZSkge1xuICAgIHNlcnZlci5nZXQoYCR7cHJlZml4fS9ldmVudHNgLCAocmVxdWVzdCwgcmVwbHkpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNzZTogU1NFQ29ubmVjdGlvbjx0eXBlb2YgVGVzdEV2ZW50U2NoZW1hPiA9IGNyZWF0ZVNTRUZhY3RvcnkoXG4gICAgICAgIHJlcXVlc3Quc29ja2V0LFxuICAgICAgICByZXBseSxcbiAgICAgICAgVGVzdEV2ZW50U2NoZW1hLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3RhdHVzOiBNYW5hZ2VyU3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKTtcbiAgICAgIHNzZS5wdWJsaXNoKFwic25hcHNob3RcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgc2VydmVyVGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAvLyBVSeuKlCBIVFRQIHN0YXR1c+yZgCDqsJnsnYAg7ZiV7YOc66W8IOq4sOuMgO2VmOuvgOuhnCBTU0Ug7Iqk64OF7IO37JeQ64+EIHNzZUF2YWlsYWJsZeydhCDtj6ztlajtlanri4jri6QuXG4gICAgICAgIHN0YXR1czogeyAuLi5zdGF0dXMsIHNzZUF2YWlsYWJsZSB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzc2UucHVibGlzaChcImhlYXJ0YmVhdFwiLCB7XG4gICAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgICAgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUxfTVMpO1xuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGRlcGVuZGVuY2llcz8uYXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoO1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQ6IHN0cmluZywgZGF0YTogVGVzdEV2ZW50UGF5bG9hZCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSBUZXN0RXZlbnROYW1lU2NoZW1hLnNhZmVQYXJzZShldmVudCk7XG4gICAgICAgIGlmICghcGFyc2VkS2V5LnN1Y2Nlc3MpIHJldHVybjtcbiAgICAgICAgY29uc3Qga2V5ID0gcGFyc2VkS2V5LmRhdGE7XG4gICAgICAgIGlmIChrZXkgPT09IFwicnVuTm9kZVByb2dyZXNzXCIpIHtcbiAgICAgICAgICBjb25zdCBwcm9ncmVzc0VudmVsb3BlID0gVGVzdEV2ZW50U2NoZW1hLnBhcnRpYWwoKS5zYWZlUGFyc2UoeyBydW5Ob2RlUHJvZ3Jlc3M6IGRhdGEgfSk7XG4gICAgICAgICAgaWYgKCFwcm9ncmVzc0VudmVsb3BlLnN1Y2Nlc3MgfHwgcHJvZ3Jlc3NFbnZlbG9wZS5kYXRhLnJ1bk5vZGVQcm9ncmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gcHJvZ3Jlc3NFbnZlbG9wZS5kYXRhLnJ1bk5vZGVQcm9ncmVzcztcbiAgICAgICAgICBjb25zdCByZWxhdGl2aXplZCA9IHtcbiAgICAgICAgICAgIC4uLnByb2dyZXNzLFxuICAgICAgICAgICAgbm9kZTogcmVsYXRpdml6ZU5vZGUocHJvZ3Jlc3Mubm9kZSwgYmFzZVBhdGgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCByZWxhdGl2aXplZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZEVudmVsb3BlID0gVGVzdEV2ZW50U2NoZW1hLnBhcnRpYWwoKS5zYWZlUGFyc2UoeyBba2V5XTogZGF0YSB9KTtcbiAgICAgICAgaWYgKCFwYXJzZWRFbnZlbG9wZS5zdWNjZXNzIHx8IHBhcnNlZEVudmVsb3BlLmRhdGFba2V5XSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBwYXJzZWRFbnZlbG9wZS5kYXRhW2tleV07XG4gICAgICAgIC8vIFNBRkVUWToga2V57JmAIHBheWxvYWTripQg6rCZ7J2AIFRlc3RFdmVudFNjaGVtYSDtla3rqqnsnLzroZwg7ZWo6ruYIOqygOymneuQmOyXiOyKteuLiOuLpC5cbiAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCBwYXJzZWREYXRhIGFzIFRlc3RFdmVudHNbdHlwZW9mIGtleV0pO1xuICAgICAgfTtcbiAgICAgIG1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGxldCBjbGVhbmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgICAgICBjbGVhbmVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChoZWFydGJlYXRUaW1lcik7XG4gICAgICAgIG1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5zb2NrZXQub24oXCJjbG9zZVwiLCBjbGVhbnVwKTtcbiAgICAgIHJlcXVlc3Quc29ja2V0Lm9uKFwiZXJyb3JcIiwgY2xlYW51cCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXJ2ZXIucG9zdChgJHtwcmVmaXh9L3J1bmAsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgIGNvbnN0IHJ1bklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHJ1blJlcXVlc3QgPSBSdW5SZXF1ZXN0U2NoZW1hLnBhcnNlKHJlcXVlc3QuYm9keSA/PyB7fSk7XG5cbiAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1blF1ZXVlZFwiLCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgIHJ1bklkLFxuICAgICAgcXVldWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJlcXVlc3Q6IHJ1blJlcXVlc3QsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5TdGFydGVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmF3UmVzdWx0OiBSdW5SZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLnJ1bihydW5SZXF1ZXN0LCBydW5JZCk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZWxhdGl2aXplUmVzdWx0KHJhd1Jlc3VsdCwgZGVwZW5kZW5jaWVzPy5hcGlSb290UGF0aCA/PyBTb25hbXUuYXBpUm9vdFBhdGgpO1xuXG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5Db21wbGV0ZWRcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgZmluaXNoZWRBdCxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5FcnJvcmVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICBzdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfTtcbiAgICB9XG4gIH0pO1xuXG4gIHNlcnZlci5nZXQoYCR7cHJlZml4fS9zdGF0dXNgLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzOiBNYW5hZ2VyU3RhdHVzID0gbWFuYWdlci5nZXRTdGF0dXMoKTtcbiAgICByZXR1cm4geyAuLi5zdGF0dXMsIHNzZUF2YWlsYWJsZSB9O1xuICB9KTtcblxuICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICBpZiAoZGVmYXVsdE1hbmFnZXIgIT09IG51bGwpIHtcbiAgICAgIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyID0gbnVsbDtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBOEpBLFNBQVMsYUFBYSxVQUEwQjtDQUM5QyxPQUFPLFNBQVMsU0FBUyxHQUFHLElBQUksV0FBVyxHQUFHLFNBQVM7QUFDekQ7QUFFQSxTQUFTLGdCQUFnQixPQUF3QixRQUFpQztDQUNoRixPQUFPO0VBQUUsR0FBRztFQUFPLFVBQVUsTUFBTSxTQUFTLFFBQVEsUUFBUSxFQUFFO0NBQUU7QUFDbEU7QUFFQSxTQUFTLGVBQWUsTUFBc0IsVUFBa0M7Q0FDOUUsTUFBTSxTQUFTLGFBQWEsUUFBUTtDQUNwQyxPQUFPO0VBQ0wsR0FBRztFQUNILE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxFQUFFO0VBQ2xDLE1BQU0sS0FBSyxLQUFLLFFBQVEsUUFBUSxFQUFFO0VBQ2xDLFFBQVEsS0FBSyxPQUFPLEtBQUssTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7RUFDekQsVUFBVSxLQUFLLFNBQVMsS0FBSyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUM7Q0FDOUQ7QUFDRjtBQUVBLFNBQVMsaUJBQWlCLFFBQW1CLFVBQTZCO0NBQ3hFLE1BQU0sU0FBUyxhQUFhLFFBQVE7Q0FDcEMsT0FBTztFQUNMLEdBQUc7RUFDSCxTQUFTLE9BQU8sUUFBUSxLQUFLLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztDQUM5RDtBQUNGO0FBRUEsZUFBc0Isc0JBQ3BCLFFBQ0EsUUFDQSxjQUNlO0NBQ2YsTUFBTSxTQUFTLE9BQU8sZUFBZTtDQUVyQyxNQUFNLGlCQUFpQixjQUFjLFlBQVksU0FBWSxJQUFJLGlCQUFpQixJQUFJO0NBQ3RGLE1BQU0sVUFBVSxjQUFjLFdBQVc7Q0FDekMsSUFBSSxZQUFZLE1BQ2QsTUFBTSxJQUFJLE1BQU0sNENBQTRDO0NBRTlELE1BQU0sUUFBUSxNQUFNLE9BQU8sZ0JBQWdCO0NBQzNDLElBQUksbUJBQW1CLE1BQ3JCLE9BQU8sbUJBQW1CO0NB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
@@ -1,3 +1,5 @@
1
+ import { type UserConfig as ViteUserConfig } from "vite";
2
+ import { type CliOptions, type Vitest } from "vitest/node";
1
3
  import { type SerializedTrace } from "../naite/naite";
2
4
  export type TestNodeKind = "file" | "suite" | "test";
3
5
  export type TestState = "passed" | "failed" | "skipped" | "todo" | "running" | "unknown";
@@ -9,12 +11,7 @@ export type TestCaseResult = {
9
11
  file: string;
10
12
  state: TestState;
11
13
  durationMs: number | null;
12
- counts: {
13
- total: number;
14
- passed: number;
15
- failed: number;
16
- skipped: number;
17
- };
14
+ counts: TestCounts;
18
15
  error: {
19
16
  message: string;
20
17
  stack?: string;
@@ -22,6 +19,12 @@ export type TestCaseResult = {
22
19
  traces: SerializedTrace[];
23
20
  children: TestCaseResult[];
24
21
  };
22
+ export type TestCounts = {
23
+ total: number;
24
+ passed: number;
25
+ failed: number;
26
+ skipped: number;
27
+ };
25
28
  export type RunResult = {
26
29
  ok: boolean;
27
30
  summary: {
@@ -38,8 +41,50 @@ export type ManagerStatus = {
38
41
  running: boolean;
39
42
  lastRunAt: string | null;
40
43
  };
41
- export type TestEventListener = (event: string, data: unknown) => void;
44
+ export type TestEventPayload = {
45
+ schemaVersion: number;
46
+ runId: string;
47
+ queuedAt: string;
48
+ request: RunRequest;
49
+ } | {
50
+ schemaVersion: number;
51
+ runId: string;
52
+ startedAt: string;
53
+ } | {
54
+ schemaVersion: number;
55
+ runId: string;
56
+ startedAt: string;
57
+ finishedAt: string;
58
+ result: RunResult;
59
+ } | {
60
+ schemaVersion: number;
61
+ runId: string;
62
+ finishedAt: string;
63
+ error: {
64
+ message: string;
65
+ stack?: string;
66
+ };
67
+ } | {
68
+ schemaVersion: 1;
69
+ runId: string;
70
+ startedAt: string;
71
+ at: string;
72
+ kind: TestNodeKind;
73
+ phase: "ready" | "result";
74
+ fileId: string;
75
+ nodeId: string;
76
+ parentId: string | null;
77
+ node: TestCaseResult;
78
+ };
79
+ export type RunRequest = {
80
+ files?: string[];
81
+ pattern?: string;
82
+ };
83
+ export type TestEventListener = (event: string, data: TestEventPayload) => void;
84
+ export type ManagedVitest = Pick<Vitest, "standalone" | "close" | "onFilterWatchedSpecification" | "invalidateFile" | "globTestSpecifications" | "runTestSpecifications" | "setGlobalTestNamePattern" | "resetGlobalTestNamePattern">;
85
+ export type DevVitestFactory = (mode: "test", options: CliOptions, viteOverrides: ViteUserConfig) => Promise<ManagedVitest>;
42
86
  export declare class DevVitestManager {
87
+ private readonly vitestFactory?;
43
88
  private vitest;
44
89
  private running;
45
90
  private lastRunAt;
@@ -48,9 +93,10 @@ export declare class DevVitestManager {
48
93
  private closed;
49
94
  private eventListeners;
50
95
  private currentRunContext;
96
+ constructor(vitestFactory?: DevVitestFactory | undefined);
51
97
  addEventListener(listener: TestEventListener): void;
52
98
  removeEventListener(listener: TestEventListener): void;
53
- emitEvent(event: string, data: unknown): void;
99
+ emitEvent(event: string, data: TestEventPayload): void;
54
100
  start(vitestConfigPath?: string): Promise<void>;
55
101
  run(opts: {
56
102
  files?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"dev-vitest-manager.d.ts","sourceRoot":"","sources":["../../src/testing/dev-vitest-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev-vitest-manager.d.ts","sourceRoot":"","sources":["../../src/testing/dev-vitest-manager.ts"],"names":[],"mappings":"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"}