@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.
- package/README.md +143 -37
- package/dist/cjs/Classify.js +1 -2
- package/dist/cjs/Classify.js.map +1 -1
- package/dist/cjs/RepositoryError.js +42 -33
- package/dist/cjs/RepositoryError.js.map +1 -1
- package/dist/cjs/Show.js +18 -0
- package/dist/cjs/Show.js.map +1 -1
- package/dist/cjs/Test.js +40 -2
- package/dist/cjs/Test.js.map +1 -1
- package/dist/cjs/Test.repository.js +25 -22
- package/dist/cjs/Test.repository.js.map +1 -1
- package/dist/cjs/TestRun.js +28 -0
- package/dist/cjs/TestRun.js.map +1 -0
- package/dist/cjs/TestValueError.js +23 -0
- package/dist/cjs/TestValueError.js.map +1 -0
- package/dist/cjs/index.js +0 -7
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/Classify.js +1 -9
- package/dist/cjs/internal/Classify.js.map +1 -1
- package/dist/cjs/internal/Test.js +235 -95
- package/dist/cjs/internal/Test.js.map +1 -1
- package/dist/cjs/internal/Test.repository.sqlite.js +487 -356
- package/dist/cjs/internal/Test.repository.sqlite.js.map +1 -1
- package/dist/cjs/internal/Test.serialization.js +128 -0
- package/dist/cjs/internal/Test.serialization.js.map +1 -0
- package/dist/cjs/internal/common.js.map +1 -1
- package/dist/cjs/internal/stats.js +29 -1
- package/dist/cjs/internal/stats.js.map +1 -1
- package/dist/cjs/internal/summarize.js +143 -29
- package/dist/cjs/internal/summarize.js.map +1 -1
- package/dist/cjs/internal/test-repository-fixtures.js +31 -0
- package/dist/cjs/internal/test-repository-fixtures.js.map +1 -0
- package/dist/cjs/internal/test-repository-schema.js +98 -0
- package/dist/cjs/internal/test-repository-schema.js.map +1 -0
- package/dist/cjs/internal/test-result-stats.js +89 -0
- package/dist/cjs/internal/test-result-stats.js.map +1 -0
- package/dist/dts/Classify.d.ts +0 -1
- package/dist/dts/Classify.d.ts.map +1 -1
- package/dist/dts/RepositoryError.d.ts +47 -20
- package/dist/dts/RepositoryError.d.ts.map +1 -1
- package/dist/dts/Show.d.ts +5 -5
- package/dist/dts/Show.d.ts.map +1 -1
- package/dist/dts/Test.d.ts +136 -13
- package/dist/dts/Test.d.ts.map +1 -1
- package/dist/dts/Test.repository.d.ts +132 -9
- package/dist/dts/Test.repository.d.ts.map +1 -1
- package/dist/dts/TestRun.d.ts +22 -0
- package/dist/dts/TestRun.d.ts.map +1 -0
- package/dist/dts/TestValueError.d.ts +17 -0
- package/dist/dts/TestValueError.d.ts.map +1 -0
- package/dist/dts/index.d.ts +0 -1
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/Classify.d.ts +0 -1
- package/dist/dts/internal/Classify.d.ts.map +1 -1
- package/dist/dts/internal/Test.d.ts +64 -30
- package/dist/dts/internal/Test.d.ts.map +1 -1
- package/dist/dts/internal/Test.repository.sqlite.d.ts +92 -11
- package/dist/dts/internal/Test.repository.sqlite.d.ts.map +1 -1
- package/dist/dts/internal/Test.serialization.d.ts +34 -0
- package/dist/dts/internal/Test.serialization.d.ts.map +1 -0
- package/dist/dts/internal/common.d.ts +1 -1
- package/dist/dts/internal/common.d.ts.map +1 -1
- package/dist/dts/internal/stats.d.ts +16 -1
- package/dist/dts/internal/stats.d.ts.map +1 -1
- package/dist/dts/internal/summarize.d.ts +39 -7
- package/dist/dts/internal/summarize.d.ts.map +1 -1
- package/dist/dts/internal/test-repository-fixtures.d.ts +33 -0
- package/dist/dts/internal/test-repository-fixtures.d.ts.map +1 -0
- package/dist/dts/internal/test-repository-schema.d.ts +16 -0
- package/dist/dts/internal/test-repository-schema.d.ts.map +1 -0
- package/dist/dts/internal/test-result-stats.d.ts +7 -0
- package/dist/dts/internal/test-result-stats.d.ts.map +1 -0
- package/dist/esm/Classify.js +0 -1
- package/dist/esm/Classify.js.map +1 -1
- package/dist/esm/RepositoryError.js +29 -29
- package/dist/esm/RepositoryError.js.map +1 -1
- package/dist/esm/Show.js +2 -2
- package/dist/esm/Show.js.map +1 -1
- package/dist/esm/Test.js +37 -1
- package/dist/esm/Test.js.map +1 -1
- package/dist/esm/Test.repository.js +26 -21
- package/dist/esm/Test.repository.js.map +1 -1
- package/dist/esm/TestRun.js +22 -0
- package/dist/esm/TestRun.js.map +1 -0
- package/dist/esm/TestValueError.js +16 -0
- package/dist/esm/TestValueError.js.map +1 -0
- package/dist/esm/index.js +0 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/Classify.js +0 -7
- package/dist/esm/internal/Classify.js.map +1 -1
- package/dist/esm/internal/Test.js +231 -94
- package/dist/esm/internal/Test.js.map +1 -1
- package/dist/esm/internal/Test.repository.sqlite.js +486 -356
- package/dist/esm/internal/Test.repository.sqlite.js.map +1 -1
- package/dist/esm/internal/Test.serialization.js +119 -0
- package/dist/esm/internal/Test.serialization.js.map +1 -0
- package/dist/esm/internal/common.js.map +1 -1
- package/dist/esm/internal/stats.js +27 -0
- package/dist/esm/internal/stats.js.map +1 -1
- package/dist/esm/internal/summarize.js +143 -28
- package/dist/esm/internal/summarize.js.map +1 -1
- package/dist/esm/internal/test-repository-fixtures.js +25 -0
- package/dist/esm/internal/test-repository-fixtures.js.map +1 -0
- package/dist/esm/internal/test-repository-schema.js +92 -0
- package/dist/esm/internal/test-repository-schema.js.map +1 -0
- package/dist/esm/internal/test-result-stats.js +83 -0
- package/dist/esm/internal/test-result-stats.js.map +1 -0
- package/package.json +1 -1
- package/dist/cjs/Test.repository.types.js +0 -14
- package/dist/cjs/Test.repository.types.js.map +0 -1
- package/dist/cjs/internal/lib/Schema.js +0 -14
- package/dist/cjs/internal/lib/Schema.js.map +0 -1
- package/dist/dts/Test.repository.types.d.ts +0 -62
- package/dist/dts/Test.repository.types.d.ts.map +0 -1
- package/dist/dts/internal/lib/Schema.d.ts +0 -4
- package/dist/dts/internal/lib/Schema.d.ts.map +0 -1
- package/dist/esm/Test.repository.types.js +0 -7
- package/dist/esm/Test.repository.types.js.map +0 -1
- package/dist/esm/internal/lib/Schema.js +0 -7
- package/dist/esm/internal/lib/Schema.js.map +0 -1
|
@@ -1,13 +1,94 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
readonly
|
|
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<
|
|
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":"
|
|
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
|
|
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,
|
|
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'
|
|
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":"
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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,
|
|
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"}
|
package/dist/esm/Classify.js
CHANGED
|
@@ -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. */
|
package/dist/esm/Classify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Classify.js","names":["Option","Schema","internal","LabelSchema","values","
|
|
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
|
-
|
|
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":["
|
|
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
|
package/dist/esm/Show.js.map
CHANGED
|
@@ -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,
|
|
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;
|
package/dist/esm/Test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Test.js","names":["internal","all","
|
|
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
|
|
2
|
-
import { Context, Layer } from 'effect';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
static
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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":["
|
|
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":[]}
|