@noego/wood 0.4.1 → 0.4.2

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 (81) hide show
  1. package/README.md +100 -2
  2. package/dist/client/global_polyfill.d.cts +1 -2
  3. package/dist/client/global_polyfill.d.ts +1 -2
  4. package/dist/client/index.cjs.map +1 -1
  5. package/dist/client/index.d.cts +1 -1
  6. package/dist/client/index.d.ts +1 -1
  7. package/dist/client/index.js.map +1 -1
  8. package/dist/index.cjs +0 -4
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.js +0 -4
  13. package/dist/index.js.map +1 -1
  14. package/dist/testing/browser.cjs +188 -34
  15. package/dist/testing/browser.cjs.map +1 -1
  16. package/dist/testing/browser.d.cts +6 -2
  17. package/dist/testing/browser.d.ts +6 -2
  18. package/dist/testing/browser.js +188 -35
  19. package/dist/testing/browser.js.map +1 -1
  20. package/dist/testing/create_controller_harness.cjs +3 -1
  21. package/dist/testing/create_controller_harness.cjs.map +1 -1
  22. package/dist/testing/create_controller_harness.d.cts +4 -2
  23. package/dist/testing/create_controller_harness.d.ts +4 -2
  24. package/dist/testing/create_controller_harness.js +3 -1
  25. package/dist/testing/create_controller_harness.js.map +1 -1
  26. package/dist/testing/index.cjs +3 -3
  27. package/dist/testing/index.cjs.map +1 -1
  28. package/dist/testing/index.d.cts +5 -3
  29. package/dist/testing/index.d.ts +5 -3
  30. package/dist/testing/index.js +2 -2
  31. package/dist/testing/index.js.map +1 -1
  32. package/dist/trace-testing/index.cjs +3 -3
  33. package/dist/trace-testing/index.cjs.map +1 -1
  34. package/dist/trace-testing/index.d.cts +2 -3
  35. package/dist/trace-testing/index.d.ts +2 -3
  36. package/dist/trace-testing/index.js +3 -3
  37. package/dist/trace-testing/index.js.map +1 -1
  38. package/dist/trace-testing/trace_assertions.cjs +2 -46
  39. package/dist/trace-testing/trace_assertions.cjs.map +1 -1
  40. package/dist/trace-testing/trace_assertions.d.cts +1 -15
  41. package/dist/trace-testing/trace_assertions.d.ts +1 -15
  42. package/dist/trace-testing/trace_assertions.js +3 -45
  43. package/dist/trace-testing/trace_assertions.js.map +1 -1
  44. package/dist/trace-testing/trace_query.cjs +4 -115
  45. package/dist/trace-testing/trace_query.cjs.map +1 -1
  46. package/dist/trace-testing/trace_query.d.cts +1 -24
  47. package/dist/trace-testing/trace_query.d.ts +1 -24
  48. package/dist/trace-testing/trace_query.js +5 -112
  49. package/dist/trace-testing/trace_query.js.map +1 -1
  50. package/dist/trace-testing/trace_recorder.cjs +50 -0
  51. package/dist/trace-testing/trace_recorder.cjs.map +1 -0
  52. package/dist/trace-testing/trace_recorder.d.cts +12 -0
  53. package/dist/trace-testing/trace_recorder.d.ts +12 -0
  54. package/dist/trace-testing/trace_recorder.js +32 -0
  55. package/dist/trace-testing/trace_recorder.js.map +1 -0
  56. package/dist/tracing/index.cjs +0 -4
  57. package/dist/tracing/index.cjs.map +1 -1
  58. package/dist/tracing/index.d.cts +1 -1
  59. package/dist/tracing/index.d.ts +1 -1
  60. package/dist/tracing/index.js +1 -5
  61. package/dist/tracing/index.js.map +1 -1
  62. package/dist/tracing/trace_hub.cjs +0 -84
  63. package/dist/tracing/trace_hub.cjs.map +1 -1
  64. package/dist/tracing/trace_hub.d.cts +1 -16
  65. package/dist/tracing/trace_hub.d.ts +1 -16
  66. package/dist/tracing/trace_hub.js +0 -72
  67. package/dist/tracing/trace_hub.js.map +1 -1
  68. package/dist/tracing/trace_provider.cjs +0 -6
  69. package/dist/tracing/trace_provider.cjs.map +1 -1
  70. package/dist/tracing/trace_provider.d.cts +1 -3
  71. package/dist/tracing/trace_provider.d.ts +1 -3
  72. package/dist/tracing/trace_provider.js +0 -7
  73. package/dist/tracing/trace_provider.js.map +1 -1
  74. package/docs/browser-testing.md +84 -0
  75. package/package.json +2 -1
  76. package/dist/trace-testing/trace_scenario.cjs +0 -61
  77. package/dist/trace-testing/trace_scenario.cjs.map +0 -1
  78. package/dist/trace-testing/trace_scenario.d.cts +0 -27
  79. package/dist/trace-testing/trace_scenario.d.ts +0 -27
  80. package/dist/trace-testing/trace_scenario.js +0 -37
  81. package/dist/trace-testing/trace_scenario.js.map +0 -1
@@ -18,21 +18,21 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var trace_testing_exports = {};
20
20
  __export(trace_testing_exports, {
21
+ TraceRecorder: () => import_trace_recorder.TraceRecorder,
21
22
  createTraceAssertions: () => import_trace_assertions.createTraceAssertions,
22
23
  createTraceQuery: () => import_trace_query.createTraceQuery,
23
- createTraceScenario: () => import_trace_scenario.createTraceScenario,
24
24
  matchesTrace: () => import_trace_query.matchesTrace,
25
25
  readPath: () => import_trace_query.readPath
26
26
  });
27
27
  module.exports = __toCommonJS(trace_testing_exports);
28
28
  var import_trace_query = require("./trace_query.js");
29
29
  var import_trace_assertions = require("./trace_assertions.js");
30
- var import_trace_scenario = require("./trace_scenario.js");
30
+ var import_trace_recorder = require("./trace_recorder.js");
31
31
  // Annotate the CommonJS export names for ESM import in node:
32
32
  0 && (module.exports = {
33
+ TraceRecorder,
33
34
  createTraceAssertions,
34
35
  createTraceQuery,
35
- createTraceScenario,
36
36
  matchesTrace,
37
37
  readPath
38
38
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trace-testing/index.ts"],"sourcesContent":["export {\n createTraceQuery,\n matchesTrace,\n readPath,\n type TraceCountSummary,\n type TraceFilter,\n type TraceQuery,\n} from './trace_query.js';\n\nexport {\n createTraceAssertions,\n type TraceAssertions,\n} from './trace_assertions.js';\n\nexport {\n createTraceScenario,\n type TraceScenario,\n type TraceScenarioOptions,\n type TraceScenarioRunContext,\n} from './trace_scenario.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOO;AAEP,8BAGO;AAEP,4BAKO;","names":[]}
1
+ {"version":3,"sources":["../../src/trace-testing/index.ts"],"sourcesContent":["export {\n createTraceQuery,\n matchesTrace,\n readPath,\n type TraceCountSummary,\n type TraceFilter,\n type TraceQuery,\n} from './trace_query.js';\n\nexport {\n createTraceAssertions,\n type TraceAssertions,\n} from './trace_assertions.js';\n\nexport {\n TraceRecorder,\n type TraceRecorderEnableOptions,\n} from './trace_recorder.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOO;AAEP,8BAGO;AAEP,4BAGO;","names":[]}
@@ -1,6 +1,5 @@
1
- export { TraceCountSummary, TraceFilter, TraceQuery, createTraceQuery, matchesTrace, readPath } from './trace_query.cjs';
2
- export { TraceAssertions, createTraceAssertions } from './trace_assertions.cjs';
3
- export { TraceScenario, TraceScenarioOptions, TraceScenarioRunContext, createTraceScenario } from './trace_scenario.cjs';
1
+ export { TraceAssertions, TraceCountSummary, TraceFilter, TraceQuery, TraceRecorderEnableOptions, createTraceAssertions, createTraceQuery, matchesTrace, readPath } from '@noego/trace/testing';
2
+ export { TraceRecorder } from './trace_recorder.cjs';
4
3
  import '../tracing/trace_hub.cjs';
5
4
  import 'rxjs';
6
5
  import '../tracing/trace_provider.cjs';
@@ -1,6 +1,5 @@
1
- export { TraceCountSummary, TraceFilter, TraceQuery, createTraceQuery, matchesTrace, readPath } from './trace_query.js';
2
- export { TraceAssertions, createTraceAssertions } from './trace_assertions.js';
3
- export { TraceScenario, TraceScenarioOptions, TraceScenarioRunContext, createTraceScenario } from './trace_scenario.js';
1
+ export { TraceAssertions, TraceCountSummary, TraceFilter, TraceQuery, TraceRecorderEnableOptions, createTraceAssertions, createTraceQuery, matchesTrace, readPath } from '@noego/trace/testing';
2
+ export { TraceRecorder } from './trace_recorder.js';
4
3
  import '../tracing/trace_hub.js';
5
4
  import 'rxjs';
6
5
  import '../tracing/trace_provider.js';
@@ -7,12 +7,12 @@ import {
7
7
  createTraceAssertions
8
8
  } from "./trace_assertions.js";
9
9
  import {
10
- createTraceScenario
11
- } from "./trace_scenario.js";
10
+ TraceRecorder
11
+ } from "./trace_recorder.js";
12
12
  export {
13
+ TraceRecorder,
13
14
  createTraceAssertions,
14
15
  createTraceQuery,
15
- createTraceScenario,
16
16
  matchesTrace,
17
17
  readPath
18
18
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trace-testing/index.ts"],"sourcesContent":["export {\n createTraceQuery,\n matchesTrace,\n readPath,\n type TraceCountSummary,\n type TraceFilter,\n type TraceQuery,\n} from './trace_query.js';\n\nexport {\n createTraceAssertions,\n type TraceAssertions,\n} from './trace_assertions.js';\n\nexport {\n createTraceScenario,\n type TraceScenario,\n type TraceScenarioOptions,\n type TraceScenarioRunContext,\n} from './trace_scenario.js';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAEP;AAAA,EACE;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,OAIK;","names":[]}
1
+ {"version":3,"sources":["../../src/trace-testing/index.ts"],"sourcesContent":["export {\n createTraceQuery,\n matchesTrace,\n readPath,\n type TraceCountSummary,\n type TraceFilter,\n type TraceQuery,\n} from './trace_query.js';\n\nexport {\n createTraceAssertions,\n type TraceAssertions,\n} from './trace_assertions.js';\n\nexport {\n TraceRecorder,\n type TraceRecorderEnableOptions,\n} from './trace_recorder.js';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAEP;AAAA,EACE;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,OAEK;","names":[]}
@@ -18,54 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var trace_assertions_exports = {};
20
20
  __export(trace_assertions_exports, {
21
- createTraceAssertions: () => createTraceAssertions
21
+ createTraceAssertions: () => import_testing.createTraceAssertions
22
22
  });
23
23
  module.exports = __toCommonJS(trace_assertions_exports);
24
- var import_trace_query = require("./trace_query.js");
25
- function createTraceAssertions(source) {
26
- const query = (0, import_trace_query.createTraceQuery)(source);
27
- return {
28
- ...query,
29
- expectCount(filter, expectedCount) {
30
- const actual = query.count(filter);
31
- if (actual !== expectedCount) {
32
- throw new Error(`Expected ${expectedCount} trace events for ${formatFilter(filter)}, found ${actual}.`);
33
- }
34
- },
35
- expectNone(filter) {
36
- const actual = query.count(filter);
37
- if (actual !== 0) {
38
- throw new Error(`Expected no trace events for ${formatFilter(filter)}, found ${actual}.`);
39
- }
40
- },
41
- expectOnce(filter) {
42
- const actual = query.count(filter);
43
- if (actual !== 1) {
44
- throw new Error(`Expected one trace event for ${formatFilter(filter)}, found ${actual}.`);
45
- }
46
- },
47
- expectSequence(filters) {
48
- if (!query.sequence(filters)) {
49
- throw new Error(`Expected trace sequence ${formatFilter(filters)}.`);
50
- }
51
- },
52
- expectUniqueBy(filter, path) {
53
- if (!query.uniqueBy(filter, path)) {
54
- throw new Error(`Expected trace values at "${path}" to be unique for ${formatFilter(filter)}.`);
55
- }
56
- }
57
- };
58
- }
59
- function formatFilter(value) {
60
- if (typeof value === "function") {
61
- return "[predicate]";
62
- }
63
- try {
64
- return JSON.stringify(value);
65
- } catch {
66
- return String(value);
67
- }
68
- }
24
+ var import_testing = require("@noego/trace/testing");
69
25
  // Annotate the CommonJS export names for ESM import in node:
70
26
  0 && (module.exports = {
71
27
  createTraceAssertions
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trace-testing/trace_assertions.ts"],"sourcesContent":["import type { TraceEvent } from '../tracing/index.js';\nimport { createTraceQuery, type TraceFilter, type TraceQuery } from './trace_query.js';\n\nexport type TraceAssertions = TraceQuery & {\n expectCount(filter: TraceFilter, expectedCount: number): void;\n expectNone(filter: TraceFilter): void;\n expectOnce(filter: TraceFilter): void;\n expectSequence(filters: TraceFilter[]): void;\n expectUniqueBy(filter: TraceFilter, path: string): void;\n};\n\ntype TraceSource = TraceEvent[] | (() => TraceEvent[]);\n\nexport function createTraceAssertions(source: TraceSource): TraceAssertions {\n const query = createTraceQuery(source);\n return {\n ...query,\n expectCount(filter, expectedCount) {\n const actual = query.count(filter);\n if (actual !== expectedCount) {\n throw new Error(`Expected ${expectedCount} trace events for ${formatFilter(filter)}, found ${actual}.`);\n }\n },\n expectNone(filter) {\n const actual = query.count(filter);\n if (actual !== 0) {\n throw new Error(`Expected no trace events for ${formatFilter(filter)}, found ${actual}.`);\n }\n },\n expectOnce(filter) {\n const actual = query.count(filter);\n if (actual !== 1) {\n throw new Error(`Expected one trace event for ${formatFilter(filter)}, found ${actual}.`);\n }\n },\n expectSequence(filters) {\n if (!query.sequence(filters)) {\n throw new Error(`Expected trace sequence ${formatFilter(filters)}.`);\n }\n },\n expectUniqueBy(filter, path) {\n if (!query.uniqueBy(filter, path)) {\n throw new Error(`Expected trace values at \"${path}\" to be unique for ${formatFilter(filter)}.`);\n }\n },\n };\n}\n\nfunction formatFilter(value: unknown): string {\n if (typeof value === 'function') {\n return '[predicate]';\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yBAAoE;AAY7D,SAAS,sBAAsB,QAAsC;AAC1E,QAAM,YAAQ,qCAAiB,MAAM;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,QAAQ,eAAe;AACjC,YAAM,SAAS,MAAM,MAAM,MAAM;AACjC,UAAI,WAAW,eAAe;AAC5B,cAAM,IAAI,MAAM,YAAY,aAAa,qBAAqB,aAAa,MAAM,CAAC,WAAW,MAAM,GAAG;AAAA,MACxG;AAAA,IACF;AAAA,IACA,WAAW,QAAQ;AACjB,YAAM,SAAS,MAAM,MAAM,MAAM;AACjC,UAAI,WAAW,GAAG;AAChB,cAAM,IAAI,MAAM,gCAAgC,aAAa,MAAM,CAAC,WAAW,MAAM,GAAG;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,WAAW,QAAQ;AACjB,YAAM,SAAS,MAAM,MAAM,MAAM;AACjC,UAAI,WAAW,GAAG;AAChB,cAAM,IAAI,MAAM,gCAAgC,aAAa,MAAM,CAAC,WAAW,MAAM,GAAG;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,eAAe,SAAS;AACtB,UAAI,CAAC,MAAM,SAAS,OAAO,GAAG;AAC5B,cAAM,IAAI,MAAM,2BAA2B,aAAa,OAAO,CAAC,GAAG;AAAA,MACrE;AAAA,IACF;AAAA,IACA,eAAe,QAAQ,MAAM;AAC3B,UAAI,CAAC,MAAM,SAAS,QAAQ,IAAI,GAAG;AACjC,cAAM,IAAI,MAAM,6BAA6B,IAAI,sBAAsB,aAAa,MAAM,CAAC,GAAG;AAAA,MAChG;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/trace-testing/trace_assertions.ts"],"sourcesContent":["export {\n createTraceAssertions,\n type TraceAssertions,\n} from '@noego/trace/testing';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAGO;","names":[]}
@@ -1,15 +1 @@
1
- import { TraceEvent } from '../tracing/trace_hub.cjs';
2
- import { TraceQuery, TraceFilter } from './trace_query.cjs';
3
- import 'rxjs';
4
-
5
- type TraceAssertions = TraceQuery & {
6
- expectCount(filter: TraceFilter, expectedCount: number): void;
7
- expectNone(filter: TraceFilter): void;
8
- expectOnce(filter: TraceFilter): void;
9
- expectSequence(filters: TraceFilter[]): void;
10
- expectUniqueBy(filter: TraceFilter, path: string): void;
11
- };
12
- type TraceSource = TraceEvent[] | (() => TraceEvent[]);
13
- declare function createTraceAssertions(source: TraceSource): TraceAssertions;
14
-
15
- export { type TraceAssertions, createTraceAssertions };
1
+ export { TraceAssertions, createTraceAssertions } from '@noego/trace/testing';
@@ -1,15 +1 @@
1
- import { TraceEvent } from '../tracing/trace_hub.js';
2
- import { TraceQuery, TraceFilter } from './trace_query.js';
3
- import 'rxjs';
4
-
5
- type TraceAssertions = TraceQuery & {
6
- expectCount(filter: TraceFilter, expectedCount: number): void;
7
- expectNone(filter: TraceFilter): void;
8
- expectOnce(filter: TraceFilter): void;
9
- expectSequence(filters: TraceFilter[]): void;
10
- expectUniqueBy(filter: TraceFilter, path: string): void;
11
- };
12
- type TraceSource = TraceEvent[] | (() => TraceEvent[]);
13
- declare function createTraceAssertions(source: TraceSource): TraceAssertions;
14
-
15
- export { type TraceAssertions, createTraceAssertions };
1
+ export { TraceAssertions, createTraceAssertions } from '@noego/trace/testing';
@@ -1,48 +1,6 @@
1
- import { createTraceQuery } from "./trace_query.js";
2
- function createTraceAssertions(source) {
3
- const query = createTraceQuery(source);
4
- return {
5
- ...query,
6
- expectCount(filter, expectedCount) {
7
- const actual = query.count(filter);
8
- if (actual !== expectedCount) {
9
- throw new Error(`Expected ${expectedCount} trace events for ${formatFilter(filter)}, found ${actual}.`);
10
- }
11
- },
12
- expectNone(filter) {
13
- const actual = query.count(filter);
14
- if (actual !== 0) {
15
- throw new Error(`Expected no trace events for ${formatFilter(filter)}, found ${actual}.`);
16
- }
17
- },
18
- expectOnce(filter) {
19
- const actual = query.count(filter);
20
- if (actual !== 1) {
21
- throw new Error(`Expected one trace event for ${formatFilter(filter)}, found ${actual}.`);
22
- }
23
- },
24
- expectSequence(filters) {
25
- if (!query.sequence(filters)) {
26
- throw new Error(`Expected trace sequence ${formatFilter(filters)}.`);
27
- }
28
- },
29
- expectUniqueBy(filter, path) {
30
- if (!query.uniqueBy(filter, path)) {
31
- throw new Error(`Expected trace values at "${path}" to be unique for ${formatFilter(filter)}.`);
32
- }
33
- }
34
- };
35
- }
36
- function formatFilter(value) {
37
- if (typeof value === "function") {
38
- return "[predicate]";
39
- }
40
- try {
41
- return JSON.stringify(value);
42
- } catch {
43
- return String(value);
44
- }
45
- }
1
+ import {
2
+ createTraceAssertions
3
+ } from "@noego/trace/testing";
46
4
  export {
47
5
  createTraceAssertions
48
6
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trace-testing/trace_assertions.ts"],"sourcesContent":["import type { TraceEvent } from '../tracing/index.js';\nimport { createTraceQuery, type TraceFilter, type TraceQuery } from './trace_query.js';\n\nexport type TraceAssertions = TraceQuery & {\n expectCount(filter: TraceFilter, expectedCount: number): void;\n expectNone(filter: TraceFilter): void;\n expectOnce(filter: TraceFilter): void;\n expectSequence(filters: TraceFilter[]): void;\n expectUniqueBy(filter: TraceFilter, path: string): void;\n};\n\ntype TraceSource = TraceEvent[] | (() => TraceEvent[]);\n\nexport function createTraceAssertions(source: TraceSource): TraceAssertions {\n const query = createTraceQuery(source);\n return {\n ...query,\n expectCount(filter, expectedCount) {\n const actual = query.count(filter);\n if (actual !== expectedCount) {\n throw new Error(`Expected ${expectedCount} trace events for ${formatFilter(filter)}, found ${actual}.`);\n }\n },\n expectNone(filter) {\n const actual = query.count(filter);\n if (actual !== 0) {\n throw new Error(`Expected no trace events for ${formatFilter(filter)}, found ${actual}.`);\n }\n },\n expectOnce(filter) {\n const actual = query.count(filter);\n if (actual !== 1) {\n throw new Error(`Expected one trace event for ${formatFilter(filter)}, found ${actual}.`);\n }\n },\n expectSequence(filters) {\n if (!query.sequence(filters)) {\n throw new Error(`Expected trace sequence ${formatFilter(filters)}.`);\n }\n },\n expectUniqueBy(filter, path) {\n if (!query.uniqueBy(filter, path)) {\n throw new Error(`Expected trace values at \"${path}\" to be unique for ${formatFilter(filter)}.`);\n }\n },\n };\n}\n\nfunction formatFilter(value: unknown): string {\n if (typeof value === 'function') {\n return '[predicate]';\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"AACA,SAAS,wBAA2D;AAY7D,SAAS,sBAAsB,QAAsC;AAC1E,QAAM,QAAQ,iBAAiB,MAAM;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,QAAQ,eAAe;AACjC,YAAM,SAAS,MAAM,MAAM,MAAM;AACjC,UAAI,WAAW,eAAe;AAC5B,cAAM,IAAI,MAAM,YAAY,aAAa,qBAAqB,aAAa,MAAM,CAAC,WAAW,MAAM,GAAG;AAAA,MACxG;AAAA,IACF;AAAA,IACA,WAAW,QAAQ;AACjB,YAAM,SAAS,MAAM,MAAM,MAAM;AACjC,UAAI,WAAW,GAAG;AAChB,cAAM,IAAI,MAAM,gCAAgC,aAAa,MAAM,CAAC,WAAW,MAAM,GAAG;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,WAAW,QAAQ;AACjB,YAAM,SAAS,MAAM,MAAM,MAAM;AACjC,UAAI,WAAW,GAAG;AAChB,cAAM,IAAI,MAAM,gCAAgC,aAAa,MAAM,CAAC,WAAW,MAAM,GAAG;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,eAAe,SAAS;AACtB,UAAI,CAAC,MAAM,SAAS,OAAO,GAAG;AAC5B,cAAM,IAAI,MAAM,2BAA2B,aAAa,OAAO,CAAC,GAAG;AAAA,MACrE;AAAA,IACF;AAAA,IACA,eAAe,QAAQ,MAAM;AAC3B,UAAI,CAAC,MAAM,SAAS,QAAQ,IAAI,GAAG;AACjC,cAAM,IAAI,MAAM,6BAA6B,IAAI,sBAAsB,aAAa,MAAM,CAAC,GAAG;AAAA,MAChG;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/trace-testing/trace_assertions.ts"],"sourcesContent":["export {\n createTraceAssertions,\n type TraceAssertions,\n} from '@noego/trace/testing';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,OAEK;","names":[]}
@@ -18,123 +18,12 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var trace_query_exports = {};
20
20
  __export(trace_query_exports, {
21
- createTraceQuery: () => createTraceQuery,
22
- matchesTrace: () => matchesTrace,
23
- readPath: () => readPath
21
+ createTraceQuery: () => import_testing.createTraceQuery,
22
+ matchesTrace: () => import_testing.matchesTrace,
23
+ readPath: () => import_testing.readPath
24
24
  });
25
25
  module.exports = __toCommonJS(trace_query_exports);
26
- function createTraceQuery(source) {
27
- const readEvents = () => Array.isArray(source) ? source.slice() : source().slice();
28
- return {
29
- all: () => readEvents(),
30
- filter: (filter) => readEvents().filter((event) => matchesTrace(event, filter)),
31
- count: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length,
32
- countByType: (types) => countTracesByType(readEvents(), types),
33
- payloads: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).map((event) => event.payload).filter((payload) => isRecord(payload)),
34
- first: (filter) => readEvents().find((event) => matchesTrace(event, filter)) ?? null,
35
- last: (filter) => findLastTrace(readEvents(), filter),
36
- sequence: (filters) => includesTraceSequence(readEvents(), filters),
37
- none: (filter) => readEvents().every((event) => !matchesTrace(event, filter)),
38
- once: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length === 1,
39
- uniqueBy: (filter, path) => valuesAtPathAreUnique(readEvents(), filter, path)
40
- };
41
- }
42
- function matchesTrace(event, filter) {
43
- if (typeof filter === "function") {
44
- return filter(event);
45
- }
46
- for (const [path, expected] of Object.entries(filter)) {
47
- const actual = readPath(event, path);
48
- if (!matchesValue(actual, expected)) {
49
- return false;
50
- }
51
- }
52
- return true;
53
- }
54
- function readPath(value, path) {
55
- let current = value;
56
- for (const segment of path.split(".")) {
57
- if (!isRecord(current)) {
58
- return void 0;
59
- }
60
- current = current[segment];
61
- }
62
- return current;
63
- }
64
- function countTracesByType(traces, types) {
65
- const allowedTypes = types ? new Set(types) : null;
66
- const counts = {};
67
- for (const trace of traces) {
68
- if (allowedTypes && !allowedTypes.has(trace.type)) {
69
- continue;
70
- }
71
- counts[trace.type] = (counts[trace.type] ?? 0) + 1;
72
- }
73
- return counts;
74
- }
75
- function findLastTrace(traces, filter) {
76
- for (let index = traces.length - 1; index >= 0; index -= 1) {
77
- const trace = traces[index];
78
- if (trace && matchesTrace(trace, filter)) {
79
- return trace;
80
- }
81
- }
82
- return null;
83
- }
84
- function includesTraceSequence(traces, filters) {
85
- let filterIndex = 0;
86
- if (filters.length === 0) {
87
- return true;
88
- }
89
- for (const trace of traces) {
90
- const filter = filters[filterIndex];
91
- if (!filter || !matchesTrace(trace, filter)) {
92
- continue;
93
- }
94
- filterIndex += 1;
95
- if (filterIndex === filters.length) {
96
- return true;
97
- }
98
- }
99
- return false;
100
- }
101
- function valuesAtPathAreUnique(traces, filter, path) {
102
- const seen = /* @__PURE__ */ new Set();
103
- for (const trace of traces) {
104
- if (!matchesTrace(trace, filter)) {
105
- continue;
106
- }
107
- const value = readPath(trace, path);
108
- if (seen.has(value)) {
109
- return false;
110
- }
111
- seen.add(value);
112
- }
113
- return true;
114
- }
115
- function matchesValue(actual, expected) {
116
- if (expected instanceof RegExp) {
117
- return typeof actual === "string" && expected.test(actual);
118
- }
119
- if (typeof expected === "function") {
120
- return Boolean(expected(actual));
121
- }
122
- if (isRecord(expected)) {
123
- return isRecord(actual) && objectContains(actual, expected);
124
- }
125
- return Object.is(actual, expected);
126
- }
127
- function objectContains(actual, expected) {
128
- for (const [key, value] of Object.entries(expected)) {
129
- if (!matchesValue(actual[key], value)) {
130
- return false;
131
- }
132
- }
133
- return true;
134
- }
135
- function isRecord(value) {
136
- return typeof value === "object" && value !== null && !Array.isArray(value);
137
- }
26
+ var import_testing = require("@noego/trace/testing");
138
27
  // Annotate the CommonJS export names for ESM import in node:
139
28
  0 && (module.exports = {
140
29
  createTraceQuery,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trace-testing/trace_query.ts"],"sourcesContent":["import type { TraceEvent } from '../tracing/index.js';\n\nexport type TraceFilter =\n | ((event: TraceEvent) => boolean)\n | Record<string, unknown>;\n\nexport type TraceCountSummary = Record<string, number>;\n\nexport type TraceQuery = {\n all(): TraceEvent[];\n filter(filter: TraceFilter): TraceEvent[];\n count(filter: TraceFilter): number;\n countByType(types?: string[]): TraceCountSummary;\n payloads(filter: TraceFilter): Record<string, unknown>[];\n first(filter: TraceFilter): TraceEvent | null;\n last(filter: TraceFilter): TraceEvent | null;\n sequence(filters: TraceFilter[]): boolean;\n none(filter: TraceFilter): boolean;\n once(filter: TraceFilter): boolean;\n uniqueBy(filter: TraceFilter, path: string): boolean;\n};\n\ntype TraceSource = TraceEvent[] | (() => TraceEvent[]);\n\nexport function createTraceQuery(source: TraceSource): TraceQuery {\n const readEvents = () => Array.isArray(source) ? source.slice() : source().slice();\n return {\n all: () => readEvents(),\n filter: (filter) => readEvents().filter((event) => matchesTrace(event, filter)),\n count: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length,\n countByType: (types) => countTracesByType(readEvents(), types),\n payloads: (filter) => readEvents()\n .filter((event) => matchesTrace(event, filter))\n .map((event) => event.payload)\n .filter((payload): payload is Record<string, unknown> => isRecord(payload)),\n first: (filter) => readEvents().find((event) => matchesTrace(event, filter)) ?? null,\n last: (filter) => findLastTrace(readEvents(), filter),\n sequence: (filters) => includesTraceSequence(readEvents(), filters),\n none: (filter) => readEvents().every((event) => !matchesTrace(event, filter)),\n once: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length === 1,\n uniqueBy: (filter, path) => valuesAtPathAreUnique(readEvents(), filter, path),\n };\n}\n\nexport function matchesTrace(event: TraceEvent, filter: TraceFilter): boolean {\n if (typeof filter === 'function') {\n return filter(event);\n }\n for (const [path, expected] of Object.entries(filter)) {\n const actual = readPath(event, path);\n if (!matchesValue(actual, expected)) {\n return false;\n }\n }\n return true;\n}\n\nexport function readPath(value: unknown, path: string): unknown {\n let current = value;\n for (const segment of path.split('.')) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction countTracesByType(traces: TraceEvent[], types?: string[]): TraceCountSummary {\n const allowedTypes = types ? new Set(types) : null;\n const counts: TraceCountSummary = {};\n for (const trace of traces) {\n if (allowedTypes && !allowedTypes.has(trace.type)) {\n continue;\n }\n counts[trace.type] = (counts[trace.type] ?? 0) + 1;\n }\n return counts;\n}\n\nfunction findLastTrace(traces: TraceEvent[], filter: TraceFilter): TraceEvent | null {\n for (let index = traces.length - 1; index >= 0; index -= 1) {\n const trace = traces[index];\n if (trace && matchesTrace(trace, filter)) {\n return trace;\n }\n }\n return null;\n}\n\nfunction includesTraceSequence(traces: TraceEvent[], filters: TraceFilter[]): boolean {\n let filterIndex = 0;\n if (filters.length === 0) {\n return true;\n }\n for (const trace of traces) {\n const filter = filters[filterIndex];\n if (!filter || !matchesTrace(trace, filter)) {\n continue;\n }\n filterIndex += 1;\n if (filterIndex === filters.length) {\n return true;\n }\n }\n return false;\n}\n\nfunction valuesAtPathAreUnique(traces: TraceEvent[], filter: TraceFilter, path: string): boolean {\n const seen = new Set<unknown>();\n for (const trace of traces) {\n if (!matchesTrace(trace, filter)) {\n continue;\n }\n const value = readPath(trace, path);\n if (seen.has(value)) {\n return false;\n }\n seen.add(value);\n }\n return true;\n}\n\nfunction matchesValue(actual: unknown, expected: unknown): boolean {\n if (expected instanceof RegExp) {\n return typeof actual === 'string' && expected.test(actual);\n }\n if (typeof expected === 'function') {\n return Boolean((expected as (value: unknown) => boolean)(actual));\n }\n if (isRecord(expected)) {\n return isRecord(actual) && objectContains(actual, expected);\n }\n return Object.is(actual, expected);\n}\n\nfunction objectContains(actual: Record<string, unknown>, expected: Record<string, unknown>): boolean {\n for (const [key, value] of Object.entries(expected)) {\n if (!matchesValue(actual[key], value)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/trace-testing/trace_query.ts"],"sourcesContent":["export {\n createTraceQuery,\n matchesTrace,\n readPath,\n type TraceCountSummary,\n type TraceFilter,\n type TraceQuery,\n type TraceRecord,\n type TraceSource,\n} from '@noego/trace/testing';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBASO;","names":[]}
@@ -1,24 +1 @@
1
- import { TraceEvent } from '../tracing/trace_hub.cjs';
2
- import 'rxjs';
3
-
4
- type TraceFilter = ((event: TraceEvent) => boolean) | Record<string, unknown>;
5
- type TraceCountSummary = Record<string, number>;
6
- type TraceQuery = {
7
- all(): TraceEvent[];
8
- filter(filter: TraceFilter): TraceEvent[];
9
- count(filter: TraceFilter): number;
10
- countByType(types?: string[]): TraceCountSummary;
11
- payloads(filter: TraceFilter): Record<string, unknown>[];
12
- first(filter: TraceFilter): TraceEvent | null;
13
- last(filter: TraceFilter): TraceEvent | null;
14
- sequence(filters: TraceFilter[]): boolean;
15
- none(filter: TraceFilter): boolean;
16
- once(filter: TraceFilter): boolean;
17
- uniqueBy(filter: TraceFilter, path: string): boolean;
18
- };
19
- type TraceSource = TraceEvent[] | (() => TraceEvent[]);
20
- declare function createTraceQuery(source: TraceSource): TraceQuery;
21
- declare function matchesTrace(event: TraceEvent, filter: TraceFilter): boolean;
22
- declare function readPath(value: unknown, path: string): unknown;
23
-
24
- export { type TraceCountSummary, type TraceFilter, type TraceQuery, createTraceQuery, matchesTrace, readPath };
1
+ export { TraceCountSummary, TraceFilter, TraceQuery, TraceRecord, TraceSource, createTraceQuery, matchesTrace, readPath } from '@noego/trace/testing';
@@ -1,24 +1 @@
1
- import { TraceEvent } from '../tracing/trace_hub.js';
2
- import 'rxjs';
3
-
4
- type TraceFilter = ((event: TraceEvent) => boolean) | Record<string, unknown>;
5
- type TraceCountSummary = Record<string, number>;
6
- type TraceQuery = {
7
- all(): TraceEvent[];
8
- filter(filter: TraceFilter): TraceEvent[];
9
- count(filter: TraceFilter): number;
10
- countByType(types?: string[]): TraceCountSummary;
11
- payloads(filter: TraceFilter): Record<string, unknown>[];
12
- first(filter: TraceFilter): TraceEvent | null;
13
- last(filter: TraceFilter): TraceEvent | null;
14
- sequence(filters: TraceFilter[]): boolean;
15
- none(filter: TraceFilter): boolean;
16
- once(filter: TraceFilter): boolean;
17
- uniqueBy(filter: TraceFilter, path: string): boolean;
18
- };
19
- type TraceSource = TraceEvent[] | (() => TraceEvent[]);
20
- declare function createTraceQuery(source: TraceSource): TraceQuery;
21
- declare function matchesTrace(event: TraceEvent, filter: TraceFilter): boolean;
22
- declare function readPath(value: unknown, path: string): unknown;
23
-
24
- export { type TraceCountSummary, type TraceFilter, type TraceQuery, createTraceQuery, matchesTrace, readPath };
1
+ export { TraceCountSummary, TraceFilter, TraceQuery, TraceRecord, TraceSource, createTraceQuery, matchesTrace, readPath } from '@noego/trace/testing';
@@ -1,115 +1,8 @@
1
- function createTraceQuery(source) {
2
- const readEvents = () => Array.isArray(source) ? source.slice() : source().slice();
3
- return {
4
- all: () => readEvents(),
5
- filter: (filter) => readEvents().filter((event) => matchesTrace(event, filter)),
6
- count: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length,
7
- countByType: (types) => countTracesByType(readEvents(), types),
8
- payloads: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).map((event) => event.payload).filter((payload) => isRecord(payload)),
9
- first: (filter) => readEvents().find((event) => matchesTrace(event, filter)) ?? null,
10
- last: (filter) => findLastTrace(readEvents(), filter),
11
- sequence: (filters) => includesTraceSequence(readEvents(), filters),
12
- none: (filter) => readEvents().every((event) => !matchesTrace(event, filter)),
13
- once: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length === 1,
14
- uniqueBy: (filter, path) => valuesAtPathAreUnique(readEvents(), filter, path)
15
- };
16
- }
17
- function matchesTrace(event, filter) {
18
- if (typeof filter === "function") {
19
- return filter(event);
20
- }
21
- for (const [path, expected] of Object.entries(filter)) {
22
- const actual = readPath(event, path);
23
- if (!matchesValue(actual, expected)) {
24
- return false;
25
- }
26
- }
27
- return true;
28
- }
29
- function readPath(value, path) {
30
- let current = value;
31
- for (const segment of path.split(".")) {
32
- if (!isRecord(current)) {
33
- return void 0;
34
- }
35
- current = current[segment];
36
- }
37
- return current;
38
- }
39
- function countTracesByType(traces, types) {
40
- const allowedTypes = types ? new Set(types) : null;
41
- const counts = {};
42
- for (const trace of traces) {
43
- if (allowedTypes && !allowedTypes.has(trace.type)) {
44
- continue;
45
- }
46
- counts[trace.type] = (counts[trace.type] ?? 0) + 1;
47
- }
48
- return counts;
49
- }
50
- function findLastTrace(traces, filter) {
51
- for (let index = traces.length - 1; index >= 0; index -= 1) {
52
- const trace = traces[index];
53
- if (trace && matchesTrace(trace, filter)) {
54
- return trace;
55
- }
56
- }
57
- return null;
58
- }
59
- function includesTraceSequence(traces, filters) {
60
- let filterIndex = 0;
61
- if (filters.length === 0) {
62
- return true;
63
- }
64
- for (const trace of traces) {
65
- const filter = filters[filterIndex];
66
- if (!filter || !matchesTrace(trace, filter)) {
67
- continue;
68
- }
69
- filterIndex += 1;
70
- if (filterIndex === filters.length) {
71
- return true;
72
- }
73
- }
74
- return false;
75
- }
76
- function valuesAtPathAreUnique(traces, filter, path) {
77
- const seen = /* @__PURE__ */ new Set();
78
- for (const trace of traces) {
79
- if (!matchesTrace(trace, filter)) {
80
- continue;
81
- }
82
- const value = readPath(trace, path);
83
- if (seen.has(value)) {
84
- return false;
85
- }
86
- seen.add(value);
87
- }
88
- return true;
89
- }
90
- function matchesValue(actual, expected) {
91
- if (expected instanceof RegExp) {
92
- return typeof actual === "string" && expected.test(actual);
93
- }
94
- if (typeof expected === "function") {
95
- return Boolean(expected(actual));
96
- }
97
- if (isRecord(expected)) {
98
- return isRecord(actual) && objectContains(actual, expected);
99
- }
100
- return Object.is(actual, expected);
101
- }
102
- function objectContains(actual, expected) {
103
- for (const [key, value] of Object.entries(expected)) {
104
- if (!matchesValue(actual[key], value)) {
105
- return false;
106
- }
107
- }
108
- return true;
109
- }
110
- function isRecord(value) {
111
- return typeof value === "object" && value !== null && !Array.isArray(value);
112
- }
1
+ import {
2
+ createTraceQuery,
3
+ matchesTrace,
4
+ readPath
5
+ } from "@noego/trace/testing";
113
6
  export {
114
7
  createTraceQuery,
115
8
  matchesTrace,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/trace-testing/trace_query.ts"],"sourcesContent":["import type { TraceEvent } from '../tracing/index.js';\n\nexport type TraceFilter =\n | ((event: TraceEvent) => boolean)\n | Record<string, unknown>;\n\nexport type TraceCountSummary = Record<string, number>;\n\nexport type TraceQuery = {\n all(): TraceEvent[];\n filter(filter: TraceFilter): TraceEvent[];\n count(filter: TraceFilter): number;\n countByType(types?: string[]): TraceCountSummary;\n payloads(filter: TraceFilter): Record<string, unknown>[];\n first(filter: TraceFilter): TraceEvent | null;\n last(filter: TraceFilter): TraceEvent | null;\n sequence(filters: TraceFilter[]): boolean;\n none(filter: TraceFilter): boolean;\n once(filter: TraceFilter): boolean;\n uniqueBy(filter: TraceFilter, path: string): boolean;\n};\n\ntype TraceSource = TraceEvent[] | (() => TraceEvent[]);\n\nexport function createTraceQuery(source: TraceSource): TraceQuery {\n const readEvents = () => Array.isArray(source) ? source.slice() : source().slice();\n return {\n all: () => readEvents(),\n filter: (filter) => readEvents().filter((event) => matchesTrace(event, filter)),\n count: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length,\n countByType: (types) => countTracesByType(readEvents(), types),\n payloads: (filter) => readEvents()\n .filter((event) => matchesTrace(event, filter))\n .map((event) => event.payload)\n .filter((payload): payload is Record<string, unknown> => isRecord(payload)),\n first: (filter) => readEvents().find((event) => matchesTrace(event, filter)) ?? null,\n last: (filter) => findLastTrace(readEvents(), filter),\n sequence: (filters) => includesTraceSequence(readEvents(), filters),\n none: (filter) => readEvents().every((event) => !matchesTrace(event, filter)),\n once: (filter) => readEvents().filter((event) => matchesTrace(event, filter)).length === 1,\n uniqueBy: (filter, path) => valuesAtPathAreUnique(readEvents(), filter, path),\n };\n}\n\nexport function matchesTrace(event: TraceEvent, filter: TraceFilter): boolean {\n if (typeof filter === 'function') {\n return filter(event);\n }\n for (const [path, expected] of Object.entries(filter)) {\n const actual = readPath(event, path);\n if (!matchesValue(actual, expected)) {\n return false;\n }\n }\n return true;\n}\n\nexport function readPath(value: unknown, path: string): unknown {\n let current = value;\n for (const segment of path.split('.')) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction countTracesByType(traces: TraceEvent[], types?: string[]): TraceCountSummary {\n const allowedTypes = types ? new Set(types) : null;\n const counts: TraceCountSummary = {};\n for (const trace of traces) {\n if (allowedTypes && !allowedTypes.has(trace.type)) {\n continue;\n }\n counts[trace.type] = (counts[trace.type] ?? 0) + 1;\n }\n return counts;\n}\n\nfunction findLastTrace(traces: TraceEvent[], filter: TraceFilter): TraceEvent | null {\n for (let index = traces.length - 1; index >= 0; index -= 1) {\n const trace = traces[index];\n if (trace && matchesTrace(trace, filter)) {\n return trace;\n }\n }\n return null;\n}\n\nfunction includesTraceSequence(traces: TraceEvent[], filters: TraceFilter[]): boolean {\n let filterIndex = 0;\n if (filters.length === 0) {\n return true;\n }\n for (const trace of traces) {\n const filter = filters[filterIndex];\n if (!filter || !matchesTrace(trace, filter)) {\n continue;\n }\n filterIndex += 1;\n if (filterIndex === filters.length) {\n return true;\n }\n }\n return false;\n}\n\nfunction valuesAtPathAreUnique(traces: TraceEvent[], filter: TraceFilter, path: string): boolean {\n const seen = new Set<unknown>();\n for (const trace of traces) {\n if (!matchesTrace(trace, filter)) {\n continue;\n }\n const value = readPath(trace, path);\n if (seen.has(value)) {\n return false;\n }\n seen.add(value);\n }\n return true;\n}\n\nfunction matchesValue(actual: unknown, expected: unknown): boolean {\n if (expected instanceof RegExp) {\n return typeof actual === 'string' && expected.test(actual);\n }\n if (typeof expected === 'function') {\n return Boolean((expected as (value: unknown) => boolean)(actual));\n }\n if (isRecord(expected)) {\n return isRecord(actual) && objectContains(actual, expected);\n }\n return Object.is(actual, expected);\n}\n\nfunction objectContains(actual: Record<string, unknown>, expected: Record<string, unknown>): boolean {\n for (const [key, value] of Object.entries(expected)) {\n if (!matchesValue(actual[key], value)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/trace-testing/trace_query.ts"],"sourcesContent":["export {\n createTraceQuery,\n matchesTrace,\n readPath,\n type TraceCountSummary,\n type TraceFilter,\n type TraceQuery,\n type TraceRecord,\n type TraceSource,\n} from '@noego/trace/testing';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAMK;","names":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var __decorateClass = (decorators, target, key, kind) => {
20
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
21
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
22
+ if (decorator = decorators[i])
23
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
24
+ if (kind && result) __defProp(target, key, result);
25
+ return result;
26
+ };
27
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
28
+ var trace_recorder_exports = {};
29
+ __export(trace_recorder_exports, {
30
+ TraceRecorder: () => TraceRecorder
31
+ });
32
+ module.exports = __toCommonJS(trace_recorder_exports);
33
+ var import_ioc = require("@noego/ioc");
34
+ var import_testing = require("@noego/trace/testing");
35
+ var import_tracing = require("../tracing/index.js");
36
+ var import_trace_hub = require("../tracing/trace_hub.js");
37
+ let TraceRecorder = class extends import_testing.TraceRecorder {
38
+ constructor(traceProvider) {
39
+ super(traceProvider ?? (0, import_trace_hub.getTraceEvents$)());
40
+ }
41
+ };
42
+ TraceRecorder = __decorateClass([
43
+ (0, import_ioc.Component)({ scope: import_ioc.LoadAs.Singleton }),
44
+ __decorateParam(0, (0, import_ioc.Inject)(import_tracing.TraceProvider))
45
+ ], TraceRecorder);
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {
48
+ TraceRecorder
49
+ });
50
+ //# sourceMappingURL=trace_recorder.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/trace-testing/trace_recorder.ts"],"sourcesContent":["import { Component, Inject, LoadAs } from '@noego/ioc';\nimport {\n TraceRecorder as BaseTraceRecorder,\n type TraceObservableSource,\n type TraceRecorderEnableOptions,\n type TraceRecorderSource,\n type TraceWaitOptions,\n} from '@noego/trace/testing';\nimport {\n TraceProvider,\n type FrameworkTracer,\n type TraceEvent,\n} from '../tracing/index.js';\nimport { getTraceEvents$ } from '../tracing/trace_hub.js';\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceRecorder extends BaseTraceRecorder<TraceEvent> {\n constructor(\n @Inject(TraceProvider) traceProvider?: FrameworkTracer,\n ) {\n super(traceProvider ?? getTraceEvents$());\n }\n}\n\nexport type {\n TraceObservableSource,\n TraceRecorderEnableOptions,\n TraceRecorderSource,\n TraceWaitOptions,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA0C;AAC1C,qBAMO;AACP,qBAIO;AACP,uBAAgC;AAGzB,IAAM,gBAAN,cAA4B,eAAAA,cAA8B;AAAA,EAC/D,YACyB,eACvB;AACA,UAAM,qBAAiB,kCAAgB,CAAC;AAAA,EAC1C;AACF;AANa,gBAAN;AAAA,MADN,sBAAU,EAAE,OAAO,kBAAO,UAAU,CAAC;AAAA,EAGjC,0CAAO,4BAAa;AAAA,GAFZ;","names":["BaseTraceRecorder"]}