@creative-introvert/tons-of-tests 2.1.0 → 3.0.0-rc.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 (120) hide show
  1. package/README.md +143 -37
  2. package/dist/cjs/Classify.js +1 -2
  3. package/dist/cjs/Classify.js.map +1 -1
  4. package/dist/cjs/RepositoryError.js +42 -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 +40 -2
  9. package/dist/cjs/Test.js.map +1 -1
  10. package/dist/cjs/Test.repository.js +25 -22
  11. package/dist/cjs/Test.repository.js.map +1 -1
  12. package/dist/cjs/TestRun.js +28 -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 +235 -95
  21. package/dist/cjs/internal/Test.js.map +1 -1
  22. package/dist/cjs/internal/Test.repository.sqlite.js +487 -356
  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 +29 -1
  28. package/dist/cjs/internal/stats.js.map +1 -1
  29. package/dist/cjs/internal/summarize.js +143 -29
  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-schema.js +98 -0
  34. package/dist/cjs/internal/test-repository-schema.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 +0 -1
  38. package/dist/dts/Classify.d.ts.map +1 -1
  39. package/dist/dts/RepositoryError.d.ts +47 -20
  40. package/dist/dts/RepositoryError.d.ts.map +1 -1
  41. package/dist/dts/Show.d.ts +5 -5
  42. package/dist/dts/Show.d.ts.map +1 -1
  43. package/dist/dts/Test.d.ts +136 -13
  44. package/dist/dts/Test.d.ts.map +1 -1
  45. package/dist/dts/Test.repository.d.ts +132 -9
  46. package/dist/dts/Test.repository.d.ts.map +1 -1
  47. package/dist/dts/TestRun.d.ts +22 -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 +64 -30
  56. package/dist/dts/internal/Test.d.ts.map +1 -1
  57. package/dist/dts/internal/Test.repository.sqlite.d.ts +92 -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 +16 -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 +33 -0
  68. package/dist/dts/internal/test-repository-fixtures.d.ts.map +1 -0
  69. package/dist/dts/internal/test-repository-schema.d.ts +16 -0
  70. package/dist/dts/internal/test-repository-schema.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 +0 -1
  74. package/dist/esm/Classify.js.map +1 -1
  75. package/dist/esm/RepositoryError.js +29 -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 +37 -1
  80. package/dist/esm/Test.js.map +1 -1
  81. package/dist/esm/Test.repository.js +26 -21
  82. package/dist/esm/Test.repository.js.map +1 -1
  83. package/dist/esm/TestRun.js +22 -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 +231 -94
  92. package/dist/esm/internal/Test.js.map +1 -1
  93. package/dist/esm/internal/Test.repository.sqlite.js +486 -356
  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 +27 -0
  99. package/dist/esm/internal/stats.js.map +1 -1
  100. package/dist/esm/internal/summarize.js +143 -28
  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-schema.js +92 -0
  105. package/dist/esm/internal/test-repository-schema.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 -62
  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
@@ -1,13 +1,94 @@
1
- import * as SqlClient from 'effect/sql/SqlClient';
2
- import { Effect } from 'effect';
3
- import { TestRepository } from '../Test.repository.js';
4
- import { type TestRepositoryShape } from '../Test.repository.types.js';
5
- export { TestRepository };
6
- import { RepositoryDecodeError } from '../RepositoryError.js';
7
- export declare const tables: {
8
- readonly testResults: 'test-results';
9
- readonly testRuns: 'test-runs';
10
- readonly testRunResults: 'test-run-results';
1
+ import { Context, Crypto, Effect, FileSystem, Option, Path, Schema, Scope, Stream } from 'effect';
2
+ import { SqlClient } from 'effect/sql';
3
+ import type { PlatformError } from 'effect/PlatformError';
4
+ import type { TestResult } from '../Test.js';
5
+ import type { TestResultSchemas } from '../Test.repository.js';
6
+ import { TestRun } from '../TestRun.js';
7
+ import { type RepositoryError, RepositoryPathConflict, TestRunNotFound } from '../RepositoryError.js';
8
+ export { tables } from './test-repository-schema.js';
9
+ declare const TestRepositoryStorage_base: Context.ServiceClass<TestRepositoryStorage, "@creative-introvert/tons-of-tests/internal/TestRepositoryStorage", {
10
+ readonly snapshot: Effect.Effect<SqlClient.SqlClient, RepositoryError>;
11
+ }>;
12
+ export declare class TestRepositoryStorage extends TestRepositoryStorage_base {
13
+ }
14
+ export declare const TestResultStorage: Schema.Struct<{
15
+ readonly id: Schema.String;
16
+ readonly hashTestCase: Schema.String;
17
+ readonly key: Schema.String;
18
+ readonly input: Schema.fromJsonString<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
19
+ readonly result: Schema.fromJsonString<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
20
+ readonly expected: Schema.fromJsonString<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
21
+ readonly label: Schema.Literals<readonly ["TP", "TN", "FP", "FN"]>;
22
+ }>;
23
+ type Options = {
24
+ readonly dbPath: string;
25
+ readonly cachePath: string;
26
+ readonly snapshotIdentity: string;
11
27
  };
12
- export declare const makeTestRepository: Effect.Effect<TestRepositoryShape, RepositoryDecodeError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
28
+ export declare const makeTestRepository: (options: Options) => Effect.Effect<{
29
+ repository: {
30
+ commitTestRuns: (runs: readonly TestRun[]) => Effect.Effect<readonly TestRun[], RepositoryError>;
31
+ getTestRun: (run: Pick<TestRun, 'store' | 'id'>) => Effect.Effect<Option.Option<TestRun>, RepositoryError>;
32
+ getLatestTestRun: (input: {
33
+ name: string;
34
+ variant: string;
35
+ }) => Effect.Effect<Option.Option<TestRun>, RepositoryError>;
36
+ getBaselineTestRun: (input: {
37
+ name: string;
38
+ variant: string;
39
+ }) => Effect.Effect<Option.Option<TestRun>, RepositoryError>;
40
+ listTestRuns: (input: {
41
+ name: string;
42
+ variant?: string;
43
+ before?: number;
44
+ limit: number;
45
+ }) => Effect.Effect<ReadonlyArray<TestRun & {
46
+ readonly isBaseline: boolean;
47
+ }>, RepositoryError>;
48
+ listVariantBaselines: (name: string) => Effect.Effect<ReadonlyArray<{
49
+ variant: string;
50
+ baseline: Option.Option<TestRun>;
51
+ }>, RepositoryError>;
52
+ getTestResultsStream: <I = unknown, O = unknown, T = unknown>(testRun: TestRun, schemas: TestResultSchemas<I, O, T>, matching?: ReadonlyArray<Pick<TestResult, 'hashTestCase' | 'key'>>) => Stream.Stream<TestResult<I, O, T>, RepositoryError>;
53
+ withTestRun: <A, E = never, R = never>(input: {
54
+ name: string;
55
+ variant: string;
56
+ }, execute: (testRun: TestRun) => Effect.Effect<A, E, R>) => Effect.Effect<{
57
+ run: TestRun;
58
+ value: A;
59
+ }, E | RepositoryError, R>;
60
+ withStats: <A, E, R>(use: (collector: {
61
+ add: (results: ReadonlyArray<Pick<TestResult, 'hashTestCase' | 'label' | 'timeMillis'>>) => Effect.Effect<void, RepositoryError>;
62
+ stats: Effect.Effect<import("../Classify.ts").Stats, RepositoryError>;
63
+ }) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | Schema.SchemaError | import("effect/sql/SqlError").SqlError, Exclude<R, SqlClient.SqlClient>>;
64
+ insertTestResult: <I, O, T>(result: TestResult<I, O, T>, run: {
65
+ readonly id: number;
66
+ readonly name: string;
67
+ readonly variant: string;
68
+ readonly store: "cache";
69
+ readonly state: "Complete" | "Failed" | "Running";
70
+ } | {
71
+ readonly id: number;
72
+ readonly name: string;
73
+ readonly variant: string;
74
+ readonly store: "snapshot";
75
+ readonly state: "Complete";
76
+ }, schemas: TestResultSchemas<I, O, T>) => Effect.Effect<undefined, Schema.SchemaError | import("effect/sql/SqlError").SqlError | TestRunNotFound | import("../TestValueError.ts").TestValueError, never>;
77
+ insertTestResults: <I, O, T>(results: readonly TestResult<I, O, T>[], run: {
78
+ readonly id: number;
79
+ readonly name: string;
80
+ readonly variant: string;
81
+ readonly store: "cache";
82
+ readonly state: "Complete" | "Failed" | "Running";
83
+ } | {
84
+ readonly id: number;
85
+ readonly name: string;
86
+ readonly variant: string;
87
+ readonly store: "snapshot";
88
+ readonly state: "Complete";
89
+ }, schemas: TestResultSchemas<I, O, T>) => Effect.Effect<undefined, Schema.SchemaError | import("effect/sql/SqlError").SqlError | TestRunNotFound | import("../TestValueError.ts").TestValueError, never>;
90
+ };
91
+ cache: SqlClient.SqlClient;
92
+ snapshot: Effect.Effect<SqlClient.SqlClient, import("../RepositoryError.js").RepositoryFormatError | Schema.SchemaError | import("effect/sql/SqlError").SqlError, never>;
93
+ }, PlatformError | import("../RepositoryError.js").RepositoryFormatError | RepositoryPathConflict | Schema.SchemaError | import("effect/sql/SqlError").SqlError, Crypto.Crypto | FileSystem.FileSystem | Path.Path | Scope.Scope>;
13
94
  //# sourceMappingURL=Test.repository.sqlite.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Test.repository.sqlite.d.ts","sourceRoot":"","sources":["../../../src/internal/Test.repository.sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAGH,MAAM,EAKT,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAEH,KAAK,mBAAmB,EAG3B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAC,cAAc,EAAC,CAAC;AACxB,OAAO,EACH,qBAAqB,EAIxB,MAAM,uBAAuB,CAAC;AAI/B,eAAO,MAAM,MAAM;aACf,WAAW,EAAE,cAAc;aAC3B,QAAQ,EAAE,WAAW;aACrB,cAAc,EAAE,kBAAkB;CAC5B,CAAC;AA+CX,eAAO,MAAM,kBAAkB,yHA0mB7B,CAAC"}
1
+ {"version":3,"file":"Test.repository.sqlite.d.ts","sourceRoot":"","sources":["../../../src/internal/Test.repository.sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,OAAO,EACP,MAAM,EACN,MAAM,EAEN,UAAU,EAEV,MAAM,EACN,IAAI,EAEJ,MAAM,EACN,KAAK,EAEL,MAAM,EAET,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AACrC,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAER,iBAAiB,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EACH,KAAK,eAAe,EACpB,sBAAsB,EAItB,eAAe,EAClB,MAAM,uBAAuB,CAAC;AAU/B,OAAO,EAAC,MAAM,EAAC,MAAM,6BAA6B,CAAC;;uBAI3B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC;;AAF3E,qBAAa,qBAAsB,SAAQ,0BAG4B;CAAG;AAE1E,eAAO,MAAM,iBAAiB;;;;;;;;EAQ5B,CAAC;AAkDH,KAAK,OAAO,GAAG;IACX,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAmP4B,CAAC,EAAE,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;iOAiehE,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { Effect, Schema } from 'effect';
2
+ import type { TestResult } from '../Test.js';
3
+ import type { TestResultSchemas } from '../Test.repository.js';
4
+ import { TestValueError } from '../TestValueError.js';
5
+ /** Stable JSON object order, including records; array order remains significant. */
6
+ export declare const stringifyJson: (value: Schema.Json) => string;
7
+ type ValueContext = Pick<TestValueError, 'suite' | 'caseNumber' | 'key' | 'field'>;
8
+ export declare const makeValueCodec: <T>(schema: Schema.Codec<T, unknown>) => {
9
+ encode: (value: T, context: ValueContext) => Effect.Effect<Schema.Json, TestValueError, never>;
10
+ decode: (text: unknown, context: ValueContext) => Effect.Effect<T, TestValueError, never>;
11
+ };
12
+ /** Reuse the same conversions for result IDs, storage, and reports. */
13
+ export declare const makeResultCodec: <I, O, T>(schemas: TestResultSchemas<I, O, T>, suite: string) => {
14
+ encode: <A extends Pick<TestResult<I, O, T>, 'input' | 'result' | 'expected' | 'key' | 'ordering'>>(value: A) => Effect.Effect<Omit<A, "expected" | "input" | "result"> & {
15
+ input: Schema.Json;
16
+ result: Schema.Json;
17
+ expected: Schema.Json;
18
+ }, TestValueError, never>;
19
+ decode: (value: TestResult<string, string, string>) => Effect.Effect<{
20
+ input: I;
21
+ result: O;
22
+ expected: T;
23
+ id: string;
24
+ hashTestCase: string;
25
+ key: string;
26
+ ordering: number;
27
+ resultOrdering: number;
28
+ label: import("../Classify.ts").Label;
29
+ tags: readonly string[];
30
+ timeMillis: number;
31
+ }, TestValueError, never>;
32
+ };
33
+ export {};
34
+ //# sourceMappingURL=Test.serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Test.serialization.d.ts","sourceRoot":"","sources":["../../../src/internal/Test.serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAEnD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEpD,oFAAoF;AACpF,eAAO,MAAM,aAAa,UAAW,MAAM,CAAC,IAAI,KAAG,MAYlD,CAAC;AAEF,KAAK,YAAY,GAAG,IAAI,CACpB,cAAc,EACd,OAAO,GAAG,YAAY,GAAG,KAAK,GAAG,OAAO,CAC3C,CAAC;AAMF,eAAO,MAAM,cAAc,GAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;;mBA0DxC,OAAO,WAAW,YAAY;CAYvD,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,WAC1B,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAC5B,MAAM;aAMT,CAAC,SAAS,IAAI,CACV,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACnB,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,UAAU,CACvD;;;;;;;;;;;;;;;;;;CAsDR,CAAC"}
@@ -5,7 +5,7 @@ export declare const showHeader: (cfg: DisplayConfig, columnWidths: number[], co
5
5
  label: string;
6
6
  }[]) => string;
7
7
  export declare const showTitle: (cfg: DisplayConfig, columnWidths: number[], title: string) => string;
8
- export declare const showRow: (cfg: DisplayConfig, row: [string, string[]][], columnWidths: number[], height: number) => string;
8
+ export declare const showRow: (cfg: DisplayConfig, row: ReadonlyArray<readonly [string, ReadonlyArray<string>]>, columnWidths: number[], height: number) => string;
9
9
  export declare const colorPositive: (n: number) => colors.StyleFunction;
10
10
  export declare const colorNegative: (n: number) => colors.StyleFunction;
11
11
  //# sourceMappingURL=common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/internal/common.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,UAAU,QACd,aAAa,gBACJ,MAAM,EAAE,YACZ,KAAK,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,QAAQ,KACrE,MAsCF,CAAC;AAEF,eAAO,MAAM,UAAU,QACd,aAAa,gBACJ,MAAM,EAAE,WACb;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,EAAE,KAC3B,MASF,CAAC;AAEF,eAAO,MAAM,SAAS,QACb,aAAa,gBACJ,MAAM,EAAE,SACf,MAAM,KACd,MAYF,CAAC;AAEF,eAAO,MAAM,OAAO,QACX,aAAa,OACb,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,gBACX,MAAM,EAAE,UACd,MAAM,WAejB,CAAC;AAEF,eAAO,MAAM,aAAa,MAAO,MAAM,yBACqB,CAAC;AAE7D,eAAO,MAAM,aAAa,MAAO,MAAM,yBACqB,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/internal/common.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,UAAU,QACd,aAAa,gBACJ,MAAM,EAAE,YACZ,KAAK,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,QAAQ,KACrE,MAsCF,CAAC;AAEF,eAAO,MAAM,UAAU,QACd,aAAa,gBACJ,MAAM,EAAE,WACb;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,EAAE,KAC3B,MASF,CAAC;AAEF,eAAO,MAAM,SAAS,QACb,aAAa,gBACJ,MAAM,EAAE,SACf,MAAM,KACd,MAYF,CAAC;AAEF,eAAO,MAAM,OAAO,QACX,aAAa,OACb,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,gBAC9C,MAAM,EAAE,UACd,MAAM,WAejB,CAAC;AAEF,eAAO,MAAM,aAAa,MAAO,MAAM,yBACqB,CAAC;AAE7D,eAAO,MAAM,aAAa,MAAO,MAAM,yBACqB,CAAC"}
@@ -1,9 +1,24 @@
1
+ import { Option } from 'effect';
2
+ import type { Stats } from '../Classify.js';
1
3
  import type { DisplayConfig } from '../DisplayConfig.js';
2
4
  import type { StatsColumnNames } from '../Show.js';
3
5
  import type { TestRunResults } from '../Test.js';
6
+ import type { TestRun } from '../Test.repository.js';
4
7
  export declare const showStats: <I, O, T>({ testRun, displayConfig, selectColumns, }: {
5
- testRun: Pick<TestRunResults<I, O, T>, 'stats' | 'testCaseHashes'>;
8
+ testRun: Pick<TestRunResults<I, O, T>, 'stats'>;
6
9
  displayConfig?: Partial<DisplayConfig>;
7
10
  selectColumns?: StatsColumnNames[];
8
11
  }) => string;
12
+ /** Missing baselines have no metrics; completed empty runs have zero counts. */
13
+ export declare const showRunSummaries: ({ summaries, displayConfig, }: {
14
+ summaries: ReadonlyArray<{
15
+ name: string;
16
+ variant: string;
17
+ run: Option.Option<TestRun>;
18
+ stats: Option.Option<Stats>;
19
+ retired: boolean;
20
+ source: 'fresh' | 'cache' | 'snapshot';
21
+ }>;
22
+ displayConfig?: Partial<DisplayConfig> | undefined;
23
+ }) => string;
9
24
  //# sourceMappingURL=stats.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/internal/stats.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAc,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AA8G/C,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,8CAe9B;IACC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACtC,KAAG,MAgCH,CAAC"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/internal/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,QAAQ,CAAC;AAE9B,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAc,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,uBAAuB,CAAC;AA8GnD,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,8CAe9B;IACC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChD,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACtC,KAAG,MAgCH,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,kCAG1B;IACC,SAAS,EAAE,aAAa,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;KAC1C,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;CACtD,KAAG,MAgEH,CAAC"}
@@ -1,11 +1,43 @@
1
- import { Array as A, Option } from 'effect';
1
+ import { Array as A, Effect, FileSystem, Option, Schema, Stream } from 'effect';
2
2
  import type { DisplayConfig } from '../DisplayConfig.js';
3
- import type { SummarizeColumnNames } from '../Show.js';
4
- import type { TestRunResults } from '../Test.js';
5
- export declare const showSummary: ({ testRun, displayConfig, previousTestRun, selectColumns, }: {
6
- testRun: TestRunResults;
7
- previousTestRun?: Option.Option<TestRunResults>;
3
+ import type { SummarizeColumnNames, SummarizeContext } from '../Show.js';
4
+ import type { TestResultComparison, TestRunResults } from '../Test.js';
5
+ import type { TestResultSchemas, TestRun } from '../Test.repository.js';
6
+ /** Format schema-encoded values; conversion failures stay in the error channel. */
7
+ export declare const showSummary: <I, O, T>(args_0: {
8
+ testRun: TestRunResults<I, O, T>;
9
+ schemas: TestResultSchemas<I, O, T>;
10
+ previousTestRun?: Option.Option<TestRunResults<I, O, T>>;
8
11
  displayConfig?: Partial<DisplayConfig> | undefined;
9
12
  selectColumns?: A.NonEmptyArray<SummarizeColumnNames>;
10
- }) => string;
13
+ }) => Effect.Effect<string, import("../TestValueError.ts").TestValueError, never>;
14
+ /**
15
+ * Format rows once into a temporary file, then read them back with final column widths.
16
+ * Use inside Effect.scoped; the returned chunks remain readable until that scope closes.
17
+ * Each chunk ends in a newline. Conversion failures fail report preparation.
18
+ */
19
+ export declare const prepareSummary: <I, O, T, E, R>(results: Stream.Stream<Pick<SummarizeContext<I, O, T>, "previousTestResult" | "testResult">, E, R>, args_1: {
20
+ schemas: TestResultSchemas<I, O, T>;
21
+ suite: string;
22
+ displayConfig?: Partial<DisplayConfig> | undefined;
23
+ hasPrevious?: boolean;
24
+ selectColumns?: A.NonEmptyArray<SummarizeColumnNames>;
25
+ }) => Effect.Effect<{
26
+ count: number;
27
+ chunks: Stream.Stream<string, import("effect/PlatformError").PlatformError | Schema.SchemaError, never>;
28
+ }, E | import("effect/PlatformError").PlatformError | import("../TestValueError.ts").TestValueError, R | FileSystem.FileSystem | import("effect/Scope").Scope>;
29
+ /**
30
+ * Show added and removed results with `-` where the other side is missing.
31
+ * Each side uses its own suite name when reporting a codec failure.
32
+ * Prepare and consume the chunks inside `Effect.scoped` so temporary files stay available.
33
+ */
34
+ export declare const prepareComparison: <I, A, B, E, R>(comparisons: Stream.Stream<TestResultComparison<I, A, B>, E, R>, args_1: {
35
+ from: Option.Option<TestRun>;
36
+ to: TestRun;
37
+ schemas: TestResultSchemas<I, A, B>;
38
+ displayConfig?: Partial<DisplayConfig> | undefined;
39
+ }) => Effect.Effect<{
40
+ chunks: Stream.Stream<string, import("effect/PlatformError").PlatformError | Schema.SchemaError, never>;
41
+ count: number;
42
+ }, E | import("effect/PlatformError").PlatformError | import("../TestValueError.ts").TestValueError, R | FileSystem.FileSystem | import("effect/Scope").Scope>;
11
43
  //# sourceMappingURL=summarize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../../src/internal/summarize.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,IAAI,CAAC,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAC;AAElD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAER,oBAAoB,EAEvB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAyI/C,eAAO,MAAM,WAAW,gEAiBrB;IACC,OAAO,EAAE,cAAc,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAChD,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;IACnD,aAAa,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;CACzD,WAgEA,CAAC"}
1
+ {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../../src/internal/summarize.ts"],"names":[],"mappings":"AACA,OAAO,EACH,KAAK,IAAI,CAAC,EACV,MAAM,EACN,UAAU,EACV,MAAM,EAEN,MAAM,EACN,MAAM,EACT,MAAM,QAAQ,CAAC;AAEhB,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAER,oBAAoB,EACpB,gBAAgB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,oBAAoB,EAAE,cAAc,EAAC,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAC,iBAAiB,EAAE,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAmLtE,mFAAmF;AACnF,eAAO,MAAM,WAAW,GAAgC,CAAC,EAAE,CAAC,EAAE,CAAC;aAOlD,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACvB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;sBACjB,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS;oBAClC,CAAC,CAAC,aAAa,CAAC,oBAAoB,CAAC;iFAwDvD,CAAC;AAUH;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAgC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;aAavD,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;WAC5B,MAAM;oBACG,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS;kBACpC,OAAO;oBACL,CAAC,CAAC,aAAa,CAAC,oBAAoB,CAAC;;;;8JAkC3D,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAgC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;UAQ7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QACxB,OAAO;aACF,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnB,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS;;;;8JA2FxD,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Effect, Schema } from 'effect';
2
+ import { SqlClient } from 'effect/sql';
3
+ export declare const getAllTestRuns: Effect.Effect<readonly ({
4
+ readonly id: number;
5
+ readonly name: string;
6
+ readonly variant: string;
7
+ readonly store: "cache";
8
+ readonly state: "Complete" | "Failed" | "Running";
9
+ } | {
10
+ readonly id: number;
11
+ readonly name: string;
12
+ readonly variant: string;
13
+ readonly store: "snapshot";
14
+ readonly state: "Complete";
15
+ })[], Schema.SchemaError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
16
+ export declare const getAllTestResults: Effect.Effect<readonly {
17
+ readonly id: string;
18
+ readonly hashTestCase: string;
19
+ readonly key: string;
20
+ readonly input: Schema.Json;
21
+ readonly result: Schema.Json;
22
+ readonly expected: Schema.Json;
23
+ readonly label: "FN" | "FP" | "TN" | "TP";
24
+ }[], Schema.SchemaError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
25
+ export declare const getAllTestRunResults: Effect.Effect<readonly {
26
+ readonly testRun: number;
27
+ readonly testResult: string;
28
+ readonly ordering: number;
29
+ readonly resultOrdering: number;
30
+ readonly timeMillis: number;
31
+ readonly tags: readonly string[];
32
+ }[], Schema.SchemaError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
33
+ //# sourceMappingURL=test-repository-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-repository-fixtures.d.ts","sourceRoot":"","sources":["../../../src/internal/test-repository-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,MAAM,EAAC,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAMrC,eAAO,MAAM,cAAc;;;;;;;;;;;;uFAKzB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;sFAK5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;sFAc/B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Effect, Schema } from 'effect';
2
+ import type { SqlClient } from 'effect/sql';
3
+ import { RepositoryFormatError } from '../RepositoryError.js';
4
+ export declare const tables: {
5
+ readonly testResults: 'test-results';
6
+ readonly testRuns: 'test-runs';
7
+ readonly testBaselines: 'test-baselines';
8
+ readonly testRunResults: 'test-run-results';
9
+ };
10
+ export declare const checkFormat: (sql: SqlClient.SqlClient, store: "cache" | "snapshot", path: string) => Effect.Effect<undefined, RepositoryFormatError | Schema.SchemaError | import("effect/sql/SqlError").SqlError, never>;
11
+ /**
12
+ * Initialize an empty store. Recheck its marker inside the transaction so another
13
+ * process may finish initialization first. Existing formats are never upgraded.
14
+ */
15
+ export declare const initializeSchema: (sql: SqlClient.SqlClient, store: "cache" | "snapshot", path: string) => Effect.Effect<void, RepositoryFormatError | Schema.SchemaError | import("effect/sql/SqlError").SqlError, never>;
16
+ //# sourceMappingURL=test-repository-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-repository-schema.d.ts","sourceRoot":"","sources":["../../../src/internal/test-repository-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,MAAM,EAAC,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAC,qBAAqB,EAAC,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,MAAM;aACf,WAAW,EAAE,cAAc;aAC3B,QAAQ,EAAE,WAAW;aACrB,aAAa,EAAE,gBAAgB;aAC/B,cAAc,EAAE,kBAAkB;CAC5B,CAAC;AAOX,eAAO,MAAM,WAAW,+LAStB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,0LAmE3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Effect, Schema } from 'effect';
2
+ import { SqlClient } from 'effect/sql';
3
+ import type { TestRepositoryShape } from '../Test.repository.js';
4
+ type Collector = Parameters<Parameters<TestRepositoryShape['withStats']>[0]>[0];
5
+ export declare const withStats: <A, E, R>(use: (collector: Collector) => Effect.Effect<A, E, R>) => Effect.Effect<A, E | Schema.SchemaError | import("effect/sql/SqlError").SqlError, R | SqlClient.SqlClient>;
6
+ export {};
7
+ //# sourceMappingURL=test-result-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-result-stats.d.ts","sourceRoot":"","sources":["../../../src/internal/test-result-stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAe,MAAM,EAAC,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAGrC,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAmB/D,KAAK,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhF,eAAO,MAAM,SAAS,GAAgC,CAAC,EAAE,CAAC,EAAE,CAAC,mBACxC,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,+GAiFvD,CAAC"}
@@ -2,7 +2,6 @@ import { Option, Schema } from 'effect';
2
2
  import * as internal from './internal/Classify.js';
3
3
  export const LabelSchema = internal.LabelSchema;
4
4
  export const values = internal.values;
5
- export const defaultIsEqual = internal.defaultIsEqual;
6
5
  export const defaultIsNil = internal.defaultIsNil;
7
6
  export const makeClassify = internal.makeClassify;
8
7
  /** Counts selected results; timing statistics count each selected case once. */
@@ -1 +1 @@
1
- {"version":3,"file":"Classify.js","names":["Option","Schema","internal","LabelSchema","values","defaultIsEqual","defaultIsNil","makeClassify","Stats","Class","TP","Finite","TN","FP","FN","total","testCases","Int","precision","recall","timeMin","timeMax","timeMedian","timeMean","empty","none"],"sources":["../../src/Classify.ts"],"sourcesContent":[null],"mappings":"AAAA,SAAQA,MAAM,EAAEC,MAAM,QAAO,QAAQ;AAErC,OAAO,KAAKC,QAAQ,MAAM,wBAAwB;AAElD,OAAO,MAAMC,WAAW,GAAGD,QAAQ,CAACC,WAAW;AAG/C,OAAO,MAAMC,MAAM,GAAGF,QAAQ,CAACE,MAAM;AACrC,OAAO,MAAMC,cAAc,GAAGH,QAAQ,CAACG,cAAc;AACrD,OAAO,MAAMC,YAAY,GAAGJ,QAAQ,CAACI,YAAY;AACjD,OAAO,MAAMC,YAAY,GAAGL,QAAQ,CAACK,YAAY;AAIjD;AACA,OAAM,MAAOC,KAAM,sBAAQP,MAAM,CAACQ,KAAK,CAAQ,OAAO,CAAC,CAAC;EACpDC,EAAE,EAAET,MAAM,CAACU,MAAM;EACjBC,EAAE,EAAEX,MAAM,CAACU,MAAM;EACjBE,EAAE,EAAEZ,MAAM,CAACU,MAAM;EACjBG,EAAE,EAAEb,MAAM,CAACU,MAAM;EACjB;EACAI,KAAK,EAAEd,MAAM,CAACU,MAAM;EACpB;EACAK,SAAS,EAAEf,MAAM,CAACgB,GAAG;EACrBC,SAAS,EAAEjB,MAAM,CAACU,MAAM;EACxBQ,MAAM,EAAElB,MAAM,CAACU,MAAM;EACrBS,OAAO,eAAEnB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACU,MAAM,CAAC;EACrCU,OAAO,eAAEpB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACU,MAAM,CAAC;EACrCW,UAAU,eAAErB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACU,MAAM,CAAC;EACxCY,QAAQ,eAAEtB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACU,MAAM;CACxC,CAAC;EACE,OAAOa,KAAKA,CAAA;IACR,OAAO,IAAIhB,KAAK,CAAC;MACbE,EAAE,EAAE,CAAC;MACLE,EAAE,EAAE,CAAC;MACLC,EAAE,EAAE,CAAC;MACLC,EAAE,EAAE,CAAC;MACLC,KAAK,EAAE,CAAC;MACRC,SAAS,EAAE,CAAC;MACZE,SAAS,EAAE,CAAC;MACZC,MAAM,EAAE,CAAC;MACTC,OAAO,EAAEpB,MAAM,CAACyB,IAAI,EAAE;MACtBJ,OAAO,EAAErB,MAAM,CAACyB,IAAI,EAAE;MACtBH,UAAU,EAAEtB,MAAM,CAACyB,IAAI,EAAE;MACzBF,QAAQ,EAAEvB,MAAM,CAACyB,IAAI;KACxB,CAAC;EACN","ignoreList":[]}
1
+ {"version":3,"file":"Classify.js","names":["Option","Schema","internal","LabelSchema","values","defaultIsNil","makeClassify","Stats","Class","TP","Finite","TN","FP","FN","total","testCases","Int","precision","recall","timeMin","timeMax","timeMedian","timeMean","empty","none"],"sources":["../../src/Classify.ts"],"sourcesContent":[null],"mappings":"AAAA,SAAQA,MAAM,EAAEC,MAAM,QAAO,QAAQ;AAErC,OAAO,KAAKC,QAAQ,MAAM,wBAAwB;AAElD,OAAO,MAAMC,WAAW,GAAGD,QAAQ,CAACC,WAAW;AAG/C,OAAO,MAAMC,MAAM,GAAGF,QAAQ,CAACE,MAAM;AACrC,OAAO,MAAMC,YAAY,GAAGH,QAAQ,CAACG,YAAY;AACjD,OAAO,MAAMC,YAAY,GAAGJ,QAAQ,CAACI,YAAY;AAIjD;AACA,OAAM,MAAOC,KAAM,sBAAQN,MAAM,CAACO,KAAK,CAAQ,OAAO,CAAC,CAAC;EACpDC,EAAE,EAAER,MAAM,CAACS,MAAM;EACjBC,EAAE,EAAEV,MAAM,CAACS,MAAM;EACjBE,EAAE,EAAEX,MAAM,CAACS,MAAM;EACjBG,EAAE,EAAEZ,MAAM,CAACS,MAAM;EACjB;EACAI,KAAK,EAAEb,MAAM,CAACS,MAAM;EACpB;EACAK,SAAS,EAAEd,MAAM,CAACe,GAAG;EACrBC,SAAS,EAAEhB,MAAM,CAACS,MAAM;EACxBQ,MAAM,EAAEjB,MAAM,CAACS,MAAM;EACrBS,OAAO,eAAElB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACS,MAAM,CAAC;EACrCU,OAAO,eAAEnB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACS,MAAM,CAAC;EACrCW,UAAU,eAAEpB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACS,MAAM,CAAC;EACxCY,QAAQ,eAAErB,MAAM,CAACD,MAAM,CAACC,MAAM,CAACS,MAAM;CACxC,CAAC;EACE,OAAOa,KAAKA,CAAA;IACR,OAAO,IAAIhB,KAAK,CAAC;MACbE,EAAE,EAAE,CAAC;MACLE,EAAE,EAAE,CAAC;MACLC,EAAE,EAAE,CAAC;MACLC,EAAE,EAAE,CAAC;MACLC,KAAK,EAAE,CAAC;MACRC,SAAS,EAAE,CAAC;MACZE,SAAS,EAAE,CAAC;MACZC,MAAM,EAAE,CAAC;MACTC,OAAO,EAAEnB,MAAM,CAACwB,IAAI,EAAE;MACtBJ,OAAO,EAAEpB,MAAM,CAACwB,IAAI,EAAE;MACtBH,UAAU,EAAErB,MAAM,CAACwB,IAAI,EAAE;MACzBF,QAAQ,EAAEtB,MAAM,CAACwB,IAAI;KACxB,CAAC;EACN","ignoreList":[]}
@@ -1,34 +1,34 @@
1
- import { ResultLengthMismatch, SqlError } from 'effect/sql/SqlError';
2
1
  import { Schema } from 'effect';
3
- const SqlCause = /*#__PURE__*/Schema.Union([/*#__PURE__*/Schema.instanceOf(SqlError), /*#__PURE__*/Schema.instanceOf(ResultLengthMismatch)]);
4
- export class RepositoryQueryError extends /*#__PURE__*/Schema.TaggedError()('RepositoryQueryError', {
5
- operation: Schema.String,
6
- cause: /*#__PURE__*/Schema.instanceOf(SqlError)
7
- }) {
8
- static fromSql = operation => cause => new RepositoryQueryError({
9
- operation,
10
- cause
11
- });
12
- }
13
- export class RepositoryWriteError extends /*#__PURE__*/Schema.TaggedError()('RepositoryWriteError', {
14
- operation: Schema.String,
15
- cause: SqlCause
16
- }) {
17
- static from = operation => cause => new RepositoryWriteError({
18
- operation,
19
- cause
20
- });
21
- }
22
- export class RepositoryDecodeError extends /*#__PURE__*/Schema.TaggedError()('RepositoryDecodeError', {
23
- operation: Schema.String,
24
- cause: /*#__PURE__*/Schema.instanceOf(Schema.SchemaError)
25
- }) {
26
- static from = operation => cause => new RepositoryDecodeError({
27
- operation,
28
- cause
29
- });
30
- }
2
+ export { TestValueError } from './TestValueError.js';
31
3
  export class TestRunNotCreated extends /*#__PURE__*/Schema.TaggedError()('TestRunNotCreated', {
32
4
  testSuiteName: Schema.String
33
5
  }) {}
6
+ /** This operation requires a complete cached attempt or committed snapshot. */
7
+ export class TestRunIncomplete extends /*#__PURE__*/Schema.TaggedError()('TestRunIncomplete', {
8
+ testSuiteName: Schema.String,
9
+ testRunId: Schema.Int,
10
+ variant: Schema.String
11
+ }) {}
12
+ export class TestRunNotFound extends /*#__PURE__*/Schema.TaggedError()('TestRunNotFound', {
13
+ testRunId: Schema.Int
14
+ }) {}
15
+ export class TestBaselineNotFound extends /*#__PURE__*/Schema.TaggedError()('TestBaselineNotFound', {
16
+ testSuiteName: Schema.String,
17
+ variant: Schema.String
18
+ }) {}
19
+ /** The store uses an unsupported format. Snapshot files are left unchanged. */
20
+ export class RepositoryFormatError extends /*#__PURE__*/Schema.TaggedError()('RepositoryFormatError', {
21
+ store: /*#__PURE__*/Schema.Literals(['cache', 'snapshot']),
22
+ path: Schema.String
23
+ }) {}
24
+ /** A commit selects more than one run for the same suite and variant. */
25
+ export class TestRunDuplicate extends /*#__PURE__*/Schema.TaggedError()('TestRunDuplicate', {
26
+ testSuiteName: Schema.String,
27
+ variant: Schema.String
28
+ }) {}
29
+ /** Cache and snapshot paths refer to the same file; no writer has been opened. */
30
+ export class RepositoryPathConflict extends /*#__PURE__*/Schema.TaggedError()('RepositoryPathConflict', {
31
+ snapshotPath: Schema.String,
32
+ cachePath: Schema.String
33
+ }) {}
34
34
  //# sourceMappingURL=RepositoryError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RepositoryError.js","names":["ResultLengthMismatch","SqlError","Schema","SqlCause","Union","instanceOf","RepositoryQueryError","TaggedError","operation","String","cause","fromSql","RepositoryWriteError","from","RepositoryDecodeError","SchemaError","TestRunNotCreated","testSuiteName"],"sources":["../../src/RepositoryError.ts"],"sourcesContent":[null],"mappings":"AAAA,SAAQA,oBAAoB,EAAEC,QAAQ,QAAO,qBAAqB;AAClE,SAAQC,MAAM,QAAO,QAAQ;AAE7B,MAAMC,QAAQ,gBAAGD,MAAM,CAACE,KAAK,CAAC,cAC1BF,MAAM,CAACG,UAAU,CAACJ,QAAQ,CAAC,eAC3BC,MAAM,CAACG,UAAU,CAACL,oBAAoB,CAAC,CAC1C,CAAC;AAEF,OAAM,MAAOM,oBAAqB,sBAAQJ,MAAM,CAACK,WAAW,EAGzD,CAAC,sBAAsB,EAAE;EACxBC,SAAS,EAAEN,MAAM,CAACO,MAAM;EACxBC,KAAK,eAAER,MAAM,CAACG,UAAU,CAACJ,QAAQ;CACpC,CAAC;EACE,OAAOU,OAAO,GAAIH,SAAiB,IAAME,KAAe,IACpD,IAAIJ,oBAAoB,CAAC;IAACE,SAAS;IAAEE;EAAK,CAAC,CAAC;;AAGpD,OAAM,MAAOE,oBAAqB,sBAAQV,MAAM,CAACK,WAAW,EAGzD,CAAC,sBAAsB,EAAE;EAACC,SAAS,EAAEN,MAAM,CAACO,MAAM;EAAEC,KAAK,EAAEP;AAAQ,CAAC,CAAC;EACpE,OAAOU,IAAI,GACNL,SAAiB,IAAME,KAAsC,IAC1D,IAAIE,oBAAoB,CAAC;IAACJ,SAAS;IAAEE;EAAK,CAAC,CAAC;;AAGxD,OAAM,MAAOI,qBAAsB,sBAAQZ,MAAM,CAACK,WAAW,EAG1D,CAAC,uBAAuB,EAAE;EACzBC,SAAS,EAAEN,MAAM,CAACO,MAAM;EACxBC,KAAK,eAAER,MAAM,CAACG,UAAU,CAACH,MAAM,CAACa,WAAW;CAC9C,CAAC;EACE,OAAOF,IAAI,GAAIL,SAAiB,IAAME,KAAyB,IAC3D,IAAII,qBAAqB,CAAC;IAACN,SAAS;IAAEE;EAAK,CAAC,CAAC;;AAGrD,OAAM,MAAOM,iBAAkB,sBAAQd,MAAM,CAACK,WAAW,EAGtD,CAAC,mBAAmB,EAAE;EAACU,aAAa,EAAEf,MAAM,CAACO;AAAM,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"RepositoryError.js","names":["Schema","TestValueError","TestRunNotCreated","TaggedError","testSuiteName","String","TestRunIncomplete","testRunId","Int","variant","TestRunNotFound","TestBaselineNotFound","RepositoryFormatError","store","Literals","path","TestRunDuplicate","RepositoryPathConflict","snapshotPath","cachePath"],"sources":["../../src/RepositoryError.ts"],"sourcesContent":[null],"mappings":"AAEA,SAAQA,MAAM,QAAO,QAAQ;AAG7B,SAAQC,cAAc,QAAO,qBAAqB;AAElD,OAAM,MAAOC,iBAAkB,sBAAQF,MAAM,CAACG,WAAW,EAGtD,CAAC,mBAAmB,EAAE;EAACC,aAAa,EAAEJ,MAAM,CAACK;AAAM,CAAC,CAAC;AAExD;AACA,OAAM,MAAOC,iBAAkB,sBAAQN,MAAM,CAACG,WAAW,EAGtD,CAAC,mBAAmB,EAAE;EACrBC,aAAa,EAAEJ,MAAM,CAACK,MAAM;EAC5BE,SAAS,EAAEP,MAAM,CAACQ,GAAG;EACrBC,OAAO,EAAET,MAAM,CAACK;CACnB,CAAC;AAEF,OAAM,MAAOK,eAAgB,sBAAQV,MAAM,CAACG,WAAW,EAGpD,CAAC,iBAAiB,EAAE;EAACI,SAAS,EAAEP,MAAM,CAACQ;AAAG,CAAC,CAAC;AAE/C,OAAM,MAAOG,oBAAqB,sBAAQX,MAAM,CAACG,WAAW,EAGzD,CAAC,sBAAsB,EAAE;EACxBC,aAAa,EAAEJ,MAAM,CAACK,MAAM;EAC5BI,OAAO,EAAET,MAAM,CAACK;CACnB,CAAC;AAEF;AACA,OAAM,MAAOO,qBAAsB,sBAAQZ,MAAM,CAACG,WAAW,EAG1D,CAAC,uBAAuB,EAAE;EACzBU,KAAK,eAAEb,MAAM,CAACc,QAAQ,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;EAC7CC,IAAI,EAAEf,MAAM,CAACK;CAChB,CAAC;AAEF;AACA,OAAM,MAAOW,gBAAiB,sBAAQhB,MAAM,CAACG,WAAW,EAGrD,CAAC,kBAAkB,EAAE;EACpBC,aAAa,EAAEJ,MAAM,CAACK,MAAM;EAC5BI,OAAO,EAAET,MAAM,CAACK;CACnB,CAAC;AAEF;AACA,OAAM,MAAOY,sBAAuB,sBAAQjB,MAAM,CAACG,WAAW,EAG3D,CAAC,wBAAwB,EAAE;EAC1Be,YAAY,EAAElB,MAAM,CAACK,MAAM;EAC3Bc,SAAS,EAAEnB,MAAM,CAACK;CACrB,CAAC","ignoreList":[]}
package/dist/esm/Show.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { showDiff as diff } from './internal/diff.js';
2
- export { showStats as stats } from './internal/stats.js';
3
- export { showSummary as summarize } from './internal/summarize.js';
2
+ export { showStats as stats, showRunSummaries as runSummaries } from './internal/stats.js';
3
+ export { showSummary as summarize, prepareSummary, prepareComparison } from './internal/summarize.js';
4
4
  //# sourceMappingURL=Show.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Show.js","names":["showDiff","diff","showStats","stats","showSummary","summarize"],"sources":["../../src/Show.ts"],"sourcesContent":[null],"mappings":"AAKA,SAAQA,QAAQ,IAAIC,IAAI,QAAO,oBAAoB;AACnD,SAAQC,SAAS,IAAIC,KAAK,QAAO,qBAAqB;AACtD,SAAQC,WAAW,IAAIC,SAAS,QAAO,yBAAyB","ignoreList":[]}
1
+ {"version":3,"file":"Show.js","names":["showDiff","diff","showStats","stats","showRunSummaries","runSummaries","showSummary","summarize","prepareSummary","prepareComparison"],"sources":["../../src/Show.ts"],"sourcesContent":[null],"mappings":"AAKA,SAAQA,QAAQ,IAAIC,IAAI,QAAO,oBAAoB;AACnD,SACIC,SAAS,IAAIC,KAAK,EAClBC,gBAAgB,IAAIC,YAAY,QAC7B,qBAAqB;AAC5B,SACIC,WAAW,IAAIC,SAAS,EACxBC,cAAc,EACdC,iBAAiB,QACd,yBAAyB","ignoreList":[]}
package/dist/esm/Test.js CHANGED
@@ -1,7 +1,43 @@
1
+ import { Schema } from 'effect';
1
2
  import * as internal from './internal/Test.js';
3
+ export class TestVariantRequired extends /*#__PURE__*/Schema.TaggedError()('TestVariantRequired', {
4
+ testSuiteName: Schema.String
5
+ }) {}
6
+ export class TestVariantNotFound extends /*#__PURE__*/Schema.TaggedError()('TestVariantNotFound', {
7
+ testSuiteName: Schema.String,
8
+ variant: Schema.String
9
+ }) {}
10
+ /** Selects a program without running it or requiring its services. */
11
+ export const selectVariant = internal.selectVariant;
12
+ /**
13
+ * Runs only the selected program. Named variants require an explicit selection;
14
+ * a single program uses `default`. Its error and service types include every
15
+ * configured program and the case stream, even when the variant ID is a literal.
16
+ */
2
17
  export const all = internal.all;
18
+ /**
19
+ * Compares complete cached runs or committed snapshots without evaluating again.
20
+ * The shared codecs must decode both runs and require no Effect services.
21
+ * Callers decide whether comparing different suites or program versions is meaningful.
22
+ *
23
+ * Results match by case hash and evaluation key. A match changes when its label
24
+ * or evaluated values change. Rows follow `to` order, followed by rows found only
25
+ * in `from`, in `from` order. Empty complete runs are valid comparison endpoints.
26
+ * Resolve missing baselines before calling. Both runs must still exist in their
27
+ * stores; a cached attempt replaced by another execution cannot be read.
28
+ * Incompatible codecs fail with `TestValueError`, which names the stored suite.
29
+ */
30
+ export const compareRuns = internal.compareRuns;
31
+ /**
32
+ * Summarizes all matching results in a complete cached run or snapshot, including
33
+ * unchanged results. Each case contributes its timing once. Empty complete runs
34
+ * have zero counts and no timing values.
35
+ * The shared codecs must still read that run. The caller decides whether the
36
+ * stored values still have the same meaning. Resolve a missing baseline before
37
+ * calling; it differs from an empty run.
38
+ */
39
+ export const summarizeRun = internal.summarizeRun;
3
40
  export const diff = internal.diff;
4
- export const makeSha256 = internal.makeSha256;
5
41
  /** Builds the lookup key for one evaluation within its original test case. */
6
42
  export const resultKey = internal.resultKey;
7
43
  export const runCollectRecord = internal.runCollectRecord;
@@ -1 +1 @@
1
- {"version":3,"file":"Test.js","names":["internal","all","diff","makeSha256","resultKey","runCollectRecord","filterResults"],"sources":["../../src/Test.ts"],"sourcesContent":[null],"mappings":"AAGA,OAAO,KAAKA,QAAQ,MAAM,oBAAoB;AAyG9C,OAAO,MAAMC,GAAG,GAAGD,QAAQ,CAACC,GAAG;AAC/B,OAAO,MAAMC,IAAI,GAAGF,QAAQ,CAACE,IAAI;AACjC,OAAO,MAAMC,UAAU,GAAGH,QAAQ,CAACG,UAAU;AAC7C;AACA,OAAO,MAAMC,SAAS,GAAGJ,QAAQ,CAACI,SAAS;AAC3C,OAAO,MAAMC,gBAAgB,GAAGL,QAAQ,CAACK,gBAAgB;AACzD;AACA,OAAO,MAAMC,aAAa,GAAGN,QAAQ,CAACM,aAAa","ignoreList":[]}
1
+ {"version":3,"file":"Test.js","names":["Schema","internal","TestVariantRequired","TaggedError","testSuiteName","String","TestVariantNotFound","variant","selectVariant","all","compareRuns","summarizeRun","diff","resultKey","runCollectRecord","filterResults"],"sources":["../../src/Test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAIIA,MAAM,QAEH,QAAQ;AAGf,OAAO,KAAKC,QAAQ,MAAM,oBAAoB;AA2E9C,OAAM,MAAOC,mBAAoB,sBAAQF,MAAM,CAACG,WAAW,EAGxD,CAAC,qBAAqB,EAAE;EAACC,aAAa,EAAEJ,MAAM,CAACK;AAAM,CAAC,CAAC;AAE1D,OAAM,MAAOC,mBAAoB,sBAAQN,MAAM,CAACG,WAAW,EAGxD,CAAC,qBAAqB,EAAE;EACvBC,aAAa,EAAEJ,MAAM,CAACK,MAAM;EAC5BE,OAAO,EAAEP,MAAM,CAACK;CACnB,CAAC;AAoGF;AACA,OAAO,MAAMG,aAAa,GAAGP,QAAQ,CAACO,aAAa;AAEnD;;;;;AAKA,OAAO,MAAMC,GAAG,GAAGR,QAAQ,CAACQ,GAAG;AAC/B;;;;;;;;;;;;AAYA,OAAO,MAAMC,WAAW,GAAGT,QAAQ,CAACS,WAAW;AAC/C;;;;;;;;AAQA,OAAO,MAAMC,YAAY,GAAGV,QAAQ,CAACU,YAAY;AACjD,OAAO,MAAMC,IAAI,GAAGX,QAAQ,CAACW,IAAI;AACjC;AACA,OAAO,MAAMC,SAAS,GAAGZ,QAAQ,CAACY,SAAS;AAC3C,OAAO,MAAMC,gBAAgB,GAAGb,QAAQ,CAACa,gBAAgB;AACzD;AACA,OAAO,MAAMC,aAAa,GAAGd,QAAQ,CAACc,aAAa","ignoreList":[]}
@@ -1,25 +1,30 @@
1
- import * as Sqlite from '@effect/sql-sqlite-node';
2
- import { Context, Layer } from 'effect';
3
- import { makeTestRepository } from './internal/Test.repository.sqlite.js';
4
- export { TestRun } from './Test.repository.types.js';
5
- const makeTestLayer = () => Layer.provideMerge(TestRepository.Live, Sqlite.SqliteClient.layer({
6
- filename: ':memory:'
7
- }));
8
- let testLayerCache;
9
- export class TestRepository extends /*#__PURE__*/Context.Service()('TestRepository') {
10
- // Lazy getters: makeTestRepository lives in an internal module that has
11
- // its own import edge back here, so we evaluate these at access time
12
- // rather than at class definition time to avoid the circular init order.
13
- static get Live() {
14
- return Layer.effect(this, makeTestRepository);
1
+ import { NodeServices } from '@effect/platform-node';
2
+ import { Context, Effect, Layer } from 'effect';
3
+ import { SqlClient } from 'effect/sql';
4
+ import { makeTestRepository, TestRepositoryStorage } from './internal/Test.repository.sqlite.js';
5
+ export { TestRun } from './TestRun.js';
6
+ export class TestRepository extends /*#__PURE__*/Context.Service()('@creative-introvert/tons-of-tests/TestRepository') {
7
+ /**
8
+ * Keep cache rows separate by `snapshotIdentity`, even when repositories share a
9
+ * cache filename. Cache and snapshot paths must refer to different files.
10
+ * With `:memory:`, each store lasts for this layer's lifetime.
11
+ * The caller supplies platform services; `CLI.buildLayer` also resolves paths.
12
+ */
13
+ static layer(options) {
14
+ return Layer.effect(this, makeTestRepository(options).pipe(Effect.map(({
15
+ repository
16
+ }) => repository)));
15
17
  }
16
- static layer(dbPath) {
17
- return Layer.provide(this.Live, Sqlite.SqliteClient.layer({
18
- filename: dbPath
18
+ /** Use separate in-memory stores and platform services for isolated tests. */
19
+ static TestLayer = /*#__PURE__*/Layer.effectContext(Effect.gen(function* () {
20
+ const stores = yield* makeTestRepository({
21
+ dbPath: ':memory:',
22
+ cachePath: ':memory:',
23
+ snapshotIdentity: 'test'
24
+ });
25
+ return Context.make(TestRepository, stores.repository).pipe(Context.add(SqlClient.SqlClient, stores.cache), Context.add(TestRepositoryStorage, {
26
+ snapshot: stores.snapshot
19
27
  }));
20
- }
21
- static get TestLayer() {
22
- return testLayerCache ??= makeTestLayer();
23
- }
28
+ })).pipe(/*#__PURE__*/Layer.provide(NodeServices.layer));
24
29
  }
25
30
  //# sourceMappingURL=Test.repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Test.repository.js","names":["Sqlite","Context","Layer","makeTestRepository","TestRun","makeTestLayer","provideMerge","TestRepository","Live","SqliteClient","layer","filename","testLayerCache","Service","effect","dbPath","provide","TestLayer"],"sources":["../../src/Test.repository.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,yBAAyB;AACjD,SAAQC,OAAO,EAAEC,KAAK,QAAO,QAAQ;AAErC,SAAQC,kBAAkB,QAAO,sCAAsC;AAGvE,SAAQC,OAAO,QAAO,4BAA4B;AAQlD,MAAMC,aAAa,GAAGA,CAAA,KAClBH,KAAK,CAACI,YAAY,CACdC,cAAc,CAACC,IAAI,EACnBR,MAAM,CAACS,YAAY,CAACC,KAAK,CAAC;EAACC,QAAQ,EAAE;AAAU,CAAC,CAAC,CACpD;AAEL,IAAIC,cAA4D;AAEhE,OAAM,MAAOL,cAAe,sBAAQN,OAAO,CAACY,OAAO,EAGhD,CAAC,gBAAgB,CAAC;EACjB;EACA;EACA;EACA,WAAWL,IAAIA,CAAA;IACX,OAAON,KAAK,CAACY,MAAM,CAAC,IAAI,EAAEX,kBAAkB,CAAC;EACjD;EACA,OAAOO,KAAKA,CAACK,MAAc;IACvB,OAAOb,KAAK,CAACc,OAAO,CAChB,IAAI,CAACR,IAAI,EACTR,MAAM,CAACS,YAAY,CAACC,KAAK,CAAC;MAACC,QAAQ,EAAEI;IAAM,CAAC,CAAC,CAChD;EACL;EAEA,WAAWE,SAASA,CAAA;IAChB,OAAQL,cAAc,KAAKP,aAAa,EAAE;EAC9C","ignoreList":[]}
1
+ {"version":3,"file":"Test.repository.js","names":["NodeServices","Context","Effect","Layer","SqlClient","makeTestRepository","TestRepositoryStorage","TestRun","TestRepository","Service","layer","options","effect","pipe","map","repository","TestLayer","effectContext","gen","stores","dbPath","cachePath","snapshotIdentity","make","add","cache","snapshot","provide"],"sources":["../../src/Test.repository.ts"],"sourcesContent":[null],"mappings":"AAAA,SAAQA,YAAY,QAAO,uBAAuB;AAClD,SACIC,OAAO,EACPC,MAAM,EACNC,KAAK,QAIF,QAAQ;AACf,SAAQC,SAAS,QAAO,YAAY;AAGpC,SACIC,kBAAkB,EAClBC,qBAAqB,QAClB,sCAAsC;AAK7C,SAAQC,OAAO,QAAO,cAAc;AAsIpC,OAAM,MAAOC,cAAe,sBAAQP,OAAO,CAACQ,OAAO,EAGhD,CAAC,kDAAkD,CAAC;EACnD;;;;;;EAMA,OAAOC,KAAKA,CAACC,OAIZ;IACG,OAAOR,KAAK,CAACS,MAAM,CACf,IAAI,EACJP,kBAAkB,CAACM,OAAO,CAAC,CAACE,IAAI,CAC5BX,MAAM,CAACY,GAAG,CAAC,CAAC;MAACC;IAAU,CAAC,KAAKA,UAAU,CAAC,CAC3C,CACJ;EACL;EAEA;EACA,OAAgBC,SAAS,gBAAGb,KAAK,CAACc,aAAa,CAC3Cf,MAAM,CAACgB,GAAG,CAAC,aAAS;IAChB,MAAMC,MAAM,GAAG,OAAOd,kBAAkB,CAAC;MACrCe,MAAM,EAAE,UAAU;MAClBC,SAAS,EAAE,UAAU;MACrBC,gBAAgB,EAAE;KACrB,CAAC;IACF,OAAOrB,OAAO,CAACsB,IAAI,CAACf,cAAc,EAAEW,MAAM,CAACJ,UAAU,CAAC,CAACF,IAAI,CACvDZ,OAAO,CAACuB,GAAG,CAACpB,SAAS,CAACA,SAAS,EAAEe,MAAM,CAACM,KAAK,CAAC,EAC9CxB,OAAO,CAACuB,GAAG,CAAClB,qBAAqB,EAAE;MAACoB,QAAQ,EAAEP,MAAM,CAACO;IAAQ,CAAC,CAAC,CAClE;EACL,CAAC,CAAC,CACL,CAACb,IAAI,cAACV,KAAK,CAACwB,OAAO,CAAC3B,YAAY,CAACU,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import { Schema } from 'effect';
2
+ const fields = {
3
+ id: Schema.Int,
4
+ name: Schema.String,
5
+ variant: Schema.String
6
+ };
7
+ /**
8
+ * Identify a run by both `store` and `id`; the two stores can use the same ID.
9
+ * A new execution replaces the cached attempt for its snapshot identity, suite,
10
+ * and variant. Complete attempts, including empty ones, can be reused or committed.
11
+ * Committed snapshots stay unchanged after a program changes or is removed.
12
+ */
13
+ export const TestRun = /*#__PURE__*/Schema.Union([/*#__PURE__*/Schema.Struct({
14
+ ...fields,
15
+ store: /*#__PURE__*/Schema.Literal('cache'),
16
+ state: /*#__PURE__*/Schema.Literals(['Running', 'Complete', 'Failed'])
17
+ }), /*#__PURE__*/Schema.Struct({
18
+ ...fields,
19
+ store: /*#__PURE__*/Schema.Literal('snapshot'),
20
+ state: /*#__PURE__*/Schema.Literal('Complete')
21
+ })]);
22
+ //# sourceMappingURL=TestRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestRun.js","names":["Schema","fields","id","Int","name","String","variant","TestRun","Union","Struct","store","Literal","state","Literals"],"sources":["../../src/TestRun.ts"],"sourcesContent":[null],"mappings":"AAAA,SAAQA,MAAM,QAAO,QAAQ;AAE7B,MAAMC,MAAM,GAAG;EACXC,EAAE,EAAEF,MAAM,CAACG,GAAG;EACdC,IAAI,EAAEJ,MAAM,CAACK,MAAM;EACnBC,OAAO,EAAEN,MAAM,CAACK;CACnB;AAED;;;;;;AAMA,OAAO,MAAME,OAAO,gBAAGP,MAAM,CAACQ,KAAK,CAAC,cAChCR,MAAM,CAACS,MAAM,CAAC;EACV,GAAGR,MAAM;EACTS,KAAK,eAAEV,MAAM,CAACW,OAAO,CAAC,OAAO,CAAC;EAC9BC,KAAK,eAAEZ,MAAM,CAACa,QAAQ,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC;CAC3D,CAAC,eACFb,MAAM,CAACS,MAAM,CAAC;EACV,GAAGR,MAAM;EACTS,KAAK,eAAEV,MAAM,CAACW,OAAO,CAAC,UAAU,CAAC;EACjCC,KAAK,eAAEZ,MAAM,CAACW,OAAO,CAAC,UAAU;CACnC,CAAC,CACL,CAAC","ignoreList":[]}