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
@@ -25,6 +25,7 @@ var init__relation_graph = __esmMin((() => {
25
25
  const relatedFixtureId = `${prop.with}#${column.value}`;
26
26
  if (this.graph.has(relatedFixtureId)) node.related.add(relatedFixtureId);
27
27
  } else if (isManyToManyRelationProp(prop)) {
28
+ if (!Array.isArray(column.value)) throw new Error(`${fixture.fixtureId}.${prop.name} 관계 값은 배열이어야 합니다.`);
28
29
  const relatedIds = column.value;
29
30
  for (const relatedId of relatedIds) {
30
31
  const relatedFixtureId = `${prop.with}#${relatedId}`;
@@ -72,4 +73,4 @@ var init__relation_graph = __esmMin((() => {
72
73
  init__relation_graph();
73
74
  export { RelationGraph, init__relation_graph };
74
75
 
75
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JlbGF0aW9uLWdyYXBoLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBGaXh0dXJlUmVjb3JkLCB0eXBlIFJlbGF0aW9uTm9kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vLyDqtIDqs4Qg6re4656Y7ZSEIOyymOumrOulvCDrs4Trj4Qg7YG0656Y7Iqk66GcIOu2hOumrFxuZXhwb3J0IGNsYXNzIFJlbGF0aW9uR3JhcGgge1xuICBwcml2YXRlIGdyYXBoOiBNYXA8c3RyaW5nLCBSZWxhdGlvbk5vZGU+ID0gbmV3IE1hcCgpO1xuXG4gIGJ1aWxkR3JhcGgoZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSk6IHZvaWQge1xuICAgIHRoaXMuZ3JhcGguY2xlYXIoKTtcblxuICAgIC8vIDEuIOuFuOuTnCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIHRoaXMuZ3JhcGguc2V0KGZpeHR1cmUuZml4dHVyZUlkLCB7XG4gICAgICAgIGZpeHR1cmVJZDogZml4dHVyZS5maXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICByZWxhdGVkOiBuZXcgU2V0KCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiDsnZjsobTshLEg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ncmFwaC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbm90IGZvdW5kIGZvciBmaXh0dXJlICR7Zml4dHVyZS5maXh0dXJlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgdW5rbm93biBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgICBpZiAodGhpcy5ncmFwaC5oYXMocmVsYXRlZEZpeHR1cmVJZCkpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGguZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5yZWxhdGVkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbnNlcnRpb25PcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRlbXBWaXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCB2aXNpdCA9IChmaXh0dXJlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHJldHVybjtcbiAgICAgIGlmICh0ZW1wVmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgaW52b2x2aW5nOiAke2ZpeHR1cmVJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmVJZCk7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBub3QgZm91bmQgZm9yIGZpeHR1cmUgJHtmaXh0dXJlSWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChub2RlLmVudGl0eUlkKTtcblxuICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBub2RlLnJlbGF0ZWQpIHtcbiAgICAgICAgY29uc3QgZGVwTm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGRlcElkKTtcbiAgICAgICAgaWYgKGRlcE5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBub3QgZm91bmQgZm9yIGZpeHR1cmUgJHtkZXBJZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSDqtIDqs4TsnbTrqbTshJwgbnVsbGFibGXsnbQg7JWE64uMIOqyveyasCDrqLzsoIAg67Cp66y4XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSAmJlxuICAgICAgICAgICAgcHJvcC53aXRoID09PSBkZXBOb2RlLmVudGl0eUlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVsYXRpb25Qcm9wICYmICFyZWxhdGlvblByb3AubnVsbGFibGUpIHtcbiAgICAgICAgICB2aXNpdChkZXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGVtcFZpc2l0ZWQuZGVsZXRlKGZpeHR1cmVJZCk7XG4gICAgICB2aXNpdGVkLmFkZChmaXh0dXJlSWQpO1xuICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiB0aGlzLmdyYXBoLmtleXMoKSkge1xuICAgICAgdmlzaXQoZml4dHVyZUlkKTtcbiAgICB9XG5cbiAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN566GcIOyduO2VtCDrsKnrrLjrkJjsp4Ag7JWK7J2AIGZpeHR1cmVJZCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiB0aGlzLmdyYXBoLmtleXMoKSkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIG9yZGVyLnB1c2goZml4dHVyZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUF3RDtZQU9qQztDQUdWLGdCQUFiLE1BQTJCO0VBQ3pCLHdCQUEyQyxJQUFJLElBQUk7RUFFbkQsV0FBVyxVQUFpQztHQUMxQyxLQUFLLE1BQU0sTUFBTTtHQUdqQixLQUFLLE1BQU0sV0FBVyxVQUNwQixLQUFLLE1BQU0sSUFBSSxRQUFRLFdBQVc7SUFDaEMsV0FBVyxRQUFRO0lBQ25CLFVBQVUsUUFBUTtJQUNsQix5QkFBUyxJQUFJLElBQUk7R0FDbkIsQ0FBQztHQUlILEtBQUssTUFBTSxXQUFXLFVBQVU7SUFDOUIsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJLFFBQVEsU0FBUztJQUM3QyxJQUFJLFNBQVMsUUFDWCxNQUFNLElBQUksTUFBTSw4QkFBOEIsUUFBUSxXQUFXO0lBR25FLEtBQUssTUFBTSxHQUFHLFdBQVcsT0FBTyxRQUFRLFFBQVEsT0FBTyxHQUFHO0tBQ3hELE1BQU0sT0FBTyxPQUFPO0tBRXBCLElBQUksZUFBZSxJQUFJLEdBQ3JCO1VBQ0UsMkJBQTJCLElBQUksS0FDOUIsdUJBQXVCLElBQUksS0FBSyxLQUFLLGVBQ3RDO09BQ0EsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEtBQUssR0FBRyxPQUFPO09BQ2hELElBQUksS0FBSyxNQUFNLElBQUksZ0JBQWdCLEdBQ2pDLEtBQUssUUFBUSxJQUFJLGdCQUFnQjtNQUVyQyxPQUFPLElBQUkseUJBQXlCLElBQUksR0FBRztPQUV6QyxNQUFNLGFBQWEsT0FBTztPQUMxQixLQUFLLE1BQU0sYUFBYSxZQUFZO1FBQ2xDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxLQUFLLEdBQUc7UUFDekMsSUFBSSxLQUFLLE1BQU0sSUFBSSxnQkFBZ0IsR0FBRztTQUNwQyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0I7U0FDakMsS0FBSyxNQUFNLElBQUksZ0JBQWdCLENBQUMsRUFBRSxRQUFRLElBQUksUUFBUSxTQUFTO1FBQ2pFO09BQ0Y7TUFDRjs7SUFFSjtHQUNGO0VBQ0Y7RUFFQSxvQkFBOEI7R0FDNUIsTUFBTSwwQkFBVSxJQUFJLElBQVk7R0FDaEMsTUFBTSxRQUFrQixDQUFDO0dBQ3pCLE1BQU0sOEJBQWMsSUFBSSxJQUFZO0dBRXBDLE1BQU0sU0FBUyxjQUFzQjtJQUNuQyxJQUFJLFFBQVEsSUFBSSxTQUFTLEdBQUc7SUFDNUIsSUFBSSxZQUFZLElBQUksU0FBUyxHQUFHO0tBQzlCLFFBQVEsS0FBSywyQ0FBMkMsV0FBVztLQUNuRTtJQUNGO0lBRUEsWUFBWSxJQUFJLFNBQVM7SUFFekIsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJLFNBQVM7SUFDckMsSUFBSSxTQUFTLFFBQ1gsTUFBTSxJQUFJLE1BQU0sOEJBQThCLFdBQVc7SUFFM0QsTUFBTSxTQUFTLGNBQWMsSUFBSSxLQUFLLFFBQVE7SUFFOUMsS0FBSyxNQUFNLFNBQVMsS0FBSyxTQUFTO0tBQ2hDLE1BQU0sVUFBVSxLQUFLLE1BQU0sSUFBSSxLQUFLO0tBQ3BDLElBQUksWUFBWSxRQUNkLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixPQUFPO0tBSXZELE1BQU0sZUFBZSxPQUFPLE1BQU0sTUFDL0IsU0FDQyxlQUFlLElBQUksTUFDbEIsMkJBQTJCLElBQUksS0FDN0IsdUJBQXVCLElBQUksS0FBSyxLQUFLLGtCQUN4QyxLQUFLLFNBQVMsUUFBUSxRQUMxQjtLQUNBLElBQUksZ0JBQWdCLENBQUMsYUFBYSxVQUNoQyxNQUFNLEtBQUs7SUFFZjtJQUVBLFlBQVksT0FBTyxTQUFTO0lBQzVCLFFBQVEsSUFBSSxTQUFTO0lBQ3JCLE1BQU0sS0FBSyxTQUFTO0dBQ3RCO0dBRUEsS0FBSyxNQUFNLGFBQWEsS0FBSyxNQUFNLEtBQUssR0FDdEMsTUFBTSxTQUFTO0dBSWpCLEtBQUssTUFBTSxhQUFhLEtBQUssTUFBTSxLQUFLLEdBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUyxHQUN4QixNQUFNLEtBQUssU0FBUztHQUl4QixPQUFPO0VBQ1Q7Q0FDRiJ9
76
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JlbGF0aW9uLWdyYXBoLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBGaXh0dXJlUmVjb3JkLCB0eXBlIFJlbGF0aW9uTm9kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vLyDqtIDqs4Qg6re4656Y7ZSEIOyymOumrOulvCDrs4Trj4Qg7YG0656Y7Iqk66GcIOu2hOumrFxuZXhwb3J0IGNsYXNzIFJlbGF0aW9uR3JhcGgge1xuICBwcml2YXRlIGdyYXBoOiBNYXA8c3RyaW5nLCBSZWxhdGlvbk5vZGU+ID0gbmV3IE1hcCgpO1xuXG4gIGJ1aWxkR3JhcGgoZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSk6IHZvaWQge1xuICAgIHRoaXMuZ3JhcGguY2xlYXIoKTtcblxuICAgIC8vIDEuIOuFuOuTnCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIHRoaXMuZ3JhcGguc2V0KGZpeHR1cmUuZml4dHVyZUlkLCB7XG4gICAgICAgIGZpeHR1cmVJZDogZml4dHVyZS5maXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICByZWxhdGVkOiBuZXcgU2V0KCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiDsnZjsobTshLEg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ncmFwaC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbm90IGZvdW5kIGZvciBmaXh0dXJlICR7Zml4dHVyZS5maXh0dXJlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2x1bW4udmFsdWUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmaXh0dXJlLmZpeHR1cmVJZH0uJHtwcm9wLm5hbWV9IOq0gOqzhCDqsJLsnYAg67Cw7Je07J207Ja07JW8IO2VqeuLiOuLpC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVsYXRlZC5hZGQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmFwaC5nZXQocmVsYXRlZEZpeHR1cmVJZCk/LnJlbGF0ZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEluc2VydGlvbk9yZGVyKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgb3JkZXI6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdGVtcFZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHZpc2l0ID0gKGZpeHR1cmVJZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoZml4dHVyZUlkKSkgcmV0dXJuO1xuICAgICAgaWYgKHRlbXBWaXNpdGVkLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCBpbnZvbHZpbmc6ICR7Zml4dHVyZUlkfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRlbXBWaXNpdGVkLmFkZChmaXh0dXJlSWQpO1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ncmFwaC5nZXQoZml4dHVyZUlkKTtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG5vdCBmb3VuZCBmb3IgZml4dHVyZSAke2ZpeHR1cmVJZH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KG5vZGUuZW50aXR5SWQpO1xuXG4gICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIG5vZGUucmVsYXRlZCkge1xuICAgICAgICBjb25zdCBkZXBOb2RlID0gdGhpcy5ncmFwaC5nZXQoZGVwSWQpO1xuICAgICAgICBpZiAoZGVwTm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG5vdCBmb3VuZCBmb3IgZml4dHVyZSAke2RlcElkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmVsb25nc1RvT25lIOq0gOqzhOydtOuptOyEnCBudWxsYWJsZeydtCDslYTri4wg6rK97JqwIOuovOyggCDrsKnrrLhcbiAgICAgICAgY29uc3QgcmVsYXRpb25Qcm9wID0gZW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgICAgICBwcm9wLndpdGggPT09IGRlcE5vZGUuZW50aXR5SWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWxhdGlvblByb3AgJiYgIXJlbGF0aW9uUHJvcC5udWxsYWJsZSkge1xuICAgICAgICAgIHZpc2l0KGRlcElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5kZWxldGUoZml4dHVyZUlkKTtcbiAgICAgIHZpc2l0ZWQuYWRkKGZpeHR1cmVJZCk7XG4gICAgICBvcmRlci5wdXNoKGZpeHR1cmVJZCk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICB2aXNpdChmaXh0dXJlSWQpO1xuICAgIH1cblxuICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3nroZwg7J247ZW0IOuwqeusuOuQmOyngCDslYrsnYAgZml4dHVyZUlkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7cUJBQXdEO1lBT2pDO0NBR1YsZ0JBQWIsTUFBMkI7RUFDekIsd0JBQTJDLElBQUksSUFBSTtFQUVuRCxXQUFXLFVBQWlDO0dBQzFDLEtBQUssTUFBTSxNQUFNO0dBR2pCLEtBQUssTUFBTSxXQUFXLFVBQ3BCLEtBQUssTUFBTSxJQUFJLFFBQVEsV0FBVztJQUNoQyxXQUFXLFFBQVE7SUFDbkIsVUFBVSxRQUFRO0lBQ2xCLHlCQUFTLElBQUksSUFBSTtHQUNuQixDQUFDO0dBSUgsS0FBSyxNQUFNLFdBQVcsVUFBVTtJQUM5QixNQUFNLE9BQU8sS0FBSyxNQUFNLElBQUksUUFBUSxTQUFTO0lBQzdDLElBQUksU0FBUyxRQUNYLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixRQUFRLFdBQVc7SUFHbkUsS0FBSyxNQUFNLEdBQUcsV0FBVyxPQUFPLFFBQVEsUUFBUSxPQUFPLEdBQUc7S0FDeEQsTUFBTSxPQUFPLE9BQU87S0FFcEIsSUFBSSxlQUFlLElBQUksR0FDckI7VUFDRSwyQkFBMkIsSUFBSSxLQUM5Qix1QkFBdUIsSUFBSSxLQUFLLEtBQUssZUFDdEM7T0FDQSxNQUFNLG1CQUFtQixHQUFHLEtBQUssS0FBSyxHQUFHLE9BQU87T0FDaEQsSUFBSSxLQUFLLE1BQU0sSUFBSSxnQkFBZ0IsR0FDakMsS0FBSyxRQUFRLElBQUksZ0JBQWdCO01BRXJDLE9BQU8sSUFBSSx5QkFBeUIsSUFBSSxHQUFHO09BRXpDLElBQUksQ0FBQyxNQUFNLFFBQVEsT0FBTyxLQUFLLEdBQzdCLE1BQU0sSUFBSSxNQUFNLEdBQUcsUUFBUSxVQUFVLEdBQUcsS0FBSyxLQUFLLGtCQUFrQjtPQUV0RSxNQUFNLGFBQWEsT0FBTztPQUMxQixLQUFLLE1BQU0sYUFBYSxZQUFZO1FBQ2xDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxLQUFLLEdBQUc7UUFDekMsSUFBSSxLQUFLLE1BQU0sSUFBSSxnQkFBZ0IsR0FBRztTQUNwQyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0I7U0FDakMsS0FBSyxNQUFNLElBQUksZ0JBQWdCLENBQUMsRUFBRSxRQUFRLElBQUksUUFBUSxTQUFTO1FBQ2pFO09BQ0Y7TUFDRjs7SUFFSjtHQUNGO0VBQ0Y7RUFFQSxvQkFBOEI7R0FDNUIsTUFBTSwwQkFBVSxJQUFJLElBQVk7R0FDaEMsTUFBTSxRQUFrQixDQUFDO0dBQ3pCLE1BQU0sOEJBQWMsSUFBSSxJQUFZO0dBRXBDLE1BQU0sU0FBUyxjQUFzQjtJQUNuQyxJQUFJLFFBQVEsSUFBSSxTQUFTLEdBQUc7SUFDNUIsSUFBSSxZQUFZLElBQUksU0FBUyxHQUFHO0tBQzlCLFFBQVEsS0FBSywyQ0FBMkMsV0FBVztLQUNuRTtJQUNGO0lBRUEsWUFBWSxJQUFJLFNBQVM7SUFFekIsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJLFNBQVM7SUFDckMsSUFBSSxTQUFTLFFBQ1gsTUFBTSxJQUFJLE1BQU0sOEJBQThCLFdBQVc7SUFFM0QsTUFBTSxTQUFTLGNBQWMsSUFBSSxLQUFLLFFBQVE7SUFFOUMsS0FBSyxNQUFNLFNBQVMsS0FBSyxTQUFTO0tBQ2hDLE1BQU0sVUFBVSxLQUFLLE1BQU0sSUFBSSxLQUFLO0tBQ3BDLElBQUksWUFBWSxRQUNkLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixPQUFPO0tBSXZELE1BQU0sZUFBZSxPQUFPLE1BQU0sTUFDL0IsU0FDQyxlQUFlLElBQUksTUFDbEIsMkJBQTJCLElBQUksS0FDN0IsdUJBQXVCLElBQUksS0FBSyxLQUFLLGtCQUN4QyxLQUFLLFNBQVMsUUFBUSxRQUMxQjtLQUNBLElBQUksZ0JBQWdCLENBQUMsYUFBYSxVQUNoQyxNQUFNLEtBQUs7SUFFZjtJQUVBLFlBQVksT0FBTyxTQUFTO0lBQzVCLFFBQVEsSUFBSSxTQUFTO0lBQ3JCLE1BQU0sS0FBSyxTQUFTO0dBQ3RCO0dBRUEsS0FBSyxNQUFNLGFBQWEsS0FBSyxNQUFNLEtBQUssR0FDdEMsTUFBTSxTQUFTO0dBSWpCLEtBQUssTUFBTSxhQUFhLEtBQUssTUFBTSxLQUFLLEdBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUyxHQUN4QixNQUFNLEtBQUssU0FBUztHQUl4QixPQUFPO0VBQ1Q7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/testing/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,IAAI,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE/E,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,gBAAgB,QAmCpE;AAkBD,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,iBAGpF;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,iBAE/D;AAED,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;AACzD,KAAK,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/C,KAAK,QAAQ,GAAG,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAC/C,KAAK,EAAE,SAAS,KAAK,EAAE,KACpB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAEzE,KAAK,WAAW,GAAG;IACjB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IACrE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,UAAU,CAAC;IAC7E,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,UAAU,CAAC;IAC7E,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,EAC3B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,YAAY,EAChB,OAAO,CAAC,EAAE,WAAW,GACpB,UAAU,CAAC;IACd,IAAI,EAAE,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,EACjC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,YAAY,EAChB,OAAO,CAAC,EAAE,WAAW,KAClB,UAAU,CAAC;IAChB,IAAI,EAAE,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,EACjC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,YAAY,EAChB,OAAO,CAAC,EAAE,WAAW,KAClB,UAAU,CAAC;IAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,CAAC;AAIF,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,QAAQ;QAChB,MAAM,EAAE,eAAe,EAAE,CAAC;KAC3B;CACF;AAED,eAAO,MAAM,IAAI,EAAE,WAiClB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,aA0DpB,CAAC"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/testing/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,IAAI,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE/E,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,gBAAgB,QAmCpE;AAyBD,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,iBAGpF;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,iBAE/D;AAED,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;AACzD,KAAK,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/C,KAAK,QAAQ,GAAG,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAC/C,KAAK,EAAE,SAAS,KAAK,EAAE,KACpB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAEzE,KAAK,WAAW,GAAG;IACjB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IACrE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,UAAU,CAAC;IAC7E,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,UAAU,CAAC;IAC7E,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,EAC3B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,YAAY,EAChB,OAAO,CAAC,EAAE,WAAW,GACpB,UAAU,CAAC;IACd,IAAI,EAAE,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,EACjC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,YAAY,EAChB,OAAO,CAAC,EAAE,WAAW,KAClB,UAAU,CAAC;IAChB,IAAI,EAAE,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,CAAC,EACjC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,YAAY,EAChB,OAAO,CAAC,EAAE,WAAW,KAClB,UAAU,CAAC;IAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,CAAC;AAIF,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,QAAQ;QAChB,MAAM,EAAE,eAAe,EAAE,CAAC;KAC3B;CACF;AAED,eAAO,MAAM,IAAI,EAAE,WAiClB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,aA0DpB,CAAC"}
@@ -37,14 +37,17 @@ function bootstrap(vi, options) {
37
37
  afterAll(() => {});
38
38
  }
39
39
  function getMockContext() {
40
+ const request = null;
41
+ const reply = null;
42
+ const createSSE = (() => {
43
+ throw new Error("createSSE is not available in mock context");
44
+ });
40
45
  return {
41
46
  transport: "http",
42
- request: null,
43
- reply: null,
47
+ request,
48
+ reply,
44
49
  headers: {},
45
- createSSE: (() => {
46
- throw new Error("createSSE is not available in mock context");
47
- }),
50
+ createSSE,
48
51
  session: null,
49
52
  user: null,
50
53
  naiteStore: Naite.createStore(),
@@ -126,4 +129,4 @@ const testAs = Object.assign(async (user, title, fn, options) => {
126
129
  //#endregion
127
130
  export { bootstrap, runWithContext, runWithMockContext, test, testAs };
128
131
 
129
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwibmFtZXMiOlsidml0ZXN0VGVzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Jvb3RzdHJhcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZnRlckFsbCwgYWZ0ZXJFYWNoLCBiZWZvcmVBbGwsIGJlZm9yZUVhY2gsIHRlc3QgYXMgdml0ZXN0VGVzdCB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB7IHR5cGUgVGVzdEZ1bmN0aW9uLCB0eXBlIFRlc3RPcHRpb25zLCB0eXBlIFZpdGVzdFV0aWxzIH0gZnJvbSBcInZpdGVzdFwiO1xuXG5pbXBvcnQgeyB0eXBlIENvbnRleHQgfSBmcm9tIFwiLi4vYXBpL2NvbnRleHRcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgU2VyaWFsaXplZFRyYWNlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBOYWl0ZVJlcG9ydGVyIH0gZnJvbSBcIi4uL25haXRlL25haXRlLXJlcG9ydGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb25hbXUg7LSI6riw7ZmUIOuqqOuTnOulvCDsp4DsoJXtlanri4jri6QuXG4gICAqIC0gdHJ1ZSAo6riw67O46rCSKTog7YWM7Iqk7YyFIOuqqOuTnOuhnCDstIjquLDtmZQgKOu5oOumhCwgU3luY2VyL1Rhc2sg7IOd6561KVxuICAgKiAtIGZhbHNlOiDsoITssrQg7LSI6riw7ZmUIChTeW5jZXIsIFRhc2ssIEVudGl0eU1hbmFnZXIg65OxIOuqqOuRkCDroZzrk5wpXG4gICAqXG4gICAqIG1pZ3JhdG9yLCBzeW5jZXIsIHRlbXBsYXRlIOuTseydmCDthYzsiqTtirjsl5DshJzripQgZmFsc2Xrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKi9cbiAgZm9yVGVzdGluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXAodmk6IFZpdGVzdFV0aWxzLCBvcHRpb25zPzogQm9vdHN0cmFwT3B0aW9ucykge1xuICBjb25zdCBmb3JUZXN0aW5nID0gb3B0aW9ucz8uZm9yVGVzdGluZyA/PyB0cnVlO1xuXG4gIGJlZm9yZUFsbChhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmb3JUZXN0aW5nKSB7XG4gICAgICAvLyBmb3JUZXN0aW5nOiBmYWxzZeyduCDqsr3smrAg7J6s7LSI6riw7ZmU6rCAIO2VhOyalO2VmOuvgOuhnCDtlIzrnpjqt7gg7ZW07KCcXG4gICAgICBTb25hbXUuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCBTb25hbXUuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmb3JUZXN0aW5nKTtcbiAgfSk7XG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IERCLmNyZWF0ZVRlc3RUcmFuc2FjdGlvbigpO1xuICB9KTtcbiAgYWZ0ZXJFYWNoKGFzeW5jICh7IHRhc2sgfSkgPT4ge1xuICAgIHZpLnVzZVJlYWxUaW1lcnMoKTtcbiAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuXG4gICAgYXdhaXQgTmFpdGVSZXBvcnRlci5yZXBvcnRUZXN0UmVzdWx0KHtcbiAgICAgIHN1aXRlTmFtZTogdGFzay5zdWl0ZT8ubmFtZSA/PyBcIihubyBzdWl0ZSlcIixcbiAgICAgIHN1aXRlRmlsZVBhdGg6IHRhc2suZmlsZT8uZmlsZXBhdGgsXG4gICAgICB0ZXN0TmFtZTogdGFzay5uYW1lLFxuICAgICAgdGVzdEZpbGVQYXRoOiB0YXNrLmZpbGU/LmZpbGVwYXRoID8/IFwiXCIsXG4gICAgICB0ZXN0TGluZTogdGFzay5sb2NhdGlvbj8ubGluZSA/PyAwLFxuICAgICAgc3RhdHVzOiB0YXNrLnJlc3VsdD8uc3RhdGUgPz8gXCJwYXNzXCIsXG4gICAgICBkdXJhdGlvbjogdGFzay5yZXN1bHQ/LmR1cmF0aW9uID8/IDAsXG4gICAgICBlcnJvcjogdGFzay5yZXN1bHQ/LmVycm9ycz8uWzBdXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWVzc2FnZTogdGFzay5yZXN1bHQuZXJyb3JzWzBdLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogdGFzay5yZXN1bHQuZXJyb3JzWzBdLnN0YWNrLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB0cmFjZXM6IHRhc2subWV0YT8udHJhY2VzID8/IFtdLFxuICAgIH0pO1xuICB9KTtcbiAgYWZ0ZXJBbGwoKCkgPT4ge30pO1xufVxuXG5mdW5jdGlvbiBnZXRNb2NrQ29udGV4dCgpOiBDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgIHJlcXVlc3Q6IG51bGwgYXMgdW5rbm93biBhcyBDb250ZXh0W1wicmVxdWVzdFwiXSxcbiAgICByZXBseTogbnVsbCBhcyB1bmtub3duIGFzIENvbnRleHRbXCJyZXBseVwiXSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBjcmVhdGVTU0U6ICgoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiBtb2NrIGNvbnRleHRcIik7XG4gICAgfSkgYXMgQ29udGV4dFtcImNyZWF0ZVNTRVwiXSxcbiAgICBzZXNzaW9uOiBudWxsLFxuICAgIHVzZXI6IG51bGwsXG4gICAgbmFpdGVTdG9yZTogTmFpdGUuY3JlYXRlU3RvcmUoKSxcbiAgICBsb2NhbGU6IFwiXCIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgLy8gU29uYW11LmFzeW5jTG9jYWxTdG9yYWdlLnJ1buycvOuhnCBjb250ZXh0IOyEpOyglVxuICBhd2FpdCBTb25hbXUuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dDogY29udGV4dCA/PyBnZXRNb2NrQ29udGV4dCgpIH0sIGZuKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhNb2NrQ29udGV4dChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICBhd2FpdCBydW5XaXRoQ29udGV4dChnZXRNb2NrQ29udGV4dCgpLCBmbik7XG59XG5cbnR5cGUgVGVzdFJlc3VsdCA9IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2Ygdml0ZXN0VGVzdD4+O1xudHlwZSBUZXN0Q2FsbGJhY2tSZXN1bHQgPSB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbnR5cGUgVGVzdEVhY2ggPSA8VEFyZ3MgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KFxuICBjYXNlczogcmVhZG9ubHkgVEFyZ3NbXSxcbikgPT4gKHRpdGxlOiBzdHJpbmcsIGZuOiAoLi4uYXJnczogVEFyZ3MpID0+IFRlc3RDYWxsYmFja1Jlc3VsdCkgPT4gdm9pZDtcblxudHlwZSBUZXN0V3JhcHBlciA9IHtcbiAgKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IFRlc3RSZXN1bHQ7XG4gIHNraXA6ICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+IFRlc3RSZXN1bHQ7XG4gIG9ubHk6ICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+IFRlc3RSZXN1bHQ7XG4gIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2b2lkO1xuICBlYWNoOiBUZXN0RWFjaDtcbn07XG5cbnR5cGUgVGVzdEFzV3JhcHBlciA9IHtcbiAgPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgdXNlcjogVXNlcixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZuOiBUZXN0RnVuY3Rpb24sXG4gICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICApOiBUZXN0UmVzdWx0O1xuICBza2lwOiA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICkgPT4gVGVzdFJlc3VsdDtcbiAgb25seTogPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgdXNlcjogVXNlcixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZuOiBUZXN0RnVuY3Rpb24sXG4gICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICApID0+IFRlc3RSZXN1bHQ7XG4gIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2b2lkO1xufTtcblxuY29uc3QgZWFjaDogVGVzdEVhY2ggPSB2aXRlc3RUZXN0LmVhY2guYmluZCh2aXRlc3RUZXN0KTtcblxuZGVjbGFyZSBtb2R1bGUgXCJ2aXRlc3RcIiB7XG4gIGludGVyZmFjZSBUYXNrTWV0YSB7XG4gICAgdHJhY2VzOiBTZXJpYWxpemVkVHJhY2VbXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdGVzdDogVGVzdFdyYXBwZXIgPSBPYmplY3QuYXNzaWduKFxuICBhc3luYyAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIHZpdGVzdFRlc3QodGl0bGUsIG9wdGlvbnMsIGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICBhd2FpdCBydW5XaXRoTW9ja0NvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZuKGNvbnRleHQpO1xuICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHtcbiAgICBza2lwOiBhc3luYyAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSA9PlxuICAgICAgdml0ZXN0VGVzdC5za2lwKHRpdGxlLCBvcHRpb25zLCBmbiksXG4gICAgb25seTogYXN5bmMgKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucykgPT4ge1xuICAgICAgcmV0dXJuIHZpdGVzdFRlc3Qub25seSh0aXRsZSwgb3B0aW9ucywgYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aE1vY2tDb250ZXh0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZm4oY29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdG9kbzogKHRpdGxlOiBzdHJpbmcpID0+IHZpdGVzdFRlc3QudG9kbyh0aXRsZSksXG4gICAgZWFjaCxcbiAgfSxcbik7XG5cbmV4cG9ydCBjb25zdCB0ZXN0QXM6IFRlc3RBc1dyYXBwZXIgPSBPYmplY3QuYXNzaWduKFxuICBhc3luYyA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICkgPT4ge1xuICAgIHJldHVybiB2aXRlc3RUZXN0KHRpdGxlLCBvcHRpb25zLCBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgYXdhaXQgcnVuV2l0aENvbnRleHQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5nZXRNb2NrQ29udGV4dCgpLFxuICAgICAgICAgIHVzZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZm4oY29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcbiAge1xuICAgIHNraXA6IGFzeW5jIDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgICAgX3VzZXI6IFVzZXIsXG4gICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICAgIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyxcbiAgICApID0+IHZpdGVzdFRlc3Quc2tpcCh0aXRsZSwgb3B0aW9ucywgZm4pLFxuICAgIG9ubHk6IGFzeW5jIDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgICAgdXNlcjogVXNlcixcbiAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICBmbjogVGVzdEZ1bmN0aW9uLFxuICAgICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICAgICkgPT4ge1xuICAgICAgcmV0dXJuIHZpdGVzdFRlc3Qub25seSh0aXRsZSwgb3B0aW9ucywgYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aENvbnRleHQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uZ2V0TW9ja0NvbnRleHQoKSxcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBmbihjb250ZXh0KTtcbiAgICAgICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2aXRlc3RUZXN0LnRvZG8odGl0bGUpLFxuICB9LFxuKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1lBSXNDO1FBQ0g7V0FDRztBQWV0QyxTQUFnQixVQUFVLElBQWlCLFNBQTRCO0NBQ3JFLE1BQU0sYUFBYSxTQUFTLGNBQWM7Q0FFMUMsVUFBVSxZQUFZO0VBQ3BCLElBQUksQ0FBQyxZQUVILE9BQU8sZ0JBQWdCO0VBRXpCLE1BQU0sT0FBTyxLQUFLLE1BQU0sT0FBTyxRQUFXLFVBQVU7Q0FDdEQsQ0FBQztDQUNELFdBQVcsWUFBWTtFQUNyQixNQUFNLEdBQUcsc0JBQXNCO0NBQ2pDLENBQUM7Q0FDRCxVQUFVLE9BQU8sRUFBRSxXQUFX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
132
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwibmFtZXMiOlsidml0ZXN0VGVzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Jvb3RzdHJhcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZnRlckFsbCwgYWZ0ZXJFYWNoLCBiZWZvcmVBbGwsIGJlZm9yZUVhY2gsIHRlc3QgYXMgdml0ZXN0VGVzdCB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB7IHR5cGUgVGVzdEZ1bmN0aW9uLCB0eXBlIFRlc3RPcHRpb25zLCB0eXBlIFZpdGVzdFV0aWxzIH0gZnJvbSBcInZpdGVzdFwiO1xuXG5pbXBvcnQgeyB0eXBlIENvbnRleHQgfSBmcm9tIFwiLi4vYXBpL2NvbnRleHRcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgU2VyaWFsaXplZFRyYWNlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBOYWl0ZVJlcG9ydGVyIH0gZnJvbSBcIi4uL25haXRlL25haXRlLXJlcG9ydGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb25hbXUg7LSI6riw7ZmUIOuqqOuTnOulvCDsp4DsoJXtlanri4jri6QuXG4gICAqIC0gdHJ1ZSAo6riw67O46rCSKTog7YWM7Iqk7YyFIOuqqOuTnOuhnCDstIjquLDtmZQgKOu5oOumhCwgU3luY2VyL1Rhc2sg7IOd6561KVxuICAgKiAtIGZhbHNlOiDsoITssrQg7LSI6riw7ZmUIChTeW5jZXIsIFRhc2ssIEVudGl0eU1hbmFnZXIg65OxIOuqqOuRkCDroZzrk5wpXG4gICAqXG4gICAqIG1pZ3JhdG9yLCBzeW5jZXIsIHRlbXBsYXRlIOuTseydmCDthYzsiqTtirjsl5DshJzripQgZmFsc2Xrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKi9cbiAgZm9yVGVzdGluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXAodmk6IFZpdGVzdFV0aWxzLCBvcHRpb25zPzogQm9vdHN0cmFwT3B0aW9ucykge1xuICBjb25zdCBmb3JUZXN0aW5nID0gb3B0aW9ucz8uZm9yVGVzdGluZyA/PyB0cnVlO1xuXG4gIGJlZm9yZUFsbChhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmb3JUZXN0aW5nKSB7XG4gICAgICAvLyBmb3JUZXN0aW5nOiBmYWxzZeyduCDqsr3smrAg7J6s7LSI6riw7ZmU6rCAIO2VhOyalO2VmOuvgOuhnCDtlIzrnpjqt7gg7ZW07KCcXG4gICAgICBTb25hbXUuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCBTb25hbXUuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmb3JUZXN0aW5nKTtcbiAgfSk7XG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IERCLmNyZWF0ZVRlc3RUcmFuc2FjdGlvbigpO1xuICB9KTtcbiAgYWZ0ZXJFYWNoKGFzeW5jICh7IHRhc2sgfSkgPT4ge1xuICAgIHZpLnVzZVJlYWxUaW1lcnMoKTtcbiAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuXG4gICAgYXdhaXQgTmFpdGVSZXBvcnRlci5yZXBvcnRUZXN0UmVzdWx0KHtcbiAgICAgIHN1aXRlTmFtZTogdGFzay5zdWl0ZT8ubmFtZSA/PyBcIihubyBzdWl0ZSlcIixcbiAgICAgIHN1aXRlRmlsZVBhdGg6IHRhc2suZmlsZT8uZmlsZXBhdGgsXG4gICAgICB0ZXN0TmFtZTogdGFzay5uYW1lLFxuICAgICAgdGVzdEZpbGVQYXRoOiB0YXNrLmZpbGU/LmZpbGVwYXRoID8/IFwiXCIsXG4gICAgICB0ZXN0TGluZTogdGFzay5sb2NhdGlvbj8ubGluZSA/PyAwLFxuICAgICAgc3RhdHVzOiB0YXNrLnJlc3VsdD8uc3RhdGUgPz8gXCJwYXNzXCIsXG4gICAgICBkdXJhdGlvbjogdGFzay5yZXN1bHQ/LmR1cmF0aW9uID8/IDAsXG4gICAgICBlcnJvcjogdGFzay5yZXN1bHQ/LmVycm9ycz8uWzBdXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWVzc2FnZTogdGFzay5yZXN1bHQuZXJyb3JzWzBdLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogdGFzay5yZXN1bHQuZXJyb3JzWzBdLnN0YWNrLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB0cmFjZXM6IHRhc2subWV0YT8udHJhY2VzID8/IFtdLFxuICAgIH0pO1xuICB9KTtcbiAgYWZ0ZXJBbGwoKCkgPT4ge30pO1xufVxuXG5mdW5jdGlvbiBnZXRNb2NrQ29udGV4dCgpOiBDb250ZXh0IHtcbiAgLy8gU0FGRVRZOiDthYzsiqTtirgg7Luo7YWN7Iqk7Yq47JeQ7ISc64qUIEZhc3RpZnkg7JqU7LKt6rO8IOydkeuLteydhCDsgqzsmqntlZjsp4Ag7JWK7Jy866mwIOygkeq3vCDsi5wg7KaJ7IucIOyLpO2MqO2VtOyVvCDtlanri4jri6QuXG4gIGNvbnN0IHJlcXVlc3Q6IENvbnRleHRbXCJyZXF1ZXN0XCJdID0gbnVsbCBhcyBuZXZlcjtcbiAgLy8gU0FGRVRZOiDthYzsiqTtirgg7Luo7YWN7Iqk7Yq47JeQ7ISc64qUIEZhc3RpZnkg7JqU7LKt6rO8IOydkeuLteydhCDsgqzsmqntlZjsp4Ag7JWK7Jy866mwIOygkeq3vCDsi5wg7KaJ7IucIOyLpO2MqO2VtOyVvCDtlanri4jri6QuXG4gIGNvbnN0IHJlcGx5OiBDb250ZXh0W1wicmVwbHlcIl0gPSBudWxsIGFzIG5ldmVyO1xuICAvLyBTQUZFVFk6IOuqqOydmCDqtaztmITsnYAg7Iuk7KCcIGNyZWF0ZVNTReyZgCDqsJnsnYAg7Zi47LacIOqzhOyVveydhCDsnKDsp4DtlZjrkJgg7ZWt7IOBIOuqheyLnOyggeycvOuhnCDsi6TtjKjtlanri4jri6QuXG4gIGNvbnN0IGNyZWF0ZVNTRSA9ICgoKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY3JlYXRlU1NFIGlzIG5vdCBhdmFpbGFibGUgaW4gbW9jayBjb250ZXh0XCIpO1xuICB9KSBhcyBDb250ZXh0W1wiY3JlYXRlU1NFXCJdO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICByZXF1ZXN0LFxuICAgIHJlcGx5LFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIGNyZWF0ZVNTRSxcbiAgICBzZXNzaW9uOiBudWxsLFxuICAgIHVzZXI6IG51bGwsXG4gICAgbmFpdGVTdG9yZTogTmFpdGUuY3JlYXRlU3RvcmUoKSxcbiAgICBsb2NhbGU6IFwiXCIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgLy8gU29uYW11LmFzeW5jTG9jYWxTdG9yYWdlLnJ1buycvOuhnCBjb250ZXh0IOyEpOyglVxuICBhd2FpdCBTb25hbXUuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dDogY29udGV4dCA/PyBnZXRNb2NrQ29udGV4dCgpIH0sIGZuKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhNb2NrQ29udGV4dChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICBhd2FpdCBydW5XaXRoQ29udGV4dChnZXRNb2NrQ29udGV4dCgpLCBmbik7XG59XG5cbnR5cGUgVGVzdFJlc3VsdCA9IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2Ygdml0ZXN0VGVzdD4+O1xudHlwZSBUZXN0Q2FsbGJhY2tSZXN1bHQgPSB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbnR5cGUgVGVzdEVhY2ggPSA8VEFyZ3MgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KFxuICBjYXNlczogcmVhZG9ubHkgVEFyZ3NbXSxcbikgPT4gKHRpdGxlOiBzdHJpbmcsIGZuOiAoLi4uYXJnczogVEFyZ3MpID0+IFRlc3RDYWxsYmFja1Jlc3VsdCkgPT4gdm9pZDtcblxudHlwZSBUZXN0V3JhcHBlciA9IHtcbiAgKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IFRlc3RSZXN1bHQ7XG4gIHNraXA6ICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+IFRlc3RSZXN1bHQ7XG4gIG9ubHk6ICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+IFRlc3RSZXN1bHQ7XG4gIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2b2lkO1xuICBlYWNoOiBUZXN0RWFjaDtcbn07XG5cbnR5cGUgVGVzdEFzV3JhcHBlciA9IHtcbiAgPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgdXNlcjogVXNlcixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZuOiBUZXN0RnVuY3Rpb24sXG4gICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICApOiBUZXN0UmVzdWx0O1xuICBza2lwOiA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICkgPT4gVGVzdFJlc3VsdDtcbiAgb25seTogPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgdXNlcjogVXNlcixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZuOiBUZXN0RnVuY3Rpb24sXG4gICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICApID0+IFRlc3RSZXN1bHQ7XG4gIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2b2lkO1xufTtcblxuY29uc3QgZWFjaDogVGVzdEVhY2ggPSB2aXRlc3RUZXN0LmVhY2guYmluZCh2aXRlc3RUZXN0KTtcblxuZGVjbGFyZSBtb2R1bGUgXCJ2aXRlc3RcIiB7XG4gIGludGVyZmFjZSBUYXNrTWV0YSB7XG4gICAgdHJhY2VzOiBTZXJpYWxpemVkVHJhY2VbXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdGVzdDogVGVzdFdyYXBwZXIgPSBPYmplY3QuYXNzaWduKFxuICBhc3luYyAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIHZpdGVzdFRlc3QodGl0bGUsIG9wdGlvbnMsIGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICBhd2FpdCBydW5XaXRoTW9ja0NvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZuKGNvbnRleHQpO1xuICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHtcbiAgICBza2lwOiBhc3luYyAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSA9PlxuICAgICAgdml0ZXN0VGVzdC5za2lwKHRpdGxlLCBvcHRpb25zLCBmbiksXG4gICAgb25seTogYXN5bmMgKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucykgPT4ge1xuICAgICAgcmV0dXJuIHZpdGVzdFRlc3Qub25seSh0aXRsZSwgb3B0aW9ucywgYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aE1vY2tDb250ZXh0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZm4oY29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdG9kbzogKHRpdGxlOiBzdHJpbmcpID0+IHZpdGVzdFRlc3QudG9kbyh0aXRsZSksXG4gICAgZWFjaCxcbiAgfSxcbik7XG5cbmV4cG9ydCBjb25zdCB0ZXN0QXM6IFRlc3RBc1dyYXBwZXIgPSBPYmplY3QuYXNzaWduKFxuICBhc3luYyA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICkgPT4ge1xuICAgIHJldHVybiB2aXRlc3RUZXN0KHRpdGxlLCBvcHRpb25zLCBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgYXdhaXQgcnVuV2l0aENvbnRleHQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5nZXRNb2NrQ29udGV4dCgpLFxuICAgICAgICAgIHVzZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZm4oY29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcbiAge1xuICAgIHNraXA6IGFzeW5jIDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgICAgX3VzZXI6IFVzZXIsXG4gICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICAgIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyxcbiAgICApID0+IHZpdGVzdFRlc3Quc2tpcCh0aXRsZSwgb3B0aW9ucywgZm4pLFxuICAgIG9ubHk6IGFzeW5jIDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgICAgdXNlcjogVXNlcixcbiAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICBmbjogVGVzdEZ1bmN0aW9uLFxuICAgICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICAgICkgPT4ge1xuICAgICAgcmV0dXJuIHZpdGVzdFRlc3Qub25seSh0aXRsZSwgb3B0aW9ucywgYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aENvbnRleHQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uZ2V0TW9ja0NvbnRleHQoKSxcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBmbihjb250ZXh0KTtcbiAgICAgICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2aXRlc3RUZXN0LnRvZG8odGl0bGUpLFxuICB9LFxuKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1lBSXNDO1FBQ0g7V0FDRztBQWV0QyxTQUFnQixVQUFVLElBQWlCLFNBQTRCO0NBQ3JFLE1BQU0sYUFBYSxTQUFTLGNBQWM7Q0FFMUMsVUFBVSxZQUFZO0VBQ3BCLElBQUksQ0FBQyxZQUVILE9BQU8sZ0JBQWdCO0VBRXpCLE1BQU0sT0FBTyxLQUFLLE1BQU0sT0FBTyxRQUFXLFVBQVU7Q0FDdEQsQ0FBQztDQUNELFdBQVcsWUFBWTtFQUNyQixNQUFNLEdBQUcsc0JBQXNCO0NBQ2pDLENBQUM7Q0FDRCxVQUFVLE9BQU8sRUFBRSxXQUFXO0VBQzVCLEdBQUcsY0FBYztFQUNqQixNQUFNLEdBQUcscUJBQXFCO0VBRTlCLE1BQU0sY0FBYyxpQkFBaUI7R0FDbkMsV0FBVyxLQUFLLE9BQU8sUUFBUTtHQUMvQixlQUFlLEtBQUssTUFBTTtHQUMxQixVQUFVLEtBQUs7R0FDZixjQUFjLEtBQUssTUFBTSxZQUFZO0dBQ3JDLFVBQVUsS0FBSyxVQUFVLFFBQVE7R0FDakMsUUFBUSxLQUFLLFFBQVEsU0FBUztHQUM5QixVQUFVLEtBQUssUUFBUSxZQUFZO0dBQ25DLE9BQU8sS0FBSyxRQUFRLFNBQVMsS0FDekI7SUFDRSxTQUFTLEtBQUssT0FBTyxPQUFPLEVBQUUsQ0FBQztJQUMvQixPQUFPLEtBQUssT0FBTyxPQUFPLEVBQUUsQ0FBQztHQUMvQixJQUNBO0dBQ0osUUFBUSxLQUFLLE1BQU0sVUFBVSxDQUFDO0VBQ2hDLENBQUM7Q0FDSCxDQUFDO0NBQ0QsZUFBZSxDQUFDLENBQUM7QUFDbkI7QUFFQSxTQUFTLGlCQUEwQjtDQUVqQyxNQUFNLFVBQThCO0NBRXBDLE1BQU0sUUFBMEI7Q0FFaEMsTUFBTSxtQkFBbUI7RUFDdkIsTUFBTSxJQUFJLE1BQU0sNENBQTRDO0NBQzlEO0NBRUEsT0FBTztFQUNMLFdBQVc7RUFDWDtFQUNBO0VBQ0EsU0FBUyxDQUFDO0VBQ1Y7RUFDQSxTQUFTO0VBQ1QsTUFBTTtFQUNOLFlBQVksTUFBTSxZQUFZO0VBQzlCLFFBQVE7Q0FDVjtBQUNGO0FBRUEsZUFBc0IsZUFBZSxTQUF5QixJQUF5QjtDQUVyRixNQUFNLE9BQU8sa0JBQWtCLElBQUksRUFBRSxTQUFTLFdBQVcsZUFBZSxFQUFFLEdBQUcsRUFBRTtBQUNqRjtBQUVBLGVBQXNCLG1CQUFtQixJQUF5QjtDQUNoRSxNQUFNLGVBQWUsZUFBZSxHQUFHLEVBQUU7QUFDM0M7QUFzQ0EsTUFBTSxPQUFpQkEsT0FBVyxLQUFLLEtBQUtBLE1BQVU7QUFRdEQsTUFBYSxPQUFvQixPQUFPLE9BQ3RDLE9BQU8sT0FBZSxJQUFrQixZQUEwQjtDQUNoRSxPQUFPQSxPQUFXLE9BQU8sU0FBUyxPQUFPLFlBQVk7RUFDbkQsTUFBTSxtQkFBbUIsWUFBWTtHQUNuQyxJQUFJO0lBQ0YsTUFBTSxHQUFHLE9BQU87SUFDaEIsUUFBUSxLQUFLLEtBQUssU0FBUyxNQUFNLGFBQWE7R0FDaEQsU0FBUyxHQUFZO0lBQ25CLFFBQVEsS0FBSyxLQUFLLFNBQVMsTUFBTSxhQUFhO0lBQzlDLE1BQU07R0FDUjtFQUNGLENBQUM7Q0FDSCxDQUFDO0FBQ0gsR0FDQTtDQUNFLE1BQU0sT0FBTyxPQUFlLElBQWtCLFlBQzVDQSxPQUFXLEtBQUssT0FBTyxTQUFTLEVBQUU7Q0FDcEMsTUFBTSxPQUFPLE9BQWUsSUFBa0IsWUFBMEI7RUFDdEUsT0FBT0EsT0FBVyxLQUFLLE9BQU8sU0FBUyxPQUFPLFlBQVk7R0FDeEQsTUFBTSxtQkFBbUIsWUFBWTtJQUNuQyxJQUFJO0tBQ0YsTUFBTSxHQUFHLE9BQU87S0FDaEIsUUFBUSxLQUFLLEtBQUssU0FBUyxNQUFNLGFBQWE7SUFDaEQsU0FBUyxHQUFZO0tBQ25CLFFBQVEsS0FBSyxLQUFLLFNBQVMsTUFBTSxhQUFhO0tBQzlDLE1BQU07SUFDUjtHQUNGLENBQUM7RUFDSCxDQUFDO0NBQ0g7Q0FDQSxPQUFPLFVBQWtCQSxPQUFXLEtBQUssS0FBSztDQUM5QztBQUNGLENBQ0Y7QUFFQSxNQUFhLFNBQXdCLE9BQU8sT0FDMUMsT0FDRSxNQUNBLE9BQ0EsSUFDQSxZQUNHO0NBQ0gsT0FBT0EsT0FBVyxPQUFPLFNBQVMsT0FBTyxZQUFZO0VBQ25ELE1BQU0sZUFDSjtHQUNFLEdBQUcsZUFBZTtHQUNsQjtFQUNGLEdBQ0EsWUFBWTtHQUNWLElBQUk7SUFDRixNQUFNLEdBQUcsT0FBTztJQUNoQixRQUFRLEtBQUssS0FBSyxTQUFTLE1BQU0sYUFBYTtHQUNoRCxTQUFTLEdBQVk7SUFDbkIsUUFBUSxLQUFLLEtBQUssU0FBUyxNQUFNLGFBQWE7SUFDOUMsTUFBTTtHQUNSO0VBQ0YsQ0FDRjtDQUNGLENBQUM7QUFDSCxHQUNBO0NBQ0UsTUFBTSxPQUNKLE9BQ0EsT0FDQSxJQUNBLFlBQ0dBLE9BQVcsS0FBSyxPQUFPLFNBQVMsRUFBRTtDQUN2QyxNQUFNLE9BQ0osTUFDQSxPQUNBLElBQ0EsWUFDRztFQUNILE9BQU9BLE9BQVcsS0FBSyxPQUFPLFNBQVMsT0FBTyxZQUFZO0dBQ3hELE1BQU0sZUFDSjtJQUNFLEdBQUcsZUFBZTtJQUNsQjtHQUNGLEdBQ0EsWUFBWTtJQUNWLElBQUk7S0FDRixNQUFNLEdBQUcsT0FBTztLQUNoQixRQUFRLEtBQUssS0FBSyxTQUFTLE1BQU0sYUFBYTtJQUNoRCxTQUFTLEdBQVk7S0FDbkIsUUFBUSxLQUFLLEtBQUssU0FBUyxNQUFNLGFBQWE7S0FDOUMsTUFBTTtJQUNSO0dBQ0YsQ0FDRjtFQUNGLENBQUM7Q0FDSDtDQUNBLE9BQU8sVUFBa0JBLE9BQVcsS0FBSyxLQUFLO0FBQ2hELENBQ0YifQ==
@@ -1,15 +1,40 @@
1
1
  import { type Knex } from "knex";
2
+ import { z } from "zod";
2
3
  import { type CacheManager } from "../cache/types";
3
4
  import { type EntityManager } from "../entity/entity-manager";
4
5
  export type DataExplorerStrategy = "sample" | "ids" | "query" | "file" | "recent" | "random";
6
+ export type DataExplorerValue = string | number | boolean | bigint | Date | Uint8Array | null | undefined | DataExplorerValue[] | DataExplorerRecord;
7
+ export type DataExplorerRecord = {
8
+ [columnName: string]: DataExplorerValue;
9
+ };
10
+ export declare const dataExplorerValueSchema: z.ZodType<DataExplorerValue>;
11
+ export declare const dataExplorerRecordSchema: z.ZodRecord<z.ZodString, z.ZodType<DataExplorerValue, unknown, z.core.$ZodTypeInternals<DataExplorerValue, unknown>>>;
12
+ export declare const dataExplorerRecordsSchema: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodType<DataExplorerValue, unknown, z.core.$ZodTypeInternals<DataExplorerValue, unknown>>>>;
13
+ export declare const dataSourceConfigSchema: z.ZodObject<{
14
+ strategy: z.ZodOptional<z.ZodEnum<{
15
+ file: "file";
16
+ sample: "sample";
17
+ ids: "ids";
18
+ query: "query";
19
+ recent: "recent";
20
+ random: "random";
21
+ }>>;
22
+ limit: z.ZodOptional<z.ZodNumber>;
23
+ where: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<DataExplorerValue, unknown, z.core.$ZodTypeInternals<DataExplorerValue, unknown>>>>;
24
+ orderBy: z.ZodOptional<z.ZodString>;
25
+ ids: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
26
+ filePath: z.ZodOptional<z.ZodString>;
27
+ useCache: z.ZodOptional<z.ZodBoolean>;
28
+ cacheTtl: z.ZodOptional<z.ZodNumber>;
29
+ }, z.core.$strip>;
5
30
  /** WHERE 조건 타입 (객체 또는 Knex QueryBuilder 함수) */
6
- export type WhereCondition = Record<string, unknown> | ((queryBuilder: Knex.QueryBuilder) => void);
31
+ export type WhereCondition = object | ((queryBuilder: Knex.QueryBuilder) => void);
7
32
  export type DataExplorerOptions = {
8
33
  strategy: DataExplorerStrategy;
9
34
  limit?: number;
10
35
  where?: WhereCondition;
11
36
  orderBy?: string;
12
- ids?: number[];
37
+ ids?: (number | string)[];
13
38
  filePath?: string;
14
39
  /** 캐싱 사용 여부 (기본값: false) */
15
40
  useCache?: boolean;
@@ -26,27 +51,27 @@ export type ExploreWithRelationsResult = {
26
51
  /** 메인 entity 데이터 */
27
52
  main: {
28
53
  entityId: string;
29
- records: Record<string, unknown>[];
54
+ records: DataExplorerRecord[];
30
55
  };
31
56
  /** 관련 entity 데이터 (entityId -> records) */
32
- related: Map<string, Record<string, unknown>[]>;
57
+ related: Map<string, DataExplorerRecord[]>;
33
58
  };
34
59
  export declare class DataExplorer {
35
60
  private db;
36
61
  private entityManager;
37
62
  private cache?;
38
63
  constructor(db: Knex, entityManager: typeof EntityManager, cacheManager?: CacheManager);
39
- explore(entityName: string, options: DataExplorerOptions): Promise<Record<string, unknown>[]>;
64
+ explore(entityName: string, options: DataExplorerOptions): Promise<DataExplorerRecord[]>;
40
65
  private exploreInternal;
41
66
  private sampleData;
42
67
  private randomSample;
43
68
  private findTimestampColumn;
44
69
  private loadFromFile;
45
- exploreRelation(entityName: string, relationProp: string, options?: Partial<DataExplorerOptions>): Promise<Record<string, unknown>[]>;
70
+ exploreRelation(entityName: string, relationProp: string, options?: Partial<DataExplorerOptions>): Promise<DataExplorerRecord[]>;
46
71
  /**
47
72
  * 여러 relation을 병렬로 조회합니다 (N+1 문제 해결)
48
73
  */
49
- exploreRelations(entityName: string, relationProps: string[], options?: Partial<DataExplorerOptions>): Promise<Record<string, Record<string, unknown>[]>>;
74
+ exploreRelations(entityName: string, relationProps: string[], options?: Partial<DataExplorerOptions>): Promise<Record<string, DataExplorerRecord[]>>;
50
75
  private generateCacheKey;
51
76
  /**
52
77
  * Entity와 관련된 데이터를 재귀적으로 탐색합니다.
@@ -1 +1 @@
1
- {"version":3,"file":"data-explorer.d.ts","sourceRoot":"","sources":["../../src/testing/data-explorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7F,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC;AAEnG,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,mBAAmB,GAAG;IAC9D,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,oBAAoB;IACpB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;KACpC,CAAC;IACF,0CAA0C;IAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;CACjD,CAAC;AAGF,qBAAa,YAAY;IAIrB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,aAAa;IAJvB,OAAO,CAAC,KAAK,CAAC,CAAe;gBAGnB,EAAE,EAAE,IAAI,EACR,aAAa,EAAE,OAAO,aAAa,EAC3C,YAAY,CAAC,EAAE,YAAY;IAKvB,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAmBvB,eAAe;YAsDf,UAAU;YAqCV,YAAY;IAO1B,OAAO,CAAC,mBAAmB;YAKb,YAAY;IA8BpB,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAuBrC;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAWrD,OAAO,CAAC,gBAAgB;IAoBxB;;;OAGG;IACG,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC;IA6BtC;;OAEG;YACW,kBAAkB;CAkHjC"}
1
+ {"version":3,"file":"data-explorer.d.ts","sourceRoot":"","sources":["../../src/testing/data-explorer.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,44 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
- import { init_utils, nonNullable } from "../utils/utils.js";
2
+ import { init_runtime_value, isFunctionValue } from "../utils/runtime-value.js";
3
3
  import { init_types, isBelongsToOneRelationProp, isOneToOneRelationProp, isRelationProp } from "../types/types.js";
4
+ import { z } from "zod";
4
5
  //#region src/testing/data-explorer.ts
5
- var DataExplorer;
6
+ var dataExplorerValueSchema, dataExplorerRecordSchema, dataExplorerRecordsSchema, dataExplorerDirectionSchema, dataSourceConfigSchema, DataExplorer;
6
7
  var init_data_explorer = __esmMin((() => {
7
8
  init_types();
8
- init_utils();
9
+ init_runtime_value();
10
+ dataExplorerValueSchema = z.lazy(() => z.union([
11
+ z.string(),
12
+ z.number(),
13
+ z.boolean(),
14
+ z.bigint(),
15
+ z.date(),
16
+ z.instanceof(Uint8Array),
17
+ z.null(),
18
+ z.undefined(),
19
+ z.array(dataExplorerValueSchema),
20
+ z.record(z.string(), dataExplorerValueSchema)
21
+ ]));
22
+ dataExplorerRecordSchema = z.record(z.string(), dataExplorerValueSchema);
23
+ dataExplorerRecordsSchema = z.array(dataExplorerRecordSchema);
24
+ dataExplorerDirectionSchema = z.enum(["asc", "desc"]);
25
+ dataSourceConfigSchema = z.object({
26
+ strategy: z.enum([
27
+ "sample",
28
+ "ids",
29
+ "query",
30
+ "file",
31
+ "recent",
32
+ "random"
33
+ ]).optional(),
34
+ limit: z.number().optional(),
35
+ where: z.record(z.string(), dataExplorerValueSchema).optional(),
36
+ orderBy: z.string().optional(),
37
+ ids: z.array(z.union([z.number(), z.string()])).optional(),
38
+ filePath: z.string().optional(),
39
+ useCache: z.boolean().optional(),
40
+ cacheTtl: z.number().optional()
41
+ });
9
42
  DataExplorer = class {
10
43
  db;
11
44
  entityManager;
@@ -35,20 +68,25 @@ var init_data_explorer = __esmMin((() => {
35
68
  case "recent": {
36
69
  const createdAtCol = this.findTimestampColumn(entity, "created_at");
37
70
  if (createdAtCol) query.orderBy(createdAtCol, "desc");
38
- return await query.limit(options.limit || 10);
71
+ return dataExplorerRecordsSchema.parse(await query.limit(options.limit || 10));
39
72
  }
40
73
  case "random": return await this.randomSample(query, options.limit || 10);
41
74
  case "ids":
42
75
  if (options.ids && options.ids.length > 0) query.whereIn("id", options.ids);
43
- return await query;
76
+ return dataExplorerRecordsSchema.parse(await query);
44
77
  case "query":
45
- if (options.where) query.where(options.where);
78
+ if (options.where) {
79
+ const whereCallback = z.custom(isFunctionValue).safeParse(options.where);
80
+ if (whereCallback.success) query.where(whereCallback.data);
81
+ else query.where(dataExplorerRecordSchema.parse(options.where));
82
+ }
46
83
  if (options.orderBy) {
47
84
  const [col, dir = "asc"] = options.orderBy.split(":");
48
- if (col === "id") query.orderByRaw(`CAST(?? AS INTEGER) ${dir}`, [col]);
49
- else query.orderBy(col, dir);
85
+ const direction = dataExplorerDirectionSchema.parse(dir);
86
+ if (col === "id") query.orderByRaw(`CAST(?? AS INTEGER) ${direction}`, [col]);
87
+ else query.orderBy(col, direction);
50
88
  }
51
- return await query.limit(options.limit || 10);
89
+ return dataExplorerRecordsSchema.parse(await query.limit(options.limit || 10));
52
90
  case "file":
53
91
  if (!options.filePath) throw new Error("filePath is required for file strategy");
54
92
  return this.loadFromFile(options.filePath);
@@ -58,11 +96,11 @@ var init_data_explorer = __esmMin((() => {
58
96
  async sampleData(query, limit) {
59
97
  const [{ count }] = await query.clone().count("* as count");
60
98
  const total = Number(count);
61
- if (total <= limit) return await query.limit(limit);
99
+ if (total <= limit) return dataExplorerRecordsSchema.parse(await query.limit(limit));
62
100
  const interval = Math.floor(total / limit);
63
101
  const tableName = query.toString().match(/from\s+"?(\w+)"?/i)?.[1];
64
102
  if (!tableName) throw new Error("Could not extract table name from query");
65
- return (await this.db.raw(`
103
+ const result = await this.db.raw(`
66
104
  WITH numbered_rows AS (
67
105
  SELECT *, ROW_NUMBER() OVER (ORDER BY id) as rn
68
106
  FROM ??
@@ -74,30 +112,31 @@ var init_data_explorer = __esmMin((() => {
74
112
  tableName,
75
113
  interval,
76
114
  limit
77
- ])).rows;
115
+ ]);
116
+ return dataExplorerRecordsSchema.parse(result.rows);
78
117
  }
79
118
  async randomSample(query, limit) {
80
- return await query.orderByRaw("RANDOM()").limit(limit);
119
+ return dataExplorerRecordsSchema.parse(await query.orderByRaw("RANDOM()").limit(limit));
81
120
  }
82
121
  findTimestampColumn(entity, columnName) {
83
122
  return entity.props.find((p) => p.name === columnName)?.name || null;
84
123
  }
85
124
  async loadFromFile(filePath) {
86
125
  const content = await (await import("fs/promises")).readFile(filePath, "utf-8");
87
- if (filePath.endsWith(".json")) {
88
- const parsed = JSON.parse(content);
89
- if (!Array.isArray(parsed)) throw new Error("JSON file must contain an array");
90
- return parsed;
91
- } else if (filePath.endsWith(".csv")) {
126
+ if (filePath.endsWith(".json")) try {
127
+ const parsed = dataExplorerRecordsSchema.safeParse(JSON.parse(content));
128
+ if (!parsed.success) throw new Error("JSON file must contain an array of records");
129
+ return parsed.data;
130
+ } catch (error) {
131
+ throw new Error("JSON file must contain a valid array of records", { cause: error });
132
+ }
133
+ else if (filePath.endsWith(".csv")) {
92
134
  const lines = content.split("\n").filter((line) => line.trim());
93
135
  if (lines.length === 0) return [];
94
136
  const headers = lines[0].split(",").map((h) => h.trim());
95
137
  return lines.slice(1).map((line) => {
96
138
  const values = line.split(",");
97
- return headers.reduce((obj, header, i) => {
98
- obj[header] = values[i]?.trim();
99
- return obj;
100
- }, {});
139
+ return Object.fromEntries(headers.map((header, index) => [header, values[index]?.trim()]));
101
140
  });
102
141
  }
103
142
  throw new Error(`Unsupported file format: ${filePath}`);
@@ -107,13 +146,14 @@ var init_data_explorer = __esmMin((() => {
107
146
  if (!prop || !isRelationProp(prop)) throw new Error(`Relation property not found: ${entityName}.${relationProp}`);
108
147
  const dataSource = prop.cone?.dataSource;
109
148
  const strategy = dataSource?.strategy || options?.strategy || "sample";
110
- const config = dataSource?.config && typeof dataSource.config === "object" ? dataSource.config : {};
111
- return this.explore(prop.with, {
149
+ const config = dataSourceConfigSchema.parse(dataSource?.config ?? {});
150
+ const exploreOptions = {
112
151
  strategy,
113
- limit: options?.limit || (typeof config.limit === "number" ? config.limit : 10),
114
- ...typeof config === "object" ? config : {},
152
+ limit: options?.limit ?? config.limit ?? 10,
153
+ ...config,
115
154
  ...options
116
- });
155
+ };
156
+ return this.explore(prop.with, exploreOptions);
117
157
  }
118
158
  /**
119
159
  * 여러 relation을 병렬로 조회합니다 (N+1 문제 해결)
@@ -161,14 +201,20 @@ var init_data_explorer = __esmMin((() => {
161
201
  async collectRelatedData(entityName, records, relatedMap, visited, remainingDepth) {
162
202
  if (remainingDepth <= 0 || records.length === 0) return;
163
203
  const entity = this.entityManager.get(entityName);
164
- const recordIds = records.map((r) => r.id).filter(nonNullable);
204
+ const recordIds = records.flatMap((record) => {
205
+ const parsedId = z.union([z.number(), z.string()]).safeParse(record.id);
206
+ return parsedId.success ? [parsedId.data] : [];
207
+ });
165
208
  const forwardRelationProps = entity.props.filter((prop) => isRelationProp(prop) && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn));
166
209
  for (const prop of forwardRelationProps) {
167
210
  if (!isRelationProp(prop)) continue;
168
211
  const targetEntityName = prop.with;
169
212
  if (visited.has(targetEntityName)) continue;
170
213
  const foreignKeyName = `${prop.name}_id`;
171
- const referencedIds = records.map((record) => record[foreignKeyName]).filter(Boolean);
214
+ const referencedIds = records.flatMap((record) => {
215
+ const parsedId = z.union([z.number(), z.string()]).safeParse(record[foreignKeyName]);
216
+ return parsedId.success ? [parsedId.data] : [];
217
+ });
172
218
  if (referencedIds.length === 0) continue;
173
219
  const uniqueIds = [...new Set(referencedIds)];
174
220
  const referencedRecords = await this.explore(targetEntityName, {
@@ -199,6 +245,6 @@ var init_data_explorer = __esmMin((() => {
199
245
  }));
200
246
  //#endregion
201
247
  init_data_explorer();
202
- export { DataExplorer, init_data_explorer };
248
+ export { DataExplorer, dataExplorerRecordSchema, dataExplorerRecordsSchema, dataExplorerValueSchema, dataSourceConfigSchema, init_data_explorer };
203
249
 
204
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9kYXRhLWV4cGxvcmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCwgaXNSZWxhdGlvblByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gXCJzYW1wbGVcIiB8IFwiaWRzXCIgfCBcInF1ZXJ5XCIgfCBcImZpbGVcIiB8IFwicmVjZW50XCIgfCBcInJhbmRvbVwiO1xuXG4vKiogV0hFUkUg7KGw6rG0IO2DgOyehSAo6rCd7LK0IOuYkOuKlCBLbmV4IFF1ZXJ5QnVpbGRlciDtlajsiJgpICovXG5leHBvcnQgdHlwZSBXaGVyZUNvbmRpdGlvbiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgKChxdWVyeUJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSA9PiB2b2lkKTtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyT3B0aW9ucyA9IHtcbiAgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IG51bWJlcjtcbiAgd2hlcmU/OiBXaGVyZUNvbmRpdGlvbjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgaWRzPzogbnVtYmVyW107XG4gIGZpbGVQYXRoPzogc3RyaW5nO1xuICAvKiog7LqQ7IuxIOyCrOyaqSDsl6zrtoAgKOq4sOuzuOqwkjogZmFsc2UpICovXG4gIHVzZUNhY2hlPzogYm9vbGVhbjtcbiAgLyoqIOy6kOyLnCBUVEwgKOy0iCDri6jsnIQsIOq4sOuzuOqwkjogMzAwKSAqL1xuICBjYWNoZVR0bD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zT3B0aW9ucyA9IERhdGFFeHBsb3Jlck9wdGlvbnMgJiB7XG4gIC8qKiDqtIDroKgg642w7J207YSwIO2PrO2VqCDsl6zrtoAgKOq4sOuzuOqwkjogdHJ1ZSkgKi9cbiAgaW5jbHVkZVJlbGF0aW9ucz86IGJvb2xlYW47XG4gIC8qKiDsnqzqt4Ag7YOQ7IOJIOy1nOuMgCDquYrsnbQgKOq4sOuzuOqwkjogMikgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc1Jlc3VsdCA9IHtcbiAgLyoqIOuplOyduCBlbnRpdHkg642w7J207YSwICovXG4gIG1haW46IHtcbiAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgIHJlY29yZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIH07XG4gIC8qKiDqtIDroKggZW50aXR5IOuNsOydtO2EsCAoZW50aXR5SWQgLT4gcmVjb3JkcykgKi9cbiAgcmVsYXRlZDogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT47XG59O1xuXG4vLyDquLDsobQgREIg642w7J207YSw66W8IO2DkOyDie2VmOyXrCBmaXh0dXJlIOyDneyEsSDsi5wg7LC47KGw7ZWgIOyImCDsnojripQg7Iuc7Iqk7YWcXG5leHBvcnQgY2xhc3MgRGF0YUV4cGxvcmVyIHtcbiAgcHJpdmF0ZSBjYWNoZT86IENhY2hlTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRiOiBLbmV4LFxuICAgIHByaXZhdGUgZW50aXR5TWFuYWdlcjogdHlwZW9mIEVudGl0eU1hbmFnZXIsXG4gICAgY2FjaGVNYW5hZ2VyPzogQ2FjaGVNYW5hZ2VyLFxuICApIHtcbiAgICB0aGlzLmNhY2hlID0gY2FjaGVNYW5hZ2VyO1xuICB9XG5cbiAgYXN5bmMgZXhwbG9yZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRGF0YUV4cGxvcmVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eU5hbWV9YCk7XG4gICAgfVxuXG4gICAgLy8g7LqQ7IuxIOyngOybkFxuICAgIGlmIChvcHRpb25zLnVzZUNhY2hlICYmIHRoaXMuY2FjaGUpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZW5lcmF0ZUNhY2hlS2V5KGVudGl0eU5hbWUsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0T3JTZXQoe1xuICAgICAgICBrZXk6IGNhY2hlS2V5LFxuICAgICAgICB0dGw6IG9wdGlvbnMuY2FjaGVUdGwgfHwgMzAwLFxuICAgICAgICBmYWN0b3J5OiAoKSA9PiB0aGlzLmV4cGxvcmVJbnRlcm5hbChlbnRpdHksIG9wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhwbG9yZUludGVybmFsKGVudGl0eSwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4cGxvcmVJbnRlcm5hbChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBvcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zLFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+IHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGIoZW50aXR5LnRhYmxlKTtcblxuICAgIHN3aXRjaCAob3B0aW9ucy5zdHJhdGVneSkge1xuICAgICAgY2FzZSBcInNhbXBsZVwiOlxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zYW1wbGVEYXRhKHF1ZXJ5LCBvcHRpb25zLmxpbWl0IHx8IDEwKTtcblxuICAgICAgY2FzZSBcInJlY2VudFwiOiB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdENvbCA9IHRoaXMuZmluZFRpbWVzdGFtcENvbHVtbihlbnRpdHksIFwiY3JlYXRlZF9hdFwiKTtcbiAgICAgICAgaWYgKGNyZWF0ZWRBdENvbCkge1xuICAgICAgICAgIHF1ZXJ5Lm9yZGVyQnkoY3JlYXRlZEF0Q29sLCBcImRlc2NcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQgfHwgMTApO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmFuZG9tXCI6XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJhbmRvbVNhbXBsZShxdWVyeSwgb3B0aW9ucy5saW1pdCB8fCAxMCk7XG5cbiAgICAgIGNhc2UgXCJpZHNcIjpcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzICYmIG9wdGlvbnMuaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVyeS53aGVyZUluKFwiaWRcIiwgb3B0aW9ucy5pZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeTtcblxuICAgICAgY2FzZSBcInF1ZXJ5XCI6XG4gICAgICAgIGlmIChvcHRpb25zLndoZXJlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUob3B0aW9ucy53aGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgICAgICAgIGNvbnN0IFtjb2wsIGRpciA9IFwiYXNjXCJdID0gb3B0aW9ucy5vcmRlckJ5LnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAvLyBpZCDsu6zrn7zsnYAg7Iir7J6Q66GcIOy6kOyKpO2Mhe2VmOyXrCDsoJXroKztlanri4jri6QgKOusuOyekOyXtCDsoJXroKwg67Cp7KeAKVxuICAgICAgICAgIGlmIChjb2wgPT09IFwiaWRcIikge1xuICAgICAgICAgICAgcXVlcnkub3JkZXJCeVJhdyhgQ0FTVCg/PyBBUyBJTlRFR0VSKSAke2Rpcn1gLCBbY29sXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXJ5Lm9yZGVyQnkoY29sLCBkaXIgYXMgXCJhc2NcIiB8IFwiZGVzY1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQgfHwgMTApO1xuXG4gICAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgICBpZiAoIW9wdGlvbnMuZmlsZVBhdGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaWxlUGF0aCBpcyByZXF1aXJlZCBmb3IgZmlsZSBzdHJhdGVneVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkRnJvbUZpbGUob3B0aW9ucy5maWxlUGF0aCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdHJhdGVneTogJHtvcHRpb25zLnN0cmF0ZWd5fWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOq3oOuTsSDsg5jtlIzrp4EgKFBvc3RncmVTUUwgUk9XX05VTUJFUiDsgqzsmqkpXG4gIHByaXZhdGUgYXN5bmMgc2FtcGxlRGF0YShcbiAgICBxdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgY29uc3QgW3sgY291bnQgfV0gPSBhd2FpdCBxdWVyeS5jbG9uZSgpLmNvdW50KFwiKiBhcyBjb3VudFwiKTtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihjb3VudCk7XG5cbiAgICBpZiAodG90YWwgPD0gbGltaXQpIHtcbiAgICAgIHJldHVybiBhd2FpdCBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgfVxuXG4gICAgLy8g6reg65OxIOqwhOqyqSDqs4TsgrBcbiAgICBjb25zdCBpbnRlcnZhbCA9IE1hdGguZmxvb3IodG90YWwgLyBsaW1pdCk7XG5cbiAgICAvLyDthYzsnbTruJTrqoUg7LaU7LacXG4gICAgY29uc3QgdGFibGVOYW1lID0gcXVlcnkudG9TdHJpbmcoKS5tYXRjaCgvZnJvbVxccytcIj8oXFx3KylcIj8vaSk/LlsxXTtcbiAgICBpZiAoIXRhYmxlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGV4dHJhY3QgdGFibGUgbmFtZSBmcm9tIHF1ZXJ5XCIpO1xuICAgIH1cblxuICAgIC8vIFJPV19OVU1CRVIoKeuhnCDtlZwg67KI7JeQIOq3oOuTsSDsg5jtlIzrp4EgKOuLqOydvCDsv7zrpqwpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYi5yYXcoXG4gICAgICBgXG4gICAgICBXSVRIIG51bWJlcmVkX3Jvd3MgQVMgKFxuICAgICAgICBTRUxFQ1QgKiwgUk9XX05VTUJFUigpIE9WRVIgKE9SREVSIEJZIGlkKSBhcyByblxuICAgICAgICBGUk9NID8/XG4gICAgICApXG4gICAgICBTRUxFQ1QgKiBGUk9NIG51bWJlcmVkX3Jvd3NcbiAgICAgIFdIRVJFIE1PRChybiAtIDEsID8pID0gMFxuICAgICAgTElNSVQgP1xuICAgIGAsXG4gICAgICBbdGFibGVOYW1lLCBpbnRlcnZhbCwgbGltaXRdLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJhbmRvbVNhbXBsZShcbiAgICBxdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Lm9yZGVyQnlSYXcoXCJSQU5ET00oKVwiKS5saW1pdChsaW1pdCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRUaW1lc3RhbXBDb2x1bW4oZW50aXR5OiBFbnRpdHksIGNvbHVtbk5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gcHJvcD8ubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4ge1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwiZnMvcHJvbWlzZXNcIik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJKU09OIGZpbGUgbXVzdCBjb250YWluIGFuIGFycmF5XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICAgIH0gZWxzZSBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoKSA9PiBoLnRyaW0oKSk7XG4gICAgICByZXR1cm4gbGluZXMuc2xpY2UoMSkubWFwKChsaW5lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGxpbmUuc3BsaXQoXCIsXCIpO1xuICAgICAgICByZXR1cm4gaGVhZGVycy5yZWR1Y2UoXG4gICAgICAgICAgKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGhlYWRlcjogc3RyaW5nLCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIG9ialtoZWFkZXJdID0gdmFsdWVzW2ldPy50cmltKCk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0OiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgYXN5bmMgZXhwbG9yZVJlbGF0aW9uKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWxhdGlvblByb3A6IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxEYXRhRXhwbG9yZXJPcHRpb25zPixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcmVsYXRpb25Qcm9wKTtcblxuICAgIGlmICghcHJvcCB8fCAhaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb24gcHJvcGVydHkgbm90IGZvdW5kOiAke2VudGl0eU5hbWV9LiR7cmVsYXRpb25Qcm9wfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBwcm9wLmNvbmU/LmRhdGFTb3VyY2U7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBkYXRhU291cmNlPy5zdHJhdGVneSB8fCBvcHRpb25zPy5zdHJhdGVneSB8fCBcInNhbXBsZVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9XG4gICAgICBkYXRhU291cmNlPy5jb25maWcgJiYgdHlwZW9mIGRhdGFTb3VyY2UuY29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gKGRhdGFTb3VyY2UuY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICA6IHt9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwbG9yZShwcm9wLndpdGgsIHtcbiAgICAgIHN0cmF0ZWd5LFxuICAgICAgbGltaXQ6IG9wdGlvbnM/LmxpbWl0IHx8ICh0eXBlb2YgY29uZmlnLmxpbWl0ID09PSBcIm51bWJlclwiID8gY29uZmlnLmxpbWl0IDogMTApLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09IFwib2JqZWN0XCIgPyBjb25maWcgOiB7fSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXrOufrCByZWxhdGlvbuydhCDrs5HroKzroZwg7KGw7ZqM7ZWp64uI64ukIChOKzEg66y47KCcIO2VtOqysClcbiAgICovXG4gIGFzeW5jIGV4cGxvcmVSZWxhdGlvbnMoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIHJlbGF0aW9uUHJvcHM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPERhdGFFeHBsb3Jlck9wdGlvbnM+LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcmVsYXRpb25Qcm9wcy5tYXAoYXN5bmMgKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZXhwbG9yZVJlbGF0aW9uKGVudGl0eU5hbWUsIHByb3AsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gW3Byb3AsIGRhdGFdIGFzIGNvbnN0O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMocmVzdWx0cyk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQ2FjaGVLZXkoZW50aXR5TmFtZTogc3RyaW5nLCBvcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgIGBEYXRhRXhwbG9yZXI6JHtlbnRpdHlOYW1lfWAsXG4gICAgICBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgb3B0aW9ucy5saW1pdD8udG9TdHJpbmcoKSB8fCBcImRlZmF1bHRcIixcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMud2hlcmUpIHtcbiAgICAgIHBhcnRzLnB1c2goSlNPTi5zdHJpbmdpZnkob3B0aW9ucy53aGVyZSkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKG9wdGlvbnMub3JkZXJCeSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlkcykge1xuICAgICAgcGFydHMucHVzaChvcHRpb25zLmlkcy5qb2luKFwiLFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oXCI6XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeyZgCDqtIDroKjrkJwg642w7J207YSw66W8IOyerOq3gOyggeycvOuhnCDtg5Dsg4ntlanri4jri6QuXG4gICAqIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbikgcmVsYXRpb27snYQg65Sw65286rCA66mwIOywuOyhsCDrjbDsnbTthLDrpbwg7IiY7KeR7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZXhwbG9yZVdpdGhSZWxhdGlvbnMoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEV4cGxvcmVXaXRoUmVsYXRpb25zT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxFeHBsb3JlV2l0aFJlbGF0aW9uc1Jlc3VsdD4ge1xuICAgIGNvbnN0IGluY2x1ZGVSZWxhdGlvbnMgPSBvcHRpb25zLmluY2x1ZGVSZWxhdGlvbnMgPz8gdHJ1ZTtcbiAgICBjb25zdCBtYXhEZXB0aCA9IG9wdGlvbnMubWF4RGVwdGggPz8gMjtcblxuICAgIC8vIOuplOyduCBlbnRpdHkg7KGw7ZqMXG4gICAgY29uc3QgbWFpblJlY29yZHMgPSBhd2FpdCB0aGlzLmV4cGxvcmUoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCByZXN1bHQ6IEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0ID0ge1xuICAgICAgbWFpbjoge1xuICAgICAgICBlbnRpdHlJZDogZW50aXR5TmFtZSxcbiAgICAgICAgcmVjb3JkczogbWFpblJlY29yZHMsXG4gICAgICB9LFxuICAgICAgcmVsYXRlZDogbmV3IE1hcCgpLFxuICAgIH07XG5cbiAgICAvLyDqtIDroKgg642w7J207YSwIOyImOynke2VmOyngCDslYrsnLzrqbQg67CU66GcIOumrO2EtFxuICAgIGlmICghaW5jbHVkZVJlbGF0aW9ucyB8fCBtYXhEZXB0aCA8PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOydtOuvuCDsobDtmoztlZwgZW50aXR5IOy2lOyggSAo7KSR67O1IOuwqeyngClcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KFtlbnRpdHlOYW1lXSk7XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwg6rSA66CoIOuNsOydtO2EsCDsiJjsp5FcbiAgICBhd2FpdCB0aGlzLmNvbGxlY3RSZWxhdGVkRGF0YShlbnRpdHlOYW1lLCBtYWluUmVjb3JkcywgcmVzdWx0LnJlbGF0ZWQsIHZpc2l0ZWQsIG1heERlcHRoKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6rSA66CoIOuNsOydtO2EsOulvCDsnqzqt4DsoIHsnLzroZwg7IiY7KeR7ZWp64uI64ukIChwcml2YXRlIGhlbHBlcilcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdFJlbGF0ZWREYXRhKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHJlbGF0ZWRNYXA6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+LFxuICAgIHZpc2l0ZWQ6IFNldDxzdHJpbmc+LFxuICAgIHJlbWFpbmluZ0RlcHRoOiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwIHx8IHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBjb25zdCByZWNvcmRJZHMgPSByZWNvcmRzLm1hcCgocikgPT4gci5pZCkuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgIC8vIDEuIEZvcndhcmQgcmVmZXJlbmNlczog7J20IGVudGl0eeqwgCDssLjsobDtlZjripQg64uk66W4IGVudGl0eVxuICAgIGNvbnN0IGZvcndhcmRSZWxhdGlvblByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwcm9wKSA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBmb3J3YXJkUmVsYXRpb25Qcm9wcykge1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVudGl0eU5hbWUgPSBwcm9wLndpdGg7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlZwgZW50aXR564qUIOyKpO2CtSAo7Iic7ZmYIOywuOyhsCDrsKnsp4ApXG4gICAgICBpZiAodmlzaXRlZC5oYXModGFyZ2V0RW50aXR5TmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOywuOyhsO2VmOuKlCBJROuTpCDsiJjsp5FcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICBjb25zdCByZWZlcmVuY2VkSWRzID0gcmVjb3Jkc1xuICAgICAgICAubWFwKChyZWNvcmQpID0+IHJlY29yZFtmb3JlaWduS2V5TmFtZV0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgbnVtYmVyW107XG5cbiAgICAgIGlmIChyZWZlcmVuY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7KSR67O1IOygnOqxsFxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQocmVmZXJlbmNlZElkcyldO1xuXG4gICAgICAvLyDssLjsobAg642w7J207YSwIOyhsO2ajFxuICAgICAgY29uc3QgcmVmZXJlbmNlZFJlY29yZHMgPSBhd2FpdCB0aGlzLmV4cGxvcmUodGFyZ2V0RW50aXR5TmFtZSwge1xuICAgICAgICBzdHJhdGVneTogXCJpZHNcIixcbiAgICAgICAgaWRzOiB1bmlxdWVJZHMsXG4gICAgICB9KTtcblxuICAgICAgLy8g6rKw6rO87JeQIOy2lOqwgFxuICAgICAgcmVsYXRlZE1hcC5zZXQodGFyZ2V0RW50aXR5TmFtZSwgcmVmZXJlbmNlZFJlY29yZHMpO1xuICAgICAgdmlzaXRlZC5hZGQodGFyZ2V0RW50aXR5TmFtZSk7XG5cbiAgICAgIC8vIOyerOq3gDog7LC47KGw65CcIOuNsOydtO2EsOydmCDqtIDroKgg642w7J207YSw64+EIOyImOynkVxuICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgIHRhcmdldEVudGl0eU5hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRSZWNvcmRzLFxuICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICB2aXNpdGVkLFxuICAgICAgICByZW1haW5pbmdEZXB0aCAtIDEsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIEJhY2t3YXJkIHJlZmVyZW5jZXM6IOydtCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIOuLpOuluCBlbnRpdHlcbiAgICAvLyDrqqjrk6AgZW50aXR566W8IOyInO2ajO2VmOupsCDtmITsnqwgZW50aXR566W8IOywuOyhsO2VmOuKlCByZWxhdGlvbiDssL7quLBcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gICAgZm9yIChjb25zdCBvdGhlckVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgY29uc3Qgb3RoZXJFbnRpdHlOYW1lID0gb3RoZXJFbnRpdHkuaWQ7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlojqsbDrgpgg7J6Q6riwIOyekOyLoOydtOuptCDsiqTtgrVcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhvdGhlckVudGl0eU5hbWUpIHx8IG90aGVyRW50aXR5TmFtZSA9PT0gZW50aXR5TmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgcmVsYXRpb24gcHJvcCDssL7quLBcbiAgICAgIGNvbnN0IGJhY2t3YXJkUmVsYXRpb25zID0gb3RoZXJFbnRpdHkucHJvcHMuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAgIHByb3Aud2l0aCA9PT0gZW50aXR5TmFtZSAmJlxuICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgYmFja3dhcmRSZWxhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gb3RoZXJFbnRpdHnqsIAg7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgRksg7Lus65+8XG4gICAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG5cbiAgICAgICAgLy8g7ZiE7J6sIOugiOy9lOuTnOuTpOydhCDssLjsobDtlZjripQgb3RoZXJFbnRpdHkg66CI7L2U65OcIOyhsO2ajFxuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGIob3RoZXJFbnRpdHkudGFibGUpLndoZXJlSW4oZm9yZWlnbktleU5hbWUsIHJlY29yZElkcyk7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkUmVjb3JkcyA9IGF3YWl0IHF1ZXJ5O1xuXG4gICAgICAgIGlmIChiYWNrd2FyZFJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsrDqs7zsl5Ag7LaU6rCAXG4gICAgICAgIHJlbGF0ZWRNYXAuc2V0KG90aGVyRW50aXR5TmFtZSwgYmFja3dhcmRSZWNvcmRzKTtcbiAgICAgICAgdmlzaXRlZC5hZGQob3RoZXJFbnRpdHlOYW1lKTtcblxuICAgICAgICAvLyDsnqzqt4A6IOyXreywuOyhsCDrjbDsnbTthLDsnZgg6rSA66CoIOuNsOydtO2EsOuPhCDsiJjsp5FcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgICAgb3RoZXJFbnRpdHlOYW1lLFxuICAgICAgICAgIGJhY2t3YXJkUmVjb3JkcyxcbiAgICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICAgcmVtYWluaW5nRGVwdGggLSAxLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7WUFLbUc7WUFDdkQ7Q0FzQy9CLGVBQWIsTUFBMEI7RUFJZDtFQUNBO0VBSlY7RUFFQSxZQUNFLElBQ0EsZUFDQSxjQUNBO0dBSFEsS0FBQSxLQUFBO0dBQ0EsS0FBQSxnQkFBQTtHQUdSLEtBQUssUUFBUTtFQUNmO0VBRUEsTUFBTSxRQUNKLFlBQ0EsU0FDb0M7R0FDcEMsTUFBTSxTQUFTLEtBQUssY0FBYyxJQUFJLFVBQVU7R0FDaEQsSUFBSSxDQUFDLFFBQ0gsTUFBTSxJQUFJLE1BQU0scUJBQXFCLFlBQVk7R0FJbkQsSUFBSSxRQUFRLFlBQVksS0FBSyxPQUFPO0lBQ2xDLE1BQU0sV0FBVyxLQUFLLGlCQUFpQixZQUFZLE9BQU87SUFDMUQsT0FBTyxLQUFLLE1BQU0sU0FBUztLQUN6QixLQUFLO0tBQ0wsS0FBSyxRQUFRLFlBQVk7S0FDekIsZUFBZSxLQUFLLGdCQUFnQixRQUFRLE9BQU87SUFDckQsQ0FBQztHQUNIO0dBRUEsT0FBTyxLQUFLLGdCQUFnQixRQUFRLE9BQU87RUFDN0M7RUFFQSxNQUFjLGdCQUNaLFFBQ0EsU0FDb0M7R0FDcEMsTUFBTSxRQUFRLEtBQUssR0FBRyxPQUFPLEtBQUs7R0FFbEMsUUFBUSxRQUFRLFVBQWhCO0lBQ0UsS0FBSyxVQUNILE9BQU8sTUFBTSxLQUFLLFdBQVcsT0FBTyxRQUFRLFNBQVMsRUFBRTtJQUV6RCxLQUFLLFVBQVU7S0FDYixNQUFNLGVBQWUsS0FBSyxvQkFBb0IsUUFBUSxZQUFZO0tBQ2xFLElBQUksY0FDRixNQUFNLFFBQVEsY0FBYyxNQUFNO0tBRXBDLE9BQU8sTUFBTSxNQUFNLE1BQU0sUUFBUSxTQUFTLEVBQUU7SUFDOUM7SUFFQSxLQUFL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
250
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9kYXRhLWV4cGxvcmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIENhY2hlTWFuYWdlciB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsIGlzT25lVG9PbmVSZWxhdGlvblByb3AsIGlzUmVsYXRpb25Qcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG5leHBvcnQgdHlwZSBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IFwic2FtcGxlXCIgfCBcImlkc1wiIHwgXCJxdWVyeVwiIHwgXCJmaWxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIjtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBEYXRlXG4gIHwgVWludDhBcnJheVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBEYXRhRXhwbG9yZXJWYWx1ZVtdXG4gIHwgRGF0YUV4cGxvcmVyUmVjb3JkO1xuXG5leHBvcnQgdHlwZSBEYXRhRXhwbG9yZXJSZWNvcmQgPSB7XG4gIFtjb2x1bW5OYW1lOiBzdHJpbmddOiBEYXRhRXhwbG9yZXJWYWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYTogei5ab2RUeXBlPERhdGFFeHBsb3JlclZhbHVlPiA9IHoubGF6eSgoKSA9PlxuICB6LnVuaW9uKFtcbiAgICB6LnN0cmluZygpLFxuICAgIHoubnVtYmVyKCksXG4gICAgei5ib29sZWFuKCksXG4gICAgei5iaWdpbnQoKSxcbiAgICB6LmRhdGUoKSxcbiAgICB6Lmluc3RhbmNlb2YoVWludDhBcnJheSksXG4gICAgei5udWxsKCksXG4gICAgei51bmRlZmluZWQoKSxcbiAgICB6LmFycmF5KGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKSxcbiAgICB6LnJlY29yZCh6LnN0cmluZygpLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSksXG4gIF0pLFxuKTtcbmV4cG9ydCBjb25zdCBkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSk7XG5leHBvcnQgY29uc3QgZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYSA9IHouYXJyYXkoZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hKTtcbmNvbnN0IGRhdGFFeHBsb3JlckRpcmVjdGlvblNjaGVtYSA9IHouZW51bShbXCJhc2NcIiwgXCJkZXNjXCJdKTtcbmV4cG9ydCBjb25zdCBkYXRhU291cmNlQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJhdGVneTogei5lbnVtKFtcInNhbXBsZVwiLCBcImlkc1wiLCBcInF1ZXJ5XCIsIFwiZmlsZVwiLCBcInJlY2VudFwiLCBcInJhbmRvbVwiXSkub3B0aW9uYWwoKSxcbiAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgd2hlcmU6IHoucmVjb3JkKHouc3RyaW5nKCksIGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKS5vcHRpb25hbCgpLFxuICBvcmRlckJ5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGlkczogei5hcnJheSh6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkpLm9wdGlvbmFsKCksXG4gIGZpbGVQYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzZUNhY2hlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBjYWNoZVR0bDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKiBXSEVSRSDsobDqsbQg7YOA7J6FICjqsJ3ssrQg65iQ64qUIEtuZXggUXVlcnlCdWlsZGVyIO2VqOyImCkgKi9cbmV4cG9ydCB0eXBlIFdoZXJlQ29uZGl0aW9uID0gb2JqZWN0IHwgKChxdWVyeUJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSA9PiB2b2lkKTtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyT3B0aW9ucyA9IHtcbiAgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IG51bWJlcjtcbiAgd2hlcmU/OiBXaGVyZUNvbmRpdGlvbjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgaWRzPzogKG51bWJlciB8IHN0cmluZylbXTtcbiAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiDsupDsi7Eg7IKs7JqpIOyXrOu2gCAo6riw67O46rCSOiBmYWxzZSkgKi9cbiAgdXNlQ2FjaGU/OiBib29sZWFuO1xuICAvKiog7LqQ7IucIFRUTCAo7LSIIOuLqOychCwg6riw67O46rCSOiAzMDApICovXG4gIGNhY2hlVHRsPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zID0gRGF0YUV4cGxvcmVyT3B0aW9ucyAmIHtcbiAgLyoqIOq0gOugqCDrjbDsnbTthLAg7Y+s7ZWoIOyXrOu2gCAo6riw67O46rCSOiB0cnVlKSAqL1xuICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgLyoqIOyerOq3gCDtg5Dsg4kg7LWc64yAIOq5iuydtCAo6riw67O46rCSOiAyKSAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0ID0ge1xuICAvKiog66mU7J24IGVudGl0eSDrjbDsnbTthLAgKi9cbiAgbWFpbjoge1xuICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgcmVjb3JkczogRGF0YUV4cGxvcmVyUmVjb3JkW107XG4gIH07XG4gIC8qKiDqtIDroKggZW50aXR5IOuNsOydtO2EsCAoZW50aXR5SWQgLT4gcmVjb3JkcykgKi9cbiAgcmVsYXRlZDogTWFwPHN0cmluZywgRGF0YUV4cGxvcmVyUmVjb3JkW10+O1xufTtcblxuLy8g6riw7KG0IERCIOuNsOydtO2EsOulvCDtg5Dsg4ntlZjsl6wgZml4dHVyZSDsg53shLEg7IucIOywuOyhsO2VoCDsiJgg7J6I64qUIOyLnOyKpO2FnFxuZXhwb3J0IGNsYXNzIERhdGFFeHBsb3JlciB7XG4gIHByaXZhdGUgY2FjaGU/OiBDYWNoZU1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYjogS25leCxcbiAgICBwcml2YXRlIGVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyLFxuICAgIGNhY2hlTWFuYWdlcj86IENhY2hlTWFuYWdlcixcbiAgKSB7XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlTWFuYWdlcjtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmUoZW50aXR5TmFtZTogc3RyaW5nLCBvcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIOy6kOyLsSDsp4Dsm5BcbiAgICBpZiAob3B0aW9ucy51c2VDYWNoZSAmJiB0aGlzLmNhY2hlKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShlbnRpdHlOYW1lLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldE9yU2V0KHtcbiAgICAgICAga2V5OiBjYWNoZUtleSxcbiAgICAgICAgdHRsOiBvcHRpb25zLmNhY2hlVHRsIHx8IDMwMCxcbiAgICAgICAgZmFjdG9yeTogKCkgPT4gdGhpcy5leHBsb3JlSW50ZXJuYWwoZW50aXR5LCBvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4cGxvcmVJbnRlcm5hbChlbnRpdHksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleHBsb3JlSW50ZXJuYWwoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgb3B0aW9uczogRGF0YUV4cGxvcmVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5kYihlbnRpdHkudGFibGUpO1xuXG4gICAgc3dpdGNoIChvcHRpb25zLnN0cmF0ZWd5KSB7XG4gICAgICBjYXNlIFwic2FtcGxlXCI6XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNhbXBsZURhdGEocXVlcnksIG9wdGlvbnMubGltaXQgfHwgMTApO1xuXG4gICAgICBjYXNlIFwicmVjZW50XCI6IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEF0Q29sID0gdGhpcy5maW5kVGltZXN0YW1wQ29sdW1uKGVudGl0eSwgXCJjcmVhdGVkX2F0XCIpO1xuICAgICAgICBpZiAoY3JlYXRlZEF0Q29sKSB7XG4gICAgICAgICAgcXVlcnkub3JkZXJCeShjcmVhdGVkQXRDb2wsIFwiZGVzY1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0IHx8IDEwKSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJyYW5kb21cIjpcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmFuZG9tU2FtcGxlKHF1ZXJ5LCBvcHRpb25zLmxpbWl0IHx8IDEwKTtcblxuICAgICAgY2FzZSBcImlkc1wiOlxuICAgICAgICBpZiAob3B0aW9ucy5pZHMgJiYgb3B0aW9ucy5pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlSW4oXCJpZFwiLCBvcHRpb25zLmlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEucGFyc2UoYXdhaXQgcXVlcnkpO1xuXG4gICAgICBjYXNlIFwicXVlcnlcIjpcbiAgICAgICAgaWYgKG9wdGlvbnMud2hlcmUpIHtcbiAgICAgICAgICBjb25zdCB3aGVyZUNhbGxiYWNrID0gelxuICAgICAgICAgICAgLmN1c3RvbTwocXVlcnlCdWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikgPT4gdm9pZD4oaXNGdW5jdGlvblZhbHVlKVxuICAgICAgICAgICAgLnNhZmVQYXJzZShvcHRpb25zLndoZXJlKTtcbiAgICAgICAgICBpZiAod2hlcmVDYWxsYmFjay5zdWNjZXNzKSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZSh3aGVyZUNhbGxiYWNrLmRhdGEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZShkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEucGFyc2Uob3B0aW9ucy53aGVyZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICAgICAgY29uc3QgW2NvbCwgZGlyID0gXCJhc2NcIl0gPSBvcHRpb25zLm9yZGVyQnkuc3BsaXQoXCI6XCIpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGRhdGFFeHBsb3JlckRpcmVjdGlvblNjaGVtYS5wYXJzZShkaXIpO1xuICAgICAgICAgIC8vIGlkIOy7rOufvOydgCDsiKvsnpDroZwg7LqQ7Iqk7YyF7ZWY7JesIOygleugrO2VqeuLiOuLpCAo66y47J6Q7Je0IOygleugrCDrsKnsp4ApXG4gICAgICAgICAgaWYgKGNvbCA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBxdWVyeS5vcmRlckJ5UmF3KGBDQVNUKD8/IEFTIElOVEVHRVIpICR7ZGlyZWN0aW9ufWAsIFtjb2xdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkub3JkZXJCeShjb2wsIGRpcmVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhRXhwbG9yZXJSZWNvcmRzU2NoZW1hLnBhcnNlKGF3YWl0IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQgfHwgMTApKTtcblxuICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgaWYgKCFvcHRpb25zLmZpbGVQYXRoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmlsZVBhdGggaXMgcmVxdWlyZWQgZm9yIGZpbGUgc3RyYXRlZ3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZyb21GaWxlKG9wdGlvbnMuZmlsZVBhdGgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RyYXRlZ3k6ICR7b3B0aW9ucy5zdHJhdGVneX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyDqt6Drk7Eg7IOY7ZSM66eBIChQb3N0Z3JlU1FMIFJPV19OVU1CRVIg7IKs7JqpKVxuICBwcml2YXRlIGFzeW5jIHNhbXBsZURhdGEocXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IFt7IGNvdW50IH1dID0gYXdhaXQgcXVlcnkuY2xvbmUoKS5jb3VudChcIiogYXMgY291bnRcIik7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIoY291bnQpO1xuXG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5saW1pdChsaW1pdCkpO1xuICAgIH1cblxuICAgIC8vIOq3oOuTsSDqsITqsqkg6rOE7IKwXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBNYXRoLmZsb29yKHRvdGFsIC8gbGltaXQpO1xuXG4gICAgLy8g7YWM7J2067iU66qFIOy2lOy2nFxuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHF1ZXJ5LnRvU3RyaW5nKCkubWF0Y2goL2Zyb21cXHMrXCI/KFxcdyspXCI/L2kpPy5bMV07XG4gICAgaWYgKCF0YWJsZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBleHRyYWN0IHRhYmxlIG5hbWUgZnJvbSBxdWVyeVwiKTtcbiAgICB9XG5cbiAgICAvLyBST1dfTlVNQkVSKCnroZwg7ZWcIOuyiOyXkCDqt6Drk7Eg7IOY7ZSM66eBICjri6jsnbwg7L+866asKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZGIucmF3KFxuICAgICAgYFxuICAgICAgV0lUSCBudW1iZXJlZF9yb3dzIEFTIChcbiAgICAgICAgU0VMRUNUICosIFJPV19OVU1CRVIoKSBPVkVSIChPUkRFUiBCWSBpZCkgYXMgcm5cbiAgICAgICAgRlJPTSA/P1xuICAgICAgKVxuICAgICAgU0VMRUNUICogRlJPTSBudW1iZXJlZF9yb3dzXG4gICAgICBXSEVSRSBNT0Qocm4gLSAxLCA/KSA9IDBcbiAgICAgIExJTUlUID9cbiAgICBgLFxuICAgICAgW3RhYmxlTmFtZSwgaW50ZXJ2YWwsIGxpbWl0XSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEucGFyc2UocmVzdWx0LnJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByYW5kb21TYW1wbGUoXG4gICAgcXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyUmVjb3JkW10+IHtcbiAgICByZXR1cm4gZGF0YUV4cGxvcmVyUmVjb3Jkc1NjaGVtYS5wYXJzZShhd2FpdCBxdWVyeS5vcmRlckJ5UmF3KFwiUkFORE9NKClcIikubGltaXQobGltaXQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFRpbWVzdGFtcENvbHVtbihlbnRpdHk6IEVudGl0eSwgY29sdW1uTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiBwcm9wPy5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmRbXT4ge1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwiZnMvcHJvbWlzZXNcIik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGRhdGFFeHBsb3JlclJlY29yZHNTY2hlbWEuc2FmZVBhcnNlKEpTT04ucGFyc2UoY29udGVudCkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSlNPTiBmaWxlIG11c3QgY29udGFpbiBhbiBhcnJheSBvZiByZWNvcmRzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkpTT04gZmlsZSBtdXN0IGNvbnRhaW4gYSB2YWxpZCBhcnJheSBvZiByZWNvcmRzXCIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoKSA9PiBoLnRyaW0oKSk7XG4gICAgICByZXR1cm4gbGluZXMuc2xpY2UoMSkubWFwKChsaW5lKTogRGF0YUV4cGxvcmVyUmVjb3JkID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gbGluZS5zcGxpdChcIixcIik7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgaGVhZGVycy5tYXAoKGhlYWRlciwgaW5kZXgpID0+IFtoZWFkZXIsIHZhbHVlc1tpbmRleF0/LnRyaW0oKV0gYXMgY29uc3QpLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmaWxlIGZvcm1hdDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmVSZWxhdGlvbihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgcmVsYXRpb25Qcm9wOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8RGF0YUV4cGxvcmVyT3B0aW9ucz4sXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyUmVjb3JkW10+IHtcbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSByZWxhdGlvblByb3ApO1xuXG4gICAgaWYgKCFwcm9wIHx8ICFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbiBwcm9wZXJ0eSBub3QgZm91bmQ6ICR7ZW50aXR5TmFtZX0uJHtyZWxhdGlvblByb3B9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IHByb3AuY29uZT8uZGF0YVNvdXJjZTtcbiAgICBjb25zdCBzdHJhdGVneSA9IGRhdGFTb3VyY2U/LnN0cmF0ZWd5IHx8IG9wdGlvbnM/LnN0cmF0ZWd5IHx8IFwic2FtcGxlXCI7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YVNvdXJjZUNvbmZpZ1NjaGVtYS5wYXJzZShkYXRhU291cmNlPy5jb25maWcgPz8ge30pO1xuICAgIGNvbnN0IGV4cGxvcmVPcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zID0ge1xuICAgICAgc3RyYXRlZ3ksXG4gICAgICBsaW1pdDogb3B0aW9ucz8ubGltaXQgPz8gY29uZmlnLmxpbWl0ID8/IDEwLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwbG9yZShwcm9wLndpdGgsIGV4cGxvcmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl6zrn6wgcmVsYXRpb27snYQg67OR66Cs66GcIOyhsO2ajO2VqeuLiOuLpCAoTisxIOusuOygnCDtlbTqsrApXG4gICAqL1xuICBhc3luYyBleHBsb3JlUmVsYXRpb25zKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWxhdGlvblByb3BzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogUGFydGlhbDxEYXRhRXhwbG9yZXJPcHRpb25zPixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBEYXRhRXhwbG9yZXJSZWNvcmRbXT4+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByZWxhdGlvblByb3BzLm1hcChhc3luYyAocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5leHBsb3JlUmVsYXRpb24oZW50aXR5TmFtZSwgcHJvcCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbcHJvcCwgZGF0YV0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWNoZUtleShlbnRpdHlOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IERhdGFFeHBsb3Jlck9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYERhdGFFeHBsb3Jlcjoke2VudGl0eU5hbWV9YCxcbiAgICAgIG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBvcHRpb25zLmxpbWl0Py50b1N0cmluZygpIHx8IFwiZGVmYXVsdFwiLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy53aGVyZSkge1xuICAgICAgcGFydHMucHVzaChKU09OLnN0cmluZ2lmeShvcHRpb25zLndoZXJlKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgIHBhcnRzLnB1c2gob3B0aW9ucy5vcmRlckJ5KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICBwYXJ0cy5wdXNoKG9wdGlvbnMuaWRzLmpvaW4oXCIsXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIjpcIik7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JmAIOq0gOugqOuQnCDrjbDsnbTthLDrpbwg7J6s6reA7KCB7Jy866GcIO2DkOyDie2VqeuLiOuLpC5cbiAgICogQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKSByZWxhdGlvbuydhCDrlLDrnbzqsIDrqbAg7LC47KGwIOuNsOydtO2EsOulvCDsiJjsp5Htlanri4jri6QuXG4gICAqL1xuICBhc3luYyBleHBsb3JlV2l0aFJlbGF0aW9ucyhcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0PiB7XG4gICAgY29uc3QgaW5jbHVkZVJlbGF0aW9ucyA9IG9wdGlvbnMuaW5jbHVkZVJlbGF0aW9ucyA/PyB0cnVlO1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0aW9ucy5tYXhEZXB0aCA/PyAyO1xuXG4gICAgLy8g66mU7J24IGVudGl0eSDsobDtmoxcbiAgICBjb25zdCBtYWluUmVjb3JkcyA9IGF3YWl0IHRoaXMuZXhwbG9yZShlbnRpdHlOYW1lLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHJlc3VsdDogRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQgPSB7XG4gICAgICBtYWluOiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHlOYW1lLFxuICAgICAgICByZWNvcmRzOiBtYWluUmVjb3JkcyxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkOiBuZXcgTWFwKCksXG4gICAgfTtcblxuICAgIC8vIOq0gOugqCDrjbDsnbTthLAg7IiY7KeR7ZWY7KeAIOyViuycvOuptCDrsJTroZwg66as7YS0XG4gICAgaWYgKCFpbmNsdWRlUmVsYXRpb25zIHx8IG1heERlcHRoIDw9IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g7J2066+4IOyhsO2ajO2VnCBlbnRpdHkg7LaU7KCBICjspJHrs7Ug67Cp7KeAKVxuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oW2VudGl0eU5hbWVdKTtcblxuICAgIC8vIOyerOq3gOyggeycvOuhnCDqtIDroKgg642w7J207YSwIOyImOynkVxuICAgIGF3YWl0IHRoaXMuY29sbGVjdFJlbGF0ZWREYXRhKGVudGl0eU5hbWUsIG1haW5SZWNvcmRzLCByZXN1bHQucmVsYXRlZCwgdmlzaXRlZCwgbWF4RGVwdGgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDqtIDroKgg642w7J207YSw66W8IOyerOq3gOyggeycvOuhnCDsiJjsp5Htlanri4jri6QgKHByaXZhdGUgaGVscGVyKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIHJlY29yZHM6IERhdGFFeHBsb3JlclJlY29yZFtdLFxuICAgIHJlbGF0ZWRNYXA6IE1hcDxzdHJpbmcsIERhdGFFeHBsb3JlclJlY29yZFtdPixcbiAgICB2aXNpdGVkOiBTZXQ8c3RyaW5nPixcbiAgICByZW1haW5pbmdEZXB0aDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVtYWluaW5nRGVwdGggPD0gMCB8fCByZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgY29uc3QgcmVjb3JkSWRzID0gcmVjb3Jkcy5mbGF0TWFwKChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZElkID0gei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pLnNhZmVQYXJzZShyZWNvcmQuaWQpO1xuICAgICAgcmV0dXJuIHBhcnNlZElkLnN1Y2Nlc3MgPyBbcGFyc2VkSWQuZGF0YV0gOiBbXTtcbiAgICB9KTtcblxuICAgIC8vIDEuIEZvcndhcmQgcmVmZXJlbmNlczog7J20IGVudGl0eeqwgCDssLjsobDtlZjripQg64uk66W4IGVudGl0eVxuICAgIGNvbnN0IGZvcndhcmRSZWxhdGlvblByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwcm9wKSA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBmb3J3YXJkUmVsYXRpb25Qcm9wcykge1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVudGl0eU5hbWUgPSBwcm9wLndpdGg7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlZwgZW50aXR564qUIOyKpO2CtSAo7Iic7ZmYIOywuOyhsCDrsKnsp4ApXG4gICAgICBpZiAodmlzaXRlZC5oYXModGFyZ2V0RW50aXR5TmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOywuOyhsO2VmOuKlCBJROuTpCDsiJjsp5FcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICBjb25zdCByZWZlcmVuY2VkSWRzID0gcmVjb3Jkcy5mbGF0TWFwKChyZWNvcmQpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkSWQgPSB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpXSkuc2FmZVBhcnNlKHJlY29yZFtmb3JlaWduS2V5TmFtZV0pO1xuICAgICAgICByZXR1cm4gcGFyc2VkSWQuc3VjY2VzcyA/IFtwYXJzZWRJZC5kYXRhXSA6IFtdO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7KSR67O1IOygnOqxsFxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQocmVmZXJlbmNlZElkcyldO1xuXG4gICAgICAvLyDssLjsobAg642w7J207YSwIOyhsO2ajFxuICAgICAgY29uc3QgcmVmZXJlbmNlZFJlY29yZHMgPSBhd2FpdCB0aGlzLmV4cGxvcmUodGFyZ2V0RW50aXR5TmFtZSwge1xuICAgICAgICBzdHJhdGVneTogXCJpZHNcIixcbiAgICAgICAgaWRzOiB1bmlxdWVJZHMsXG4gICAgICB9KTtcblxuICAgICAgLy8g6rKw6rO87JeQIOy2lOqwgFxuICAgICAgcmVsYXRlZE1hcC5zZXQodGFyZ2V0RW50aXR5TmFtZSwgcmVmZXJlbmNlZFJlY29yZHMpO1xuICAgICAgdmlzaXRlZC5hZGQodGFyZ2V0RW50aXR5TmFtZSk7XG5cbiAgICAgIC8vIOyerOq3gDog7LC47KGw65CcIOuNsOydtO2EsOydmCDqtIDroKgg642w7J207YSw64+EIOyImOynkVxuICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgIHRhcmdldEVudGl0eU5hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRSZWNvcmRzLFxuICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICB2aXNpdGVkLFxuICAgICAgICByZW1haW5pbmdEZXB0aCAtIDEsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIEJhY2t3YXJkIHJlZmVyZW5jZXM6IOydtCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIOuLpOuluCBlbnRpdHlcbiAgICAvLyDrqqjrk6AgZW50aXR566W8IOyInO2ajO2VmOupsCDtmITsnqwgZW50aXR566W8IOywuOyhsO2VmOuKlCByZWxhdGlvbiDssL7quLBcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gICAgZm9yIChjb25zdCBvdGhlckVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgY29uc3Qgb3RoZXJFbnRpdHlOYW1lID0gb3RoZXJFbnRpdHkuaWQ7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlojqsbDrgpgg7J6Q6riwIOyekOyLoOydtOuptCDsiqTtgrVcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhvdGhlckVudGl0eU5hbWUpIHx8IG90aGVyRW50aXR5TmFtZSA9PT0gZW50aXR5TmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgcmVsYXRpb24gcHJvcCDssL7quLBcbiAgICAgIGNvbnN0IGJhY2t3YXJkUmVsYXRpb25zID0gb3RoZXJFbnRpdHkucHJvcHMuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAgIHByb3Aud2l0aCA9PT0gZW50aXR5TmFtZSAmJlxuICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgYmFja3dhcmRSZWxhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gb3RoZXJFbnRpdHnqsIAg7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgRksg7Lus65+8XG4gICAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG5cbiAgICAgICAgLy8g7ZiE7J6sIOugiOy9lOuTnOuTpOydhCDssLjsobDtlZjripQgb3RoZXJFbnRpdHkg66CI7L2U65OcIOyhsO2ajFxuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGIob3RoZXJFbnRpdHkudGFibGUpLndoZXJlSW4oZm9yZWlnbktleU5hbWUsIHJlY29yZElkcyk7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkUmVjb3JkcyA9IGF3YWl0IHF1ZXJ5O1xuXG4gICAgICAgIGlmIChiYWNrd2FyZFJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsrDqs7zsl5Ag7LaU6rCAXG4gICAgICAgIHJlbGF0ZWRNYXAuc2V0KG90aGVyRW50aXR5TmFtZSwgYmFja3dhcmRSZWNvcmRzKTtcbiAgICAgICAgdmlzaXRlZC5hZGQob3RoZXJFbnRpdHlOYW1lKTtcblxuICAgICAgICAvLyDsnqzqt4A6IOyXreywuOyhsCDrjbDsnbTthLDsnZgg6rSA66CoIOuNsOydtO2EsOuPhCDsiJjsp5FcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgICAgb3RoZXJFbnRpdHlOYW1lLFxuICAgICAgICAgIGJhY2t3YXJkUmVjb3JkcyxcbiAgICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICAgcmVtYWluaW5nRGVwdGggLSAxLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O1lBTW1HO29CQUMzQztDQW9CM0MsMEJBQXdELEVBQUUsV0FDckUsRUFBRSxNQUFNO0VBQ04sRUFBRSxPQUFPO0VBQ1QsRUFBRSxPQUFPO0VBQ1QsRUFBRSxRQUFRO0VBQ1YsRUFBRSxPQUFPO0VBQ1QsRUFBRSxLQUFLO0VBQ1AsRUFBRSxXQUFXLFVBQVU7RUFDdkIsRUFBRSxLQUFLO0VBQ1AsRUFBRSxVQUFVO0VBQ1osRUFBRSxNQUFNLHVCQUF1QjtFQUMvQixFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsdUJBQXVCO0NBQzlDLENBQUMsQ0FDSDtDQUNhLDJCQUEyQixFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsdUJBQXVCO0NBQ3ZFLDRCQUE0QixFQUFFLE1BQU0sd0JBQXdCO0NBQ25FLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxPQUFPLE1BQU0sQ0FBQztDQUM3Qyx5QkFBeUIsRUFBRSxPQUFPO0VBQzdDLFVBQVUsRUFBRSxLQUFLO0dBQUM7R0FBVTtHQUFPO0dBQVM7R0FBUTtHQUFVO0VBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUztFQUNsRixPQUFPLEVBQUUsT0FBTyxDQUFDLENB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
@@ -1,4 +1,11 @@
1
1
  import { type FastifyInstance } from "fastify";
2
2
  import { type SonamuDevRunnerConfig } from "../api/config";
3
- export declare function registerDevTestRoutes(server: FastifyInstance, config: SonamuDevRunnerConfig): Promise<void>;
3
+ import { DevVitestManager } from "./dev-vitest-manager";
4
+ export type DevTestRouteManager = Pick<DevVitestManager, "start" | "run" | "getStatus" | "emitEvent" | "addEventListener" | "removeEventListener" | "shutdown">;
5
+ export type DevTestRouteDependencies = {
6
+ manager?: DevTestRouteManager;
7
+ apiRootPath?: string;
8
+ sseAvailable?: boolean;
9
+ };
10
+ export declare function registerDevTestRoutes(server: FastifyInstance, config: SonamuDevRunnerConfig, dependencies?: DevTestRouteDependencies): Promise<void>;
4
11
  //# sourceMappingURL=dev-test-routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-test-routes.d.ts","sourceRoot":"","sources":["../../src/testing/dev-test-routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAsJ3D,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAkIf"}
1
+ {"version":3,"file":"dev-test-routes.d.ts","sourceRoot":"","sources":["../../src/testing/dev-test-routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAW3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKxD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,gBAAgB,EACd,OAAO,GACP,KAAK,GACL,WAAW,GACX,WAAW,GACX,kBAAkB,GAClB,qBAAqB,GACrB,UAAU,CACb,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAqJF,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,qBAAqB,EAC7B,YAAY,CAAC,EAAE,wBAAwB,GACtC,OAAO,CAAC,IAAI,CAAC,CAwIf"}