vest 6.0.0 → 6.0.1

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 (66) hide show
  1. package/dist/exports/SuiteSerializer.cjs +45 -1
  2. package/dist/exports/SuiteSerializer.cjs.map +1 -1
  3. package/dist/exports/SuiteSerializer.mjs +45 -1
  4. package/dist/exports/SuiteSerializer.mjs.map +1 -1
  5. package/dist/exports/classnames.cjs +2 -2
  6. package/dist/exports/classnames.mjs +2 -2
  7. package/dist/exports/debounce.cjs +1 -1
  8. package/dist/exports/debounce.mjs +1 -1
  9. package/dist/exports/memo.cjs +1 -1
  10. package/dist/exports/memo.mjs +1 -1
  11. package/dist/exports/parser.cjs +2 -2
  12. package/dist/exports/parser.mjs +2 -2
  13. package/dist/{parser-CLhCAAYG.cjs → parser-DurNd9af.cjs} +2 -2
  14. package/dist/{parser-CLhCAAYG.cjs.map → parser-DurNd9af.cjs.map} +1 -1
  15. package/dist/{parser-Ch9qn6Hm.mjs → parser-TvzEAVLQ.mjs} +2 -2
  16. package/dist/{parser-Ch9qn6Hm.mjs.map → parser-TvzEAVLQ.mjs.map} +1 -1
  17. package/dist/{vest-CKYaivPf.cjs → vest-Lg6ZJuyu.cjs} +46 -12
  18. package/dist/vest-Lg6ZJuyu.cjs.map +1 -0
  19. package/dist/{vest-BEj6iXsK.mjs → vest-WSPRosdH.mjs} +47 -13
  20. package/dist/vest-WSPRosdH.mjs.map +1 -0
  21. package/dist/vest.cjs +1 -1
  22. package/dist/vest.mjs +1 -1
  23. package/package.json +6 -6
  24. package/src/core/Runtime.ts +3 -2
  25. package/src/exports/SuiteSerializer.ts +104 -1
  26. package/src/exports/__tests__/SuiteSerializer.test.ts +58 -1
  27. package/src/exports/__tests__/classnames.test.ts +24 -1
  28. package/src/exports/__tests__/parser.test.ts +23 -1
  29. package/src/suite/SuiteTypes.ts +15 -5
  30. package/src/suite/__tests__/runSummary.integration.test.ts +72 -0
  31. package/src/suite/__tests__/schema.types.test.ts +12 -0
  32. package/src/suite/useCreateSuiteRunner.ts +62 -41
  33. package/src/suiteResult/SuiteResultTypes.ts +22 -4
  34. package/src/suiteResult/selectors/useProduceSuiteSummary.ts +3 -2
  35. package/src/suiteResult/suiteResult.ts +37 -10
  36. package/types/{IsolateSuite-DnMtFHBW.d.cts → IsolateSuite-3gZF4eDG.d.mts} +11 -6
  37. package/types/IsolateSuite-3gZF4eDG.d.mts.map +1 -0
  38. package/types/{IsolateSuite-JdFYn2DA.d.mts → IsolateSuite-WsmXGGR-.d.cts} +11 -6
  39. package/types/IsolateSuite-WsmXGGR-.d.cts.map +1 -0
  40. package/types/{SuiteTypes-DESBCvZ7.d.cts → SuiteTypes-BNCL13HG.d.cts} +8 -7
  41. package/types/SuiteTypes-BNCL13HG.d.cts.map +1 -0
  42. package/types/{SuiteTypes-cjI5BA_k.d.mts → SuiteTypes-hg7F7swJ.d.mts} +8 -7
  43. package/types/SuiteTypes-hg7F7swJ.d.mts.map +1 -0
  44. package/types/exports/SuiteSerializer.d.cts +2 -2
  45. package/types/exports/SuiteSerializer.d.mts +2 -2
  46. package/types/exports/classnames.d.cts +2 -2
  47. package/types/exports/classnames.d.mts +2 -2
  48. package/types/exports/debounce.d.cts +1 -1
  49. package/types/exports/debounce.d.mts +1 -1
  50. package/types/exports/memo.d.cts +1 -1
  51. package/types/exports/memo.d.mts +1 -1
  52. package/types/exports/parser.d.cts +2 -2
  53. package/types/exports/parser.d.mts +2 -2
  54. package/types/{parser-BsrjuZ4_.d.cts → parser-DqW8l1IB.d.cts} +2 -2
  55. package/types/{parser-BsrjuZ4_.d.cts.map → parser-DqW8l1IB.d.cts.map} +1 -1
  56. package/types/{parser-CqvCfNJR.d.mts → parser-uCTQIcV6.d.mts} +2 -2
  57. package/types/{parser-CqvCfNJR.d.mts.map → parser-uCTQIcV6.d.mts.map} +1 -1
  58. package/types/vest.d.cts +2 -2
  59. package/types/vest.d.mts +2 -2
  60. package/types/vest.d.ts +2 -2
  61. package/dist/vest-BEj6iXsK.mjs.map +0 -1
  62. package/dist/vest-CKYaivPf.cjs.map +0 -1
  63. package/types/IsolateSuite-DnMtFHBW.d.cts.map +0 -1
  64. package/types/IsolateSuite-JdFYn2DA.d.mts.map +0 -1
  65. package/types/SuiteTypes-DESBCvZ7.d.cts.map +0 -1
  66. package/types/SuiteTypes-cjI5BA_k.d.mts.map +0 -1
@@ -5,7 +5,7 @@ let vestjs_runtime = require("vestjs-runtime");
5
5
  //#region src/exports/SuiteSerializer.ts
6
6
  var SuiteSerializer = class SuiteSerializer {
7
7
  static serialize(suite) {
8
- const dump = { ...suite.dump() };
8
+ const dump = stripMessageFromPassingTests(suite.dump());
9
9
  return vestjs_runtime.IsolateSerializer.serialize(dump, suiteSerializerReplacer);
10
10
  }
11
11
  static safeDeserialize(serialized) {
@@ -19,6 +19,50 @@ var SuiteSerializer = class SuiteSerializer {
19
19
  suite.resume(suiteRoot);
20
20
  }
21
21
  };
22
+ function stripMessageFromPassingTests(node) {
23
+ return strip(node, /* @__PURE__ */ new WeakMap(), /* @__PURE__ */ new WeakMap(), /* @__PURE__ */ new WeakSet());
24
+ }
25
+ function strip(node, visited, containsPassingMemo, seen) {
26
+ if (!node || typeof node !== "object") return node;
27
+ if (visited.has(node)) return visited.get(node);
28
+ if (!containsPassing(node, seen, containsPassingMemo)) return node;
29
+ if (Array.isArray(node)) {
30
+ const arr = [];
31
+ visited.set(node, arr);
32
+ node.forEach((value) => {
33
+ arr.push(strip(value, visited, containsPassingMemo, seen));
34
+ });
35
+ return arr;
36
+ }
37
+ const root = node;
38
+ const shouldStripMessage = root.testStatus === require_IsolateTestStateMachine.TestStatus.PASSING;
39
+ const clonedNode = {};
40
+ visited.set(node, clonedNode);
41
+ for (const [key, value] of Object.entries(root)) {
42
+ if (shouldStripMessage && key === "message") continue;
43
+ clonedNode[key] = strip(value, visited, containsPassingMemo, seen);
44
+ }
45
+ return clonedNode;
46
+ }
47
+ function containsPassing(node, seen, memo) {
48
+ if (!node || typeof node !== "object") return false;
49
+ if (memo.has(node)) return memo.get(node) ?? false;
50
+ if (seen.has(node)) return true;
51
+ if (node.testStatus === require_IsolateTestStateMachine.TestStatus.PASSING) {
52
+ memo.set(node, true);
53
+ return true;
54
+ }
55
+ seen.add(node);
56
+ const values = Array.isArray(node) ? node : Object.values(node);
57
+ for (const value of values) if (containsPassing(value, seen, memo)) {
58
+ memo.set(node, true);
59
+ seen.delete(node);
60
+ return true;
61
+ }
62
+ memo.set(node, false);
63
+ seen.delete(node);
64
+ return false;
65
+ }
22
66
  function suiteSerializerReplacer(value, key) {
23
67
  if (isStatusKey(key)) return getAllowedStatus(value);
24
68
  if (DisallowedKeys.has(key)) return;
@@ -1 +1 @@
1
- {"version":3,"file":"SuiteSerializer.cjs","names":["IsolateSerializer","TestStatus"],"sources":["../../src/exports/SuiteSerializer.ts"],"sourcesContent":["import { CB, Result } from 'vest-utils';\nimport { IsolateSerializer } from 'vestjs-runtime';\n\nimport { TestStatus } from '../core/StateMachines/IsolateTestStateMachine';\nimport { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\nimport { Suite } from '../suite/SuiteTypes';\nimport {\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\n\ntype Dumpable = {\n dump: CB<TIsolateSuite>;\n};\n\nexport class SuiteSerializer {\n static serialize(suite: Dumpable) {\n const dump = { ...suite.dump() };\n\n return IsolateSerializer.serialize(dump, suiteSerializerReplacer);\n }\n\n static safeDeserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): Result<TIsolateSuite, Error> {\n return IsolateSerializer.safeDeserialize(serialized).map(\n isolate => isolate as TIsolateSuite,\n );\n }\n\n static deserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): TIsolateSuite {\n return SuiteSerializer.safeDeserialize(serialized).unwrap();\n }\n\n static resume<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB,\n S extends TSchema,\n >(\n suite: Suite<F, G, T, S>,\n root: string | TIsolateSuite | Record<string, any>,\n ): void {\n const suiteRoot = SuiteSerializer.deserialize(root);\n\n suite.resume(suiteRoot);\n }\n}\n\nfunction suiteSerializerReplacer(value: any, key: string) {\n if (isStatusKey(key)) {\n return getAllowedStatus(value);\n }\n\n if (DisallowedKeys.has(key)) {\n return undefined;\n }\n\n return value;\n}\n\nfunction isStatusKey(key: string): boolean {\n return key === 'testStatus';\n}\n\nfunction getAllowedStatus(value: any): any {\n return AllowedStatuses.has(value) ? value : undefined;\n}\n\nconst AllowedStatuses = new Set([\n TestStatus.FAILED,\n TestStatus.PASSING,\n TestStatus.WARNING,\n]);\n\nconst DisallowedKeys = new Set([\n 'focusMode',\n 'match',\n 'matchAll',\n 'output',\n 'severity',\n 'tests',\n]);\n"],"mappings":";;;;;AAgBA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B,OAAO,UAAU,OAAiB;EAChC,MAAM,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE;AAEhC,SAAOA,iCAAkB,UAAU,MAAM,wBAAwB;;CAGnE,OAAO,gBACL,YAC8B;AAC9B,SAAOA,iCAAkB,gBAAgB,WAAW,CAAC,KACnD,YAAW,QACZ;;CAGH,OAAO,YACL,YACe;AACf,SAAO,gBAAgB,gBAAgB,WAAW,CAAC,QAAQ;;CAG7D,OAAO,OAML,OACA,MACM;EACN,MAAM,YAAY,gBAAgB,YAAY,KAAK;AAEnD,QAAM,OAAO,UAAU;;;AAI3B,SAAS,wBAAwB,OAAY,KAAa;AACxD,KAAI,YAAY,IAAI,CAClB,QAAO,iBAAiB,MAAM;AAGhC,KAAI,eAAe,IAAI,IAAI,CACzB;AAGF,QAAO;;AAGT,SAAS,YAAY,KAAsB;AACzC,QAAO,QAAQ;;AAGjB,SAAS,iBAAiB,OAAiB;AACzC,QAAO,gBAAgB,IAAI,MAAM,GAAG,QAAQ;;AAG9C,MAAM,kBAAkB,IAAI,IAAI;CAC9BC,2CAAW;CACXA,2CAAW;CACXA,2CAAW;CACZ,CAAC;AAEF,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC"}
1
+ {"version":3,"file":"SuiteSerializer.cjs","names":["IsolateSerializer","arr: any[]","TestStatus","clonedNode: Record<string, any>"],"sources":["../../src/exports/SuiteSerializer.ts"],"sourcesContent":["import { CB, Result } from 'vest-utils';\nimport { IsolateSerializer } from 'vestjs-runtime';\n\nimport { TestStatus } from '../core/StateMachines/IsolateTestStateMachine';\nimport { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\nimport { Suite } from '../suite/SuiteTypes';\nimport {\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\n\ntype Dumpable = {\n dump: CB<TIsolateSuite>;\n};\n\nexport class SuiteSerializer {\n static serialize(suite: Dumpable) {\n const dump = stripMessageFromPassingTests(suite.dump());\n\n return IsolateSerializer.serialize(dump, suiteSerializerReplacer);\n }\n\n static safeDeserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): Result<TIsolateSuite, Error> {\n return IsolateSerializer.safeDeserialize(serialized).map(\n isolate => isolate as TIsolateSuite,\n );\n }\n\n static deserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): TIsolateSuite {\n return SuiteSerializer.safeDeserialize(serialized).unwrap();\n }\n\n static resume<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB,\n S extends TSchema,\n >(\n suite: Suite<F, G, T, S>,\n root: string | TIsolateSuite | Record<string, any>,\n ): void {\n const suiteRoot = SuiteSerializer.deserialize(root);\n\n suite.resume(suiteRoot);\n }\n}\n\nfunction stripMessageFromPassingTests<T>(node: T): T {\n const visited = new WeakMap<object, any>();\n const containsPassingMemo = new WeakMap<object, boolean>();\n const seen = new WeakSet<object>();\n\n return strip(node, visited, containsPassingMemo, seen);\n}\n\n// eslint-disable-next-line complexity, max-statements\nfunction strip<T>(\n node: T,\n visited: WeakMap<object, any>,\n containsPassingMemo: WeakMap<object, boolean>,\n seen: WeakSet<object>,\n): T {\n if (!node || typeof node !== 'object') {\n return node;\n }\n\n if (visited.has(node as object)) {\n return visited.get(node as object);\n }\n\n if (!containsPassing(node, seen, containsPassingMemo)) {\n return node;\n }\n\n if (Array.isArray(node)) {\n const arr: any[] = [];\n visited.set(node, arr);\n\n node.forEach(value => {\n arr.push(strip(value, visited, containsPassingMemo, seen));\n });\n\n return arr as T;\n }\n\n const root = node as Record<string, any>;\n const shouldStripMessage = root.testStatus === TestStatus.PASSING;\n const clonedNode: Record<string, any> = {};\n visited.set(node, clonedNode);\n\n for (const [key, value] of Object.entries(root)) {\n if (shouldStripMessage && key === 'message') {\n continue;\n }\n\n clonedNode[key] = strip(value, visited, containsPassingMemo, seen);\n }\n\n return clonedNode as T;\n}\n\n// `strip` calls this with a shared `seen` set that is expected to be empty\n// at call boundaries. Inside this DFS, revisiting a node (`seen.has(node)`) means\n// we've encountered a cycle currently in-flight, so we conservatively return `true`\n// to avoid suppressing message-stripping while still preventing infinite recursion.\n// This is safe because every path that adds to `seen` removes it (`seen.delete`) on\n// return, and `memo` only stores final computed booleans for completed nodes.\n// eslint-disable-next-line complexity, max-statements\nfunction containsPassing(\n node: unknown,\n seen: WeakSet<object>,\n memo: WeakMap<object, boolean>,\n): boolean {\n if (!node || typeof node !== 'object') {\n return false;\n }\n\n if (memo.has(node)) {\n return memo.get(node) ?? false;\n }\n\n if (seen.has(node)) {\n return true;\n }\n\n if ((node as Record<string, unknown>).testStatus === TestStatus.PASSING) {\n memo.set(node, true);\n return true;\n }\n\n seen.add(node);\n\n const values = Array.isArray(node)\n ? node\n : Object.values(node as Record<string, unknown>);\n\n for (const value of values) {\n if (containsPassing(value, seen, memo)) {\n memo.set(node, true);\n seen.delete(node);\n return true;\n }\n }\n\n memo.set(node, false);\n seen.delete(node);\n\n return false;\n}\n\nfunction suiteSerializerReplacer(value: any, key: string) {\n if (isStatusKey(key)) {\n return getAllowedStatus(value);\n }\n\n if (DisallowedKeys.has(key)) {\n return undefined;\n }\n\n return value;\n}\n\nfunction isStatusKey(key: string): boolean {\n return key === 'testStatus';\n}\n\nfunction getAllowedStatus(value: any): any {\n return AllowedStatuses.has(value) ? value : undefined;\n}\n\nconst AllowedStatuses = new Set([\n TestStatus.FAILED,\n TestStatus.PASSING,\n TestStatus.WARNING,\n]);\n\nconst DisallowedKeys = new Set([\n 'focusMode',\n 'match',\n 'matchAll',\n 'output',\n 'severity',\n 'tests',\n]);\n"],"mappings":";;;;;AAgBA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B,OAAO,UAAU,OAAiB;EAChC,MAAM,OAAO,6BAA6B,MAAM,MAAM,CAAC;AAEvD,SAAOA,iCAAkB,UAAU,MAAM,wBAAwB;;CAGnE,OAAO,gBACL,YAC8B;AAC9B,SAAOA,iCAAkB,gBAAgB,WAAW,CAAC,KACnD,YAAW,QACZ;;CAGH,OAAO,YACL,YACe;AACf,SAAO,gBAAgB,gBAAgB,WAAW,CAAC,QAAQ;;CAG7D,OAAO,OAML,OACA,MACM;EACN,MAAM,YAAY,gBAAgB,YAAY,KAAK;AAEnD,QAAM,OAAO,UAAU;;;AAI3B,SAAS,6BAAgC,MAAY;AAKnD,QAAO,MAAM,sBAJG,IAAI,SAAsB,kBACd,IAAI,SAA0B,kBAC7C,IAAI,SAAiB,CAEoB;;AAIxD,SAAS,MACP,MACA,SACA,qBACA,MACG;AACH,KAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;AAGT,KAAI,QAAQ,IAAI,KAAe,CAC7B,QAAO,QAAQ,IAAI,KAAe;AAGpC,KAAI,CAAC,gBAAgB,MAAM,MAAM,oBAAoB,CACnD,QAAO;AAGT,KAAI,MAAM,QAAQ,KAAK,EAAE;EACvB,MAAMC,MAAa,EAAE;AACrB,UAAQ,IAAI,MAAM,IAAI;AAEtB,OAAK,SAAQ,UAAS;AACpB,OAAI,KAAK,MAAM,OAAO,SAAS,qBAAqB,KAAK,CAAC;IAC1D;AAEF,SAAO;;CAGT,MAAM,OAAO;CACb,MAAM,qBAAqB,KAAK,eAAeC,2CAAW;CAC1D,MAAMC,aAAkC,EAAE;AAC1C,SAAQ,IAAI,MAAM,WAAW;AAE7B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;AAC/C,MAAI,sBAAsB,QAAQ,UAChC;AAGF,aAAW,OAAO,MAAM,OAAO,SAAS,qBAAqB,KAAK;;AAGpE,QAAO;;AAUT,SAAS,gBACP,MACA,MACA,MACS;AACT,KAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;AAGT,KAAI,KAAK,IAAI,KAAK,CAChB,QAAO,KAAK,IAAI,KAAK,IAAI;AAG3B,KAAI,KAAK,IAAI,KAAK,CAChB,QAAO;AAGT,KAAK,KAAiC,eAAeD,2CAAW,SAAS;AACvE,OAAK,IAAI,MAAM,KAAK;AACpB,SAAO;;AAGT,MAAK,IAAI,KAAK;CAEd,MAAM,SAAS,MAAM,QAAQ,KAAK,GAC9B,OACA,OAAO,OAAO,KAAgC;AAElD,MAAK,MAAM,SAAS,OAClB,KAAI,gBAAgB,OAAO,MAAM,KAAK,EAAE;AACtC,OAAK,IAAI,MAAM,KAAK;AACpB,OAAK,OAAO,KAAK;AACjB,SAAO;;AAIX,MAAK,IAAI,MAAM,MAAM;AACrB,MAAK,OAAO,KAAK;AAEjB,QAAO;;AAGT,SAAS,wBAAwB,OAAY,KAAa;AACxD,KAAI,YAAY,IAAI,CAClB,QAAO,iBAAiB,MAAM;AAGhC,KAAI,eAAe,IAAI,IAAI,CACzB;AAGF,QAAO;;AAGT,SAAS,YAAY,KAAsB;AACzC,QAAO,QAAQ;;AAGjB,SAAS,iBAAiB,OAAiB;AACzC,QAAO,gBAAgB,IAAI,MAAM,GAAG,QAAQ;;AAG9C,MAAM,kBAAkB,IAAI,IAAI;CAC9BA,2CAAW;CACXA,2CAAW;CACXA,2CAAW;CACZ,CAAC;AAEF,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC"}
@@ -4,7 +4,7 @@ import { IsolateSerializer } from "vestjs-runtime";
4
4
  //#region src/exports/SuiteSerializer.ts
5
5
  var SuiteSerializer = class SuiteSerializer {
6
6
  static serialize(suite) {
7
- const dump = { ...suite.dump() };
7
+ const dump = stripMessageFromPassingTests(suite.dump());
8
8
  return IsolateSerializer.serialize(dump, suiteSerializerReplacer);
9
9
  }
10
10
  static safeDeserialize(serialized) {
@@ -18,6 +18,50 @@ var SuiteSerializer = class SuiteSerializer {
18
18
  suite.resume(suiteRoot);
19
19
  }
20
20
  };
21
+ function stripMessageFromPassingTests(node) {
22
+ return strip(node, /* @__PURE__ */ new WeakMap(), /* @__PURE__ */ new WeakMap(), /* @__PURE__ */ new WeakSet());
23
+ }
24
+ function strip(node, visited, containsPassingMemo, seen) {
25
+ if (!node || typeof node !== "object") return node;
26
+ if (visited.has(node)) return visited.get(node);
27
+ if (!containsPassing(node, seen, containsPassingMemo)) return node;
28
+ if (Array.isArray(node)) {
29
+ const arr = [];
30
+ visited.set(node, arr);
31
+ node.forEach((value) => {
32
+ arr.push(strip(value, visited, containsPassingMemo, seen));
33
+ });
34
+ return arr;
35
+ }
36
+ const root = node;
37
+ const shouldStripMessage = root.testStatus === TestStatus.PASSING;
38
+ const clonedNode = {};
39
+ visited.set(node, clonedNode);
40
+ for (const [key, value] of Object.entries(root)) {
41
+ if (shouldStripMessage && key === "message") continue;
42
+ clonedNode[key] = strip(value, visited, containsPassingMemo, seen);
43
+ }
44
+ return clonedNode;
45
+ }
46
+ function containsPassing(node, seen, memo) {
47
+ if (!node || typeof node !== "object") return false;
48
+ if (memo.has(node)) return memo.get(node) ?? false;
49
+ if (seen.has(node)) return true;
50
+ if (node.testStatus === TestStatus.PASSING) {
51
+ memo.set(node, true);
52
+ return true;
53
+ }
54
+ seen.add(node);
55
+ const values = Array.isArray(node) ? node : Object.values(node);
56
+ for (const value of values) if (containsPassing(value, seen, memo)) {
57
+ memo.set(node, true);
58
+ seen.delete(node);
59
+ return true;
60
+ }
61
+ memo.set(node, false);
62
+ seen.delete(node);
63
+ return false;
64
+ }
21
65
  function suiteSerializerReplacer(value, key) {
22
66
  if (isStatusKey(key)) return getAllowedStatus(value);
23
67
  if (DisallowedKeys.has(key)) return;
@@ -1 +1 @@
1
- {"version":3,"file":"SuiteSerializer.mjs","names":[],"sources":["../../src/exports/SuiteSerializer.ts"],"sourcesContent":["import { CB, Result } from 'vest-utils';\nimport { IsolateSerializer } from 'vestjs-runtime';\n\nimport { TestStatus } from '../core/StateMachines/IsolateTestStateMachine';\nimport { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\nimport { Suite } from '../suite/SuiteTypes';\nimport {\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\n\ntype Dumpable = {\n dump: CB<TIsolateSuite>;\n};\n\nexport class SuiteSerializer {\n static serialize(suite: Dumpable) {\n const dump = { ...suite.dump() };\n\n return IsolateSerializer.serialize(dump, suiteSerializerReplacer);\n }\n\n static safeDeserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): Result<TIsolateSuite, Error> {\n return IsolateSerializer.safeDeserialize(serialized).map(\n isolate => isolate as TIsolateSuite,\n );\n }\n\n static deserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): TIsolateSuite {\n return SuiteSerializer.safeDeserialize(serialized).unwrap();\n }\n\n static resume<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB,\n S extends TSchema,\n >(\n suite: Suite<F, G, T, S>,\n root: string | TIsolateSuite | Record<string, any>,\n ): void {\n const suiteRoot = SuiteSerializer.deserialize(root);\n\n suite.resume(suiteRoot);\n }\n}\n\nfunction suiteSerializerReplacer(value: any, key: string) {\n if (isStatusKey(key)) {\n return getAllowedStatus(value);\n }\n\n if (DisallowedKeys.has(key)) {\n return undefined;\n }\n\n return value;\n}\n\nfunction isStatusKey(key: string): boolean {\n return key === 'testStatus';\n}\n\nfunction getAllowedStatus(value: any): any {\n return AllowedStatuses.has(value) ? value : undefined;\n}\n\nconst AllowedStatuses = new Set([\n TestStatus.FAILED,\n TestStatus.PASSING,\n TestStatus.WARNING,\n]);\n\nconst DisallowedKeys = new Set([\n 'focusMode',\n 'match',\n 'matchAll',\n 'output',\n 'severity',\n 'tests',\n]);\n"],"mappings":";;;;AAgBA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B,OAAO,UAAU,OAAiB;EAChC,MAAM,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE;AAEhC,SAAO,kBAAkB,UAAU,MAAM,wBAAwB;;CAGnE,OAAO,gBACL,YAC8B;AAC9B,SAAO,kBAAkB,gBAAgB,WAAW,CAAC,KACnD,YAAW,QACZ;;CAGH,OAAO,YACL,YACe;AACf,SAAO,gBAAgB,gBAAgB,WAAW,CAAC,QAAQ;;CAG7D,OAAO,OAML,OACA,MACM;EACN,MAAM,YAAY,gBAAgB,YAAY,KAAK;AAEnD,QAAM,OAAO,UAAU;;;AAI3B,SAAS,wBAAwB,OAAY,KAAa;AACxD,KAAI,YAAY,IAAI,CAClB,QAAO,iBAAiB,MAAM;AAGhC,KAAI,eAAe,IAAI,IAAI,CACzB;AAGF,QAAO;;AAGT,SAAS,YAAY,KAAsB;AACzC,QAAO,QAAQ;;AAGjB,SAAS,iBAAiB,OAAiB;AACzC,QAAO,gBAAgB,IAAI,MAAM,GAAG,QAAQ;;AAG9C,MAAM,kBAAkB,IAAI,IAAI;CAC9B,WAAW;CACX,WAAW;CACX,WAAW;CACZ,CAAC;AAEF,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC"}
1
+ {"version":3,"file":"SuiteSerializer.mjs","names":["arr: any[]","clonedNode: Record<string, any>"],"sources":["../../src/exports/SuiteSerializer.ts"],"sourcesContent":["import { CB, Result } from 'vest-utils';\nimport { IsolateSerializer } from 'vestjs-runtime';\n\nimport { TestStatus } from '../core/StateMachines/IsolateTestStateMachine';\nimport { TIsolateSuite } from '../core/isolate/IsolateSuite/IsolateSuite';\nimport { Suite } from '../suite/SuiteTypes';\nimport {\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\n\ntype Dumpable = {\n dump: CB<TIsolateSuite>;\n};\n\nexport class SuiteSerializer {\n static serialize(suite: Dumpable) {\n const dump = stripMessageFromPassingTests(suite.dump());\n\n return IsolateSerializer.serialize(dump, suiteSerializerReplacer);\n }\n\n static safeDeserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): Result<TIsolateSuite, Error> {\n return IsolateSerializer.safeDeserialize(serialized).map(\n isolate => isolate as TIsolateSuite,\n );\n }\n\n static deserialize(\n serialized: string | TIsolateSuite | Record<string, any>,\n ): TIsolateSuite {\n return SuiteSerializer.safeDeserialize(serialized).unwrap();\n }\n\n static resume<\n F extends TFieldName,\n G extends TGroupName,\n T extends CB,\n S extends TSchema,\n >(\n suite: Suite<F, G, T, S>,\n root: string | TIsolateSuite | Record<string, any>,\n ): void {\n const suiteRoot = SuiteSerializer.deserialize(root);\n\n suite.resume(suiteRoot);\n }\n}\n\nfunction stripMessageFromPassingTests<T>(node: T): T {\n const visited = new WeakMap<object, any>();\n const containsPassingMemo = new WeakMap<object, boolean>();\n const seen = new WeakSet<object>();\n\n return strip(node, visited, containsPassingMemo, seen);\n}\n\n// eslint-disable-next-line complexity, max-statements\nfunction strip<T>(\n node: T,\n visited: WeakMap<object, any>,\n containsPassingMemo: WeakMap<object, boolean>,\n seen: WeakSet<object>,\n): T {\n if (!node || typeof node !== 'object') {\n return node;\n }\n\n if (visited.has(node as object)) {\n return visited.get(node as object);\n }\n\n if (!containsPassing(node, seen, containsPassingMemo)) {\n return node;\n }\n\n if (Array.isArray(node)) {\n const arr: any[] = [];\n visited.set(node, arr);\n\n node.forEach(value => {\n arr.push(strip(value, visited, containsPassingMemo, seen));\n });\n\n return arr as T;\n }\n\n const root = node as Record<string, any>;\n const shouldStripMessage = root.testStatus === TestStatus.PASSING;\n const clonedNode: Record<string, any> = {};\n visited.set(node, clonedNode);\n\n for (const [key, value] of Object.entries(root)) {\n if (shouldStripMessage && key === 'message') {\n continue;\n }\n\n clonedNode[key] = strip(value, visited, containsPassingMemo, seen);\n }\n\n return clonedNode as T;\n}\n\n// `strip` calls this with a shared `seen` set that is expected to be empty\n// at call boundaries. Inside this DFS, revisiting a node (`seen.has(node)`) means\n// we've encountered a cycle currently in-flight, so we conservatively return `true`\n// to avoid suppressing message-stripping while still preventing infinite recursion.\n// This is safe because every path that adds to `seen` removes it (`seen.delete`) on\n// return, and `memo` only stores final computed booleans for completed nodes.\n// eslint-disable-next-line complexity, max-statements\nfunction containsPassing(\n node: unknown,\n seen: WeakSet<object>,\n memo: WeakMap<object, boolean>,\n): boolean {\n if (!node || typeof node !== 'object') {\n return false;\n }\n\n if (memo.has(node)) {\n return memo.get(node) ?? false;\n }\n\n if (seen.has(node)) {\n return true;\n }\n\n if ((node as Record<string, unknown>).testStatus === TestStatus.PASSING) {\n memo.set(node, true);\n return true;\n }\n\n seen.add(node);\n\n const values = Array.isArray(node)\n ? node\n : Object.values(node as Record<string, unknown>);\n\n for (const value of values) {\n if (containsPassing(value, seen, memo)) {\n memo.set(node, true);\n seen.delete(node);\n return true;\n }\n }\n\n memo.set(node, false);\n seen.delete(node);\n\n return false;\n}\n\nfunction suiteSerializerReplacer(value: any, key: string) {\n if (isStatusKey(key)) {\n return getAllowedStatus(value);\n }\n\n if (DisallowedKeys.has(key)) {\n return undefined;\n }\n\n return value;\n}\n\nfunction isStatusKey(key: string): boolean {\n return key === 'testStatus';\n}\n\nfunction getAllowedStatus(value: any): any {\n return AllowedStatuses.has(value) ? value : undefined;\n}\n\nconst AllowedStatuses = new Set([\n TestStatus.FAILED,\n TestStatus.PASSING,\n TestStatus.WARNING,\n]);\n\nconst DisallowedKeys = new Set([\n 'focusMode',\n 'match',\n 'matchAll',\n 'output',\n 'severity',\n 'tests',\n]);\n"],"mappings":";;;;AAgBA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B,OAAO,UAAU,OAAiB;EAChC,MAAM,OAAO,6BAA6B,MAAM,MAAM,CAAC;AAEvD,SAAO,kBAAkB,UAAU,MAAM,wBAAwB;;CAGnE,OAAO,gBACL,YAC8B;AAC9B,SAAO,kBAAkB,gBAAgB,WAAW,CAAC,KACnD,YAAW,QACZ;;CAGH,OAAO,YACL,YACe;AACf,SAAO,gBAAgB,gBAAgB,WAAW,CAAC,QAAQ;;CAG7D,OAAO,OAML,OACA,MACM;EACN,MAAM,YAAY,gBAAgB,YAAY,KAAK;AAEnD,QAAM,OAAO,UAAU;;;AAI3B,SAAS,6BAAgC,MAAY;AAKnD,QAAO,MAAM,sBAJG,IAAI,SAAsB,kBACd,IAAI,SAA0B,kBAC7C,IAAI,SAAiB,CAEoB;;AAIxD,SAAS,MACP,MACA,SACA,qBACA,MACG;AACH,KAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;AAGT,KAAI,QAAQ,IAAI,KAAe,CAC7B,QAAO,QAAQ,IAAI,KAAe;AAGpC,KAAI,CAAC,gBAAgB,MAAM,MAAM,oBAAoB,CACnD,QAAO;AAGT,KAAI,MAAM,QAAQ,KAAK,EAAE;EACvB,MAAMA,MAAa,EAAE;AACrB,UAAQ,IAAI,MAAM,IAAI;AAEtB,OAAK,SAAQ,UAAS;AACpB,OAAI,KAAK,MAAM,OAAO,SAAS,qBAAqB,KAAK,CAAC;IAC1D;AAEF,SAAO;;CAGT,MAAM,OAAO;CACb,MAAM,qBAAqB,KAAK,eAAe,WAAW;CAC1D,MAAMC,aAAkC,EAAE;AAC1C,SAAQ,IAAI,MAAM,WAAW;AAE7B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;AAC/C,MAAI,sBAAsB,QAAQ,UAChC;AAGF,aAAW,OAAO,MAAM,OAAO,SAAS,qBAAqB,KAAK;;AAGpE,QAAO;;AAUT,SAAS,gBACP,MACA,MACA,MACS;AACT,KAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;AAGT,KAAI,KAAK,IAAI,KAAK,CAChB,QAAO,KAAK,IAAI,KAAK,IAAI;AAG3B,KAAI,KAAK,IAAI,KAAK,CAChB,QAAO;AAGT,KAAK,KAAiC,eAAe,WAAW,SAAS;AACvE,OAAK,IAAI,MAAM,KAAK;AACpB,SAAO;;AAGT,MAAK,IAAI,KAAK;CAEd,MAAM,SAAS,MAAM,QAAQ,KAAK,GAC9B,OACA,OAAO,OAAO,KAAgC;AAElD,MAAK,MAAM,SAAS,OAClB,KAAI,gBAAgB,OAAO,MAAM,KAAK,EAAE;AACtC,OAAK,IAAI,MAAM,KAAK;AACpB,OAAK,OAAO,KAAK;AACjB,SAAO;;AAIX,MAAK,IAAI,MAAM,MAAM;AACrB,MAAK,OAAO,KAAK;AAEjB,QAAO;;AAGT,SAAS,wBAAwB,OAAY,KAAa;AACxD,KAAI,YAAY,IAAI,CAClB,QAAO,iBAAiB,MAAM;AAGhC,KAAI,eAAe,IAAI,IAAI,CACzB;AAGF,QAAO;;AAGT,SAAS,YAAY,KAAsB;AACzC,QAAO,QAAQ;;AAGjB,SAAS,iBAAiB,OAAiB;AACzC,QAAO,gBAAgB,IAAI,MAAM,GAAG,QAAQ;;AAG9C,MAAM,kBAAkB,IAAI,IAAI;CAC9B,WAAW;CACX,WAAW;CACX,WAAW;CACZ,CAAC;AAEF,MAAM,iBAAiB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require('../chunk-CbDLau6x.cjs');
2
- require('../vest-CKYaivPf.cjs');
2
+ require('../vest-Lg6ZJuyu.cjs');
3
3
  require('../IsolateTestStateMachine-BBP3PZx3.cjs');
4
- const require_parser = require('../parser-CLhCAAYG.cjs');
4
+ const require_parser = require('../parser-DurNd9af.cjs');
5
5
  let vest_utils = require("vest-utils");
6
6
 
7
7
  //#region src/exports/classnames.ts
@@ -1,6 +1,6 @@
1
- import "../vest-BEj6iXsK.mjs";
1
+ import "../vest-WSPRosdH.mjs";
2
2
  import "../IsolateTestStateMachine-BejZsTRI.mjs";
3
- import { t as parse } from "../parser-Ch9qn6Hm.mjs";
3
+ import { t as parse } from "../parser-TvzEAVLQ.mjs";
4
4
  import { isFunction, makeBrand } from "vest-utils";
5
5
 
6
6
  //#region src/exports/classnames.ts
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('../chunk-CbDLau6x.cjs');
2
- const require_vest = require('../vest-CKYaivPf.cjs');
2
+ const require_vest = require('../vest-Lg6ZJuyu.cjs');
3
3
  require('../IsolateTestStateMachine-BBP3PZx3.cjs');
4
4
  let vest_utils = require("vest-utils");
5
5
  let vestjs_runtime = require("vestjs-runtime");
@@ -1,4 +1,4 @@
1
- import { b as SuiteContext, d as getTestFromAbortSignal, f as registerReconciler } from "../vest-BEj6iXsK.mjs";
1
+ import { b as SuiteContext, d as getTestFromAbortSignal, f as registerReconciler } from "../vest-WSPRosdH.mjs";
2
2
  import "../IsolateTestStateMachine-BejZsTRI.mjs";
3
3
  import { isPromise } from "vest-utils";
4
4
  import { Isolate, IsolateSelectors } from "vestjs-runtime";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('../chunk-CbDLau6x.cjs');
2
- const require_vest = require('../vest-CKYaivPf.cjs');
2
+ const require_vest = require('../vest-Lg6ZJuyu.cjs');
3
3
  require('../IsolateTestStateMachine-BBP3PZx3.cjs');
4
4
  let vest_utils = require("vest-utils");
5
5
  let vestjs_runtime = require("vestjs-runtime");
@@ -1,4 +1,4 @@
1
- import { f as registerReconciler, v as VestTest, y as createVestIsolate } from "../vest-BEj6iXsK.mjs";
1
+ import { f as registerReconciler, v as VestTest, y as createVestIsolate } from "../vest-WSPRosdH.mjs";
2
2
  import "../IsolateTestStateMachine-BejZsTRI.mjs";
3
3
  import { cache, isNullish, makeResult, unwrap } from "vest-utils";
4
4
  import { IsolateSelectors, Walker } from "vestjs-runtime";
@@ -1,5 +1,5 @@
1
- require('../vest-CKYaivPf.cjs');
1
+ require('../vest-Lg6ZJuyu.cjs');
2
2
  require('../IsolateTestStateMachine-BBP3PZx3.cjs');
3
- const require_parser = require('../parser-CLhCAAYG.cjs');
3
+ const require_parser = require('../parser-DurNd9af.cjs');
4
4
 
5
5
  exports.parse = require_parser.parse;
@@ -1,5 +1,5 @@
1
- import "../vest-BEj6iXsK.mjs";
1
+ import "../vest-WSPRosdH.mjs";
2
2
  import "../IsolateTestStateMachine-BejZsTRI.mjs";
3
- import { t as parse } from "../parser-Ch9qn6Hm.mjs";
3
+ import { t as parse } from "../parser-TvzEAVLQ.mjs";
4
4
 
5
5
  export { parse };
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-CbDLau6x.cjs');
2
- const require_vest = require('./vest-CKYaivPf.cjs');
2
+ const require_vest = require('./vest-Lg6ZJuyu.cjs');
3
3
  let vest_utils = require("vest-utils");
4
4
 
5
5
  //#region src/exports/parser.ts
@@ -39,4 +39,4 @@ Object.defineProperty(exports, 'parse', {
39
39
  return parse;
40
40
  }
41
41
  });
42
- //# sourceMappingURL=parser-CLhCAAYG.cjs.map
42
+ //# sourceMappingURL=parser-DurNd9af.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser-CLhCAAYG.cjs","names":["ErrorStrings","suiteSelectors","testedStorage: Record<string, boolean>"],"sources":["../src/exports/parser.ts"],"sourcesContent":["import {\n hasOwnProperty,\n invariant,\n isNullish,\n isPositive,\n makeBrand,\n} from 'vest-utils';\n\nimport { ErrorStrings } from '../errors/ErrorStrings';\nimport {\n SuiteResult,\n SuiteSummary,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\nimport { suiteSelectors } from '../vest';\n\nexport function parse<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema,\n>(summary: SuiteSummary<F, G> | SuiteResult<F, G, S>): ParsedVestObject<F> {\n invariant(\n summary && hasOwnProperty(summary, 'valid'),\n ErrorStrings.PARSER_EXPECT_RESULT_OBJECT,\n );\n\n const sel = suiteSelectors(summary);\n\n const testedStorage: Record<string, boolean> = {};\n\n const selectors = {\n invalid: sel.hasErrors,\n pending: sel.isPending,\n tested: isTested,\n untested: isUntested,\n valid: sel.isValid,\n warning: sel.hasWarnings,\n };\n\n return selectors;\n\n // Booleans\n function isTested(fieldName?: F | string): boolean {\n if (isNullish(fieldName)) {\n return isPositive(summary.testCount);\n }\n\n const safeFieldName = makeBrand<TFieldName>(fieldName);\n\n if (hasOwnProperty(testedStorage, safeFieldName)) {\n return testedStorage[safeFieldName];\n }\n\n addFieldToTestedStorage(safeFieldName);\n\n return selectors.tested(safeFieldName as F);\n }\n\n function addFieldToTestedStorage(fieldName: TFieldName): void {\n testedStorage[fieldName] =\n hasOwnProperty(summary.tests, fieldName) &&\n isPositive(summary.tests[fieldName].testCount);\n }\n\n function isUntested(fieldName?: F | string): boolean {\n const safeFieldName = fieldName\n ? makeBrand<TFieldName>(fieldName)\n : undefined;\n\n return !(\n isPositive(summary.testCount) &&\n selectors.tested(safeFieldName as F | undefined)\n );\n }\n}\n\nexport type ParsedVestObject<F extends TFieldName> = {\n valid(fieldName?: F | string): boolean;\n tested(fieldName?: F | string): boolean;\n invalid(fieldName?: F | string): boolean;\n untested(fieldName?: F | string): boolean;\n warning(fieldName?: F | string): boolean;\n pending(fieldName?: F | string): boolean;\n};\n"],"mappings":";;;;;AAkBA,SAAgB,MAId,SAAyE;AACzE,2BACE,0CAA0B,SAAS,QAAQ,EAC3CA,0BAAa,4BACd;CAED,MAAM,MAAMC,4BAAe,QAAQ;CAEnC,MAAMC,gBAAyC,EAAE;CAEjD,MAAM,YAAY;EAChB,SAAS,IAAI;EACb,SAAS,IAAI;EACb,QAAQ;EACR,UAAU;EACV,OAAO,IAAI;EACX,SAAS,IAAI;EACd;AAED,QAAO;CAGP,SAAS,SAAS,WAAiC;AACjD,gCAAc,UAAU,CACtB,mCAAkB,QAAQ,UAAU;EAGtC,MAAM,0CAAsC,UAAU;AAEtD,qCAAmB,eAAe,cAAc,CAC9C,QAAO,cAAc;AAGvB,0BAAwB,cAAc;AAEtC,SAAO,UAAU,OAAO,cAAmB;;CAG7C,SAAS,wBAAwB,WAA6B;AAC5D,gBAAc,4CACG,QAAQ,OAAO,UAAU,+BAC7B,QAAQ,MAAM,WAAW,UAAU;;CAGlD,SAAS,WAAW,WAAiC;EACnD,MAAM,gBAAgB,sCACI,UAAU,GAChC;AAEJ,SAAO,6BACM,QAAQ,UAAU,IAC7B,UAAU,OAAO,cAA+B"}
1
+ {"version":3,"file":"parser-DurNd9af.cjs","names":["ErrorStrings","suiteSelectors","testedStorage: Record<string, boolean>"],"sources":["../src/exports/parser.ts"],"sourcesContent":["import {\n hasOwnProperty,\n invariant,\n isNullish,\n isPositive,\n makeBrand,\n} from 'vest-utils';\n\nimport { ErrorStrings } from '../errors/ErrorStrings';\nimport {\n SuiteResult,\n SuiteSummary,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\nimport { suiteSelectors } from '../vest';\n\nexport function parse<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema,\n>(summary: SuiteSummary<F, G> | SuiteResult<F, G, S>): ParsedVestObject<F> {\n invariant(\n summary && hasOwnProperty(summary, 'valid'),\n ErrorStrings.PARSER_EXPECT_RESULT_OBJECT,\n );\n\n const sel = suiteSelectors(summary);\n\n const testedStorage: Record<string, boolean> = {};\n\n const selectors = {\n invalid: sel.hasErrors,\n pending: sel.isPending,\n tested: isTested,\n untested: isUntested,\n valid: sel.isValid,\n warning: sel.hasWarnings,\n };\n\n return selectors;\n\n // Booleans\n function isTested(fieldName?: F | string): boolean {\n if (isNullish(fieldName)) {\n return isPositive(summary.testCount);\n }\n\n const safeFieldName = makeBrand<TFieldName>(fieldName);\n\n if (hasOwnProperty(testedStorage, safeFieldName)) {\n return testedStorage[safeFieldName];\n }\n\n addFieldToTestedStorage(safeFieldName);\n\n return selectors.tested(safeFieldName as F);\n }\n\n function addFieldToTestedStorage(fieldName: TFieldName): void {\n testedStorage[fieldName] =\n hasOwnProperty(summary.tests, fieldName) &&\n isPositive(summary.tests[fieldName].testCount);\n }\n\n function isUntested(fieldName?: F | string): boolean {\n const safeFieldName = fieldName\n ? makeBrand<TFieldName>(fieldName)\n : undefined;\n\n return !(\n isPositive(summary.testCount) &&\n selectors.tested(safeFieldName as F | undefined)\n );\n }\n}\n\nexport type ParsedVestObject<F extends TFieldName> = {\n valid(fieldName?: F | string): boolean;\n tested(fieldName?: F | string): boolean;\n invalid(fieldName?: F | string): boolean;\n untested(fieldName?: F | string): boolean;\n warning(fieldName?: F | string): boolean;\n pending(fieldName?: F | string): boolean;\n};\n"],"mappings":";;;;;AAkBA,SAAgB,MAId,SAAyE;AACzE,2BACE,0CAA0B,SAAS,QAAQ,EAC3CA,0BAAa,4BACd;CAED,MAAM,MAAMC,4BAAe,QAAQ;CAEnC,MAAMC,gBAAyC,EAAE;CAEjD,MAAM,YAAY;EAChB,SAAS,IAAI;EACb,SAAS,IAAI;EACb,QAAQ;EACR,UAAU;EACV,OAAO,IAAI;EACX,SAAS,IAAI;EACd;AAED,QAAO;CAGP,SAAS,SAAS,WAAiC;AACjD,gCAAc,UAAU,CACtB,mCAAkB,QAAQ,UAAU;EAGtC,MAAM,0CAAsC,UAAU;AAEtD,qCAAmB,eAAe,cAAc,CAC9C,QAAO,cAAc;AAGvB,0BAAwB,cAAc;AAEtC,SAAO,UAAU,OAAO,cAAmB;;CAG7C,SAAS,wBAAwB,WAA6B;AAC5D,gBAAc,4CACG,QAAQ,OAAO,UAAU,+BAC7B,QAAQ,MAAM,WAAW,UAAU;;CAGlD,SAAS,WAAW,WAAiC;EACnD,MAAM,gBAAgB,sCACI,UAAU,GAChC;AAEJ,SAAO,6BACM,QAAQ,UAAU,IAC7B,UAAU,OAAO,cAA+B"}
@@ -1,4 +1,4 @@
1
- import { S as ErrorStrings, _ as suiteSelectors } from "./vest-BEj6iXsK.mjs";
1
+ import { S as ErrorStrings, _ as suiteSelectors } from "./vest-WSPRosdH.mjs";
2
2
  import { hasOwnProperty, invariant, isNullish, isPositive, makeBrand } from "vest-utils";
3
3
 
4
4
  //#region src/exports/parser.ts
@@ -33,4 +33,4 @@ function parse(summary) {
33
33
 
34
34
  //#endregion
35
35
  export { parse as t };
36
- //# sourceMappingURL=parser-Ch9qn6Hm.mjs.map
36
+ //# sourceMappingURL=parser-TvzEAVLQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser-Ch9qn6Hm.mjs","names":["testedStorage: Record<string, boolean>"],"sources":["../src/exports/parser.ts"],"sourcesContent":["import {\n hasOwnProperty,\n invariant,\n isNullish,\n isPositive,\n makeBrand,\n} from 'vest-utils';\n\nimport { ErrorStrings } from '../errors/ErrorStrings';\nimport {\n SuiteResult,\n SuiteSummary,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\nimport { suiteSelectors } from '../vest';\n\nexport function parse<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema,\n>(summary: SuiteSummary<F, G> | SuiteResult<F, G, S>): ParsedVestObject<F> {\n invariant(\n summary && hasOwnProperty(summary, 'valid'),\n ErrorStrings.PARSER_EXPECT_RESULT_OBJECT,\n );\n\n const sel = suiteSelectors(summary);\n\n const testedStorage: Record<string, boolean> = {};\n\n const selectors = {\n invalid: sel.hasErrors,\n pending: sel.isPending,\n tested: isTested,\n untested: isUntested,\n valid: sel.isValid,\n warning: sel.hasWarnings,\n };\n\n return selectors;\n\n // Booleans\n function isTested(fieldName?: F | string): boolean {\n if (isNullish(fieldName)) {\n return isPositive(summary.testCount);\n }\n\n const safeFieldName = makeBrand<TFieldName>(fieldName);\n\n if (hasOwnProperty(testedStorage, safeFieldName)) {\n return testedStorage[safeFieldName];\n }\n\n addFieldToTestedStorage(safeFieldName);\n\n return selectors.tested(safeFieldName as F);\n }\n\n function addFieldToTestedStorage(fieldName: TFieldName): void {\n testedStorage[fieldName] =\n hasOwnProperty(summary.tests, fieldName) &&\n isPositive(summary.tests[fieldName].testCount);\n }\n\n function isUntested(fieldName?: F | string): boolean {\n const safeFieldName = fieldName\n ? makeBrand<TFieldName>(fieldName)\n : undefined;\n\n return !(\n isPositive(summary.testCount) &&\n selectors.tested(safeFieldName as F | undefined)\n );\n }\n}\n\nexport type ParsedVestObject<F extends TFieldName> = {\n valid(fieldName?: F | string): boolean;\n tested(fieldName?: F | string): boolean;\n invalid(fieldName?: F | string): boolean;\n untested(fieldName?: F | string): boolean;\n warning(fieldName?: F | string): boolean;\n pending(fieldName?: F | string): boolean;\n};\n"],"mappings":";;;;AAkBA,SAAgB,MAId,SAAyE;AACzE,WACE,WAAW,eAAe,SAAS,QAAQ,EAC3C,aAAa,4BACd;CAED,MAAM,MAAM,eAAe,QAAQ;CAEnC,MAAMA,gBAAyC,EAAE;CAEjD,MAAM,YAAY;EAChB,SAAS,IAAI;EACb,SAAS,IAAI;EACb,QAAQ;EACR,UAAU;EACV,OAAO,IAAI;EACX,SAAS,IAAI;EACd;AAED,QAAO;CAGP,SAAS,SAAS,WAAiC;AACjD,MAAI,UAAU,UAAU,CACtB,QAAO,WAAW,QAAQ,UAAU;EAGtC,MAAM,gBAAgB,UAAsB,UAAU;AAEtD,MAAI,eAAe,eAAe,cAAc,CAC9C,QAAO,cAAc;AAGvB,0BAAwB,cAAc;AAEtC,SAAO,UAAU,OAAO,cAAmB;;CAG7C,SAAS,wBAAwB,WAA6B;AAC5D,gBAAc,aACZ,eAAe,QAAQ,OAAO,UAAU,IACxC,WAAW,QAAQ,MAAM,WAAW,UAAU;;CAGlD,SAAS,WAAW,WAAiC;EACnD,MAAM,gBAAgB,YAClB,UAAsB,UAAU,GAChC;AAEJ,SAAO,EACL,WAAW,QAAQ,UAAU,IAC7B,UAAU,OAAO,cAA+B"}
1
+ {"version":3,"file":"parser-TvzEAVLQ.mjs","names":["testedStorage: Record<string, boolean>"],"sources":["../src/exports/parser.ts"],"sourcesContent":["import {\n hasOwnProperty,\n invariant,\n isNullish,\n isPositive,\n makeBrand,\n} from 'vest-utils';\n\nimport { ErrorStrings } from '../errors/ErrorStrings';\nimport {\n SuiteResult,\n SuiteSummary,\n TFieldName,\n TGroupName,\n TSchema,\n} from '../suiteResult/SuiteResultTypes';\nimport { suiteSelectors } from '../vest';\n\nexport function parse<\n F extends TFieldName,\n G extends TGroupName,\n S extends TSchema,\n>(summary: SuiteSummary<F, G> | SuiteResult<F, G, S>): ParsedVestObject<F> {\n invariant(\n summary && hasOwnProperty(summary, 'valid'),\n ErrorStrings.PARSER_EXPECT_RESULT_OBJECT,\n );\n\n const sel = suiteSelectors(summary);\n\n const testedStorage: Record<string, boolean> = {};\n\n const selectors = {\n invalid: sel.hasErrors,\n pending: sel.isPending,\n tested: isTested,\n untested: isUntested,\n valid: sel.isValid,\n warning: sel.hasWarnings,\n };\n\n return selectors;\n\n // Booleans\n function isTested(fieldName?: F | string): boolean {\n if (isNullish(fieldName)) {\n return isPositive(summary.testCount);\n }\n\n const safeFieldName = makeBrand<TFieldName>(fieldName);\n\n if (hasOwnProperty(testedStorage, safeFieldName)) {\n return testedStorage[safeFieldName];\n }\n\n addFieldToTestedStorage(safeFieldName);\n\n return selectors.tested(safeFieldName as F);\n }\n\n function addFieldToTestedStorage(fieldName: TFieldName): void {\n testedStorage[fieldName] =\n hasOwnProperty(summary.tests, fieldName) &&\n isPositive(summary.tests[fieldName].testCount);\n }\n\n function isUntested(fieldName?: F | string): boolean {\n const safeFieldName = fieldName\n ? makeBrand<TFieldName>(fieldName)\n : undefined;\n\n return !(\n isPositive(summary.testCount) &&\n selectors.tested(safeFieldName as F | undefined)\n );\n }\n}\n\nexport type ParsedVestObject<F extends TFieldName> = {\n valid(fieldName?: F | string): boolean;\n tested(fieldName?: F | string): boolean;\n invalid(fieldName?: F | string): boolean;\n untested(fieldName?: F | string): boolean;\n warning(fieldName?: F | string): boolean;\n pending(fieldName?: F | string): boolean;\n};\n"],"mappings":";;;;AAkBA,SAAgB,MAId,SAAyE;AACzE,WACE,WAAW,eAAe,SAAS,QAAQ,EAC3C,aAAa,4BACd;CAED,MAAM,MAAM,eAAe,QAAQ;CAEnC,MAAMA,gBAAyC,EAAE;CAEjD,MAAM,YAAY;EAChB,SAAS,IAAI;EACb,SAAS,IAAI;EACb,QAAQ;EACR,UAAU;EACV,OAAO,IAAI;EACX,SAAS,IAAI;EACd;AAED,QAAO;CAGP,SAAS,SAAS,WAAiC;AACjD,MAAI,UAAU,UAAU,CACtB,QAAO,WAAW,QAAQ,UAAU;EAGtC,MAAM,gBAAgB,UAAsB,UAAU;AAEtD,MAAI,eAAe,eAAe,cAAc,CAC9C,QAAO,cAAc;AAGvB,0BAAwB,cAAc;AAEtC,SAAO,UAAU,OAAO,cAAmB;;CAG7C,SAAS,wBAAwB,WAA6B;AAC5D,gBAAc,aACZ,eAAe,QAAQ,OAAO,UAAU,IACxC,WAAW,QAAQ,MAAM,WAAW,UAAU;;CAGlD,SAAS,WAAW,WAAiC;EACnD,MAAM,gBAAgB,YAClB,UAAsB,UAAU,GAChC;AAEJ,SAAO,EACL,WAAW,QAAQ,UAAU,IAC7B,UAAU,OAAO,cAA+B"}
@@ -379,16 +379,25 @@ var SummaryBase = class {
379
379
  }
380
380
  };
381
381
  var SuiteSummary = class extends SummaryBase {
382
- constructor(..._args) {
383
- super(..._args);
382
+ static {
383
+ _Severity$ERRORS = Severity.ERRORS, _Severity$WARNINGS = Severity.WARNINGS;
384
+ }
385
+ constructor() {
386
+ super();
384
387
  this[_Severity$ERRORS] = [];
385
388
  this[_Severity$WARNINGS] = [];
386
389
  this.groups = {};
387
390
  this.tests = {};
388
391
  this.valid = null;
389
- }
390
- static {
391
- _Severity$ERRORS = Severity.ERRORS, _Severity$WARNINGS = Severity.WARNINGS;
392
+ Object.defineProperty(this, "run", {
393
+ configurable: true,
394
+ enumerable: false,
395
+ value: {
396
+ data: void 0,
397
+ time: /* @__PURE__ */ new Date(0)
398
+ },
399
+ writable: true
400
+ });
392
401
  }
393
402
  };
394
403
 
@@ -1230,15 +1239,28 @@ function shouldCountTestRun(testObject) {
1230
1239
 
1231
1240
  //#endregion
1232
1241
  //#region src/suiteResult/suiteResult.ts
1233
- function useCreateSuiteResult(schema, outputData, inputData) {
1242
+ function useCreateSuiteResult(schema, outputData, inputData, runTime = /* @__PURE__ */ new Date()) {
1234
1243
  return useSuiteResultCache(() => {
1235
- return (0, vest_utils.freezeAssign)(constructSuiteResultObject(useProduceSuiteSummary(), outputData), {
1244
+ const summary = useProduceSuiteSummary();
1245
+ summary.run = {
1246
+ data: inputData,
1247
+ time: runTime
1248
+ };
1249
+ const result = (0, vest_utils.assign)(constructSuiteResultObject(summary, outputData), {
1236
1250
  dump: vestjs_runtime.VestRuntime.persist(vestjs_runtime.VestRuntime.useAvailableRoot),
1237
1251
  types: schema ? {
1238
1252
  input: inputData,
1239
1253
  output: outputData
1240
1254
  } : void 0
1241
1255
  });
1256
+ const runMeta = Object.freeze({ ...summary.run });
1257
+ Object.defineProperty(result, "run", {
1258
+ configurable: true,
1259
+ enumerable: false,
1260
+ value: runMeta,
1261
+ writable: true
1262
+ });
1263
+ return Object.freeze(result);
1242
1264
  });
1243
1265
  }
1244
1266
  function constructSuiteResultObject(summary, outputData) {
@@ -2168,21 +2190,23 @@ function getTypedMethods() {
2168
2190
  function useCreateSuiteRunner(suiteCallback, modifiers, schema) {
2169
2191
  const transformedModifiers = useTransformedModifiers(modifiers);
2170
2192
  return function runSuite(...args) {
2193
+ const runTime = /* @__PURE__ */ new Date();
2171
2194
  const { resolve, promise } = (0, vest_utils.withResolvers)();
2172
2195
  const schemaInput = args[0];
2173
2196
  const schemaRunResult = shouldRunSchema(schema, transformedModifiers) ? runSchemaWithParse(schema, schemaInput) : void 0;
2174
2197
  const callbackInput = getCallbackInput(schemaRunResult, schemaInput);
2175
2198
  const callbackArgs = [callbackInput, ...args.slice(1)];
2176
- return (0, vest_utils.assign)(promise, SuiteContext.run({
2199
+ const runData = callbackInput;
2200
+ const result = (0, vest_utils.assign)(promise, SuiteContext.run({
2177
2201
  suiteParams: callbackArgs,
2178
2202
  schema,
2179
2203
  modifiers: transformedModifiers
2180
2204
  }, () => {
2181
2205
  useEmit("SUITE_RUN_STARTED");
2182
2206
  const useResolver = () => {
2183
- const result = useCreateSuiteResult(schema, callbackInput, schemaInput);
2184
- if (!result.isPending()) resolve(result);
2185
- return result;
2207
+ const result$1 = useCreateSuiteResult(schema, callbackInput, runData, runTime);
2208
+ if (!result$1.isPending()) resolve(result$1);
2209
+ return result$1;
2186
2210
  };
2187
2211
  return IsolateSuite(useRunSuiteCallback({
2188
2212
  args: callbackArgs,
@@ -2193,6 +2217,16 @@ function useCreateSuiteRunner(suiteCallback, modifiers, schema) {
2193
2217
  useResolver
2194
2218
  }), useResolver).output;
2195
2219
  }));
2220
+ Object.defineProperty(result, "run", {
2221
+ configurable: true,
2222
+ enumerable: false,
2223
+ value: Object.freeze({
2224
+ data: runData,
2225
+ time: runTime
2226
+ }),
2227
+ writable: true
2228
+ });
2229
+ return result;
2196
2230
  };
2197
2231
  }
2198
2232
  /**
@@ -2619,4 +2653,4 @@ Object.defineProperty(exports, 'warn', {
2619
2653
  return warn;
2620
2654
  }
2621
2655
  });
2622
- //# sourceMappingURL=vest-CKYaivPf.cjs.map
2656
+ //# sourceMappingURL=vest-Lg6ZJuyu.cjs.map