@creative-introvert/tons-of-tests 2.0.0 → 3.0.0-rc.0

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 (120) hide show
  1. package/README.md +263 -134
  2. package/dist/cjs/Classify.js +6 -2
  3. package/dist/cjs/Classify.js.map +1 -1
  4. package/dist/cjs/RepositoryError.js +24 -33
  5. package/dist/cjs/RepositoryError.js.map +1 -1
  6. package/dist/cjs/Show.js +18 -0
  7. package/dist/cjs/Show.js.map +1 -1
  8. package/dist/cjs/Test.js +41 -2
  9. package/dist/cjs/Test.js.map +1 -1
  10. package/dist/cjs/Test.repository.js +8 -17
  11. package/dist/cjs/Test.repository.js.map +1 -1
  12. package/dist/cjs/TestRun.js +20 -0
  13. package/dist/cjs/TestRun.js.map +1 -0
  14. package/dist/cjs/TestValueError.js +23 -0
  15. package/dist/cjs/TestValueError.js.map +1 -0
  16. package/dist/cjs/index.js +0 -7
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/internal/Classify.js +1 -9
  19. package/dist/cjs/internal/Classify.js.map +1 -1
  20. package/dist/cjs/internal/Test.js +305 -109
  21. package/dist/cjs/internal/Test.js.map +1 -1
  22. package/dist/cjs/internal/Test.repository.sqlite.js +266 -304
  23. package/dist/cjs/internal/Test.repository.sqlite.js.map +1 -1
  24. package/dist/cjs/internal/Test.serialization.js +128 -0
  25. package/dist/cjs/internal/Test.serialization.js.map +1 -0
  26. package/dist/cjs/internal/common.js.map +1 -1
  27. package/dist/cjs/internal/stats.js +37 -3
  28. package/dist/cjs/internal/stats.js.map +1 -1
  29. package/dist/cjs/internal/summarize.js +155 -36
  30. package/dist/cjs/internal/summarize.js.map +1 -1
  31. package/dist/cjs/internal/test-repository-fixtures.js +31 -0
  32. package/dist/cjs/internal/test-repository-fixtures.js.map +1 -0
  33. package/dist/cjs/internal/test-repository-migrations.js +68 -0
  34. package/dist/cjs/internal/test-repository-migrations.js.map +1 -0
  35. package/dist/cjs/internal/test-result-stats.js +89 -0
  36. package/dist/cjs/internal/test-result-stats.js.map +1 -0
  37. package/dist/dts/Classify.d.ts +4 -1
  38. package/dist/dts/Classify.d.ts.map +1 -1
  39. package/dist/dts/RepositoryError.d.ts +19 -20
  40. package/dist/dts/RepositoryError.d.ts.map +1 -1
  41. package/dist/dts/Show.d.ts +8 -8
  42. package/dist/dts/Show.d.ts.map +1 -1
  43. package/dist/dts/Test.d.ts +155 -11
  44. package/dist/dts/Test.d.ts.map +1 -1
  45. package/dist/dts/Test.repository.d.ts +94 -8
  46. package/dist/dts/Test.repository.d.ts.map +1 -1
  47. package/dist/dts/TestRun.d.ts +18 -0
  48. package/dist/dts/TestRun.d.ts.map +1 -0
  49. package/dist/dts/TestValueError.d.ts +17 -0
  50. package/dist/dts/TestValueError.d.ts.map +1 -0
  51. package/dist/dts/index.d.ts +0 -1
  52. package/dist/dts/index.d.ts.map +1 -1
  53. package/dist/dts/internal/Classify.d.ts +0 -1
  54. package/dist/dts/internal/Classify.d.ts.map +1 -1
  55. package/dist/dts/internal/Test.d.ts +58 -31
  56. package/dist/dts/internal/Test.d.ts.map +1 -1
  57. package/dist/dts/internal/Test.repository.sqlite.d.ts +66 -11
  58. package/dist/dts/internal/Test.repository.sqlite.d.ts.map +1 -1
  59. package/dist/dts/internal/Test.serialization.d.ts +34 -0
  60. package/dist/dts/internal/Test.serialization.d.ts.map +1 -0
  61. package/dist/dts/internal/common.d.ts +1 -1
  62. package/dist/dts/internal/common.d.ts.map +1 -1
  63. package/dist/dts/internal/stats.d.ts +15 -1
  64. package/dist/dts/internal/stats.d.ts.map +1 -1
  65. package/dist/dts/internal/summarize.d.ts +39 -7
  66. package/dist/dts/internal/summarize.d.ts.map +1 -1
  67. package/dist/dts/internal/test-repository-fixtures.d.ts +22 -0
  68. package/dist/dts/internal/test-repository-fixtures.d.ts.map +1 -0
  69. package/dist/dts/internal/test-repository-migrations.d.ts +11 -0
  70. package/dist/dts/internal/test-repository-migrations.d.ts.map +1 -0
  71. package/dist/dts/internal/test-result-stats.d.ts +7 -0
  72. package/dist/dts/internal/test-result-stats.d.ts.map +1 -0
  73. package/dist/esm/Classify.js +5 -1
  74. package/dist/esm/Classify.js.map +1 -1
  75. package/dist/esm/RepositoryError.js +14 -29
  76. package/dist/esm/RepositoryError.js.map +1 -1
  77. package/dist/esm/Show.js +2 -2
  78. package/dist/esm/Show.js.map +1 -1
  79. package/dist/esm/Test.js +38 -1
  80. package/dist/esm/Test.js.map +1 -1
  81. package/dist/esm/Test.repository.js +7 -16
  82. package/dist/esm/Test.repository.js.map +1 -1
  83. package/dist/esm/TestRun.js +13 -0
  84. package/dist/esm/TestRun.js.map +1 -0
  85. package/dist/esm/TestValueError.js +16 -0
  86. package/dist/esm/TestValueError.js.map +1 -0
  87. package/dist/esm/index.js +0 -1
  88. package/dist/esm/index.js.map +1 -1
  89. package/dist/esm/internal/Classify.js +0 -7
  90. package/dist/esm/internal/Classify.js.map +1 -1
  91. package/dist/esm/internal/Test.js +299 -108
  92. package/dist/esm/internal/Test.js.map +1 -1
  93. package/dist/esm/internal/Test.repository.sqlite.js +265 -301
  94. package/dist/esm/internal/Test.repository.sqlite.js.map +1 -1
  95. package/dist/esm/internal/Test.serialization.js +119 -0
  96. package/dist/esm/internal/Test.serialization.js.map +1 -0
  97. package/dist/esm/internal/common.js.map +1 -1
  98. package/dist/esm/internal/stats.js +35 -2
  99. package/dist/esm/internal/stats.js.map +1 -1
  100. package/dist/esm/internal/summarize.js +155 -35
  101. package/dist/esm/internal/summarize.js.map +1 -1
  102. package/dist/esm/internal/test-repository-fixtures.js +25 -0
  103. package/dist/esm/internal/test-repository-fixtures.js.map +1 -0
  104. package/dist/esm/internal/test-repository-migrations.js +62 -0
  105. package/dist/esm/internal/test-repository-migrations.js.map +1 -0
  106. package/dist/esm/internal/test-result-stats.js +83 -0
  107. package/dist/esm/internal/test-result-stats.js.map +1 -0
  108. package/package.json +1 -1
  109. package/dist/cjs/Test.repository.types.js +0 -14
  110. package/dist/cjs/Test.repository.types.js.map +0 -1
  111. package/dist/cjs/internal/lib/Schema.js +0 -14
  112. package/dist/cjs/internal/lib/Schema.js.map +0 -1
  113. package/dist/dts/Test.repository.types.d.ts +0 -56
  114. package/dist/dts/Test.repository.types.d.ts.map +0 -1
  115. package/dist/dts/internal/lib/Schema.d.ts +0 -4
  116. package/dist/dts/internal/lib/Schema.d.ts.map +0 -1
  117. package/dist/esm/Test.repository.types.js +0 -7
  118. package/dist/esm/Test.repository.types.js.map +0 -1
  119. package/dist/esm/internal/lib/Schema.js +0 -7
  120. package/dist/esm/internal/lib/Schema.js.map +0 -1
@@ -3,55 +3,26 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.test = exports.runCollectRecord = exports.makeSha256 = exports.diff = exports.all = exports.TestResultSchema = void 0;
6
+ exports.all = all;
7
+ exports.runCollectRecord = exports.resultKey = exports.makeSha256 = exports.filterResults = exports.diff = exports.compareRuns = void 0;
8
+ exports.selectVariant = selectVariant;
9
+ exports.test = exports.summarizeRun = void 0;
7
10
  var _nodeCrypto = /*#__PURE__*/require("node:crypto");
8
11
  var _effect = /*#__PURE__*/require("effect");
9
12
  var _Classify = /*#__PURE__*/require("../Classify.js");
13
+ var _Test = /*#__PURE__*/require("../Test.js");
14
+ var _TestRepository = /*#__PURE__*/require("../Test.repository.js");
15
+ var _RepositoryError = /*#__PURE__*/require("../RepositoryError.js");
16
+ var _TestSerialization = /*#__PURE__*/require("./Test.serialization.js");
10
17
  var _Classify2 = /*#__PURE__*/require("./Classify.js");
11
- const makeSha256 = input => {
12
- // This public synchronous helper keeps result IDs stable across releases.
13
- return (0, _nodeCrypto.createHash)('sha256').update(JSON.stringify(input)).digest('hex');
14
- };
18
+ /** Hash already encoded JSON. Object key order does not affect identity. */
19
+ const makeSha256 = input => (0, _nodeCrypto.createHash)('sha256').update((0, _TestSerialization.stringifyJson)(input)).digest('hex');
15
20
  exports.makeSha256 = makeSha256;
16
- const TestResult = {
17
- make: args => {
18
- const {
19
- label,
20
- input,
21
- result,
22
- expected
23
- } = args;
24
- // Without `ordering`, in case the user decides to re-order test cases,
25
- // which shouldn't change the identity of the test result.
26
- // Without `tags`, as those are just for filtering.
27
- const id = makeSha256({
28
- label,
29
- input,
30
- result,
31
- expected
32
- });
33
- const hashTestCase = makeSha256({
34
- input,
35
- expected
36
- });
37
- return {
38
- ...args,
39
- id,
40
- hashTestCase
41
- };
42
- }
43
- };
44
- const TestResultSchema = exports.TestResultSchema = /*#__PURE__*/_effect.Schema.Struct({
45
- id: _effect.Schema.String,
46
- hashTestCase: _effect.Schema.String,
47
- ordering: _effect.Schema.Int,
48
- input: _effect.Schema.Unknown,
49
- result: _effect.Schema.Unknown,
50
- expected: _effect.Schema.Unknown,
51
- label: _Classify2.LabelSchema,
52
- tags: /*#__PURE__*/_effect.Schema.Array(_effect.Schema.String),
53
- timeMillis: _effect.Schema.Finite
54
- });
21
+ const resultKey = ({
22
+ hashTestCase,
23
+ key
24
+ }) => JSON.stringify([hashTestCase, key]);
25
+ exports.resultKey = resultKey;
55
26
  const test = exports.test = /*#__PURE__*/_effect.Effect.fnUntraced(function* ({
56
27
  testCase: {
57
28
  input,
@@ -59,86 +30,231 @@ const test = exports.test = /*#__PURE__*/_effect.Effect.fnUntraced(function* ({
59
30
  tags,
60
31
  ordering
61
32
  },
33
+ hashTestCase,
62
34
  program,
63
- classify
35
+ evaluate,
36
+ encodeResult
64
37
  }) {
65
38
  const t0 = yield* _effect.Clock.currentTimeNanos;
66
39
  const result = yield* program(input);
67
40
  const t1 = yield* _effect.Clock.currentTimeNanos;
68
- return TestResult.make({
69
- ordering,
70
- input,
71
- result,
72
- expected,
73
- tags: tags ?? [],
74
- label: classify(result, expected),
75
- timeMillis: Number(t1 - t0) / 1_000_000
76
- });
41
+ const evaluations = evaluate(result, expected);
42
+ if (evaluations.length === 0) {
43
+ return yield* _effect.Effect.die(new Error('evaluate must return at least one result'));
44
+ }
45
+ const keys = new Set();
46
+ for (const {
47
+ key
48
+ } of evaluations) {
49
+ if (key.length === 0 || keys.has(key)) {
50
+ return yield* _effect.Effect.die(new Error('evaluate must return non-empty keys that are unique within each test case'));
51
+ }
52
+ keys.add(key);
53
+ }
54
+ return yield* _effect.Effect.forEach(evaluations, (evaluation, resultOrdering) => _effect.Effect.gen(function* () {
55
+ const args = {
56
+ ...evaluation,
57
+ hashTestCase,
58
+ ordering,
59
+ resultOrdering,
60
+ input,
61
+ tags: tags ?? [],
62
+ timeMillis: Number(t1 - t0) / 1_000_000
63
+ };
64
+ const encoded = yield* encodeResult(args);
65
+ // Ordering, tags, and timing do not change result identity.
66
+ return {
67
+ ...args,
68
+ id: makeSha256({
69
+ hashTestCase,
70
+ key: evaluation.key,
71
+ label: evaluation.label,
72
+ input: encoded.input,
73
+ result: encoded.result,
74
+ expected: encoded.expected
75
+ })
76
+ };
77
+ }));
77
78
  });
78
- const all = ({
79
- testCases,
80
- program,
81
- classify = (0, _Classify2.makeClassify)({
82
- isEqual: _Classify2.defaultIsEqual
83
- })
84
- }, {
85
- concurrency
86
- } = {
87
- concurrency: 1
79
+ function selectVariant(suite, variant) {
80
+ const suiteName = suite.name;
81
+ return _effect.Effect.suspend(() => {
82
+ if (Object.hasOwn(suite, 'program') === Object.hasOwn(suite, 'variants')) {
83
+ return _effect.Effect.die(new Error(`${suite.name}: define exactly one of program and variants`));
84
+ }
85
+ if (suite.program !== undefined) {
86
+ if (typeof suite.program !== 'function') {
87
+ return _effect.Effect.die(new Error(`${suiteName}: program must be a function`));
88
+ }
89
+ return variant === undefined || variant === 'default' ? _effect.Effect.succeed({
90
+ name: 'default',
91
+ program: suite.program
92
+ }) : _effect.Effect.fail(new _Test.TestVariantNotFound({
93
+ testSuiteName: suite.name,
94
+ variant
95
+ }));
96
+ }
97
+ if (suite.variants === undefined || suite.variants === null || typeof suite.variants !== 'object' || Array.isArray(suite.variants)) {
98
+ return _effect.Effect.die(new Error(`${suite.name}: variants must be a map of programs`));
99
+ }
100
+ for (const [name, definition] of Object.entries(suite.variants)) {
101
+ if (name.length === 0 || name.includes(',') || name.startsWith('run:')) {
102
+ return _effect.Effect.die(new Error(`${suite.name}: invalid variant ID ${JSON.stringify(name)}`));
103
+ }
104
+ if (definition === null || typeof definition !== 'object' || typeof definition.program !== 'function') {
105
+ return _effect.Effect.die(new Error(`${suite.name}: variant ${JSON.stringify(name)} must define a program`));
106
+ }
107
+ }
108
+ if (variant === undefined) {
109
+ return _effect.Effect.fail(new _Test.TestVariantRequired({
110
+ testSuiteName: suite.name
111
+ }));
112
+ }
113
+ return Object.hasOwn(suite.variants, variant) ? _effect.Effect.succeed({
114
+ name: variant,
115
+ program: suite.variants[variant].program
116
+ }) : _effect.Effect.fail(new _Test.TestVariantNotFound({
117
+ testSuiteName: suite.name,
118
+ variant
119
+ }));
120
+ });
121
+ }
122
+ function all(suite, options = {}) {
123
+ return executeAll(suite, options);
124
+ }
125
+ const executeAll = (suite, {
126
+ variant,
127
+ concurrency = 1
88
128
  }) => {
129
+ if (suite.evaluate === undefined) {
130
+ if (!Object.is(suite.schemas.evaluation.result, suite.schemas.evaluation.expected)) {
131
+ return _effect.Stream.die(new Error(`${suite.name}: without evaluate, evaluation.result and evaluation.expected must reuse the same schema`));
132
+ }
133
+ const classify = (0, _Classify2.makeClassify)({
134
+ isEqual: _effect.Schema.toEquivalence(_effect.Schema.Union([suite.schemas.evaluation.result, suite.schemas.evaluation.expected]))
135
+ });
136
+ return executeAll({
137
+ ...suite,
138
+ evaluate: (result, expected) => [{
139
+ key: 'result',
140
+ result,
141
+ expected,
142
+ label: classify(result, expected)
143
+ }]
144
+ }, {
145
+ variant,
146
+ concurrency
147
+ });
148
+ }
149
+ const {
150
+ testCases,
151
+ evaluate,
152
+ schemas
153
+ } = suite;
154
+ const inputCodec = (0, _TestSerialization.makeValueCodec)(schemas.testCase.input);
155
+ const expectedCodec = (0, _TestSerialization.makeValueCodec)(schemas.testCase.expected);
156
+ const {
157
+ encode: encodeResult
158
+ } = (0, _TestSerialization.makeResultCodec)(schemas, suite.name);
89
159
  const total = _effect.Stream.isStream(testCases) ? undefined : testCases.length;
90
160
  const testCases$ = _effect.Stream.isStream(testCases) ? testCases : _effect.Stream.fromIterable(testCases);
91
- return (0, _effect.pipe)(testCases$, _effect.Stream.zipWithIndex, _effect.Stream.map(([testCase, ordering]) => ({
92
- ...testCase,
93
- ordering
94
- })), _effect.Stream.mapEffect(testCase => test({
95
- testCase,
96
- program,
97
- classify
98
- }), {
99
- concurrency,
100
- unordered: false
101
- }), _effect.Stream.tap(testResult => {
102
- const i = testResult.ordering + 1;
103
- const stride = total === undefined ? 10 : Math.max(Math.floor(total * 0.05), 10);
104
- const isMilestone = i === 1 || i % stride === 0 || total !== undefined && i === total;
105
- if (!isMilestone) return _effect.Effect.void;
106
- return _effect.Effect.logDebug(total === undefined ? `progress ${i}` : `progress ${i}/${total}`);
161
+ return _effect.Stream.unwrap(_effect.Effect.map(selectVariant(suite, variant), ({
162
+ program
163
+ }) => {
164
+ const seen = new Set();
165
+ return (0, _effect.pipe)(testCases$, _effect.Stream.zipWithIndex, _effect.Stream.mapEffect(_effect.Effect.fnUntraced(function* ([testCase, ordering]) {
166
+ const context = {
167
+ suite: suite.name,
168
+ caseNumber: ordering + 1
169
+ };
170
+ const input = yield* inputCodec.encode(testCase.input, {
171
+ ...context,
172
+ field: 'testCase.input'
173
+ });
174
+ const expected = yield* expectedCodec.encode(testCase.expected, {
175
+ ...context,
176
+ field: 'testCase.expected'
177
+ });
178
+ return {
179
+ testCase: {
180
+ ...testCase,
181
+ ordering
182
+ },
183
+ hashTestCase: makeSha256({
184
+ input,
185
+ expected
186
+ })
187
+ };
188
+ })), _effect.Stream.filterEffect(({
189
+ testCase,
190
+ hashTestCase
191
+ }) => {
192
+ if (seen.has(hashTestCase)) {
193
+ return _effect.Effect.logWarning('Skipping duplicate test case.', {
194
+ suite: suite.name,
195
+ hashTestCase,
196
+ caseNumber: testCase.ordering + 1
197
+ }).pipe(_effect.Effect.as(false));
198
+ }
199
+ seen.add(hashTestCase);
200
+ return _effect.Effect.succeed(true);
201
+ }), _effect.Stream.mapEffect(({
202
+ testCase,
203
+ hashTestCase
204
+ }) => test({
205
+ testCase,
206
+ hashTestCase,
207
+ program,
208
+ evaluate,
209
+ encodeResult
210
+ }), {
211
+ concurrency,
212
+ unordered: false
213
+ }), _effect.Stream.tap(testResults => {
214
+ const i = testResults[0].ordering + 1;
215
+ const stride = total === undefined ? 10 : Math.max(Math.floor(total * 0.05), 10);
216
+ const isMilestone = i === 1 || i % stride === 0 || total !== undefined && i === total;
217
+ if (!isMilestone) return _effect.Effect.void;
218
+ return _effect.Effect.logDebug(total === undefined ? `progress ${i}` : `progress ${i}/${total}`);
219
+ }), _effect.Stream.flattenIterable);
107
220
  }));
108
221
  };
109
- exports.all = all;
110
222
  const emptyAcc = () => ({
111
- testResultsByTestCaseHash: {},
112
- testCaseHashes: [],
113
- times: [],
223
+ testResultsByKey: {},
224
+ testResultKeys: [],
225
+ timesByTestCaseHash: new Map(),
114
226
  TP: 0,
115
227
  TN: 0,
116
228
  FP: 0,
117
- FN: 0,
118
- timeSum: 0,
119
- timeMin: Number.POSITIVE_INFINITY,
120
- timeMax: Number.NEGATIVE_INFINITY
229
+ FN: 0
121
230
  });
122
- const runCollectRecord = testRun => testResults$ => testResults$.pipe(_effect.Stream.run(
123
- // Each run owns its accumulator, so updates can happen in place.
124
- _effect.Sink.reduce(emptyAcc, (acc, r) => {
125
- acc.testResultsByTestCaseHash[r.hashTestCase] = r;
126
- acc.testCaseHashes.push(r.hashTestCase);
127
- acc.times.push(r.timeMillis);
128
- acc.timeSum += r.timeMillis;
129
- if (r.timeMillis < acc.timeMin) acc.timeMin = r.timeMillis;
130
- if (r.timeMillis > acc.timeMax) acc.timeMax = r.timeMillis;
231
+ const appendResult = (acc, r) => {
232
+ const key = resultKey(r);
233
+ acc.testResultsByKey[key] = r;
234
+ acc.testResultKeys.push(key);
235
+ if (!acc.timesByTestCaseHash.has(r.hashTestCase)) {
236
+ acc.timesByTestCaseHash.set(r.hashTestCase, r.timeMillis);
237
+ }
131
238
  if (r.label === 'TP') acc.TP++;else if (r.label === 'TN') acc.TN++;else if (r.label === 'FP') acc.FP++;else acc.FN++;
132
239
  return acc;
133
- })), _effect.Effect.map(acc => {
134
- const total = acc.testCaseHashes.length;
135
- const hasTimes = acc.times.length > 0;
240
+ };
241
+ const finish = (testRun, acc) => {
242
+ const times = [...acc.timesByTestCaseHash.values()];
243
+ let timeSum = 0;
244
+ let timeMin = Number.POSITIVE_INFINITY;
245
+ let timeMax = Number.NEGATIVE_INFINITY;
246
+ for (const time of times) {
247
+ timeSum += time;
248
+ if (time < timeMin) timeMin = time;
249
+ if (time > timeMax) timeMax = time;
250
+ }
136
251
  const stats = new _Classify.Stats({
137
252
  TP: acc.TP,
138
253
  TN: acc.TN,
139
254
  FP: acc.FP,
140
255
  FN: acc.FN,
141
- total,
256
+ total: acc.testResultKeys.length,
257
+ testCases: acc.timesByTestCaseHash.size,
142
258
  precision: (0, _Classify2.precision)({
143
259
  TP: acc.TP,
144
260
  FP: acc.FP
@@ -147,21 +263,33 @@ _effect.Sink.reduce(emptyAcc, (acc, r) => {
147
263
  TP: acc.TP,
148
264
  FN: acc.FN
149
265
  }),
150
- timeMean: hasTimes ? _effect.Option.some(acc.timeSum / acc.times.length) : _effect.Option.none(),
151
- timeMin: hasTimes ? _effect.Option.some(acc.timeMin) : _effect.Option.none(),
152
- timeMax: hasTimes ? _effect.Option.some(acc.timeMax) : _effect.Option.none(),
153
- timeMedian: (0, _Classify2.median)(acc.times)
266
+ timeMean: times.length > 0 ? _effect.Option.some(timeSum / times.length) : _effect.Option.none(),
267
+ timeMin: times.length > 0 ? _effect.Option.some(timeMin) : _effect.Option.none(),
268
+ timeMax: times.length > 0 ? _effect.Option.some(timeMax) : _effect.Option.none(),
269
+ timeMedian: (0, _Classify2.median)(times)
154
270
  });
155
271
  return {
156
272
  id: testRun.id,
157
273
  name: testRun.name,
158
- hash: testRun.hash,
159
- testResultsByTestCaseHash: acc.testResultsByTestCaseHash,
160
- testCaseHashes: acc.testCaseHashes,
274
+ variant: testRun.variant,
275
+ state: testRun.state,
276
+ testResultsByKey: acc.testResultsByKey,
277
+ testResultKeys: acc.testResultKeys,
278
+ testCaseHashes: [...acc.timesByTestCaseHash.keys()],
161
279
  stats
162
280
  };
163
- }));
281
+ };
282
+ const runCollectRecord = testRun => testResults$ => testResults$.pipe(_effect.Stream.run(_effect.Sink.reduce(emptyAcc, appendResult)), _effect.Effect.map(acc => finish(testRun, acc)));
164
283
  exports.runCollectRecord = runCollectRecord;
284
+ const filterResults = (testRun, predicate) => {
285
+ const acc = emptyAcc();
286
+ for (const key of testRun.testResultKeys) {
287
+ const result = testRun.testResultsByKey[key];
288
+ if (predicate(result)) appendResult(acc, result);
289
+ }
290
+ return finish(testRun, acc);
291
+ };
292
+ exports.filterResults = filterResults;
165
293
  const diff = ({
166
294
  testRun: {
167
295
  stats
@@ -181,4 +309,72 @@ const diff = ({
181
309
  })
182
310
  }));
183
311
  exports.diff = diff;
312
+ const requireComplete = /*#__PURE__*/_effect.Effect.fnUntraced(function* (repository, run) {
313
+ const saved = yield* repository.getTestRun(run.id);
314
+ if (_effect.Option.isNone(saved)) {
315
+ return yield* new _RepositoryError.TestRunNotFound({
316
+ testRunId: run.id
317
+ });
318
+ }
319
+ if (saved.value.state !== 'Complete') {
320
+ return yield* new _RepositoryError.TestRunIncomplete({
321
+ testSuiteName: saved.value.name,
322
+ testRunId: saved.value.id,
323
+ variant: saved.value.variant
324
+ });
325
+ }
326
+ return saved.value;
327
+ });
328
+ const compareRuns = ({
329
+ from,
330
+ to,
331
+ schemas
332
+ }) => _effect.Stream.unwrap(_effect.Effect.gen(function* () {
333
+ const repository = yield* _TestRepository.TestRepository;
334
+ const savedFrom = yield* requireComplete(repository, from);
335
+ const savedTo = yield* requireComplete(repository, to);
336
+ const resultEquals = _effect.Schema.toEquivalence(schemas.evaluation.result);
337
+ const expectedEquals = _effect.Schema.toEquivalence(schemas.evaluation.expected);
338
+ const matchingTo = repository.getTestResultsStream(savedTo, schemas).pipe(_effect.Stream.grouped(50), _effect.Stream.mapEffect(_effect.Effect.fnUntraced(function* (batch) {
339
+ const matches = yield* repository.getTestResultsStream(savedFrom, schemas, batch).pipe(_effect.Stream.runCollect);
340
+ const byKey = new Map(matches.map(result => [resultKey(result), result]));
341
+ return batch.map(to => {
342
+ const from = byKey.get(resultKey(to));
343
+ return from === undefined ? {
344
+ _tag: 'OnlyTo',
345
+ to
346
+ } : {
347
+ _tag: 'Matched',
348
+ from,
349
+ to,
350
+ changed: from.label !== to.label || !resultEquals(from.result, to.result) || !expectedEquals(from.expected, to.expected)
351
+ };
352
+ });
353
+ })), _effect.Stream.flattenIterable);
354
+ const onlyFrom = repository.getTestResultsStream(savedFrom, schemas).pipe(_effect.Stream.grouped(50), _effect.Stream.mapEffect(_effect.Effect.fnUntraced(function* (batch) {
355
+ const matches = yield* repository.getTestResultsStream(savedTo, schemas, batch).pipe(_effect.Stream.runCollect);
356
+ const keys = new Set(matches.map(resultKey));
357
+ return batch.filter(from => !keys.has(resultKey(from))).map(from => ({
358
+ _tag: 'OnlyFrom',
359
+ from
360
+ }));
361
+ })), _effect.Stream.flattenIterable);
362
+ return matchingTo.pipe(_effect.Stream.concat(onlyFrom));
363
+ }));
364
+ exports.compareRuns = compareRuns;
365
+ const summarizeRun = exports.summarizeRun = /*#__PURE__*/_effect.Effect.fnUntraced(function* ({
366
+ run,
367
+ schemas,
368
+ predicate
369
+ }) {
370
+ const repository = yield* _TestRepository.TestRepository;
371
+ const saved = yield* requireComplete(repository, run);
372
+ return yield* repository.withStats(collector => _effect.Effect.gen(function* () {
373
+ yield* repository.getTestResultsStream(saved, schemas).pipe(_effect.Stream.filter(predicate ?? (() => true)), _effect.Stream.grouped(50), _effect.Stream.runForEach(collector.add));
374
+ return {
375
+ run: saved,
376
+ stats: yield* collector.stats
377
+ };
378
+ }));
379
+ });
184
380
  //# sourceMappingURL=Test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Test.js","names":["_nodeCrypto","require","_effect","_Classify","_Classify2","makeSha256","input","createHash","update","JSON","stringify","digest","exports","TestResult","make","args","label","result","expected","id","hashTestCase","TestResultSchema","Schema","Struct","String","ordering","Int","Unknown","LabelSchema","tags","Array","timeMillis","Finite","test","Effect","fnUntraced","testCase","program","classify","t0","Clock","currentTimeNanos","t1","Number","all","testCases","makeClassify","isEqual","defaultIsEqual","concurrency","total","Stream","isStream","undefined","length","testCases$","fromIterable","pipe","zipWithIndex","map","mapEffect","unordered","tap","testResult","i","stride","Math","max","floor","isMilestone","void","logDebug","emptyAcc","testResultsByTestCaseHash","testCaseHashes","times","TP","TN","FP","FN","timeSum","timeMin","POSITIVE_INFINITY","timeMax","NEGATIVE_INFINITY","runCollectRecord","testRun","testResults$","run","Sink","reduce","acc","r","push","hasTimes","stats","Stats","precision","recall","timeMean","Option","some","none","timeMedian","median","name","hash","diff","previousTestRun","match","onNone","onSome","previousStats"],"sources":["../../../src/internal/Test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Test.js","names":["_nodeCrypto","require","_effect","_Classify","_Test","_TestRepository","_RepositoryError","_TestSerialization","_Classify2","makeSha256","input","createHash","update","stringifyJson","digest","exports","resultKey","hashTestCase","key","JSON","stringify","test","Effect","fnUntraced","testCase","expected","tags","ordering","program","evaluate","encodeResult","t0","Clock","currentTimeNanos","result","t1","evaluations","length","die","Error","keys","Set","has","add","forEach","evaluation","resultOrdering","gen","args","timeMillis","Number","encoded","id","label","selectVariant","suite","variant","suiteName","name","suspend","Object","hasOwn","undefined","succeed","fail","TestVariantNotFound","testSuiteName","variants","Array","isArray","definition","entries","includes","startsWith","TestVariantRequired","all","options","executeAll","concurrency","is","schemas","Stream","classify","makeClassify","isEqual","Schema","toEquivalence","Union","testCases","inputCodec","makeValueCodec","expectedCodec","encode","makeResultCodec","total","isStream","testCases$","fromIterable","unwrap","map","seen","pipe","zipWithIndex","mapEffect","context","caseNumber","field","filterEffect","logWarning","as","unordered","tap","testResults","i","stride","Math","max","floor","isMilestone","void","logDebug","flattenIterable","emptyAcc","testResultsByKey","testResultKeys","timesByTestCaseHash","Map","TP","TN","FP","FN","appendResult","acc","r","push","set","finish","testRun","times","values","timeSum","timeMin","POSITIVE_INFINITY","timeMax","NEGATIVE_INFINITY","time","stats","Stats","size","precision","recall","timeMean","Option","some","none","timeMedian","median","state","testCaseHashes","runCollectRecord","testResults$","run","Sink","reduce","filterResults","predicate","diff","previousTestRun","match","onNone","onSome","previousStats","requireComplete","repository","saved","getTestRun","isNone","TestRunNotFound","testRunId","value","TestRunIncomplete","compareRuns","from","to","TestRepository","savedFrom","savedTo","resultEquals","expectedEquals","matchingTo","getTestResultsStream","grouped","batch","matches","runCollect","byKey","get","_tag","changed","onlyFrom","filter","concat","summarizeRun","withStats","collector","runForEach"],"sources":["../../../src/internal/Test.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;AAAA,IAAAA,WAAA,gBAAAC,OAAA;AACA,IAAAC,OAAA,gBAAAD,OAAA;AAEA,IAAAE,SAAA,gBAAAF,OAAA;AAgBA,IAAAG,KAAA,gBAAAH,OAAA;AACA,IAAAI,eAAA,gBAAAJ,OAAA;AAMA,IAAAK,gBAAA,gBAAAL,OAAA;AAEA,IAAAM,kBAAA,gBAAAN,OAAA;AAKA,IAAAO,UAAA,gBAAAP,OAAA;AAEA;AACO,MAAMQ,UAAU,GAAIC,KAAkB,IACzC,IAAAC,sBAAU,EAAC,QAAQ,CAAC,CAACC,MAAM,CAAC,IAAAC,gCAAa,EAACH,KAAK,CAAC,CAAC,CAACI,MAAM,CAAC,KAAK,CAAC;AAACC,OAAA,CAAAN,UAAA,GAAAA,UAAA;AAE7D,MAAMO,SAAS,GAAGA,CAAC;EACtBC,YAAY;EACZC;AAAG,CACoC,KACvCC,IAAI,CAACC,SAAS,CAAC,CAACH,YAAY,EAAEC,GAAG,CAAC,CAAC;AAACH,OAAA,CAAAC,SAAA,GAAAA,SAAA;AAEjC,MAAMK,IAAI,GAAAN,OAAA,CAAAM,IAAA,gBAAGC,cAAM,CAACC,UAAU,CAAC,WAAgC;EAClEC,QAAQ,EAAE;IAACd,KAAK;IAAEe,QAAQ;IAAEC,IAAI;IAAEC;EAAQ,CAAC;EAC3CV,YAAY;EACZW,OAAO;EACPC,QAAQ;EACRC;AAAY,CAOf;EACG,MAAMC,EAAE,GAAG,OAAOC,aAAK,CAACC,gBAAgB;EACxC,MAAMC,MAAM,GAAG,OAAON,OAAO,CAAClB,KAAK,CAAC;EACpC,MAAMyB,EAAE,GAAG,OAAOH,aAAK,CAACC,gBAAgB;EACxC,MAAMG,WAAW,GAAGP,QAAQ,CAACK,MAAM,EAAET,QAAQ,CAAC;EAC9C,IAAIW,WAAW,CAACC,MAAM,KAAK,CAAC,EAAE;IAC1B,OAAO,OAAOf,cAAM,CAACgB,GAAG,CACpB,IAAIC,KAAK,CAAC,0CAA0C,CAAC,CACxD;EACL;EACA,MAAMC,IAAI,GAAG,IAAIC,GAAG,EAAU;EAC9B,KAAK,MAAM;IAACvB;EAAG,CAAC,IAAIkB,WAAW,EAAE;IAC7B,IAAIlB,GAAG,CAACmB,MAAM,KAAK,CAAC,IAAIG,IAAI,CAACE,GAAG,CAACxB,GAAG,CAAC,EAAE;MACnC,OAAO,OAAOI,cAAM,CAACgB,GAAG,CACpB,IAAIC,KAAK,CACL,2EAA2E,CAC9E,CACJ;IACL;IACAC,IAAI,CAACG,GAAG,CAACzB,GAAG,CAAC;EACjB;EACA,OAAO,OAAOI,cAAM,CAACsB,OAAO,CAACR,WAAW,EAAE,CAACS,UAAU,EAAEC,cAAc,KACjExB,cAAM,CAACyB,GAAG,CAAC,aAAS;IAChB,MAAMC,IAAI,GAAG;MACT,GAAGH,UAAU;MACb5B,YAAY;MACZU,QAAQ;MACRmB,cAAc;MACdpC,KAAK;MACLgB,IAAI,EAAEA,IAAI,IAAI,EAAE;MAChBuB,UAAU,EAAEC,MAAM,CAACf,EAAE,GAAGJ,EAAE,CAAC,GAAG;KACjC;IACD,MAAMoB,OAAO,GAAG,OAAOrB,YAAY,CAACkB,IAAI,CAAC;IACzC;IACA,OAAO;MACH,GAAGA,IAAI;MACPI,EAAE,EAAE3C,UAAU,CAAC;QACXQ,YAAY;QACZC,GAAG,EAAE2B,UAAU,CAAC3B,GAAG;QACnBmC,KAAK,EAAER,UAAU,CAACQ,KAAK;QACvB3C,KAAK,EAAEyC,OAAO,CAACzC,KAAK;QACpBwB,MAAM,EAAEiB,OAAO,CAACjB,MAAM;QACtBT,QAAQ,EAAE0B,OAAO,CAAC1B;OACrB;KACJ;EACL,CAAC,CAAC,CACL;AACL,CAAC,CAAC;AAgBI,SAAU6B,aAAaA,CACzBC,KAA2E,EAC3EC,OAAgB;EAEhB,MAAMC,SAAS,GAAGF,KAAK,CAACG,IAAI;EAC5B,OAAOpC,cAAM,CAACqC,OAAO,CACjB,MAGI;IACA,IACIC,MAAM,CAACC,MAAM,CAACN,KAAK,EAAE,SAAS,CAAC,KAC/BK,MAAM,CAACC,MAAM,CAACN,KAAK,EAAE,UAAU,CAAC,EAClC;MACE,OAAOjC,cAAM,CAACgB,GAAG,CACb,IAAIC,KAAK,CACL,GAAGgB,KAAK,CAACG,IAAI,8CAA8C,CAC9D,CACJ;IACL;IACA,IAAIH,KAAK,CAAC3B,OAAO,KAAKkC,SAAS,EAAE;MAC7B,IAAI,OAAOP,KAAK,CAAC3B,OAAO,KAAK,UAAU,EAAE;QACrC,OAAON,cAAM,CAACgB,GAAG,CACb,IAAIC,KAAK,CAAC,GAAGkB,SAAS,8BAA8B,CAAC,CACxD;MACL;MACA,OAAOD,OAAO,KAAKM,SAAS,IAAIN,OAAO,KAAK,SAAS,GAC/ClC,cAAM,CAACyC,OAAO,CAAC;QAACL,IAAI,EAAE,SAAS;QAAE9B,OAAO,EAAE2B,KAAK,CAAC3B;MAAO,CAAC,CAAC,GACzDN,cAAM,CAAC0C,IAAI,CACP,IAAIC,yBAAmB,CAAC;QACpBC,aAAa,EAAEX,KAAK,CAACG,IAAI;QACzBF;OACH,CAAC,CACL;IACX;IACA,IACID,KAAK,CAACY,QAAQ,KAAKL,SAAS,IAC5BP,KAAK,CAACY,QAAQ,KAAK,IAAI,IACvB,OAAOZ,KAAK,CAACY,QAAQ,KAAK,QAAQ,IAClCC,KAAK,CAACC,OAAO,CAACd,KAAK,CAACY,QAAQ,CAAC,EAC/B;MACE,OAAO7C,cAAM,CAACgB,GAAG,CACb,IAAIC,KAAK,CACL,GAAGgB,KAAK,CAACG,IAAI,sCAAsC,CACtD,CACJ;IACL;IACA,KAAK,MAAM,CAACA,IAAI,EAAEY,UAAU,CAAC,IAAIV,MAAM,CAACW,OAAO,CAAChB,KAAK,CAACY,QAAQ,CAAC,EAAE;MAC7D,IACIT,IAAI,CAACrB,MAAM,KAAK,CAAC,IACjBqB,IAAI,CAACc,QAAQ,CAAC,GAAG,CAAC,IAClBd,IAAI,CAACe,UAAU,CAAC,MAAM,CAAC,EACzB;QACE,OAAOnD,cAAM,CAACgB,GAAG,CACb,IAAIC,KAAK,CACL,GAAGgB,KAAK,CAACG,IAAI,wBAAwBvC,IAAI,CAACC,SAAS,CAACsC,IAAI,CAAC,EAAE,CAC9D,CACJ;MACL;MACA,IACIY,UAAU,KAAK,IAAI,IACnB,OAAOA,UAAU,KAAK,QAAQ,IAC9B,OAAOA,UAAU,CAAC1C,OAAO,KAAK,UAAU,EAC1C;QACE,OAAON,cAAM,CAACgB,GAAG,CACb,IAAIC,KAAK,CACL,GAAGgB,KAAK,CAACG,IAAI,aAAavC,IAAI,CAACC,SAAS,CAACsC,IAAI,CAAC,wBAAwB,CACzE,CACJ;MACL;IACJ;IACA,IAAIF,OAAO,KAAKM,SAAS,EAAE;MACvB,OAAOxC,cAAM,CAAC0C,IAAI,CACd,IAAIU,yBAAmB,CAAC;QAACR,aAAa,EAAEX,KAAK,CAACG;MAAI,CAAC,CAAC,CACvD;IACL;IACA,OAAOE,MAAM,CAACC,MAAM,CAACN,KAAK,CAACY,QAAQ,EAAEX,OAAO,CAAC,GACvClC,cAAM,CAACyC,OAAO,CAAC;MACXL,IAAI,EAAEF,OAAO;MACb5B,OAAO,EAAE2B,KAAK,CAACY,QAAQ,CAACX,OAAO,CAAC,CAAC5B;KACpC,CAAC,GACFN,cAAM,CAAC0C,IAAI,CACP,IAAIC,yBAAmB,CAAC;MACpBC,aAAa,EAAEX,KAAK,CAACG,IAAI;MACzBF;KACH,CAAC,CACL;EACX,CAAC,CACJ;AACL;AAaM,SAAUmB,GAAGA,CACfpB,KAAiD,EACjDqB,OAAO,GAGH,EAAE;EAEN,OAAOC,UAAU,CAACtB,KAAK,EAAEqB,OAAO,CAAC;AACrC;AAEA,MAAMC,UAAU,GAAGA,CACftB,KAAqC,EACrC;EACIC,OAAO;EACPsB,WAAW,GAAG;AAAC,CACgD,KAKnE;EACA,IAAIvB,KAAK,CAAC1B,QAAQ,KAAKiC,SAAS,EAAE;IAC9B,IACI,CAACF,MAAM,CAACmB,EAAE,CACNxB,KAAK,CAACyB,OAAO,CAACnC,UAAU,CAACX,MAAM,EAC/BqB,KAAK,CAACyB,OAAO,CAACnC,UAAU,CAACpB,QAAQ,CACpC,EACH;MACE,OAAOwD,cAAM,CAAC3C,GAAG,CACb,IAAIC,KAAK,CACL,GAAGgB,KAAK,CAACG,IAAI,0FAA0F,CAC1G,CACJ;IACL;IACA,MAAMwB,QAAQ,GAAG,IAAAC,uBAAY,EAAe;MACxCC,OAAO,EAAEC,cAAM,CAACC,aAAa,CACzBD,cAAM,CAACE,KAAK,CAAC,CACThC,KAAK,CAACyB,OAAO,CAACnC,UAAU,CAACX,MAAM,EAC/BqB,KAAK,CAACyB,OAAO,CAACnC,UAAU,CAACpB,QAAQ,CACpC,CAAC;KAET,CAAC;IACF,OAAOoD,UAAU,CACb;MACI,GAAGtB,KAAK;MACR1B,QAAQ,EAAEA,CAACK,MAAM,EAAET,QAAQ,KAAK,CAC5B;QACIP,GAAG,EAAE,QAAQ;QACbgB,MAAM;QACNT,QAAQ;QACR4B,KAAK,EAAE6B,QAAQ,CAAChD,MAAM,EAAET,QAAQ;OACnC;KAER,EACD;MAAC+B,OAAO;MAAEsB;IAAW,CAAC,CACzB;EACL;EACA,MAAM;IAACU,SAAS;IAAE3D,QAAQ;IAAEmD;EAAO,CAAC,GAAGzB,KAAK;EAC5C,MAAMkC,UAAU,GAAG,IAAAC,iCAAc,EAACV,OAAO,CAACxD,QAAQ,CAACd,KAAK,CAAC;EACzD,MAAMiF,aAAa,GAAG,IAAAD,iCAAc,EAACV,OAAO,CAACxD,QAAQ,CAACC,QAAQ,CAAC;EAC/D,MAAM;IAACmE,MAAM,EAAE9D;EAAY,CAAC,GAAG,IAAA+D,kCAAe,EAACb,OAAO,EAAEzB,KAAK,CAACG,IAAI,CAAC;EACnE,MAAMoC,KAAK,GAAGb,cAAM,CAACc,QAAQ,CAACP,SAAS,CAAC,GAAG1B,SAAS,GAAG0B,SAAS,CAACnD,MAAM;EACvE,MAAM2D,UAAU,GAAGf,cAAM,CAACc,QAAQ,CAACP,SAAS,CAAC,GACvCA,SAAS,GACTP,cAAM,CAACgB,YAAY,CAACT,SAAS,CAAC;EAEpC,OAAOP,cAAM,CAACiB,MAAM,CAChB5E,cAAM,CAAC6E,GAAG,CAAC7C,aAAa,CAACC,KAAK,EAAEC,OAAO,CAAC,EAAE,CAAC;IAAC5B;EAAO,CAAC,KAAI;IACpD,MAAMwE,IAAI,GAAG,IAAI3D,GAAG,EAAU;IAC9B,OAAO,IAAA4D,YAAI,EACPL,UAAU,EACVf,cAAM,CAACqB,YAAY,EACnBrB,cAAM,CAACsB,SAAS,CACZjF,cAAM,CAACC,UAAU,CAAC,WAAW,CAACC,QAAQ,EAAEG,QAAQ,CAAC;MAC7C,MAAM6E,OAAO,GAAG;QACZjD,KAAK,EAAEA,KAAK,CAACG,IAAI;QACjB+C,UAAU,EAAE9E,QAAQ,GAAG;OAC1B;MACD,MAAMjB,KAAK,GAAG,OAAO+E,UAAU,CAACG,MAAM,CAACpE,QAAQ,CAACd,KAAK,EAAE;QACnD,GAAG8F,OAAO;QACVE,KAAK,EAAE;OACV,CAAC;MACF,MAAMjF,QAAQ,GAAG,OAAOkE,aAAa,CAACC,MAAM,CACxCpE,QAAQ,CAACC,QAAQ,EACjB;QACI,GAAG+E,OAAO;QACVE,KAAK,EAAE;OACV,CACJ;MACD,OAAO;QACHlF,QAAQ,EAAE;UAAC,GAAGA,QAAQ;UAAEG;QAAQ,CAAC;QACjCV,YAAY,EAAER,UAAU,CAAC;UAACC,KAAK;UAAEe;QAAQ,CAAC;OAC7C;IACL,CAAC,CAAC,CACL,EACDwD,cAAM,CAAC0B,YAAY,CAAC,CAAC;MAACnF,QAAQ;MAAEP;IAAY,CAAC,KAAI;MAC7C,IAAImF,IAAI,CAAC1D,GAAG,CAACzB,YAAY,CAAC,EAAE;QACxB,OAAOK,cAAM,CAACsF,UAAU,CACpB,+BAA+B,EAC/B;UACIrD,KAAK,EAAEA,KAAK,CAACG,IAAI;UACjBzC,YAAY;UACZwF,UAAU,EAAEjF,QAAQ,CAACG,QAAQ,GAAG;SACnC,CACJ,CAAC0E,IAAI,CAAC/E,cAAM,CAACuF,EAAE,CAAC,KAAK,CAAC,CAAC;MAC5B;MACAT,IAAI,CAACzD,GAAG,CAAC1B,YAAY,CAAC;MACtB,OAAOK,cAAM,CAACyC,OAAO,CAAC,IAAI,CAAC;IAC/B,CAAC,CAAC,EACFkB,cAAM,CAACsB,SAAS,CACZ,CAAC;MAAC/E,QAAQ;MAAEP;IAAY,CAAC,KACrBI,IAAI,CAAC;MACDG,QAAQ;MACRP,YAAY;MACZW,OAAO;MACPC,QAAQ;MACRC;KACH,CAAC,EACN;MACIgD,WAAW;MACXgC,SAAS,EAAE;KACd,CACJ,EACD7B,cAAM,CAAC8B,GAAG,CAACC,WAAW,IAAG;MACrB,MAAMC,CAAC,GAAGD,WAAW,CAAC,CAAC,CAAC,CAACrF,QAAQ,GAAG,CAAC;MACrC,MAAMuF,MAAM,GACRpB,KAAK,KAAKhC,SAAS,GACb,EAAE,GACFqD,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,KAAK,CAACvB,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;MAChD,MAAMwB,WAAW,GACbL,CAAC,KAAK,CAAC,IACPA,CAAC,GAAGC,MAAM,KAAK,CAAC,IACfpB,KAAK,KAAKhC,SAAS,IAAImD,CAAC,KAAKnB,KAAM;MACxC,IAAI,CAACwB,WAAW,EAAE,OAAOhG,cAAM,CAACiG,IAAI;MAEpC,OAAOjG,cAAM,CAACkG,QAAQ,CAClB1B,KAAK,KAAKhC,SAAS,GACb,YAAYmD,CAAC,EAAE,GACf,YAAYA,CAAC,IAAInB,KAAK,EAAE,CACjC;IACL,CAAC,CAAC,EACFb,cAAM,CAACwC,eAAe,CACzB;EACL,CAAC,CAAC,CACL;AACL,CAAC;AAYD,MAAMC,QAAQ,GAAGA,CAAA,MAAkC;EAC/CC,gBAAgB,EAAE,EAAE;EACpBC,cAAc,EAAE,EAAE;EAClBC,mBAAmB,EAAE,IAAIC,GAAG,EAAE;EAC9BC,EAAE,EAAE,CAAC;EACLC,EAAE,EAAE,CAAC;EACLC,EAAE,EAAE,CAAC;EACLC,EAAE,EAAE;CACP,CAAC;AAEF,MAAMC,YAAY,GAAGA,CACjBC,GAAqB,EACrBC,CAAsB,KACJ;EAClB,MAAMnH,GAAG,GAAGF,SAAS,CAACqH,CAAC,CAAC;EACxBD,GAAG,CAACT,gBAAgB,CAACzG,GAAG,CAAC,GAAGmH,CAAC;EAC7BD,GAAG,CAACR,cAAc,CAACU,IAAI,CAACpH,GAAG,CAAC;EAC5B,IAAI,CAACkH,GAAG,CAACP,mBAAmB,CAACnF,GAAG,CAAC2F,CAAC,CAACpH,YAAY,CAAC,EAAE;IAC9CmH,GAAG,CAACP,mBAAmB,CAACU,GAAG,CAACF,CAAC,CAACpH,YAAY,EAAEoH,CAAC,CAACpF,UAAU,CAAC;EAC7D;EACA,IAAIoF,CAAC,CAAChF,KAAK,KAAK,IAAI,EAAE+E,GAAG,CAACL,EAAE,EAAE,CAAC,KAC1B,IAAIM,CAAC,CAAChF,KAAK,KAAK,IAAI,EAAE+E,GAAG,CAACJ,EAAE,EAAE,CAAC,KAC/B,IAAIK,CAAC,CAAChF,KAAK,KAAK,IAAI,EAAE+E,GAAG,CAACH,EAAE,EAAE,CAAC,KAC/BG,GAAG,CAACF,EAAE,EAAE;EACb,OAAOE,GAAG;AACd,CAAC;AAED,MAAMI,MAAM,GAAGA,CACXC,OAA2D,EAC3DL,GAAqB,KACI;EACzB,MAAMM,KAAK,GAAG,CAAC,GAAGN,GAAG,CAACP,mBAAmB,CAACc,MAAM,EAAE,CAAC;EACnD,IAAIC,OAAO,GAAG,CAAC;EACf,IAAIC,OAAO,GAAG3F,MAAM,CAAC4F,iBAAiB;EACtC,IAAIC,OAAO,GAAG7F,MAAM,CAAC8F,iBAAiB;EACtC,KAAK,MAAMC,IAAI,IAAIP,KAAK,EAAE;IACtBE,OAAO,IAAIK,IAAI;IACf,IAAIA,IAAI,GAAGJ,OAAO,EAAEA,OAAO,GAAGI,IAAI;IAClC,IAAIA,IAAI,GAAGF,OAAO,EAAEA,OAAO,GAAGE,IAAI;EACtC;EACA,MAAMC,KAAK,GAAG,IAAIC,eAAK,CAAC;IACpBpB,EAAE,EAAEK,GAAG,CAACL,EAAE;IACVC,EAAE,EAAEI,GAAG,CAACJ,EAAE;IACVC,EAAE,EAAEG,GAAG,CAACH,EAAE;IACVC,EAAE,EAAEE,GAAG,CAACF,EAAE;IACVpC,KAAK,EAAEsC,GAAG,CAACR,cAAc,CAACvF,MAAM;IAChCmD,SAAS,EAAE4C,GAAG,CAACP,mBAAmB,CAACuB,IAAI;IACvCC,SAAS,EAAE,IAAAA,oBAAS,EAAC;MAACtB,EAAE,EAAEK,GAAG,CAACL,EAAE;MAAEE,EAAE,EAAEG,GAAG,CAACH;IAAE,CAAC,CAAC;IAC9CqB,MAAM,EAAE,IAAAA,iBAAM,EAAC;MAACvB,EAAE,EAAEK,GAAG,CAACL,EAAE;MAAEG,EAAE,EAAEE,GAAG,CAACF;IAAE,CAAC,CAAC;IACxCqB,QAAQ,EACJb,KAAK,CAACrG,MAAM,GAAG,CAAC,GACVmH,cAAM,CAACC,IAAI,CAACb,OAAO,GAAGF,KAAK,CAACrG,MAAM,CAAC,GACnCmH,cAAM,CAACE,IAAI,EAAE;IACvBb,OAAO,EAAEH,KAAK,CAACrG,MAAM,GAAG,CAAC,GAAGmH,cAAM,CAACC,IAAI,CAACZ,OAAO,CAAC,GAAGW,cAAM,CAACE,IAAI,EAAE;IAChEX,OAAO,EAAEL,KAAK,CAACrG,MAAM,GAAG,CAAC,GAAGmH,cAAM,CAACC,IAAI,CAACV,OAAO,CAAC,GAAGS,cAAM,CAACE,IAAI,EAAE;IAChEC,UAAU,EAAE,IAAAC,iBAAM,EAAClB,KAAK;GAC3B,CAAC;EACF,OAAO;IACHtF,EAAE,EAAEqF,OAAO,CAACrF,EAAE;IACdM,IAAI,EAAE+E,OAAO,CAAC/E,IAAI;IAClBF,OAAO,EAAEiF,OAAO,CAACjF,OAAO;IACxBqG,KAAK,EAAEpB,OAAO,CAACoB,KAAK;IACpBlC,gBAAgB,EAAES,GAAG,CAACT,gBAAgB;IACtCC,cAAc,EAAEQ,GAAG,CAACR,cAAc;IAClCkC,cAAc,EAAE,CAAC,GAAG1B,GAAG,CAACP,mBAAmB,CAACrF,IAAI,EAAE,CAAC;IACnD0G;GACH;AACL,CAAC;AAEM,MAAMa,gBAAgB,GACxBtB,OAAgB,IAEbuB,YAAsD,IAEtDA,YAAY,CAAC3D,IAAI,CACbpB,cAAM,CAACgF,GAAG,CAACC,YAAI,CAACC,MAAM,CAACzC,QAAiB,EAAES,YAAY,CAAC,CAAC,EACxD7G,cAAM,CAAC6E,GAAG,CAACiC,GAAG,IAAII,MAAM,CAACC,OAAO,EAAEL,GAAG,CAAC,CAAC,CAC1C;AAACrH,OAAA,CAAAgJ,gBAAA,GAAAA,gBAAA;AAEH,MAAMK,aAAa,GAAGA,CACzB3B,OAAgC,EAChC4B,SAAmD,KAC1B;EACzB,MAAMjC,GAAG,GAAGV,QAAQ,EAAW;EAC/B,KAAK,MAAMxG,GAAG,IAAIuH,OAAO,CAACb,cAAc,EAAE;IACtC,MAAM1F,MAAM,GAAGuG,OAAO,CAACd,gBAAgB,CAACzG,GAAG,CAAC;IAC5C,IAAImJ,SAAS,CAACnI,MAAM,CAAC,EAAEiG,YAAY,CAACC,GAAG,EAAElG,MAAM,CAAC;EACpD;EACA,OAAOsG,MAAM,CAACC,OAAO,EAAEL,GAAG,CAAC;AAC/B,CAAC;AAACrH,OAAA,CAAAqJ,aAAA,GAAAA,aAAA;AAEK,MAAME,IAAI,GAAGA,CAAC;EACjB7B,OAAO,EAAE;IAACS;EAAK,CAAC;EAChBqB;AAAe,CAIlB,KACGA,eAAe,CAAClE,IAAI,CAChBmD,cAAM,CAACgB,KAAK,CAAC;EACTC,MAAM,EAAEA,CAAA,KAAMvB,KAAK;EACnBwB,MAAM,EAAEA,CAAC;IAACxB,KAAK,EAAEyB;EAAa,CAAC,MAAM;IACjC5C,EAAE,EAAEmB,KAAK,CAACnB,EAAE,GAAG4C,aAAa,CAAC5C,EAAE;IAC/BC,EAAE,EAAEkB,KAAK,CAAClB,EAAE,GAAG2C,aAAa,CAAC3C,EAAE;IAC/BC,EAAE,EAAEiB,KAAK,CAACjB,EAAE,GAAG0C,aAAa,CAAC1C,EAAE;IAC/BC,EAAE,EAAEgB,KAAK,CAAChB,EAAE,GAAGyC,aAAa,CAACzC,EAAE;IAC/BmB,SAAS,EAAEH,KAAK,CAACG,SAAS,GAAGsB,aAAa,CAACtB,SAAS;IACpDC,MAAM,EAAEJ,KAAK,CAACI,MAAM,GAAGqB,aAAa,CAACrB;GACxC;CACJ,CAAC,CACL;AAACvI,OAAA,CAAAuJ,IAAA,GAAAA,IAAA;AAEN,MAAMM,eAAe,gBAAGtJ,cAAM,CAACC,UAAU,CAAC,WACtCsJ,UAA+B,EAC/BZ,GAAY;EAEZ,MAAMa,KAAK,GAAG,OAAOD,UAAU,CAACE,UAAU,CAACd,GAAG,CAAC7G,EAAE,CAAC;EAClD,IAAIoG,cAAM,CAACwB,MAAM,CAACF,KAAK,CAAC,EAAE;IACtB,OAAO,OAAO,IAAIG,gCAAe,CAAC;MAACC,SAAS,EAAEjB,GAAG,CAAC7G;IAAE,CAAC,CAAC;EAC1D;EACA,IAAI0H,KAAK,CAACK,KAAK,CAACtB,KAAK,KAAK,UAAU,EAAE;IAClC,OAAO,OAAO,IAAIuB,kCAAiB,CAAC;MAChClH,aAAa,EAAE4G,KAAK,CAACK,KAAK,CAACzH,IAAI;MAC/BwH,SAAS,EAAEJ,KAAK,CAACK,KAAK,CAAC/H,EAAE;MACzBI,OAAO,EAAEsH,KAAK,CAACK,KAAK,CAAC3H;KACxB,CAAC;EACN;EACA,OAAOsH,KAAK,CAACK,KAAK;AACtB,CAAC,CAAC;AAEK,MAAME,WAAW,GAAGA,CAAU;EACjCC,IAAI;EACJC,EAAE;EACFvG;AAAO,CAKV,KACGC,cAAM,CAACiB,MAAM,CACT5E,cAAM,CAACyB,GAAG,CAAC,aAAS;EAChB,MAAM8H,UAAU,GAAG,OAAOW,8BAAc;EACxC,MAAMC,SAAS,GAAG,OAAOb,eAAe,CAACC,UAAU,EAAES,IAAI,CAAC;EAC1D,MAAMI,OAAO,GAAG,OAAOd,eAAe,CAACC,UAAU,EAAEU,EAAE,CAAC;EACtD,MAAMI,YAAY,GAAGtG,cAAM,CAACC,aAAa,CACrCN,OAAO,CAACnC,UAAU,CAACX,MAAM,CAC5B;EACD,MAAM0J,cAAc,GAAGvG,cAAM,CAACC,aAAa,CACvCN,OAAO,CAACnC,UAAU,CAACpB,QAAQ,CAC9B;EACD,MAAMoK,UAAU,GAAGhB,UAAU,CACxBiB,oBAAoB,CAACJ,OAAO,EAAE1G,OAAO,CAAC,CACtCqB,IAAI,CACDpB,cAAM,CAAC8G,OAAO,CAAC,EAAE,CAAC,EAClB9G,cAAM,CAACsB,SAAS,CACZjF,cAAM,CAACC,UAAU,CAAC,WAAWyK,KAAK;IAC9B,MAAMC,OAAO,GAAG,OAAOpB,UAAU,CAC5BiB,oBAAoB,CAACL,SAAS,EAAEzG,OAAO,EAAEgH,KAAK,CAAC,CAC/C3F,IAAI,CAACpB,cAAM,CAACiH,UAAU,CAAC;IAC5B,MAAMC,KAAK,GAAG,IAAIrE,GAAG,CACjBmE,OAAO,CAAC9F,GAAG,CAACjE,MAAM,IAAI,CAClBlB,SAAS,CAACkB,MAAM,CAAC,EACjBA,MAAM,CACT,CAAC,CACL;IACD,OAAO8J,KAAK,CAAC7F,GAAG,CACXoF,EAAE,IAAmC;MAClC,MAAMD,IAAI,GAAGa,KAAK,CAACC,GAAG,CAACpL,SAAS,CAACuK,EAAE,CAAC,CAAC;MACrC,OAAOD,IAAI,KAAKxH,SAAS,GACnB;QAACuI,IAAI,EAAE,QAAQ;QAAEd;MAAE,CAAC,GACpB;QACIc,IAAI,EAAE,SAAS;QACff,IAAI;QACJC,EAAE;QACFe,OAAO,EACHhB,IAAI,CAACjI,KAAK,KAAKkI,EAAE,CAAClI,KAAK,IACvB,CAACsI,YAAY,CACTL,IAAI,CAACpJ,MAAM,EACXqJ,EAAE,CAACrJ,MAAM,CACZ,IACD,CAAC0J,cAAc,CACXN,IAAI,CAAC7J,QAAQ,EACb8J,EAAE,CAAC9J,QAAQ;OAEtB;IACX,CAAC,CACJ;EACL,CAAC,CAAC,CACL,EACDwD,cAAM,CAACwC,eAAe,CACzB;EACL,MAAM8E,QAAQ,GAAG1B,UAAU,CACtBiB,oBAAoB,CAACL,SAAS,EAAEzG,OAAO,CAAC,CACxCqB,IAAI,CACDpB,cAAM,CAAC8G,OAAO,CAAC,EAAE,CAAC,EAClB9G,cAAM,CAACsB,SAAS,CACZjF,cAAM,CAACC,UAAU,CAAC,WAAWyK,KAAK;IAC9B,MAAMC,OAAO,GAAG,OAAOpB,UAAU,CAC5BiB,oBAAoB,CAACJ,OAAO,EAAE1G,OAAO,EAAEgH,KAAK,CAAC,CAC7C3F,IAAI,CAACpB,cAAM,CAACiH,UAAU,CAAC;IAC5B,MAAM1J,IAAI,GAAG,IAAIC,GAAG,CAACwJ,OAAO,CAAC9F,GAAG,CAACnF,SAAS,CAAC,CAAC;IAC5C,OAAOgL,KAAK,CACPQ,MAAM,CAAClB,IAAI,IAAI,CAAC9I,IAAI,CAACE,GAAG,CAAC1B,SAAS,CAACsK,IAAI,CAAC,CAAC,CAAC,CAC1CnF,GAAG,CAAEmF,IAAI,KAAqC;MAC3Ce,IAAI,EAAE,UAAU;MAChBf;KACH,CAAC,CAAC;EACX,CAAC,CAAC,CACL,EACDrG,cAAM,CAACwC,eAAe,CACzB;EACL,OAAOoE,UAAU,CAACxF,IAAI,CAACpB,cAAM,CAACwH,MAAM,CAACF,QAAQ,CAAC,CAAC;AACnD,CAAC,CAAC,CACL;AAACxL,OAAA,CAAAsK,WAAA,GAAAA,WAAA;AAEC,MAAMqB,YAAY,GAAA3L,OAAA,CAAA2L,YAAA,gBAAGpL,cAAM,CAACC,UAAU,CAAC,WAAoB;EAC9D0I,GAAG;EACHjF,OAAO;EACPqF;AAAS,CAKZ;EACG,MAAMQ,UAAU,GAAG,OAAOW,8BAAc;EACxC,MAAMV,KAAK,GAAG,OAAOF,eAAe,CAACC,UAAU,EAAEZ,GAAG,CAAC;EACrD,OAAO,OAAOY,UAAU,CAAC8B,SAAS,CAACC,SAAS,IACxCtL,cAAM,CAACyB,GAAG,CAAC,aAAS;IAChB,OAAO8H,UAAU,CACZiB,oBAAoB,CAAChB,KAAK,EAAE9F,OAAO,CAAC,CACpCqB,IAAI,CACDpB,cAAM,CAACuH,MAAM,CAACnC,SAAS,KAAK,MAAM,IAAI,CAAC,CAAC,EACxCpF,cAAM,CAAC8G,OAAO,CAAC,EAAE,CAAC,EAClB9G,cAAM,CAAC4H,UAAU,CAACD,SAAS,CAACjK,GAAG,CAAC,CACnC;IACL,OAAO;MAACsH,GAAG,EAAEa,KAAK;MAAE5B,KAAK,EAAE,OAAO0D,SAAS,CAAC1D;IAAK,CAAC;EACtD,CAAC,CAAC,CACL;AACL,CAAC,CAAC","ignoreList":[]}