velocious 1.0.643 → 1.0.645

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 (279) hide show
  1. package/README.md +21 -10
  2. package/build/authorization/ability.js +36 -13
  3. package/build/background-jobs/adapter.js +9 -0
  4. package/build/background-jobs/main.js +35 -10
  5. package/build/background-jobs/store.js +217 -38
  6. package/build/background-jobs/types.js +15 -0
  7. package/build/configuration-types.js +1 -1
  8. package/build/configuration.js +45 -9
  9. package/build/database/drivers/base-column.js +8 -0
  10. package/build/database/drivers/mssql/sql/update.js +1 -3
  11. package/build/database/drivers/mysql/sql/update.js +1 -3
  12. package/build/database/drivers/pgsql/column.js +22 -0
  13. package/build/database/drivers/pgsql/sql/update.js +1 -3
  14. package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
  15. package/build/database/drivers/sqlite/sql/update.js +1 -3
  16. package/build/database/query/index.js +2 -2
  17. package/build/database/query/model-class-query.js +26 -10
  18. package/build/database/query/preloader/has-many.js +4 -1
  19. package/build/database/query/query-data.js +2 -1
  20. package/build/database/query/update-base.js +14 -0
  21. package/build/database/query/with-count.js +3 -1
  22. package/build/database/record/acts-as-list.js +37 -13
  23. package/build/database/record/attachments/store.js +336 -26
  24. package/build/database/record/auditing.js +6 -3
  25. package/build/database/record/index.js +197 -42
  26. package/build/database/record/instance-relationships/belongs-to.js +2 -1
  27. package/build/database/record/validators/uniqueness.js +8 -5
  28. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  29. package/build/frontend-model-controller.js +136 -53
  30. package/build/frontend-model-resource/base-resource.js +87 -37
  31. package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
  32. package/build/frontend-models/base.js +307 -59
  33. package/build/frontend-models/preloader.js +6 -3
  34. package/build/frontend-models/query.js +15 -6
  35. package/build/frontend-models/resource-definition.js +21 -2
  36. package/build/frontend-models/use-destroyed-event.js +1 -1
  37. package/build/frontend-models/use-model-class-event.js +2 -2
  38. package/build/frontend-models/use-updated-event.js +1 -1
  39. package/build/frontend-models/websocket-channel.js +256 -93
  40. package/build/frontend-models/websocket-publishers.js +218 -18
  41. package/build/http-server/client/websocket-session.js +13 -1
  42. package/build/http-server/websocket-channel.js +15 -2
  43. package/build/src/authorization/ability.d.ts +9 -3
  44. package/build/src/authorization/ability.d.ts.map +1 -1
  45. package/build/src/authorization/ability.js +33 -14
  46. package/build/src/background-jobs/adapter.d.ts +6 -0
  47. package/build/src/background-jobs/adapter.d.ts.map +1 -1
  48. package/build/src/background-jobs/adapter.js +9 -1
  49. package/build/src/background-jobs/main.d.ts +6 -0
  50. package/build/src/background-jobs/main.d.ts.map +1 -1
  51. package/build/src/background-jobs/main.js +34 -11
  52. package/build/src/background-jobs/store.d.ts +66 -12
  53. package/build/src/background-jobs/store.d.ts.map +1 -1
  54. package/build/src/background-jobs/store.js +191 -35
  55. package/build/src/background-jobs/types.d.ts +55 -0
  56. package/build/src/background-jobs/types.d.ts.map +1 -1
  57. package/build/src/background-jobs/types.js +16 -1
  58. package/build/src/configuration-types.d.ts +3 -3
  59. package/build/src/configuration-types.d.ts.map +1 -1
  60. package/build/src/configuration-types.js +2 -2
  61. package/build/src/configuration.d.ts +18 -8
  62. package/build/src/configuration.d.ts.map +1 -1
  63. package/build/src/configuration.js +38 -7
  64. package/build/src/database/drivers/base-column.d.ts +5 -0
  65. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  66. package/build/src/database/drivers/base-column.js +8 -1
  67. package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
  68. package/build/src/database/drivers/mssql/sql/update.js +2 -4
  69. package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
  70. package/build/src/database/drivers/mysql/sql/update.js +2 -4
  71. package/build/src/database/drivers/pgsql/column.d.ts +5 -0
  72. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  73. package/build/src/database/drivers/pgsql/column.js +19 -1
  74. package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
  75. package/build/src/database/drivers/pgsql/sql/update.js +2 -4
  76. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  77. package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
  78. package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
  79. package/build/src/database/drivers/sqlite/sql/update.js +2 -4
  80. package/build/src/database/query/index.d.ts +4 -4
  81. package/build/src/database/query/index.d.ts.map +1 -1
  82. package/build/src/database/query/index.js +3 -3
  83. package/build/src/database/query/model-class-query.d.ts +8 -2
  84. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  85. package/build/src/database/query/model-class-query.js +25 -11
  86. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  87. package/build/src/database/query/preloader/has-many.js +4 -2
  88. package/build/src/database/query/query-data.d.ts.map +1 -1
  89. package/build/src/database/query/query-data.js +3 -2
  90. package/build/src/database/query/update-base.d.ts +7 -0
  91. package/build/src/database/query/update-base.d.ts.map +1 -1
  92. package/build/src/database/query/update-base.js +13 -1
  93. package/build/src/database/query/with-count.d.ts.map +1 -1
  94. package/build/src/database/query/with-count.js +3 -2
  95. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  96. package/build/src/database/record/acts-as-list.js +35 -14
  97. package/build/src/database/record/attachments/store.d.ts +67 -0
  98. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  99. package/build/src/database/record/attachments/store.js +301 -25
  100. package/build/src/database/record/auditing.d.ts.map +1 -1
  101. package/build/src/database/record/auditing.js +7 -4
  102. package/build/src/database/record/index.d.ts +78 -26
  103. package/build/src/database/record/index.d.ts.map +1 -1
  104. package/build/src/database/record/index.js +171 -42
  105. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  106. package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
  107. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  108. package/build/src/database/record/validators/uniqueness.js +8 -6
  109. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
  110. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  111. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
  112. package/build/src/frontend-model-controller.d.ts +29 -8
  113. package/build/src/frontend-model-controller.d.ts.map +1 -1
  114. package/build/src/frontend-model-controller.js +122 -51
  115. package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
  116. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  117. package/build/src/frontend-model-resource/base-resource.js +83 -37
  118. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
  119. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
  120. package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
  121. package/build/src/frontend-models/base.d.ts +53 -20
  122. package/build/src/frontend-models/base.d.ts.map +1 -1
  123. package/build/src/frontend-models/base.js +275 -59
  124. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  125. package/build/src/frontend-models/preloader.js +6 -4
  126. package/build/src/frontend-models/query.d.ts +2 -2
  127. package/build/src/frontend-models/query.d.ts.map +1 -1
  128. package/build/src/frontend-models/query.js +14 -7
  129. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  130. package/build/src/frontend-models/resource-definition.js +20 -3
  131. package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
  132. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  133. package/build/src/frontend-models/use-destroyed-event.js +2 -2
  134. package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
  135. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  136. package/build/src/frontend-models/use-model-class-event.js +3 -3
  137. package/build/src/frontend-models/use-updated-event.d.ts +1 -1
  138. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  139. package/build/src/frontend-models/use-updated-event.js +2 -2
  140. package/build/src/frontend-models/websocket-channel.d.ts +60 -41
  141. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  142. package/build/src/frontend-models/websocket-channel.js +225 -85
  143. package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
  144. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  145. package/build/src/frontend-models/websocket-publishers.js +190 -19
  146. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  147. package/build/src/http-server/client/websocket-session.js +11 -2
  148. package/build/src/http-server/websocket-channel.d.ts +20 -8
  149. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  150. package/build/src/http-server/websocket-channel.js +15 -3
  151. package/build/src/sync/assets/cache.d.ts +288 -0
  152. package/build/src/sync/assets/cache.d.ts.map +1 -0
  153. package/build/src/sync/assets/cache.js +883 -0
  154. package/build/src/sync/assets/types.d.ts +199 -0
  155. package/build/src/sync/assets/types.d.ts.map +1 -0
  156. package/build/src/sync/assets/types.js +56 -0
  157. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  158. package/build/src/sync/sync-api-client.js +4 -3
  159. package/build/src/sync/sync-client.d.ts.map +1 -1
  160. package/build/src/sync/sync-client.js +3 -2
  161. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  162. package/build/src/sync/sync-envelope-replay-service.js +6 -5
  163. package/build/src/sync/sync-publisher.d.ts.map +1 -1
  164. package/build/src/sync/sync-publisher.js +4 -3
  165. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
  166. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  167. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
  168. package/build/src/testing/test-profiler.d.ts +4 -4
  169. package/build/src/testing/test-profiler.d.ts.map +1 -1
  170. package/build/src/testing/test-profiler.js +3 -3
  171. package/build/src/testing/test-runner.d.ts +279 -117
  172. package/build/src/testing/test-runner.d.ts.map +1 -1
  173. package/build/src/testing/test-runner.js +503 -933
  174. package/build/src/testing/test.d.ts +11 -72
  175. package/build/src/testing/test.d.ts.map +1 -1
  176. package/build/src/testing/test.js +131 -284
  177. package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
  178. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
  179. package/build/src/testing/velocious-attempt-executor.js +408 -0
  180. package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
  181. package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
  182. package/build/src/testing/velocious-runner-reporter.js +240 -0
  183. package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
  184. package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
  185. package/build/src/testing/velocious-suite-hook-executor.js +41 -0
  186. package/build/src/testing/velocious-test-arguments.d.ts +39 -0
  187. package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
  188. package/build/src/testing/velocious-test-arguments.js +55 -0
  189. package/build/src/utils/model-primary-key.d.ts +73 -0
  190. package/build/src/utils/model-primary-key.d.ts.map +1 -0
  191. package/build/src/utils/model-primary-key.js +144 -0
  192. package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
  193. package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
  194. package/build/src/utils/sha256-bytes-hex.js +117 -0
  195. package/build/src/utils/sha256-hex.d.ts +2 -4
  196. package/build/src/utils/sha256-hex.d.ts.map +1 -1
  197. package/build/src/utils/sha256-hex.js +6 -120
  198. package/build/sync/assets/cache.js +998 -0
  199. package/build/sync/assets/types.js +62 -0
  200. package/build/sync/sync-api-client.js +3 -2
  201. package/build/sync/sync-client.js +2 -1
  202. package/build/sync/sync-envelope-replay-service.js +5 -4
  203. package/build/sync/sync-publisher.js +3 -2
  204. package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  205. package/build/testing/test-profiler.js +2 -2
  206. package/build/testing/test-runner.js +496 -990
  207. package/build/testing/test.js +164 -306
  208. package/build/testing/velocious-attempt-executor.js +441 -0
  209. package/build/testing/velocious-runner-reporter.js +264 -0
  210. package/build/testing/velocious-suite-hook-executor.js +43 -0
  211. package/build/testing/velocious-test-arguments.js +64 -0
  212. package/build/tsconfig.tsbuildinfo +1 -1
  213. package/build/utils/model-primary-key.js +171 -0
  214. package/build/utils/sha256-bytes-hex.js +132 -0
  215. package/build/utils/sha256-hex.js +7 -135
  216. package/package.json +5 -4
  217. package/src/authorization/ability.js +36 -13
  218. package/src/background-jobs/adapter.js +9 -0
  219. package/src/background-jobs/main.js +35 -10
  220. package/src/background-jobs/store.js +217 -38
  221. package/src/background-jobs/types.js +15 -0
  222. package/src/configuration-types.js +1 -1
  223. package/src/configuration.js +45 -9
  224. package/src/database/drivers/base-column.js +8 -0
  225. package/src/database/drivers/mssql/sql/update.js +1 -3
  226. package/src/database/drivers/mysql/sql/update.js +1 -3
  227. package/src/database/drivers/pgsql/column.js +22 -0
  228. package/src/database/drivers/pgsql/sql/update.js +1 -3
  229. package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
  230. package/src/database/drivers/sqlite/sql/update.js +1 -3
  231. package/src/database/query/index.js +2 -2
  232. package/src/database/query/model-class-query.js +26 -10
  233. package/src/database/query/preloader/has-many.js +4 -1
  234. package/src/database/query/query-data.js +2 -1
  235. package/src/database/query/update-base.js +14 -0
  236. package/src/database/query/with-count.js +3 -1
  237. package/src/database/record/acts-as-list.js +37 -13
  238. package/src/database/record/attachments/store.js +336 -26
  239. package/src/database/record/auditing.js +6 -3
  240. package/src/database/record/index.js +197 -42
  241. package/src/database/record/instance-relationships/belongs-to.js +2 -1
  242. package/src/database/record/validators/uniqueness.js +8 -5
  243. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  244. package/src/frontend-model-controller.js +136 -53
  245. package/src/frontend-model-resource/base-resource.js +87 -37
  246. package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
  247. package/src/frontend-models/base.js +307 -59
  248. package/src/frontend-models/preloader.js +6 -3
  249. package/src/frontend-models/query.js +15 -6
  250. package/src/frontend-models/resource-definition.js +21 -2
  251. package/src/frontend-models/use-destroyed-event.js +1 -1
  252. package/src/frontend-models/use-model-class-event.js +2 -2
  253. package/src/frontend-models/use-updated-event.js +1 -1
  254. package/src/frontend-models/websocket-channel.js +256 -93
  255. package/src/frontend-models/websocket-publishers.js +218 -18
  256. package/src/http-server/client/websocket-session.js +13 -1
  257. package/src/http-server/websocket-channel.js +15 -2
  258. package/src/sync/assets/cache.js +998 -0
  259. package/src/sync/assets/types.js +62 -0
  260. package/src/sync/sync-api-client.js +3 -2
  261. package/src/sync/sync-client.js +2 -1
  262. package/src/sync/sync-envelope-replay-service.js +5 -4
  263. package/src/sync/sync-publisher.js +3 -2
  264. package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  265. package/src/testing/test-profiler.js +2 -2
  266. package/src/testing/test-runner.js +496 -990
  267. package/src/testing/test.js +164 -306
  268. package/src/testing/velocious-attempt-executor.js +441 -0
  269. package/src/testing/velocious-runner-reporter.js +264 -0
  270. package/src/testing/velocious-suite-hook-executor.js +43 -0
  271. package/src/testing/velocious-test-arguments.js +64 -0
  272. package/src/utils/model-primary-key.js +171 -0
  273. package/src/utils/sha256-bytes-hex.js +132 -0
  274. package/src/utils/sha256-hex.js +7 -135
  275. package/build/src/testing/testing-package-adapter.d.ts +0 -9
  276. package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
  277. package/build/src/testing/testing-package-adapter.js +0 -69
  278. package/build/testing/testing-package-adapter.js +0 -76
  279. package/src/testing/testing-package-adapter.js +0 -76
@@ -1,10 +1,9 @@
1
1
  // @ts-check
2
- import path from "path";
3
- import { fileURLToPath } from "url";
4
- import { defaultTestContext, waitForEvent } from "@velocious/testing";
2
+ import { afterAll, afterEach, beforeAll, beforeEach, configureTests, defaultTestContext, describe, fdescribe, fit, it, test, waitForEvent, xdescribe, xit, xtest } from "@velocious/testing";
5
3
  import EventEmitter from "../utils/event-emitter.js";
6
4
  import Expect from "./expect.js";
7
5
  import { arrayContaining, objectContaining } from "./expect-utils.js";
6
+ /** @typedef {(typeof defaultTestContext.registry.suites)[number]} PackageSuiteDeclaration */
8
7
  /**
9
8
  * VelociousTestConfig type.
10
9
  * @typedef {object} VelociousTestConfig
@@ -13,224 +12,6 @@ import { arrayContaining, objectContaining } from "./expect-utils.js";
13
12
  * @property {number} defaultTimeoutSeconds - Default timeout in seconds.
14
13
  * @property {number} failedConsoleOutputMaxLines - Maximum failed console lines to print inline.
15
14
  */
16
- /**
17
- * Tests.
18
- * @type {import("./test-runner.js").TestsArgument} */
19
- const tests = {
20
- /**
21
- * Narrows the runtime value to the documented type.
22
- * @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
23
- afterEaches: [],
24
- /**
25
- * Narrows the runtime value to the documented type.
26
- * @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
27
- afterAlls: [],
28
- args: { databaseCleaning: { transaction: true } },
29
- /**
30
- * Narrows the runtime value to the documented type.
31
- * @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
32
- beforeAlls: [],
33
- /**
34
- * Narrows the runtime value to the documented type.
35
- * @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
36
- beforeEaches: [],
37
- filePath: undefined,
38
- line: undefined,
39
- subs: {},
40
- tests: {}
41
- };
42
- const testEvents = new EventEmitter();
43
- let currentPath = [tests];
44
- /**
45
- * Runs capture location.
46
- * @returns {{filePath?: string, line?: number}} - Location.
47
- */
48
- function captureLocation() {
49
- const error = new Error();
50
- const stack = typeof error.stack === "string" ? error.stack.split("\n") : [];
51
- for (const line of stack) {
52
- const trimmed = line.trim();
53
- if (!trimmed.includes("at"))
54
- continue;
55
- if (trimmed.includes("/src/testing/test.js"))
56
- continue;
57
- if (trimmed.includes("/@velocious/testing/"))
58
- continue;
59
- const match = trimmed.match(/(?:\(|\s)(file:\/\/.*?|\/.*?):(\d+):(\d+)\)?$/);
60
- if (!match)
61
- continue;
62
- const rawPath = match[1];
63
- const lineNumber = Number(match[2]);
64
- const filePath = rawPath.startsWith("file://")
65
- ? fileURLToPath(rawPath)
66
- : rawPath;
67
- return {
68
- filePath: path.resolve(filePath),
69
- line: Number.isFinite(lineNumber) ? lineNumber : undefined
70
- };
71
- }
72
- return {};
73
- }
74
- defaultTestContext.setDeclarationLocator(captureLocation);
75
- /**
76
- * Runs normalize tags.
77
- * @param {string[] | string | undefined} tags - Tags.
78
- * @returns {string[]} - Normalized tags.
79
- */
80
- function normalizeTags(tags) {
81
- if (!tags)
82
- return [];
83
- const values = [];
84
- const rawTags = Array.isArray(tags) ? tags : [tags];
85
- for (const rawTag of rawTags) {
86
- if (rawTag === undefined || rawTag === null)
87
- continue;
88
- const parts = String(rawTag).split(",");
89
- for (const part of parts) {
90
- const trimmed = part.trim();
91
- if (trimmed)
92
- values.push(trimmed);
93
- }
94
- }
95
- return Array.from(new Set(values));
96
- }
97
- /**
98
- * Test config.
99
- * @type {VelociousTestConfig} */
100
- const testConfig = {
101
- consoleOutput: "failure",
102
- failedConsoleOutputMaxLines: 200,
103
- excludeTags: [],
104
- defaultTimeoutSeconds: 60
105
- };
106
- /**
107
- * Runs configure tests.
108
- * @param {object} args - Options.
109
- * @param {"failure" | "live"} [args.consoleOutput] - Console output mode.
110
- * @param {string[] | string} [args.excludeTags] - Tags to exclude.
111
- * @param {number} [args.defaultTimeoutSeconds] - Default timeout in seconds.
112
- * @param {number} [args.failedConsoleOutputMaxLines] - Maximum failed console lines to print inline.
113
- * @returns {void}
114
- */
115
- function configureTests({ consoleOutput, excludeTags, defaultTimeoutSeconds, failedConsoleOutputMaxLines } = {}) {
116
- if (excludeTags !== undefined) {
117
- testConfig.excludeTags = normalizeTags(excludeTags);
118
- }
119
- if (consoleOutput !== undefined) {
120
- if (consoleOutput !== "failure" && consoleOutput !== "live") {
121
- throw new Error(`Invalid consoleOutput config: ${consoleOutput}`);
122
- }
123
- testConfig.consoleOutput = consoleOutput;
124
- }
125
- if (typeof defaultTimeoutSeconds === "number") {
126
- testConfig.defaultTimeoutSeconds = defaultTimeoutSeconds;
127
- }
128
- if (typeof failedConsoleOutputMaxLines === "number") {
129
- testConfig.failedConsoleOutputMaxLines = failedConsoleOutputMaxLines;
130
- }
131
- }
132
- /**
133
- * Runs merge test args.
134
- * @param {Record<string, ReturnType<typeof JSON.parse>>} baseArgs - Base args.
135
- * @param {Record<string, ReturnType<typeof JSON.parse>>} extraArgs - Extra args.
136
- * @returns {Record<string, ReturnType<typeof JSON.parse>>} - Merged args.
137
- */
138
- function mergeTestArgs(baseArgs, extraArgs) {
139
- const merged = Object.assign({}, baseArgs, extraArgs);
140
- const mergedTags = [...normalizeTags(baseArgs?.tags), ...normalizeTags(extraArgs?.tags)];
141
- if (mergedTags.length > 0) {
142
- merged.tags = Array.from(new Set(mergedTags));
143
- }
144
- else if ("tags" in merged) {
145
- delete merged.tags;
146
- }
147
- return merged;
148
- }
149
- /**
150
- * Runs before each.
151
- * @param {import("./test-runner.js").AfterBeforeEachCallbackType} callback - Callback function.
152
- * @returns {void} - No return value.
153
- */
154
- function beforeEach(callback) {
155
- const currentTest = currentPath[currentPath.length - 1];
156
- currentTest.beforeEaches.push({ callback });
157
- }
158
- /**
159
- * Runs before all.
160
- * @param {import("./test-runner.js").BeforeAfterAllCallbackType} callback - Callback function.
161
- * @returns {void} - No return value.
162
- */
163
- function beforeAll(callback) {
164
- const currentTest = currentPath[currentPath.length - 1];
165
- currentTest.beforeAlls.push({ callback });
166
- }
167
- /**
168
- * Runs after each.
169
- * @param {import("./test-runner.js").AfterBeforeEachCallbackType} callback - Callback function.
170
- * @returns {void} - No return value.
171
- */
172
- function afterEach(callback) {
173
- const currentTest = currentPath[currentPath.length - 1];
174
- currentTest.afterEaches.push({ callback });
175
- }
176
- /**
177
- * Runs after all.
178
- * @param {import("./test-runner.js").BeforeAfterAllCallbackType} callback - Callback function.
179
- * @returns {void} - No return value.
180
- */
181
- function afterAll(callback) {
182
- const currentTest = currentPath[currentPath.length - 1];
183
- currentTest.afterAlls.push({ callback });
184
- }
185
- /**
186
- * Runs describe.
187
- * @param {string} description - Description.
188
- * @param {object|(() => (void|Promise<void>))} arg1 - Arg1.
189
- * @param {undefined|(() => (void|Promise<void>))} [arg2] - Arg2.
190
- * @returns {Promise<void>} - Resolves when complete.
191
- */
192
- async function describe(description, arg1, arg2) {
193
- /**
194
- * Defines testArgs.
195
- * @type {Record<string, ReturnType<typeof JSON.parse>>} */
196
- let testArgs, testFunction;
197
- if (typeof arg2 == "function") {
198
- testFunction = arg2;
199
- testArgs = arg1;
200
- }
201
- else if (typeof arg1 == "function") {
202
- testFunction = arg1;
203
- testArgs = {};
204
- }
205
- else {
206
- throw new Error(`Invalid arguments for describe: ${arg1}, ${arg2}`);
207
- }
208
- const currentTest = currentPath[currentPath.length - 1];
209
- const newTestArgs = mergeTestArgs(currentTest.args, testArgs);
210
- if (description in currentTest.subs) {
211
- throw new Error(`Duplicate test description: ${description}`);
212
- }
213
- const location = captureLocation();
214
- const newTestData = {
215
- afterEaches: [],
216
- afterAlls: [],
217
- args: newTestArgs,
218
- beforeAlls: [],
219
- beforeEaches: [],
220
- filePath: location.filePath,
221
- line: location.line,
222
- subs: {},
223
- tests: {}
224
- };
225
- currentTest.subs[description] = newTestData;
226
- currentPath.push(newTestData);
227
- try {
228
- await testFunction();
229
- }
230
- finally {
231
- currentPath.pop();
232
- }
233
- }
234
15
  /**
235
16
  * Runs expect.
236
17
  * @param {ReturnType<typeof JSON.parse>} arg - Arg.
@@ -241,73 +22,134 @@ function expect(arg) {
241
22
  }
242
23
  expect.objectContaining = objectContaining;
243
24
  expect.arrayContaining = arrayContaining;
25
+ /** Velocious-owned awaited compatibility events. */
26
+ const testEvents = new EventEmitter();
244
27
  /**
245
- * Runs it.
246
- * @param {string} description - Description.
247
- * @param {object|(() => (void|Promise<void>))} arg1 - Arg1.
248
- * @param {undefined|(() => (void|Promise<void>))} [arg2] - Arg2.
249
- * @returns {void} - No return value.
28
+ * Detaches and freezes declaration metadata exposed by the compatibility view.
29
+ * @param {ReturnType<typeof JSON.parse>} value - Package declaration value.
30
+ * @returns {ReturnType<typeof JSON.parse>} - Immutable detached value.
250
31
  */
251
- function it(description, arg1, arg2) {
252
- const currentTest = currentPath[currentPath.length - 1];
253
- /**
254
- * Defines testArgs.
255
- * @type {Record<string, ReturnType<typeof JSON.parse>>} */
256
- let testArgs;
257
- /**
258
- * Defines testFunction.
259
- * @type {() => (void|Promise<void>)} */
260
- let testFunction;
261
- if (typeof arg1 == "function") {
262
- testFunction = /** @type {() => (void|Promise<void>)} */ (arg1);
263
- testArgs = {};
264
- }
265
- else if (typeof arg2 == "function") {
266
- testFunction = /** @type {() => (void|Promise<void>)} */ (arg2);
267
- testArgs = arg1;
268
- }
269
- else {
270
- throw new Error(`Invalid arguments for it: ${description}, ${arg1}`);
271
- }
272
- const newTestArgs = mergeTestArgs(currentTest.args, testArgs);
273
- const location = captureLocation();
274
- currentTest.tests[description] = {
275
- args: newTestArgs,
276
- function: testFunction,
277
- filePath: location.filePath,
278
- line: location.line
32
+ function readOnlySnapshot(value) {
33
+ if (Array.isArray(value))
34
+ return Object.freeze(value.map((entry) => readOnlySnapshot(entry)));
35
+ if (value === null || typeof value !== "object")
36
+ return value;
37
+ /** @type {Record<string, ReturnType<typeof JSON.parse>>} */
38
+ const projectedValue = {};
39
+ for (const [key, entry] of Object.entries(value))
40
+ projectedValue[key] = readOnlySnapshot(entry);
41
+ return Object.freeze(projectedValue);
42
+ }
43
+ /**
44
+ * Backward-compatible view of the package configuration.
45
+ * @type {VelociousTestConfig}
46
+ */
47
+ const testConfig = {
48
+ get consoleOutput() { return defaultTestContext.config.consoleOutput; },
49
+ set consoleOutput(value) { defaultTestContext.configureTests({ consoleOutput: value }); },
50
+ get excludeTags() { return defaultTestContext.config.excludeTags; },
51
+ set excludeTags(value) { defaultTestContext.configureTests({ excludeTags: value }); },
52
+ get defaultTimeoutSeconds() { return defaultTestContext.config.defaultTimeoutMs / 1000; },
53
+ set defaultTimeoutSeconds(value) { defaultTestContext.configureTests({ defaultTimeoutSeconds: value }); },
54
+ get failedConsoleOutputMaxLines() { return defaultTestContext.config.failedConsoleOutputMaxLines; },
55
+ set failedConsoleOutputMaxLines(value) { defaultTestContext.configureTests({ failedConsoleOutputMaxLines: value }); }
56
+ };
57
+ /**
58
+ * Projects one package suite into the deprecated legacy inspection shape.
59
+ * The returned objects are snapshots and never participate in execution.
60
+ * @param {PackageSuiteDeclaration} suite - Package declaration.
61
+ * @returns {import("./test-runner.js").TestsArgument} - Read-only compatibility snapshot.
62
+ */
63
+ function projectSuite(suite) {
64
+ /** @type {Record<string, import("./test-runner.js").TestData>} */
65
+ const projectedTests = {};
66
+ /** @type {Record<string, import("./test-runner.js").TestsArgument>} */
67
+ const projectedSuites = {};
68
+ for (const declaration of suite.tests) {
69
+ const mutableArgs = { ...declaration.options };
70
+ if (mutableArgs.retry === undefined && typeof mutableArgs.retries === "number")
71
+ mutableArgs.retry = mutableArgs.retries;
72
+ if (mutableArgs.timeoutSeconds === undefined && typeof mutableArgs.timeoutMs === "number")
73
+ mutableArgs.timeoutSeconds = mutableArgs.timeoutMs / 1000;
74
+ projectedTests[declaration.name] = Object.freeze({
75
+ args: readOnlySnapshot(mutableArgs),
76
+ filePath: declaration.location.filePath,
77
+ function: declaration.callback,
78
+ line: declaration.location.line
79
+ });
80
+ }
81
+ for (const child of suite.suites)
82
+ projectedSuites[child.name] = projectSuite(child);
83
+ const projection = {
84
+ afterAlls: Object.freeze(suite.hooks.afterAll.map((hook) => Object.freeze({ callback: hook.callback }))),
85
+ afterEaches: Object.freeze(suite.hooks.afterEach.map((hook) => Object.freeze({ callback: hook.callback }))),
86
+ args: readOnlySnapshot(suite.options),
87
+ beforeAlls: Object.freeze(suite.hooks.beforeAll.map((hook) => Object.freeze({ callback: hook.callback }))),
88
+ beforeEaches: Object.freeze(suite.hooks.beforeEach.map((hook) => Object.freeze({ callback: hook.callback }))),
89
+ filePath: suite.location.filePath,
90
+ line: suite.location.line,
91
+ subs: Object.freeze(projectedSuites),
92
+ tests: Object.freeze(projectedTests)
279
93
  };
94
+ // Narrows the immutable snapshot to the historical inspection contract.
95
+ return /** @type {import("./test-runner.js").TestsArgument} */ (Object.freeze(projection));
280
96
  }
281
97
  /**
282
- * Runs fit.
283
- * @param {string} description - Description.
284
- * @param {object|(() => (void|Promise<void>))} arg1 - Arg1.
285
- * @param {undefined|(() => (void|Promise<void>))} [arg2] - Arg2.
286
- * @returns {void} - No return value.
98
+ * Deprecated read-only declaration projection. Package declarations in
99
+ * defaultTestContext are the sole execution source.
287
100
  */
288
- function fit(description, arg1, arg2) {
289
- /**
290
- * Defines testArgs.
291
- * @type {Record<string, ReturnType<typeof JSON.parse>>} */
292
- let testArgs;
293
- /**
294
- * Defines testFunction.
295
- * @type {() => (void|Promise<void>)} */
296
- let testFunction;
297
- if (typeof arg1 == "function") {
298
- testFunction = /** @type {() => (void|Promise<void>)} */ (arg1);
299
- testArgs = { focus: true };
300
- }
301
- else if (typeof arg2 == "function") {
302
- testFunction = /** @type {() => (void|Promise<void>)} */ (arg2);
303
- testArgs = Object.assign({ focus: true }, arg1);
304
- }
305
- else {
306
- throw new Error(`Invalid arguments for it: ${description}, ${arg1}`);
101
+ /** @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
102
+ const emptyAfterAlls = [];
103
+ /** @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
104
+ const emptyAfterEaches = [];
105
+ /** @type {import("./test-runner.js").BeforeAfterAllCallbackObjectType[]} */
106
+ const emptyBeforeAlls = [];
107
+ /** @type {import("./test-runner.js").AfterBeforeEachCallbackObjectType[]} */
108
+ const emptyBeforeEaches = [];
109
+ const defaultTestArguments = { databaseCleaning: { transaction: true } };
110
+ Object.freeze(emptyAfterAlls);
111
+ Object.freeze(emptyAfterEaches);
112
+ Object.freeze(emptyBeforeAlls);
113
+ Object.freeze(emptyBeforeEaches);
114
+ Object.freeze(defaultTestArguments.databaseCleaning);
115
+ Object.freeze(defaultTestArguments);
116
+ const testsProjection = {
117
+ get afterAlls() { return emptyAfterAlls; },
118
+ get afterEaches() { return emptyAfterEaches; },
119
+ get args() { return defaultTestArguments; },
120
+ get beforeAlls() { return emptyBeforeAlls; },
121
+ get beforeEaches() { return emptyBeforeEaches; },
122
+ get filePath() { return undefined; },
123
+ get line() { return undefined; },
124
+ get subs() {
125
+ /** @type {Record<string, import("./test-runner.js").TestsArgument>} */
126
+ const projectedSuites = {};
127
+ for (const suite of defaultTestContext.registry.suites) {
128
+ if (suite.name === "") {
129
+ for (const childSuite of suite.suites)
130
+ projectedSuites[childSuite.name] = projectSuite(childSuite);
131
+ }
132
+ else {
133
+ projectedSuites[suite.name] = projectSuite(suite);
134
+ }
135
+ }
136
+ return Object.freeze(projectedSuites);
137
+ },
138
+ get tests() {
139
+ /** @type {Record<string, import("./test-runner.js").TestData>} */
140
+ const projectedTests = {};
141
+ for (const suite of defaultTestContext.registry.suites) {
142
+ if (suite.name !== "")
143
+ continue;
144
+ Object.assign(projectedTests, projectSuite(suite).tests);
145
+ }
146
+ return Object.freeze(projectedTests);
307
147
  }
308
- return it(description, testArgs, testFunction);
309
- }
310
- // Make the methods global so they can be used in test files
148
+ };
149
+ /** @type {import("./test-runner.js").TestsArgument} */
150
+ const tests = testsProjection;
151
+ Object.freeze(tests);
152
+ // Make the compatibility facade global so existing test files remain source-compatible.
311
153
  Object.assign(globalThis, {
312
154
  afterAll,
313
155
  afterEach,
@@ -316,9 +158,14 @@ Object.assign(globalThis, {
316
158
  configureTests,
317
159
  describe,
318
160
  expect,
161
+ fdescribe,
319
162
  fit,
320
163
  it,
321
- testEvents
164
+ test,
165
+ testEvents,
166
+ xdescribe,
167
+ xit,
168
+ xtest
322
169
  });
323
- export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fit, it, arrayContaining, objectContaining, testConfig, testEvents, tests, waitForEvent };
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sS0FBSyxDQUFBO0FBQ2pDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUNuRSxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBRW5FOzs7Ozs7O0dBT0c7QUFDSDs7c0RBRXNEO0FBQ3RELE1BQU0sS0FBSyxHQUFHO0lBQ1o7O2dGQUU0RTtJQUM1RSxXQUFXLEVBQUUsRUFBRTtJQUNmOzsrRUFFMkU7SUFDM0UsU0FBUyxFQUFFLEVBQUU7SUFDYixJQUFJLEVBQUUsRUFBQyxnQkFBZ0IsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsRUFBQztJQUU3Qzs7K0VBRTJFO0lBQzNFLFVBQVUsRUFBRSxFQUFFO0lBQ2Q7O2dGQUU0RTtJQUM1RSxZQUFZLEVBQUUsRUFBRTtJQUNoQixRQUFRLEVBQUUsU0FBUztJQUNuQixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEVBQUU7Q0FDVixDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtBQUVyQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXpCOzs7R0FHRztBQUNILFNBQVMsZUFBZTtJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFBO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUss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UyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IHtkZWZhdWx0VGVzdENvbnRleHQsIHdhaXRGb3JFdmVudH0gZnJvbSBcIkB2ZWxvY2lvdXMvdGVzdGluZ1wiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBFeHBlY3QgZnJvbSBcIi4vZXhwZWN0LmpzXCJcbmltcG9ydCB7YXJyYXlDb250YWluaW5nLCBvYmplY3RDb250YWluaW5nfSBmcm9tIFwiLi9leHBlY3QtdXRpbHMuanNcIlxuXG4vKipcbiAqIFZlbG9jaW91c1Rlc3RDb25maWcgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1Rlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7XCJmYWlsdXJlXCIgfCBcImxpdmVcIn0gY29uc29sZU91dHB1dCAtIENvbnNvbGUgb3V0cHV0IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBleGNsdWRlVGFncyAtIFRhZ3MgZXhjbHVkZWQgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZWZhdWx0VGltZW91dFNlY29uZHMgLSBEZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXMgLSBNYXhpbXVtIGZhaWxlZCBjb25zb2xlIGxpbmVzIHRvIHByaW50IGlubGluZS5cbiAqL1xuLyoqXG4gKiBUZXN0cy5cbiAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnR9ICovXG5jb25zdCB0ZXN0cyA9IHtcbiAgLyoqXG4gICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGFmdGVyRWFjaGVzOiBbXSxcbiAgLyoqXG4gICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYWZ0ZXJBbGxzOiBbXSxcbiAgYXJnczoge2RhdGFiYXNlQ2xlYW5pbmc6IHt0cmFuc2FjdGlvbjogdHJ1ZX19LFxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGJlZm9yZUFsbHM6IFtdLFxuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgZmlsZVBhdGg6IHVuZGVmaW5lZCxcbiAgbGluZTogdW5kZWZpbmVkLFxuICBzdWJzOiB7fSxcbiAgdGVzdHM6IHt9XG59XG5cbmNvbnN0IHRlc3RFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxubGV0IGN1cnJlbnRQYXRoID0gW3Rlc3RzXVxuXG4vKipcbiAqIFJ1bnMgY2FwdHVyZSBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHt7ZmlsZVBhdGg/OiBzdHJpbmcsIGxpbmU/OiBudW1iZXJ9fSAtIExvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlTG9jYXRpb24oKSB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcbiAgY29uc3Qgc3RhY2sgPSB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09IFwic3RyaW5nXCIgPyBlcnJvci5zdGFjay5zcGxpdChcIlxcblwiKSA6IFtdXG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0YWNrKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpXG5cbiAgICBpZiAoIXRyaW1tZWQuaW5jbHVkZXMoXCJhdFwiKSkgY29udGludWVcbiAgICBpZiAodHJpbW1lZC5pbmNsdWRlcyhcIi9zcmMvdGVzdGluZy90ZXN0LmpzXCIpKSBjb250aW51ZVxuICAgIGlmICh0cmltbWVkLmluY2x1ZGVzKFwiL0B2ZWxvY2lvdXMvdGVzdGluZy9cIikpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goLyg/OlxcKHxcXHMpKGZpbGU6XFwvXFwvLio/fFxcLy4qPyk6KFxcZCspOihcXGQrKVxcKT8kLylcblxuICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlXG5cbiAgICBjb25zdCByYXdQYXRoID0gbWF0Y2hbMV1cbiAgICBjb25zdCBsaW5lTnVtYmVyID0gTnVtYmVyKG1hdGNoWzJdKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKVxuICAgICAgPyBmaWxlVVJMVG9QYXRoKHJhd1BhdGgpXG4gICAgICA6IHJhd1BhdGhcblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlUGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSxcbiAgICAgIGxpbmU6IE51bWJlci5pc0Zpbml0ZShsaW5lTnVtYmVyKSA/IGxpbmVOdW1iZXIgOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge31cbn1cblxuZGVmYXVsdFRlc3RDb250ZXh0LnNldERlY2xhcmF0aW9uTG9jYXRvcihjYXB0dXJlTG9jYXRpb24pXG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgdGFncy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWR9IHRhZ3MgLSBUYWdzLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgdGFncy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVGFncyh0YWdzKSB7XG4gIGlmICghdGFncykgcmV0dXJuIFtdXG5cbiAgY29uc3QgdmFsdWVzID0gW11cbiAgY29uc3QgcmF3VGFncyA9IEFycmF5LmlzQXJyYXkodGFncykgPyB0YWdzIDogW3RhZ3NdXG5cbiAgZm9yIChjb25zdCByYXdUYWcgb2YgcmF3VGFncykge1xuICAgIGlmIChyYXdUYWcgPT09IHVuZGVmaW5lZCB8fCByYXdUYWcgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXJ0cyA9IFN0cmluZyhyYXdUYWcpLnNwbGl0KFwiLFwiKVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gcGFydC50cmltKClcblxuICAgICAgaWYgKHRyaW1tZWQpIHZhbHVlcy5wdXNoKHRyaW1tZWQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKVxufVxuXG4vKipcbiAqIFRlc3QgY29uZmlnLlxuICogQHR5cGUge1ZlbG9jaW91c1Rlc3RDb25maWd9ICovXG5jb25zdCB0ZXN0Q29uZmlnID0ge1xuICBjb25zb2xlT3V0cHV0OiBcImZhaWx1cmVcIixcbiAgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzOiAyMDAsXG4gIGV4Y2x1ZGVUYWdzOiBbXSxcbiAgZGVmYXVsdFRpbWVvdXRTZWNvbmRzOiA2MFxufVxuXG4vKipcbiAqIFJ1bnMgY29uZmlndXJlIHRlc3RzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtcImZhaWx1cmVcIiB8IFwibGl2ZVwifSBbYXJncy5jb25zb2xlT3V0cHV0XSAtIENvbnNvbGUgb3V0cHV0IG1vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSBbYXJncy5leGNsdWRlVGFnc10gLSBUYWdzIHRvIGV4Y2x1ZGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVmYXVsdFRpbWVvdXRTZWNvbmRzXSAtIERlZmF1bHQgdGltZW91dCBpbiBzZWNvbmRzLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmZhaWxlZENvbnNvbGVPdXRwdXRNYXhMaW5lc10gLSBNYXhpbXVtIGZhaWxlZCBjb25zb2xlIGxpbmVzIHRvIHByaW50IGlubGluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBjb25maWd1cmVUZXN0cyh7Y29uc29sZU91dHB1dCwgZXhjbHVkZVRhZ3MsIGRlZmF1bHRUaW1lb3V0U2Vjb25kcywgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzfSA9IHt9KSB7XG4gIGlmIChleGNsdWRlVGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGVzdENvbmZpZy5leGNsdWRlVGFncyA9IG5vcm1hbGl6ZVRhZ3MoZXhjbHVkZVRhZ3MpXG4gIH1cblxuICBpZiAoY29uc29sZU91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNvbnNvbGVPdXRwdXQgIT09IFwiZmFpbHVyZVwiICYmIGNvbnNvbGVPdXRwdXQgIT09IFwibGl2ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uc29sZU91dHB1dCBjb25maWc6ICR7Y29uc29sZU91dHB1dH1gKVxuICAgIH1cblxuICAgIHRlc3RDb25maWcuY29uc29sZU91dHB1dCA9IGNvbnNvbGVPdXRwdXRcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVmYXVsdFRpbWVvdXRTZWNvbmRzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5kZWZhdWx0VGltZW91dFNlY29uZHMgPSBkZWZhdWx0VGltZW91dFNlY29uZHNcbiAgfVxuXG4gIGlmICh0eXBlb2YgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5mYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXMgPSBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXNcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbWVyZ2UgdGVzdCBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGJhc2VBcmdzIC0gQmFzZSBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGV4dHJhQXJncyAtIEV4dHJhIGFyZ3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIE1lcmdlZCBhcmdzLlxuICovXG5mdW5jdGlvbiBtZXJnZVRlc3RBcmdzKGJhc2VBcmdzLCBleHRyYUFyZ3MpIHtcbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmFzc2lnbih7fSwgYmFzZUFyZ3MsIGV4dHJhQXJncylcbiAgY29uc3QgbWVyZ2VkVGFncyA9IFsuLi5ub3JtYWxpemVUYWdzKGJhc2VBcmdzPy50YWdzKSwgLi4ubm9ybWFsaXplVGFncyhleHRyYUFyZ3M/LnRhZ3MpXVxuXG4gIGlmIChtZXJnZWRUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBtZXJnZWQudGFncyA9IEFycmF5LmZyb20obmV3IFNldChtZXJnZWRUYWdzKSlcbiAgfSBlbHNlIGlmIChcInRhZ3NcIiBpbiBtZXJnZWQpIHtcbiAgICBkZWxldGUgbWVyZ2VkLnRhZ3NcbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlRWFjaChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlRWFjaGVzLnB1c2goe2NhbGxiYWNrfSlcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZUFsbChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlQWxscy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYWZ0ZXJFYWNoKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckVhY2hlcy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFmdGVyQWxsKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckFsbHMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG4vKipcbiAqIFJ1bnMgZGVzY3JpYmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IGFyZzEgLSBBcmcxLlxuICogQHBhcmFtIHt1bmRlZmluZWR8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gW2FyZzJdIC0gQXJnMi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlc2NyaWJlKGRlc2NyaXB0aW9uLCBhcmcxLCBhcmcyKSB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICBsZXQgdGVzdEFyZ3MsIHRlc3RGdW5jdGlvblxuXG4gIGlmICh0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSBhcmcyXG4gICAgdGVzdEFyZ3MgPSBhcmcxXG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gYXJnMVxuICAgIHRlc3RBcmdzID0ge31cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzIGZvciBkZXNjcmliZTogJHthcmcxfSwgJHthcmcyfWApXG4gIH1cblxuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIGNvbnN0IG5ld1Rlc3RBcmdzID0gbWVyZ2VUZXN0QXJncyhjdXJyZW50VGVzdC5hcmdzLCB0ZXN0QXJncylcblxuICBpZiAoZGVzY3JpcHRpb24gaW4gY3VycmVudFRlc3Quc3Vicykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRlc3QgZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YClcbiAgfVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gY2FwdHVyZUxvY2F0aW9uKClcbiAgY29uc3QgbmV3VGVzdERhdGEgPSB7XG4gICAgYWZ0ZXJFYWNoZXM6IFtdLFxuICAgIGFmdGVyQWxsczogW10sXG4gICAgYXJnczogbmV3VGVzdEFyZ3MsXG4gICAgYmVmb3JlQWxsczogW10sXG4gICAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgICBmaWxlUGF0aDogbG9jYXRpb24uZmlsZVBhdGgsXG4gICAgbGluZTogbG9jYXRpb24ubGluZSxcbiAgICBzdWJzOiB7fSxcbiAgICB0ZXN0czoge31cbiAgfVxuXG4gIGN1cnJlbnRUZXN0LnN1YnNbZGVzY3JpcHRpb25dID0gbmV3VGVzdERhdGFcbiAgY3VycmVudFBhdGgucHVzaChuZXdUZXN0RGF0YSlcblxuICB0cnkge1xuICAgIGF3YWl0IHRlc3RGdW5jdGlvbigpXG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFBhdGgucG9wKClcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgZXhwZWN0LlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJnIC0gQXJnLlxuICogQHJldHVybnMge0V4cGVjdH0gLSBUaGUgZXhwZWN0LlxuICovXG5mdW5jdGlvbiBleHBlY3QoYXJnKSB7XG4gIHJldHVybiBuZXcgRXhwZWN0KGFyZylcbn1cblxuZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcgPSBvYmplY3RDb250YWluaW5nXG5leHBlY3QuYXJyYXlDb250YWluaW5nID0gYXJyYXlDb250YWluaW5nXG5cbi8qKlxuICogUnVucyBpdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uLlxuICogQHBhcmFtIHtvYmplY3R8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gYXJnMSAtIEFyZzEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBbYXJnMl0gLSBBcmcyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICBsZXQgdGVzdEFyZ3NcblxuICAvKipcbiAgICogRGVmaW5lcyB0ZXN0RnVuY3Rpb24uXG4gICAqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi9cbiAgbGV0IHRlc3RGdW5jdGlvblxuXG4gIGlmICh0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSAvKiogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqLyAoYXJnMSlcbiAgICB0ZXN0QXJncyA9IHt9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gLyoqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi8gKGFyZzIpXG4gICAgdGVzdEFyZ3MgPSBhcmcxXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgaXQ6ICR7ZGVzY3JpcHRpb259LCAke2FyZzF9YClcbiAgfVxuXG4gIGNvbnN0IG5ld1Rlc3RBcmdzID0gbWVyZ2VUZXN0QXJncyhjdXJyZW50VGVzdC5hcmdzLCB0ZXN0QXJncylcblxuICBjb25zdCBsb2NhdGlvbiA9IGNhcHR1cmVMb2NhdGlvbigpXG5cbiAgY3VycmVudFRlc3QudGVzdHNbZGVzY3JpcHRpb25dID0ge1xuICAgIGFyZ3M6IG5ld1Rlc3RBcmdzLFxuICAgIGZ1bmN0aW9uOiB0ZXN0RnVuY3Rpb24sXG4gICAgZmlsZVBhdGg6IGxvY2F0aW9uLmZpbGVQYXRoLFxuICAgIGxpbmU6IGxvY2F0aW9uLmxpbmVcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgZml0LlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24uXG4gKiBAcGFyYW0ge29iamVjdHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBhcmcxIC0gQXJnMS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IFthcmcyXSAtIEFyZzIuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGZpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICAvKipcbiAgICogRGVmaW5lcyB0ZXN0QXJncy5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgbGV0IHRlc3RBcmdzXG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGVzdEZ1bmN0aW9uLlxuICAgKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovXG4gIGxldCB0ZXN0RnVuY3Rpb25cblxuICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gLyoqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi8gKGFyZzEpXG4gICAgdGVzdEFyZ3MgPSB7Zm9jdXM6IHRydWV9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gLyoqIEB0eXBlIHsoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KX0gKi8gKGFyZzIpXG4gICAgdGVzdEFyZ3MgPSBPYmplY3QuYXNzaWduKHtmb2N1czogdHJ1ZX0sIGFyZzEpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgaXQ6ICR7ZGVzY3JpcHRpb259LCAke2FyZzF9YClcbiAgfVxuXG4gIHJldHVybiBpdChkZXNjcmlwdGlvbiwgdGVzdEFyZ3MsIHRlc3RGdW5jdGlvbilcbn1cblxuLy8gTWFrZSB0aGUgbWV0aG9kcyBnbG9iYWwgc28gdGhleSBjYW4gYmUgdXNlZCBpbiB0ZXN0IGZpbGVzXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHtcbiAgYWZ0ZXJBbGwsXG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlQWxsLFxuICBiZWZvcmVFYWNoLFxuICBjb25maWd1cmVUZXN0cyxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgZml0LFxuICBpdCxcbiAgdGVzdEV2ZW50c1xufSlcblxuZXhwb3J0IHthZnRlckFsbCwgYWZ0ZXJFYWNoLCBiZWZvcmVBbGwsIGJlZm9yZUVhY2gsIGNvbmZpZ3VyZVRlc3RzLCBkZXNjcmliZSwgZXhwZWN0LCBmaXQsIGl0LCBhcnJheUNvbnRhaW5pbmcsIG9iamVjdENvbnRhaW5pbmcsIHRlc3RDb25maWcsIHRlc3RFdmVudHMsIHRlc3RzLCB3YWl0Rm9yRXZlbnR9XG4iXX0=
170
+ export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fdescribe, fit, it, test, xdescribe, xit, xtest, arrayContaining, objectContaining, testConfig, testEvents, tests, waitForEvent };
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixRQUFRLEVBQ1IsU0FBUyxFQUNULEdBQUcsRUFDSCxFQUFFLEVBQ0YsSUFBSSxFQUNKLFlBQVksRUFDWixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDTixNQUFNLG9CQUFvQixDQUFBO0FBQzNCLE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFFbkUsNkZBQTZGO0FBRTdGOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxNQUFNLENBQUMsR0FBRztJQUNqQixPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUE7QUFDMUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7QUFFeEMsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7QUFFckM7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBSztJQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM3RixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUks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Q0QsdURBQXVEO0FBQ3ZELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQTtBQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXBCLHdGQUF3RjtBQUN4RixNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtJQUN4QixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1YsY0FBYztJQUNkLFFBQVE7SUFDUixNQUFNO0lBQ04sU0FBUztJQUNULEdBQUc7SUFDSCxFQUFFO0lBQ0YsSUFBSTtJQUNKLFVBQVU7SUFDVixTQUFTO0lBQ1QsR0FBRztJQUNILEtBQUs7Q0FDTixDQUFDLENBQUE7QUFFRixPQUFPLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxHQUFHLEVBQ0gsRUFBRSxFQUNGLElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixVQUFVLEVBQ1YsS0FBSyxFQUNMLFlBQVksRUFDYixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7XG4gIGFmdGVyQWxsLFxuICBhZnRlckVhY2gsXG4gIGJlZm9yZUFsbCxcbiAgYmVmb3JlRWFjaCxcbiAgY29uZmlndXJlVGVzdHMsXG4gIGRlZmF1bHRUZXN0Q29udGV4dCxcbiAgZGVzY3JpYmUsXG4gIGZkZXNjcmliZSxcbiAgZml0LFxuICBpdCxcbiAgdGVzdCxcbiAgd2FpdEZvckV2ZW50LFxuICB4ZGVzY3JpYmUsXG4gIHhpdCxcbiAgeHRlc3Rcbn0gZnJvbSBcIkB2ZWxvY2lvdXMvdGVzdGluZ1wiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBFeHBlY3QgZnJvbSBcIi4vZXhwZWN0LmpzXCJcbmltcG9ydCB7YXJyYXlDb250YWluaW5nLCBvYmplY3RDb250YWluaW5nfSBmcm9tIFwiLi9leHBlY3QtdXRpbHMuanNcIlxuXG4vKiogQHR5cGVkZWYgeyh0eXBlb2YgZGVmYXVsdFRlc3RDb250ZXh0LnJlZ2lzdHJ5LnN1aXRlcylbbnVtYmVyXX0gUGFja2FnZVN1aXRlRGVjbGFyYXRpb24gKi9cblxuLyoqXG4gKiBWZWxvY2lvdXNUZXN0Q29uZmlnIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNUZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge1wiZmFpbHVyZVwiIHwgXCJsaXZlXCJ9IGNvbnNvbGVPdXRwdXQgLSBDb25zb2xlIG91dHB1dCBtb2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZXhjbHVkZVRhZ3MgLSBUYWdzIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVmYXVsdFRpbWVvdXRTZWNvbmRzIC0gRGVmYXVsdCB0aW1lb3V0IGluIHNlY29uZHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzIC0gTWF4aW11bSBmYWlsZWQgY29uc29sZSBsaW5lcyB0byBwcmludCBpbmxpbmUuXG4gKi9cblxuLyoqXG4gKiBSdW5zIGV4cGVjdC5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZyAtIEFyZy5cbiAqIEByZXR1cm5zIHtFeHBlY3R9IC0gVGhlIGV4cGVjdC5cbiAqL1xuZnVuY3Rpb24gZXhwZWN0KGFyZykge1xuICByZXR1cm4gbmV3IEV4cGVjdChhcmcpXG59XG5cbmV4cGVjdC5vYmplY3RDb250YWluaW5nID0gb2JqZWN0Q29udGFpbmluZ1xuZXhwZWN0LmFycmF5Q29udGFpbmluZyA9IGFycmF5Q29udGFpbmluZ1xuXG4vKiogVmVsb2Npb3VzLW93bmVkIGF3YWl0ZWQgY29tcGF0aWJpbGl0eSBldmVudHMuICovXG5jb25zdCB0ZXN0RXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbi8qKlxuICogRGV0YWNoZXMgYW5kIGZyZWV6ZXMgZGVjbGFyYXRpb24gbWV0YWRhdGEgZXhwb3NlZCBieSB0aGUgY29tcGF0aWJpbGl0eSB2aWV3LlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBQYWNrYWdlIGRlY2xhcmF0aW9uIHZhbHVlLlxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAtIEltbXV0YWJsZSBkZXRhY2hlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVhZE9ubHlTbmFwc2hvdCh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlLm1hcCgoZW50cnkpID0+IHJlYWRPbmx5U25hcHNob3QoZW50cnkpKSlcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHZhbHVlXG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gIGNvbnN0IHByb2plY3RlZFZhbHVlID0ge31cblxuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHByb2plY3RlZFZhbHVlW2tleV0gPSByZWFkT25seVNuYXBzaG90KGVudHJ5KVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHByb2plY3RlZFZhbHVlKVxufVxuXG4vKipcbiAqIEJhY2t3YXJkLWNvbXBhdGlibGUgdmlldyBvZiB0aGUgcGFja2FnZSBjb25maWd1cmF0aW9uLlxuICogQHR5cGUge1ZlbG9jaW91c1Rlc3RDb25maWd9XG4gKi9cbmNvbnN0IHRlc3RDb25maWcgPSB7XG4gIGdldCBjb25zb2xlT3V0cHV0KCkgeyByZXR1cm4gZGVmYXVsdFRlc3RDb250ZXh0LmNvbmZpZy5jb25zb2xlT3V0cHV0IH0sXG4gIHNldCBjb25zb2xlT3V0cHV0KHZhbHVlKSB7IGRlZmF1bHRUZXN0Q29udGV4dC5jb25maWd1cmVUZXN0cyh7Y29uc29sZU91dHB1dDogdmFsdWV9KSB9LFxuICBnZXQgZXhjbHVkZVRhZ3MoKSB7IHJldHVybiBkZWZhdWx0VGVzdENvbnRleHQuY29uZmlnLmV4Y2x1ZGVUYWdzIH0sXG4gIHNldCBleGNsdWRlVGFncyh2YWx1ZSkgeyBkZWZhdWx0VGVzdENvbnRleHQuY29uZmlndXJlVGVzdHMoe2V4Y2x1ZGVUYWdzOiB2YWx1ZX0pIH0sXG4gIGdldCBkZWZhdWx0VGltZW91dFNlY29uZHMoKSB7IHJldHVybiBkZWZhdWx0VGVzdENvbnRleHQuY29uZmlnLmRlZmF1bHRUaW1lb3V0TXMgLyAxMDAwIH0sXG4gIHNldCBkZWZhdWx0VGltZW91dFNlY29uZHModmFsdWUpIHsgZGVmYXVsdFRlc3RDb250ZXh0LmNvbmZpZ3VyZVRlc3RzKHtkZWZhdWx0VGltZW91dFNlY29uZHM6IHZhbHVlfSkgfSxcbiAgZ2V0IGZhaWxlZENvbnNvbGVPdXRwdXRNYXhMaW5lcygpIHsgcmV0dXJuIGRlZmF1bHRUZXN0Q29udGV4dC5jb25maWcuZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzIH0sXG4gIHNldCBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXModmFsdWUpIHsgZGVmYXVsdFRlc3RDb250ZXh0LmNvbmZpZ3VyZVRlc3RzKHtmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXM6IHZhbHVlfSkgfVxufVxuXG4vKipcbiAqIFByb2plY3RzIG9uZSBwYWNrYWdlIHN1aXRlIGludG8gdGhlIGRlcHJlY2F0ZWQgbGVnYWN5IGluc3BlY3Rpb24gc2hhcGUuXG4gKiBUaGUgcmV0dXJuZWQgb2JqZWN0cyBhcmUgc25hcHNob3RzIGFuZCBuZXZlciBwYXJ0aWNpcGF0ZSBpbiBleGVjdXRpb24uXG4gKiBAcGFyYW0ge1BhY2thZ2VTdWl0ZURlY2xhcmF0aW9ufSBzdWl0ZSAtIFBhY2thZ2UgZGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5UZXN0c0FyZ3VtZW50fSAtIFJlYWQtb25seSBjb21wYXRpYmlsaXR5IHNuYXBzaG90LlxuICovXG5mdW5jdGlvbiBwcm9qZWN0U3VpdGUoc3VpdGUpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3REYXRhPn0gKi9cbiAgY29uc3QgcHJvamVjdGVkVGVzdHMgPSB7fVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuVGVzdHNBcmd1bWVudD59ICovXG4gIGNvbnN0IHByb2plY3RlZFN1aXRlcyA9IHt9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBzdWl0ZS50ZXN0cykge1xuICAgIGNvbnN0IG11dGFibGVBcmdzID0gey4uLmRlY2xhcmF0aW9uLm9wdGlvbnN9XG5cbiAgICBpZiAobXV0YWJsZUFyZ3MucmV0cnkgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbXV0YWJsZUFyZ3MucmV0cmllcyA9PT0gXCJudW1iZXJcIikgbXV0YWJsZUFyZ3MucmV0cnkgPSBtdXRhYmxlQXJncy5yZXRyaWVzXG4gICAgaWYgKG11dGFibGVBcmdzLnRpbWVvdXRTZWNvbmRzID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG11dGFibGVBcmdzLnRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIikgbXV0YWJsZUFyZ3MudGltZW91dFNlY29uZHMgPSBtdXRhYmxlQXJncy50aW1lb3V0TXMgLyAxMDAwXG4gICAgcHJvamVjdGVkVGVzdHNbZGVjbGFyYXRpb24ubmFtZV0gPSBPYmplY3QuZnJlZXplKHtcbiAgICAgIGFyZ3M6IHJlYWRPbmx5U25hcHNob3QobXV0YWJsZUFyZ3MpLFxuICAgICAgZmlsZVBhdGg6IGRlY2xhcmF0aW9uLmxvY2F0aW9uLmZpbGVQYXRoLFxuICAgICAgZnVuY3Rpb246IGRlY2xhcmF0aW9uLmNhbGxiYWNrLFxuICAgICAgbGluZTogZGVjbGFyYXRpb24ubG9jYXRpb24ubGluZVxuICAgIH0pXG4gIH1cblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN1aXRlLnN1aXRlcykgcHJvamVjdGVkU3VpdGVzW2NoaWxkLm5hbWVdID0gcHJvamVjdFN1aXRlKGNoaWxkKVxuXG4gIGNvbnN0IHByb2plY3Rpb24gPSB7XG4gICAgYWZ0ZXJBbGxzOiBPYmplY3QuZnJlZXplKHN1aXRlLmhvb2tzLmFmdGVyQWxsLm1hcCgoaG9vaykgPT4gT2JqZWN0LmZyZWV6ZSh7Y2FsbGJhY2s6IGhvb2suY2FsbGJhY2t9KSkpLFxuICAgIGFmdGVyRWFjaGVzOiBPYmplY3QuZnJlZXplKHN1aXRlLmhvb2tzLmFmdGVyRWFjaC5tYXAoKGhvb2spID0+IE9iamVjdC5mcmVlemUoe2NhbGxiYWNrOiBob29rLmNhbGxiYWNrfSkpKSxcbiAgICBhcmdzOiByZWFkT25seVNuYXBzaG90KHN1aXRlLm9wdGlvbnMpLFxuICAgIGJlZm9yZUFsbHM6IE9iamVjdC5mcmVlemUoc3VpdGUuaG9va3MuYmVmb3JlQWxsLm1hcCgoaG9vaykgPT4gT2JqZWN0LmZyZWV6ZSh7Y2FsbGJhY2s6IGhvb2suY2FsbGJhY2t9KSkpLFxuICAgIGJlZm9yZUVhY2hlczogT2JqZWN0LmZyZWV6ZShzdWl0ZS5ob29rcy5iZWZvcmVFYWNoLm1hcCgoaG9vaykgPT4gT2JqZWN0LmZyZWV6ZSh7Y2FsbGJhY2s6IGhvb2suY2FsbGJhY2t9KSkpLFxuICAgIGZpbGVQYXRoOiBzdWl0ZS5sb2NhdGlvbi5maWxlUGF0aCxcbiAgICBsaW5lOiBzdWl0ZS5sb2NhdGlvbi5saW5lLFxuICAgIHN1YnM6IE9iamVjdC5mcmVlemUocHJvamVjdGVkU3VpdGVzKSxcbiAgICB0ZXN0czogT2JqZWN0LmZyZWV6ZShwcm9qZWN0ZWRUZXN0cylcbiAgfVxuXG4gIC8vIE5hcnJvd3MgdGhlIGltbXV0YWJsZSBzbmFwc2hvdCB0byB0aGUgaGlzdG9yaWNhbCBpbnNwZWN0aW9uIGNvbnRyYWN0LlxuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnR9ICovIChPYmplY3QuZnJlZXplKHByb2plY3Rpb24pKVxufVxuXG4vKipcbiAqIERlcHJlY2F0ZWQgcmVhZC1vbmx5IGRlY2xhcmF0aW9uIHByb2plY3Rpb24uIFBhY2thZ2UgZGVjbGFyYXRpb25zIGluXG4gKiBkZWZhdWx0VGVzdENvbnRleHQgYXJlIHRoZSBzb2xlIGV4ZWN1dGlvbiBzb3VyY2UuXG4gKi9cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5CZWZvcmVBZnRlckFsbENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuY29uc3QgZW1wdHlBZnRlckFsbHMgPSBbXVxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuY29uc3QgZW1wdHlBZnRlckVhY2hlcyA9IFtdXG4vKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbmNvbnN0IGVtcHR5QmVmb3JlQWxscyA9IFtdXG4vKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQWZ0ZXJCZWZvcmVFYWNoQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG5jb25zdCBlbXB0eUJlZm9yZUVhY2hlcyA9IFtdXG5jb25zdCBkZWZhdWx0VGVzdEFyZ3VtZW50cyA9IHtkYXRhYmFzZUNsZWFuaW5nOiB7dHJhbnNhY3Rpb246IHRydWV9fVxuXG5PYmplY3QuZnJlZXplKGVtcHR5QWZ0ZXJBbGxzKVxuT2JqZWN0LmZyZWV6ZShlbXB0eUFmdGVyRWFjaGVzKVxuT2JqZWN0LmZyZWV6ZShlbXB0eUJlZm9yZUFsbHMpXG5PYmplY3QuZnJlZXplKGVtcHR5QmVmb3JlRWFjaGVzKVxuT2JqZWN0LmZyZWV6ZShkZWZhdWx0VGVzdEFyZ3VtZW50cy5kYXRhYmFzZUNsZWFuaW5nKVxuT2JqZWN0LmZyZWV6ZShkZWZhdWx0VGVzdEFyZ3VtZW50cylcblxuY29uc3QgdGVzdHNQcm9qZWN0aW9uID0ge1xuICBnZXQgYWZ0ZXJBbGxzKCkgeyByZXR1cm4gZW1wdHlBZnRlckFsbHMgfSxcbiAgZ2V0IGFmdGVyRWFjaGVzKCkgeyByZXR1cm4gZW1wdHlBZnRlckVhY2hlcyB9LFxuICBnZXQgYXJncygpIHsgcmV0dXJuIGRlZmF1bHRUZXN0QXJndW1lbnRzIH0sXG4gIGdldCBiZWZvcmVBbGxzKCkgeyByZXR1cm4gZW1wdHlCZWZvcmVBbGxzIH0sXG4gIGdldCBiZWZvcmVFYWNoZXMoKSB7IHJldHVybiBlbXB0eUJlZm9yZUVhY2hlcyB9LFxuICBnZXQgZmlsZVBhdGgoKSB7IHJldHVybiB1bmRlZmluZWQgfSxcbiAgZ2V0IGxpbmUoKSB7IHJldHVybiB1bmRlZmluZWQgfSxcbiAgZ2V0IHN1YnMoKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3RzQXJndW1lbnQ+fSAqL1xuICAgIGNvbnN0IHByb2plY3RlZFN1aXRlcyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IHN1aXRlIG9mIGRlZmF1bHRUZXN0Q29udGV4dC5yZWdpc3RyeS5zdWl0ZXMpIHtcbiAgICAgIGlmIChzdWl0ZS5uYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRTdWl0ZSBvZiBzdWl0ZS5zdWl0ZXMpIHByb2plY3RlZFN1aXRlc1tjaGlsZFN1aXRlLm5hbWVdID0gcHJvamVjdFN1aXRlKGNoaWxkU3VpdGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9qZWN0ZWRTdWl0ZXNbc3VpdGUubmFtZV0gPSBwcm9qZWN0U3VpdGUoc3VpdGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUocHJvamVjdGVkU3VpdGVzKVxuICB9LFxuICBnZXQgdGVzdHMoKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLlRlc3REYXRhPn0gKi9cbiAgICBjb25zdCBwcm9qZWN0ZWRUZXN0cyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IHN1aXRlIG9mIGRlZmF1bHRUZXN0Q29udGV4dC5yZWdpc3RyeS5zdWl0ZXMpIHtcbiAgICAgIGlmIChzdWl0ZS5uYW1lICE9PSBcIlwiKSBjb250aW51ZVxuXG4gICAgICBPYmplY3QuYXNzaWduKHByb2plY3RlZFRlc3RzLCBwcm9qZWN0U3VpdGUoc3VpdGUpLnRlc3RzKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHByb2plY3RlZFRlc3RzKVxuICB9XG59XG4vKiogQHR5cGUge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuVGVzdHNBcmd1bWVudH0gKi9cbmNvbnN0IHRlc3RzID0gdGVzdHNQcm9qZWN0aW9uXG5PYmplY3QuZnJlZXplKHRlc3RzKVxuXG4vLyBNYWtlIHRoZSBjb21wYXRpYmlsaXR5IGZhY2FkZSBnbG9iYWwgc28gZXhpc3RpbmcgdGVzdCBmaWxlcyByZW1haW4gc291cmNlLWNvbXBhdGlibGUuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHtcbiAgYWZ0ZXJBbGwsXG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlQWxsLFxuICBiZWZvcmVFYWNoLFxuICBjb25maWd1cmVUZXN0cyxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgZmRlc2NyaWJlLFxuICBmaXQsXG4gIGl0LFxuICB0ZXN0LFxuICB0ZXN0RXZlbnRzLFxuICB4ZGVzY3JpYmUsXG4gIHhpdCxcbiAgeHRlc3Rcbn0pXG5cbmV4cG9ydCB7XG4gIGFmdGVyQWxsLFxuICBhZnRlckVhY2gsXG4gIGJlZm9yZUFsbCxcbiAgYmVmb3JlRWFjaCxcbiAgY29uZmlndXJlVGVzdHMsXG4gIGRlc2NyaWJlLFxuICBleHBlY3QsXG4gIGZkZXNjcmliZSxcbiAgZml0LFxuICBpdCxcbiAgdGVzdCxcbiAgeGRlc2NyaWJlLFxuICB4aXQsXG4gIHh0ZXN0LFxuICBhcnJheUNvbnRhaW5pbmcsXG4gIG9iamVjdENvbnRhaW5pbmcsXG4gIHRlc3RDb25maWcsXG4gIHRlc3RFdmVudHMsXG4gIHRlc3RzLFxuICB3YWl0Rm9yRXZlbnRcbn1cbiJdfQ==
@@ -0,0 +1,54 @@
1
+ export type PackageHookDeclaration = import("@velocious/testing/runner").AttemptExecutorInput["beforeEach"][number];
2
+ export type TestTimeoutError = Error & {
3
+ velociousTestTimeout?: true;
4
+ };
5
+ export default class VelociousAttemptExecutor {
6
+ testRunner: import("./test-runner.js").default;
7
+ /**
8
+ * Creates an executor for framework-owned attempt lifecycle work.
9
+ * @param {object} args - Constructor arguments.
10
+ * @param {import("./test-runner.js").default} args.testRunner - Owning Velocious runner.
11
+ */
12
+ constructor({ testRunner, ...restArgs }: {
13
+ testRunner: import("./test-runner.js").default;
14
+ });
15
+ /**
16
+ * Normalizes the legacy timeout contract at the framework adapter boundary.
17
+ * @param {number | undefined} timeoutMs - Declared package timeout.
18
+ * @returns {number | undefined} - Positive finite timeout, or no timeout.
19
+ */
20
+ normalizeTimeoutMs(timeoutMs: number | undefined): number | undefined;
21
+ /**
22
+ * Executes exactly one complete Velocious-owned test attempt.
23
+ * @param {import("@velocious/testing/runner").AttemptExecutorInput} input - Package attempt.
24
+ * @returns {Promise<void>} - Resolves after one complete framework attempt.
25
+ */
26
+ execute({ afterEach, args, attemptNumber, beforeEach, context, defaultExecute, fullName, suite, test, timeoutMs, ...restArgs }: import("@velocious/testing/runner").AttemptExecutorInput): Promise<void>;
27
+ /**
28
+ * Runs before-each hooks in inherited declaration order.
29
+ * @param {object} args - Hook arguments.
30
+ * @param {PackageHookDeclaration[]} args.beforeEaches - Setup hooks.
31
+ * @param {import("./velocious-test-arguments.js").TestArgs} args.testArgs - Stable test arguments.
32
+ * @param {import("./velocious-test-arguments.js").TestData} args.testData - Test registration.
33
+ * @returns {Promise<void>} - Resolves after all setup hooks complete.
34
+ */
35
+ runBeforeEaches({ beforeEaches, testArgs, testData }: {
36
+ beforeEaches: PackageHookDeclaration[];
37
+ testArgs: import("./velocious-test-arguments.js").TestArgs;
38
+ testData: import("./velocious-test-arguments.js").TestData;
39
+ }): Promise<void>;
40
+ /**
41
+ * Runs every after-each hook while preserving all failures.
42
+ * @param {object} args - Hook arguments.
43
+ * @param {PackageHookDeclaration[]} args.afterEaches - Cleanup hooks.
44
+ * @param {import("./velocious-test-arguments.js").TestArgs} args.testArgs - Stable test arguments.
45
+ * @param {import("./velocious-test-arguments.js").TestData} args.testData - Test registration.
46
+ * @returns {Promise<void>} - Resolves after every cleanup hook settles.
47
+ */
48
+ runAfterEaches({ afterEaches, testArgs, testData }: {
49
+ afterEaches: PackageHookDeclaration[];
50
+ testArgs: import("./velocious-test-arguments.js").TestArgs;
51
+ testData: import("./velocious-test-arguments.js").TestData;
52
+ }): Promise<void>;
53
+ }
54
+ //# sourceMappingURL=velocious-attempt-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"velocious-attempt-executor.d.ts","sourceRoot":"","sources":["../../../src/testing/velocious-attempt-executor.js"],"names":[],"mappings":"AAOI,YAA0F,sBAAsB,GAAtG,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAwB;AAIjH,YAAiD,gBAAgB,GAAvD,KAAK,GAAG;IAAC,oBAAoB,CAAC,EAAE,IAAI,CAAA;CAAC,CAAkB;AA8EpE,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAQpC,UAAU;IAPjB;;;;OAIG;IACH,YAAY,EAAC,UAAU,EAAE,GAAG,QAAQ,EAAC,EAFlC;QAAiD,UAAU,EAAnD,OAAO,kBAAkB,EAAE,OAAO,CAC5C;KACoC,EAGpC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAHjB,MAAM,GAAG,SAGQ,GAFf,MAAM,GAAG,SAAS,CAI9B;IAED;;;;OAIG;IACG,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,QAAQ,EAAC,EAHvH,OAAO,2BAA2B,EAAE,oBAGmF,GAFrH,OAAO,CAAC,IAAI,CAAC,CA6QzB;IAED;;;;;;;OAOG;IACG,eAAe,CAAC,EAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALrD;QAAuC,YAAY,EAA3C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEqD,GAF3C,OAAO,CAAC,IAAI,CAAC,CAezB;IAED;;;;;;;OAOG;IACG,cAAc,CAAC,EAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAC,EALnD;QAAuC,WAAW,EAA1C,sBAAsB,EAAE,CAChC;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;QAA+D,QAAQ,EAA/D,OAAO,+BAA+B,EAAE,QAAQ,CACxD;KAEmD,GAFzC,OAAO,CAAC,IAAI,CAAC,CA2BzB;CACF"}