@elench/testkit 0.1.142 → 0.1.144
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 +22 -5
- package/lib/config/database-materialization.mjs +62 -0
- package/lib/config/database.mjs +10 -30
- package/lib/config/index.mjs +27 -7
- package/lib/config-api/index.d.ts +14 -34
- package/lib/config-api/index.mjs +8 -3
- package/lib/database/index.mjs +18 -4
- package/lib/local/kiln-driver.mjs +72 -32
- package/lib/local/orchestrator.mjs +2 -0
- package/lib/runner/results.mjs +8 -2
- package/lib/runner/template.mjs +14 -7
- package/node_modules/@elench/next-analysis/package.json +1 -1
- package/node_modules/@elench/testkit-bridge/package.json +2 -2
- package/node_modules/@elench/testkit-protocol/package.json +1 -1
- package/node_modules/@elench/ts-analysis/package.json +1 -1
- package/package.json +5 -5
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts +188 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts.map +1 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js +293 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js.map +1 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/package.json +25 -0
package/README.md
CHANGED
|
@@ -230,6 +230,7 @@ import {
|
|
|
230
230
|
defineConfig,
|
|
231
231
|
defineFile,
|
|
232
232
|
environment,
|
|
233
|
+
resource,
|
|
233
234
|
toolchain,
|
|
234
235
|
} from "@elench/testkit/config";
|
|
235
236
|
|
|
@@ -257,9 +258,17 @@ export default defineConfig({
|
|
|
257
258
|
}),
|
|
258
259
|
},
|
|
259
260
|
environments: {
|
|
260
|
-
local: environment.
|
|
261
|
+
local: environment.productionLike({
|
|
261
262
|
target: "frontend",
|
|
262
263
|
data: "reuse",
|
|
264
|
+
resources: {
|
|
265
|
+
databases: {
|
|
266
|
+
api: resource.postgres({
|
|
267
|
+
version: "16",
|
|
268
|
+
extensions: ["vector"],
|
|
269
|
+
}),
|
|
270
|
+
},
|
|
271
|
+
},
|
|
263
272
|
}),
|
|
264
273
|
},
|
|
265
274
|
services: {
|
|
@@ -342,10 +351,15 @@ right way to move expensive browser targets from `next dev` / watch mode to
|
|
|
342
351
|
stable build-and-start flows.
|
|
343
352
|
|
|
344
353
|
`testkit local` starts the same service graph as a persistent local production
|
|
345
|
-
environment instead of a test run.
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
354
|
+
environment instead of a test run. Service database declarations stay logical:
|
|
355
|
+
`database.postgres(...)` says the service needs Postgres, while the selected
|
|
356
|
+
environment decides where that database is materialized. Normal `testkit run`
|
|
357
|
+
uses transient host Docker Postgres. `environment.productionLike(...)` uses the
|
|
358
|
+
Kiln driver by default and maps `resources.databases.<serviceName>` to durable
|
|
359
|
+
Postgres appliances for `testkit local up`. It runs template setup,
|
|
360
|
+
`runtime.prepare`, starts dependent services, and records state under
|
|
361
|
+
`.testkit/environments/<name>/` rather than `.testkit/_runs`. Local environment
|
|
362
|
+
processes receive `TESTKIT_ACTIVE=1`, `TESTKIT_MODE=local`, and
|
|
349
363
|
`TESTKIT_LOCAL_ENV=<name>`. Use `data: "reuse"` for fast restarts against the
|
|
350
364
|
existing local runtime database, `data: "reset"` to refresh runtime databases
|
|
351
365
|
from their templates on each launch, or `--rebuild` to destroy and recreate the
|
|
@@ -741,6 +755,9 @@ Git metadata.
|
|
|
741
755
|
`@elench/testkit` provisions Docker-managed local Postgres automatically for
|
|
742
756
|
services that define `database: database.postgres(...)`.
|
|
743
757
|
|
|
758
|
+
- normal test runs always use transient host-managed Postgres
|
|
759
|
+
- named production-like local environments can place the same logical service
|
|
760
|
+
database on a Kiln Postgres appliance via `resources.databases.<serviceName>`
|
|
744
761
|
- template databases are cached
|
|
745
762
|
- runtime databases are cloned from templates when binding is `per-runtime`
|
|
746
763
|
- shared databases are reused when binding is `shared`
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const DEFAULT_LOCAL_IMAGE = "pgvector/pgvector:pg16";
|
|
2
|
+
const DEFAULT_LOCAL_USER = "testkit";
|
|
3
|
+
const DEFAULT_LOCAL_PASSWORD = "testkit";
|
|
4
|
+
|
|
5
|
+
export function buildEnvironmentDatabaseMaterialization(environment = {}) {
|
|
6
|
+
const databases = environment.resources?.databases || {};
|
|
7
|
+
return {
|
|
8
|
+
resourcesByService: Object.fromEntries(
|
|
9
|
+
Object.keys(databases).map((serviceName) => [serviceName, serviceName])
|
|
10
|
+
),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function materializeDatabaseConfig(database, serviceName, materialization = {}) {
|
|
15
|
+
if (!database) return undefined;
|
|
16
|
+
if (database.provider) {
|
|
17
|
+
return materializeExplicitProviderDatabaseConfig(database, serviceName);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const resourceName = materialization.resourcesByService?.[serviceName] || null;
|
|
21
|
+
if (resourceName) {
|
|
22
|
+
return {
|
|
23
|
+
...database,
|
|
24
|
+
provider: "resource",
|
|
25
|
+
selectedBackend: "resource",
|
|
26
|
+
resource: resourceName,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
...database,
|
|
32
|
+
provider: "local",
|
|
33
|
+
selectedBackend: "local",
|
|
34
|
+
image: database.image || DEFAULT_LOCAL_IMAGE,
|
|
35
|
+
user: database.user || DEFAULT_LOCAL_USER,
|
|
36
|
+
password: database.password || DEFAULT_LOCAL_PASSWORD,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function materializeExplicitProviderDatabaseConfig(database, serviceName) {
|
|
41
|
+
if (database.provider === "resource") {
|
|
42
|
+
const resource = String(database.resource || "").trim();
|
|
43
|
+
if (!resource) {
|
|
44
|
+
throw new Error(`Service "${serviceName}" database.resource must be a non-empty string`);
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
...database,
|
|
48
|
+
resource,
|
|
49
|
+
selectedBackend: "resource",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (database.provider === "local") {
|
|
53
|
+
return {
|
|
54
|
+
...database,
|
|
55
|
+
selectedBackend: "local",
|
|
56
|
+
image: database.image || DEFAULT_LOCAL_IMAGE,
|
|
57
|
+
user: database.user || DEFAULT_LOCAL_USER,
|
|
58
|
+
password: database.password || DEFAULT_LOCAL_PASSWORD,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`Service "${serviceName}" database.provider must be "local" or "resource"`);
|
|
62
|
+
}
|
package/lib/config/database.mjs
CHANGED
|
@@ -4,50 +4,30 @@ import {
|
|
|
4
4
|
normalizeConfiguredSteps,
|
|
5
5
|
} from "../shared/configured-steps.mjs";
|
|
6
6
|
|
|
7
|
-
const DEFAULT_LOCAL_IMAGE = "pgvector/pgvector:pg16";
|
|
8
|
-
const DEFAULT_LOCAL_USER = "testkit";
|
|
9
|
-
const DEFAULT_LOCAL_PASSWORD = "testkit";
|
|
10
|
-
|
|
11
7
|
export function normalizeDatabaseConfig(explicitService, serviceName) {
|
|
12
8
|
if (explicitService.databaseFrom) return undefined;
|
|
13
9
|
if (!explicitService.database) return undefined;
|
|
14
10
|
|
|
15
11
|
const rawDatabase = explicitService.database;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
if (Object.prototype.hasOwnProperty.call(rawDatabase, "provider")) {
|
|
13
|
+
throw new Error(
|
|
14
|
+
`Service "${serviceName}" database.provider has been removed. Configure database placement in environments.<name>.resources.databases instead.`
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
if (Object.prototype.hasOwnProperty.call(rawDatabase, "resource")) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
`Service "${serviceName}" database.resource has been removed. Configure database placement in environments.<name>.resources.databases instead.`
|
|
20
|
+
);
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
return {
|
|
22
24
|
...rawDatabase,
|
|
23
|
-
provider,
|
|
24
25
|
binding: normalizeDatabaseBinding(rawDatabase.binding || "per-runtime", `Service "${serviceName}" database.binding`),
|
|
25
26
|
reset: rawDatabase.reset !== false,
|
|
26
27
|
sourceSchema: normalizeSourceSchemaConfig(rawDatabase.sourceSchema, serviceName),
|
|
27
28
|
template: normalizeDatabaseTemplateConfig(rawDatabase.template, serviceName),
|
|
28
29
|
serviceName,
|
|
29
30
|
};
|
|
30
|
-
|
|
31
|
-
if (provider === "resource") {
|
|
32
|
-
const resource = String(rawDatabase.resource || "").trim();
|
|
33
|
-
if (!resource) {
|
|
34
|
-
throw new Error(`Service "${serviceName}" database.resource must be a non-empty string`);
|
|
35
|
-
}
|
|
36
|
-
return {
|
|
37
|
-
...base,
|
|
38
|
-
resource,
|
|
39
|
-
selectedBackend: "resource",
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
...base,
|
|
45
|
-
provider: "local",
|
|
46
|
-
selectedBackend: "local",
|
|
47
|
-
image: rawDatabase.image || DEFAULT_LOCAL_IMAGE,
|
|
48
|
-
user: rawDatabase.user || DEFAULT_LOCAL_USER,
|
|
49
|
-
password: rawDatabase.password || DEFAULT_LOCAL_PASSWORD,
|
|
50
|
-
};
|
|
51
31
|
}
|
|
52
32
|
|
|
53
33
|
export function normalizeDatabaseTemplateConfig(value, serviceName) {
|
package/lib/config/index.mjs
CHANGED
|
@@ -244,19 +244,39 @@ function normalizeEnvironmentConfig(name, environment) {
|
|
|
244
244
|
}
|
|
245
245
|
|
|
246
246
|
function normalizeEnvironmentResources(environmentName, resources = {}) {
|
|
247
|
-
if (resources == null) return {};
|
|
247
|
+
if (resources == null) return { databases: {}, servers: {} };
|
|
248
248
|
if (typeof resources !== "object" || Array.isArray(resources)) {
|
|
249
249
|
throw new Error(`Environment "${environmentName}" resources must be an object`);
|
|
250
250
|
}
|
|
251
|
+
const allowedKeys = new Set(["databases", "servers"]);
|
|
252
|
+
const unexpectedKeys = Object.keys(resources).filter((key) => !allowedKeys.has(key));
|
|
253
|
+
if (unexpectedKeys.length > 0) {
|
|
254
|
+
throw new Error(
|
|
255
|
+
`Environment "${environmentName}" resources only supports "databases" and "servers". Received unexpected key(s): ${unexpectedKeys.join(", ")}`
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
databases: normalizeEnvironmentResourceGroup(environmentName, "databases", resources.databases, ["postgres"]),
|
|
260
|
+
servers: normalizeEnvironmentResourceGroup(environmentName, "servers", resources.servers, ["server"]),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function normalizeEnvironmentResourceGroup(environmentName, groupName, group = {}, allowedKinds) {
|
|
265
|
+
if (group == null) return {};
|
|
266
|
+
if (typeof group !== "object" || Array.isArray(group)) {
|
|
267
|
+
throw new Error(`Environment "${environmentName}" resources.${groupName} must be an object`);
|
|
268
|
+
}
|
|
251
269
|
return Object.fromEntries(
|
|
252
|
-
Object.entries(
|
|
253
|
-
const normalizedName = normalizeDatabaseEnvToken(name, `Environment "${environmentName}"
|
|
270
|
+
Object.entries(group).map(([name, resource]) => {
|
|
271
|
+
const normalizedName = normalizeDatabaseEnvToken(name, `Environment "${environmentName}" resources.${groupName} name`, false);
|
|
254
272
|
if (!resource || typeof resource !== "object" || Array.isArray(resource)) {
|
|
255
|
-
throw new Error(`Environment "${environmentName}"
|
|
273
|
+
throw new Error(`Environment "${environmentName}" resources.${groupName}.${name} must be an object`);
|
|
256
274
|
}
|
|
257
275
|
const kind = String(resource.kind || "").trim();
|
|
258
|
-
if (!
|
|
259
|
-
throw new Error(
|
|
276
|
+
if (!allowedKinds.includes(kind)) {
|
|
277
|
+
throw new Error(
|
|
278
|
+
`Environment "${environmentName}" resources.${groupName}.${name} kind must be ${allowedKinds.map((entry) => `"${entry}"`).join(" or ")}`
|
|
279
|
+
);
|
|
260
280
|
}
|
|
261
281
|
return [normalizedName, { ...resource, kind }];
|
|
262
282
|
})
|
|
@@ -310,7 +330,7 @@ function normalizeEnvironmentEnv(env) {
|
|
|
310
330
|
const unexpectedKeys = Object.keys(env).filter((key) => !allowedKeys.has(key));
|
|
311
331
|
if (unexpectedKeys.length > 0) {
|
|
312
332
|
throw new Error(
|
|
313
|
-
`Environment env only supports "values" and "
|
|
333
|
+
`Environment env only supports "values", "databases", and "resources". Received unexpected key(s): ${unexpectedKeys.join(", ")}`
|
|
314
334
|
);
|
|
315
335
|
}
|
|
316
336
|
const values = env.values && typeof env.values === "object" && !Array.isArray(env.values) ? env.values : {};
|
|
@@ -85,8 +85,7 @@ export interface StepsBuildConfig {
|
|
|
85
85
|
|
|
86
86
|
export type BuildConfig = TscBuildConfig | ScriptBuildConfig | NextBuildConfig | StepsBuildConfig;
|
|
87
87
|
|
|
88
|
-
export interface
|
|
89
|
-
provider: "local";
|
|
88
|
+
export interface PostgresDatabaseConfig {
|
|
90
89
|
binding?: "shared" | "per-runtime";
|
|
91
90
|
image?: string;
|
|
92
91
|
password?: string;
|
|
@@ -96,17 +95,15 @@ export interface LocalDatabaseConfig {
|
|
|
96
95
|
user?: string;
|
|
97
96
|
}
|
|
98
97
|
|
|
99
|
-
export interface
|
|
98
|
+
export interface MaterializedLocalDatabaseConfig extends PostgresDatabaseConfig {
|
|
99
|
+
provider: "local";
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface MaterializedResourceDatabaseConfig extends PostgresDatabaseConfig {
|
|
100
103
|
provider: "resource";
|
|
101
|
-
binding?: "shared" | "per-runtime";
|
|
102
|
-
reset?: boolean;
|
|
103
104
|
resource: string;
|
|
104
|
-
sourceSchema?: DatabaseSourceSchemaConfig | null;
|
|
105
|
-
template?: DatabaseTemplateConfig;
|
|
106
105
|
}
|
|
107
106
|
|
|
108
|
-
export type PostgresDatabaseConfig = LocalDatabaseConfig | ResourceDatabaseConfig;
|
|
109
|
-
|
|
110
107
|
export interface SkipFileRule {
|
|
111
108
|
path: string;
|
|
112
109
|
reason: string;
|
|
@@ -324,7 +321,10 @@ export interface ServerResourceConfig {
|
|
|
324
321
|
vm?: KilnVMResourceConfig;
|
|
325
322
|
}
|
|
326
323
|
|
|
327
|
-
export
|
|
324
|
+
export interface EnvironmentResourceConfig {
|
|
325
|
+
databases?: Record<string, PostgresResourceConfig>;
|
|
326
|
+
servers?: Record<string, ServerResourceConfig>;
|
|
327
|
+
}
|
|
328
328
|
|
|
329
329
|
export interface LocalEnvironmentConfig {
|
|
330
330
|
kind: "local";
|
|
@@ -335,7 +335,7 @@ export interface LocalEnvironmentConfig {
|
|
|
335
335
|
portOffset?: number;
|
|
336
336
|
productionLike?: boolean;
|
|
337
337
|
publicHost?: string;
|
|
338
|
-
resources?:
|
|
338
|
+
resources?: EnvironmentResourceConfig;
|
|
339
339
|
target: string;
|
|
340
340
|
}
|
|
341
341
|
|
|
@@ -625,36 +625,16 @@ export declare const database: {
|
|
|
625
625
|
postgresConnectionFromEnv(prefix: string): unknown;
|
|
626
626
|
};
|
|
627
627
|
postgres(
|
|
628
|
-
options?: Omit<
|
|
628
|
+
options?: Omit<PostgresDatabaseConfig, "template"> & {
|
|
629
629
|
inputs?: string[];
|
|
630
630
|
migrate?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
631
631
|
seed?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
632
632
|
template?: DatabaseTemplateOptions;
|
|
633
633
|
verify?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
634
634
|
}
|
|
635
|
-
):
|
|
636
|
-
postgres(
|
|
637
|
-
options?: Omit<ResourceDatabaseConfig, "provider" | "template"> & {
|
|
638
|
-
inputs?: string[];
|
|
639
|
-
migrate?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
640
|
-
seed?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
641
|
-
template?: DatabaseTemplateOptions;
|
|
642
|
-
verify?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
643
|
-
}
|
|
644
|
-
): ResourceDatabaseConfig;
|
|
645
|
-
fixture(
|
|
646
|
-
options?: Omit<LocalDatabaseConfig, "provider" | "template"> & {
|
|
647
|
-
inputs?: string[];
|
|
648
|
-
migrate?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
649
|
-
seed?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
650
|
-
template?: DatabaseTemplateOptions;
|
|
651
|
-
verify?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
652
|
-
discovery?: DiscoveryConfig;
|
|
653
|
-
envFiles?: string[];
|
|
654
|
-
}
|
|
655
|
-
): ServiceConfig;
|
|
635
|
+
): PostgresDatabaseConfig;
|
|
656
636
|
fixture(
|
|
657
|
-
options?: Omit<
|
|
637
|
+
options?: Omit<PostgresDatabaseConfig, "template"> & {
|
|
658
638
|
inputs?: string[];
|
|
659
639
|
migrate?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
|
660
640
|
seed?: TemplateLifecycleStepConfig | TemplateLifecycleStepConfig[] | string | string[];
|
package/lib/config-api/index.mjs
CHANGED
|
@@ -27,9 +27,14 @@ export function defineFile(metadata) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
function postgresDatabase(options = {}) {
|
|
30
|
-
const
|
|
30
|
+
for (const removedKey of ["provider", "resource"]) {
|
|
31
|
+
if (Object.prototype.hasOwnProperty.call(options, removedKey)) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`database.postgres(...) no longer accepts "${removedKey}". Configure database placement in environments.<name>.resources.databases instead.`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
31
37
|
return {
|
|
32
|
-
provider,
|
|
33
38
|
...options,
|
|
34
39
|
};
|
|
35
40
|
}
|
|
@@ -561,7 +566,7 @@ function normalizePresetEnv(env) {
|
|
|
561
566
|
const unexpectedKeys = Object.keys(env).filter((key) => !allowedKeys.has(key));
|
|
562
567
|
if (unexpectedKeys.length > 0) {
|
|
563
568
|
throw new Error(
|
|
564
|
-
`Preset env only supports "values" and "
|
|
569
|
+
`Preset env only supports "values", "databases", and "resources". Received unexpected key(s): ${unexpectedKeys.join(", ")}`
|
|
565
570
|
);
|
|
566
571
|
}
|
|
567
572
|
|
package/lib/database/index.mjs
CHANGED
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
runTemplateStage,
|
|
29
29
|
runTemplateStep,
|
|
30
30
|
} from "./template-steps.mjs";
|
|
31
|
+
import { materializeDatabaseConfig } from "../config/database-materialization.mjs";
|
|
31
32
|
import {
|
|
32
33
|
applySourceSchemaCache,
|
|
33
34
|
createSourceSchemaMismatchError,
|
|
@@ -49,16 +50,29 @@ const LOCAL_DROP_DATABASE_TIMEOUT_MS = 15_000;
|
|
|
49
50
|
const LOCAL_DROP_DATABASE_POLL_INTERVAL_MS = 250;
|
|
50
51
|
|
|
51
52
|
export async function prepareDatabaseRuntime(config, options = {}) {
|
|
52
|
-
const db =
|
|
53
|
+
const db = materializeDatabaseConfig(
|
|
54
|
+
config.testkit.database,
|
|
55
|
+
config.name,
|
|
56
|
+
options.databaseMaterialization || {}
|
|
57
|
+
);
|
|
53
58
|
if (!db) return;
|
|
59
|
+
const runtimeConfig = db === config.testkit.database
|
|
60
|
+
? config
|
|
61
|
+
: {
|
|
62
|
+
...config,
|
|
63
|
+
testkit: {
|
|
64
|
+
...config.testkit,
|
|
65
|
+
database: db,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
54
68
|
|
|
55
|
-
fs.mkdirSync(
|
|
69
|
+
fs.mkdirSync(runtimeConfig.stateDir, { recursive: true });
|
|
56
70
|
if (db.provider === "local") {
|
|
57
|
-
await prepareLocalDatabase(
|
|
71
|
+
await prepareLocalDatabase(runtimeConfig, options);
|
|
58
72
|
return;
|
|
59
73
|
}
|
|
60
74
|
if (db.provider === "resource") {
|
|
61
|
-
await prepareResourceDatabase(
|
|
75
|
+
await prepareResourceDatabase(runtimeConfig, options);
|
|
62
76
|
return;
|
|
63
77
|
}
|
|
64
78
|
|
|
@@ -250,37 +250,16 @@ async function attachExistingVMs(client, network, vmRefs) {
|
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
async function ensureResources(client, environment, network) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
disk_size_mb: parseDiskMB(resource.vm?.disk || resource.vm?.diskSize || resource.vm?.diskSizeMB || resource.disk || "24G"),
|
|
264
|
-
memory_mb: Number(resource.vm?.memoryMB || resource.memoryMB || 1536),
|
|
265
|
-
vcpus: Number(resource.vm?.vcpus || resource.vcpus || 1),
|
|
266
|
-
autostart: Boolean(resource.vm?.autostart || resource.autostart),
|
|
267
|
-
postgres: {
|
|
268
|
-
version: resource.version || "16",
|
|
269
|
-
...(resource.image ? { image: resource.image } : {}),
|
|
270
|
-
database: resource.database || name,
|
|
271
|
-
user: resource.user || "app",
|
|
272
|
-
...(resource.password ? { password: resource.password } : {}),
|
|
273
|
-
...(resource.port ? { port: Number(resource.port) } : {}),
|
|
274
|
-
},
|
|
275
|
-
metadata: {
|
|
276
|
-
"testkit.environment": environment.name,
|
|
277
|
-
"testkit.resource": name,
|
|
278
|
-
},
|
|
279
|
-
});
|
|
280
|
-
manifest[name] = pickAppliance(appliance);
|
|
281
|
-
connections[name] = appliance.connection || {};
|
|
282
|
-
continue;
|
|
283
|
-
}
|
|
253
|
+
const configured = flattenEnvironmentResources(environment.resources || {});
|
|
254
|
+
const manifest = {};
|
|
255
|
+
const connections = {};
|
|
256
|
+
for (const [name, resource] of Object.entries(configured)) {
|
|
257
|
+
if (resource.kind === "postgres") {
|
|
258
|
+
const appliance = await client.ensureAppliance(buildPostgresApplianceRequest(name, resource, environment, network));
|
|
259
|
+
manifest[name] = pickAppliance(appliance);
|
|
260
|
+
connections[name] = appliance.connection || {};
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
284
263
|
if (resource.kind === "server") {
|
|
285
264
|
const appliance = await client.ensureAppliance({
|
|
286
265
|
name: resource.vm?.name || `${environment.name}-${name}`,
|
|
@@ -300,7 +279,68 @@ async function ensureResources(client, environment, network) {
|
|
|
300
279
|
connections[name] = appliance.connection || {};
|
|
301
280
|
}
|
|
302
281
|
}
|
|
303
|
-
|
|
282
|
+
return { manifest, connections };
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export function flattenEnvironmentResources(resources = {}) {
|
|
286
|
+
return {
|
|
287
|
+
...(resources.databases || {}),
|
|
288
|
+
...(resources.servers || {}),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export function buildPostgresApplianceRequest(name, resource, environment, network) {
|
|
293
|
+
const extensions = normalizePostgresExtensions(resource.extensions);
|
|
294
|
+
const image = resolvePostgresResourceImage(resource, name);
|
|
295
|
+
return {
|
|
296
|
+
name: resource.vm?.name || `${environment.name}-${name}`,
|
|
297
|
+
kind: "postgres",
|
|
298
|
+
network_id: resource.vm?.networkId || network?.id || "",
|
|
299
|
+
profile: resource.vm?.profile || "ubuntu-docker",
|
|
300
|
+
disk_size_mb: parseDiskMB(resource.vm?.disk || resource.vm?.diskSize || resource.vm?.diskSizeMB || resource.disk || "24G"),
|
|
301
|
+
memory_mb: Number(resource.vm?.memoryMB || resource.memoryMB || 1536),
|
|
302
|
+
vcpus: Number(resource.vm?.vcpus || resource.vcpus || 1),
|
|
303
|
+
autostart: Boolean(resource.vm?.autostart || resource.autostart),
|
|
304
|
+
postgres: {
|
|
305
|
+
version: resource.version || "16",
|
|
306
|
+
...(image ? { image } : {}),
|
|
307
|
+
database: resource.database || name,
|
|
308
|
+
user: resource.user || "app",
|
|
309
|
+
...(resource.password ? { password: resource.password } : {}),
|
|
310
|
+
...(resource.port ? { port: Number(resource.port) } : {}),
|
|
311
|
+
},
|
|
312
|
+
metadata: {
|
|
313
|
+
"testkit.environment": environment.name,
|
|
314
|
+
"testkit.resource": name,
|
|
315
|
+
...(extensions.length > 0 ? { "testkit.postgres.extensions": extensions.join(",") } : {}),
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export function resolvePostgresResourceImage(resource, resourceName = "postgres") {
|
|
321
|
+
if (resource.image) return resource.image;
|
|
322
|
+
const extensions = normalizePostgresExtensions(resource.extensions);
|
|
323
|
+
if (extensions.length === 0) return null;
|
|
324
|
+
const unsupported = extensions.filter((extension) => extension !== "vector" && extension !== "pgvector");
|
|
325
|
+
if (unsupported.length > 0) {
|
|
326
|
+
throw new Error(
|
|
327
|
+
`Postgres resource "${resourceName}" requests unsupported extensions: ${unsupported.join(", ")}. ` +
|
|
328
|
+
`Set resource.postgres({ image }) to provide a custom Postgres image.`
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
return `pgvector/pgvector:pg${postgresMajorVersion(resource.version || "16")}-trixie`;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function normalizePostgresExtensions(extensions) {
|
|
335
|
+
if (extensions == null) return [];
|
|
336
|
+
if (!Array.isArray(extensions)) throw new Error("resource.postgres({ extensions }) must be an array");
|
|
337
|
+
return [...new Set(extensions.map((extension) => String(extension).trim().toLowerCase()).filter(Boolean))].sort();
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function postgresMajorVersion(version) {
|
|
341
|
+
const match = String(version || "16").match(/^\d+/);
|
|
342
|
+
if (!match) throw new Error(`Invalid Postgres version for resource image selection: ${version}`);
|
|
343
|
+
return match[0];
|
|
304
344
|
}
|
|
305
345
|
|
|
306
346
|
async function deleteManifestResources(manifest) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { spawn } from "child_process";
|
|
4
|
+
import { buildEnvironmentDatabaseMaterialization } from "../config/database-materialization.mjs";
|
|
4
5
|
import { loadConfigContext } from "../config/index.mjs";
|
|
5
6
|
import { prepareDatabaseRuntime } from "../database/index.mjs";
|
|
6
7
|
import { prepareRuntimeServices } from "../runner/runtime-preparation.mjs";
|
|
@@ -186,6 +187,7 @@ export function buildLocalRuntimeConfigs(allConfigs, environment, runtimeDir) {
|
|
|
186
187
|
graphDirName: runtimeConfigs.map((config) => config.name).sort().join("__"),
|
|
187
188
|
portOffset: environment.portOffset || 0,
|
|
188
189
|
publicHost: environment.publicHost || null,
|
|
190
|
+
databaseMaterialization: buildEnvironmentDatabaseMaterialization(environment),
|
|
189
191
|
}).map((config) => applyLocalEnvironmentConfig(config, environment));
|
|
190
192
|
}
|
|
191
193
|
|
package/lib/runner/results.mjs
CHANGED
|
@@ -8,7 +8,7 @@ export function buildServiceTrackers(servicePlans, startedAt) {
|
|
|
8
8
|
if (plan.skipped) {
|
|
9
9
|
trackers.set(plan.config.name, {
|
|
10
10
|
name: plan.config.name,
|
|
11
|
-
dbBackend: plan.config
|
|
11
|
+
dbBackend: inferDatabaseBackend(plan.config),
|
|
12
12
|
skipped: true,
|
|
13
13
|
suiteCount: 0,
|
|
14
14
|
suites: [],
|
|
@@ -73,7 +73,7 @@ export function buildServiceTrackers(servicePlans, startedAt) {
|
|
|
73
73
|
|
|
74
74
|
trackers.set(plan.config.name, {
|
|
75
75
|
name: plan.config.name,
|
|
76
|
-
dbBackend: plan.config
|
|
76
|
+
dbBackend: inferDatabaseBackend(plan.config),
|
|
77
77
|
skipped: false,
|
|
78
78
|
suiteCount: suites.length,
|
|
79
79
|
suites,
|
|
@@ -90,6 +90,12 @@ export function buildServiceTrackers(servicePlans, startedAt) {
|
|
|
90
90
|
return trackers;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
function inferDatabaseBackend(config) {
|
|
94
|
+
const database = config.testkit.database;
|
|
95
|
+
if (!database) return null;
|
|
96
|
+
return database.selectedBackend || database.provider || "local";
|
|
97
|
+
}
|
|
98
|
+
|
|
93
99
|
export function recordTaskOutcome(trackers, task, outcome, finishedAt = Date.now()) {
|
|
94
100
|
const tracker = trackers.get(task.serviceName);
|
|
95
101
|
if (!tracker || tracker.skipped) return;
|
package/lib/runner/template.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
finalizeConfiguredInputs,
|
|
4
4
|
finalizeConfiguredSteps,
|
|
5
5
|
} from "../shared/configured-steps.mjs";
|
|
6
|
+
import { materializeDatabaseConfig } from "../config/database-materialization.mjs";
|
|
6
7
|
import { readDatabaseInfo } from "./state-io.mjs";
|
|
7
8
|
|
|
8
9
|
const PORT_STRIDE = 100;
|
|
@@ -75,7 +76,8 @@ export function resolveRuntimeInstanceConfigs(runtimeConfigs, runtimeId, runtime
|
|
|
75
76
|
publicBaseUrlByService,
|
|
76
77
|
options.publicHost || null,
|
|
77
78
|
stateDirByService,
|
|
78
|
-
urlMappings
|
|
79
|
+
urlMappings,
|
|
80
|
+
options.databaseMaterialization || {}
|
|
79
81
|
)
|
|
80
82
|
);
|
|
81
83
|
}
|
|
@@ -123,7 +125,8 @@ export function resolveRuntimeConfig(
|
|
|
123
125
|
publicBaseUrlByService,
|
|
124
126
|
publicHost,
|
|
125
127
|
stateDirByService,
|
|
126
|
-
urlMappings
|
|
128
|
+
urlMappings,
|
|
129
|
+
databaseMaterialization = {}
|
|
127
130
|
) {
|
|
128
131
|
const stateDir = resolveServiceStateDir(runtimeDir, config);
|
|
129
132
|
const prepareDir = resolveServicePrepareDir(runtimeDir, config);
|
|
@@ -147,11 +150,15 @@ export function resolveRuntimeConfig(
|
|
|
147
150
|
};
|
|
148
151
|
|
|
149
152
|
const database = config.testkit.database
|
|
150
|
-
?
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
? materializeDatabaseConfig(
|
|
154
|
+
{
|
|
155
|
+
...config.testkit.database,
|
|
156
|
+
sourceSchema: finalizeSourceSchema(config.testkit.database.sourceSchema, context),
|
|
157
|
+
template: finalizeDatabaseTemplate(config.testkit.database.template, context),
|
|
158
|
+
},
|
|
159
|
+
config.name,
|
|
160
|
+
databaseMaterialization
|
|
161
|
+
)
|
|
155
162
|
: undefined;
|
|
156
163
|
|
|
157
164
|
const runtime = {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elench/testkit-bridge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.144",
|
|
4
4
|
"description": "Browser bridge helpers for testkit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@elench/testkit-protocol": "0.1.
|
|
25
|
+
"@elench/testkit-protocol": "0.1.144"
|
|
26
26
|
},
|
|
27
27
|
"private": false
|
|
28
28
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elench/testkit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.144",
|
|
4
4
|
"description": "Assistant-first CLI for running, inspecting, and debugging local testkit suites",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"workspaces": [
|
|
@@ -98,10 +98,10 @@
|
|
|
98
98
|
},
|
|
99
99
|
"dependencies": {
|
|
100
100
|
"@babel/code-frame": "^7.29.0",
|
|
101
|
-
"@elench/next-analysis": "0.1.
|
|
102
|
-
"@elench/testkit-bridge": "0.1.
|
|
103
|
-
"@elench/testkit-protocol": "0.1.
|
|
104
|
-
"@elench/ts-analysis": "0.1.
|
|
101
|
+
"@elench/next-analysis": "0.1.144",
|
|
102
|
+
"@elench/testkit-bridge": "0.1.144",
|
|
103
|
+
"@elench/testkit-protocol": "0.1.144",
|
|
104
|
+
"@elench/ts-analysis": "0.1.144",
|
|
105
105
|
"@oclif/core": "^4.10.6",
|
|
106
106
|
"@playwright/test": "^1.52.0",
|
|
107
107
|
"esbuild": "^0.25.11",
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
export declare const TESTKIT_BROWSER_PROTOCOL_VERSION = 1;
|
|
2
|
+
export declare const TESTKIT_COVERAGE_GRAPH_VERSION = 1;
|
|
3
|
+
export type BrowserTargetKind = "testId" | "role" | "text" | "css" | "xpath" | "component";
|
|
4
|
+
export type BrowserConfidence = "low" | "medium" | "high";
|
|
5
|
+
export type BrowserFailureState = "failing" | "healthy" | "unavailable";
|
|
6
|
+
export type BrowserCoverageState = "covered" | "missing" | "unavailable";
|
|
7
|
+
export type BridgeSurfaceImportance = "critical" | "high" | "medium" | "low";
|
|
8
|
+
export type BridgeCoverageSupportKind = "direct" | "indirect" | "mixed";
|
|
9
|
+
export type CoverageNodeKind = "page_view" | "ui_surface" | "ui_action" | "client_request" | "api_route" | "server_action" | "server_capability" | "data_capability" | "test_file";
|
|
10
|
+
export type CoverageEdgeKind = "contains" | "renders" | "triggers" | "requests" | "handles" | "delegates_to" | "covers";
|
|
11
|
+
export type CoverageEvidenceSource = "convention" | "static" | "runtime";
|
|
12
|
+
export type CoverageGraphDiagnosticLevel = "info" | "warn";
|
|
13
|
+
export interface BrowserTarget {
|
|
14
|
+
kind: BrowserTargetKind;
|
|
15
|
+
value: string;
|
|
16
|
+
label?: string;
|
|
17
|
+
confidence?: BrowserConfidence;
|
|
18
|
+
}
|
|
19
|
+
export interface BrowserMetadata {
|
|
20
|
+
label?: string;
|
|
21
|
+
origins?: string[];
|
|
22
|
+
routes?: string[];
|
|
23
|
+
targets?: BrowserTarget[];
|
|
24
|
+
}
|
|
25
|
+
export interface BrowserMetadataDocument {
|
|
26
|
+
schemaVersion: number;
|
|
27
|
+
browser: BrowserMetadata;
|
|
28
|
+
}
|
|
29
|
+
export interface CoverageGraphNode {
|
|
30
|
+
id: string;
|
|
31
|
+
kind: CoverageNodeKind;
|
|
32
|
+
service: string;
|
|
33
|
+
label: string;
|
|
34
|
+
filePath?: string;
|
|
35
|
+
route?: string;
|
|
36
|
+
method?: string;
|
|
37
|
+
path?: string;
|
|
38
|
+
target?: BrowserTarget | null;
|
|
39
|
+
metadata?: Record<string, string | number | boolean | null>;
|
|
40
|
+
}
|
|
41
|
+
export interface CoverageGraphEdge {
|
|
42
|
+
id: string;
|
|
43
|
+
kind: CoverageEdgeKind;
|
|
44
|
+
from: string;
|
|
45
|
+
to: string;
|
|
46
|
+
confidence?: BrowserConfidence;
|
|
47
|
+
metadata?: Record<string, string | number | boolean | null>;
|
|
48
|
+
}
|
|
49
|
+
export interface CoverageEvidenceDetails {
|
|
50
|
+
requestPaths?: string[];
|
|
51
|
+
route?: string;
|
|
52
|
+
targets?: BrowserTarget[];
|
|
53
|
+
}
|
|
54
|
+
export interface CoverageEvidence {
|
|
55
|
+
id: string;
|
|
56
|
+
source: CoverageEvidenceSource;
|
|
57
|
+
confidence?: BrowserConfidence;
|
|
58
|
+
service: string;
|
|
59
|
+
suiteName: string;
|
|
60
|
+
type: string;
|
|
61
|
+
testFilePath: string;
|
|
62
|
+
coveredNodeIds: string[];
|
|
63
|
+
details?: CoverageEvidenceDetails;
|
|
64
|
+
}
|
|
65
|
+
export interface CoverageGraphDiagnostic {
|
|
66
|
+
level: CoverageGraphDiagnosticLevel;
|
|
67
|
+
code: string;
|
|
68
|
+
filePath: string;
|
|
69
|
+
service: string;
|
|
70
|
+
message: string;
|
|
71
|
+
}
|
|
72
|
+
export interface CoverageGraph {
|
|
73
|
+
schemaVersion: number;
|
|
74
|
+
nodes: CoverageGraphNode[];
|
|
75
|
+
edges: CoverageGraphEdge[];
|
|
76
|
+
evidence: CoverageEvidence[];
|
|
77
|
+
diagnostics: CoverageGraphDiagnostic[];
|
|
78
|
+
}
|
|
79
|
+
export interface BridgeProductRef {
|
|
80
|
+
name: string;
|
|
81
|
+
directory: string;
|
|
82
|
+
}
|
|
83
|
+
export interface BridgeServiceRef {
|
|
84
|
+
name: string;
|
|
85
|
+
baseUrl: string;
|
|
86
|
+
origin: string;
|
|
87
|
+
}
|
|
88
|
+
export interface BrowserMatchResponse {
|
|
89
|
+
protocolVersion: number;
|
|
90
|
+
url: string;
|
|
91
|
+
origin: string;
|
|
92
|
+
route: string;
|
|
93
|
+
matched: boolean;
|
|
94
|
+
product: BridgeProductRef;
|
|
95
|
+
service: BridgeServiceRef | null;
|
|
96
|
+
}
|
|
97
|
+
export interface BridgeRunSummary {
|
|
98
|
+
artifactAvailable: boolean;
|
|
99
|
+
generatedAt: string | null;
|
|
100
|
+
status: string | null;
|
|
101
|
+
}
|
|
102
|
+
export interface BridgeSupportingTestRef {
|
|
103
|
+
service: string;
|
|
104
|
+
suite: string;
|
|
105
|
+
type: string;
|
|
106
|
+
filePath: string;
|
|
107
|
+
label: string;
|
|
108
|
+
status?: "passed" | "failed" | "skipped" | "not_run";
|
|
109
|
+
error?: string | null;
|
|
110
|
+
}
|
|
111
|
+
export interface BridgeCoverageViaNodeRef {
|
|
112
|
+
id: string;
|
|
113
|
+
kind: CoverageNodeKind;
|
|
114
|
+
label: string;
|
|
115
|
+
route?: string;
|
|
116
|
+
method?: string;
|
|
117
|
+
path?: string;
|
|
118
|
+
}
|
|
119
|
+
export interface FailureOverlayEntry {
|
|
120
|
+
id: string;
|
|
121
|
+
kind: CoverageNodeKind;
|
|
122
|
+
label: string;
|
|
123
|
+
service: string;
|
|
124
|
+
route?: string | null;
|
|
125
|
+
targets: BrowserTarget[];
|
|
126
|
+
failedTests: BridgeSupportingTestRef[];
|
|
127
|
+
viaNodes: BridgeCoverageViaNodeRef[];
|
|
128
|
+
importance?: BridgeSurfaceImportance;
|
|
129
|
+
surfaceKind?: string | null;
|
|
130
|
+
reason?: string | null;
|
|
131
|
+
}
|
|
132
|
+
export interface CoverageOverlayEntry {
|
|
133
|
+
id: string;
|
|
134
|
+
kind: CoverageNodeKind;
|
|
135
|
+
label: string;
|
|
136
|
+
service: string;
|
|
137
|
+
route?: string | null;
|
|
138
|
+
targets: BrowserTarget[];
|
|
139
|
+
supportingTests: BridgeSupportingTestRef[];
|
|
140
|
+
viaNodes: BridgeCoverageViaNodeRef[];
|
|
141
|
+
confidence: BrowserConfidence;
|
|
142
|
+
importance?: BridgeSurfaceImportance;
|
|
143
|
+
surfaceKind?: string | null;
|
|
144
|
+
supportKind?: BridgeCoverageSupportKind;
|
|
145
|
+
reason?: string | null;
|
|
146
|
+
}
|
|
147
|
+
export interface PageOverlayResponse {
|
|
148
|
+
protocolVersion: number;
|
|
149
|
+
page: {
|
|
150
|
+
url: string;
|
|
151
|
+
origin: string;
|
|
152
|
+
route: string;
|
|
153
|
+
};
|
|
154
|
+
match: BrowserMatchResponse;
|
|
155
|
+
run: BridgeRunSummary;
|
|
156
|
+
summary: {
|
|
157
|
+
failureState: BrowserFailureState;
|
|
158
|
+
coverageState: BrowserCoverageState;
|
|
159
|
+
relatedFailureCount: number;
|
|
160
|
+
relatedCoverageCount: number;
|
|
161
|
+
coverageBreakdown?: {
|
|
162
|
+
direct: number;
|
|
163
|
+
indirect: number;
|
|
164
|
+
mixed: number;
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
failures: FailureOverlayEntry[];
|
|
168
|
+
coverage: CoverageOverlayEntry[];
|
|
169
|
+
}
|
|
170
|
+
export interface BridgeErrorResponse {
|
|
171
|
+
protocolVersion: number;
|
|
172
|
+
error: {
|
|
173
|
+
code: string;
|
|
174
|
+
message: string;
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export declare function normalizeBrowserTarget(value: unknown): BrowserTarget | null;
|
|
178
|
+
export declare function normalizeBrowserMetadata(value: unknown): BrowserMetadata | null;
|
|
179
|
+
export declare function normalizeBrowserMetadataDocument(value: unknown): BrowserMetadataDocument | null;
|
|
180
|
+
export declare function normalizeCoverageGraphNode(value: unknown): CoverageGraphNode | null;
|
|
181
|
+
export declare function normalizeCoverageGraphEdge(value: unknown): CoverageGraphEdge | null;
|
|
182
|
+
export declare function normalizeCoverageEvidence(value: unknown): CoverageEvidence | null;
|
|
183
|
+
export declare function normalizeCoverageGraphDiagnostic(value: unknown): CoverageGraphDiagnostic | null;
|
|
184
|
+
export declare function normalizeCoverageGraph(value: unknown): CoverageGraph | null;
|
|
185
|
+
export declare function isPageOverlayResponse(value: unknown): value is PageOverlayResponse;
|
|
186
|
+
export declare function normalizePageOverlayResponse(value: unknown): PageOverlayResponse | null;
|
|
187
|
+
export declare function createBridgeErrorResponse(code: string, message: string): BridgeErrorResponse;
|
|
188
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
export const TESTKIT_BROWSER_PROTOCOL_VERSION = 1;
|
|
2
|
+
export const TESTKIT_COVERAGE_GRAPH_VERSION = 1;
|
|
3
|
+
const TARGET_KINDS = new Set(["testId", "role", "text", "css", "xpath", "component"]);
|
|
4
|
+
const CONFIDENCE_LEVELS = new Set(["low", "medium", "high"]);
|
|
5
|
+
const FAILURE_STATES = new Set(["failing", "healthy", "unavailable"]);
|
|
6
|
+
const COVERAGE_STATES = new Set(["covered", "missing", "unavailable"]);
|
|
7
|
+
const NODE_KINDS = new Set([
|
|
8
|
+
"page_view",
|
|
9
|
+
"ui_surface",
|
|
10
|
+
"ui_action",
|
|
11
|
+
"client_request",
|
|
12
|
+
"api_route",
|
|
13
|
+
"server_action",
|
|
14
|
+
"server_capability",
|
|
15
|
+
"data_capability",
|
|
16
|
+
"test_file",
|
|
17
|
+
]);
|
|
18
|
+
const EDGE_KINDS = new Set([
|
|
19
|
+
"contains",
|
|
20
|
+
"renders",
|
|
21
|
+
"triggers",
|
|
22
|
+
"requests",
|
|
23
|
+
"handles",
|
|
24
|
+
"delegates_to",
|
|
25
|
+
"covers",
|
|
26
|
+
]);
|
|
27
|
+
const EVIDENCE_SOURCES = new Set(["convention", "static", "runtime"]);
|
|
28
|
+
const DIAGNOSTIC_LEVELS = new Set(["info", "warn"]);
|
|
29
|
+
export function normalizeBrowserTarget(value) {
|
|
30
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
31
|
+
return null;
|
|
32
|
+
const record = value;
|
|
33
|
+
const kind = normalizeOptionalString(record.kind);
|
|
34
|
+
const targetValue = normalizeOptionalString(record.value);
|
|
35
|
+
if (!kind || !isSetValue(TARGET_KINDS, kind) || !targetValue)
|
|
36
|
+
return null;
|
|
37
|
+
const label = normalizeOptionalString(record.label);
|
|
38
|
+
const confidence = normalizeOptionalString(record.confidence);
|
|
39
|
+
return {
|
|
40
|
+
kind,
|
|
41
|
+
value: targetValue,
|
|
42
|
+
...(label ? { label } : {}),
|
|
43
|
+
...(confidence && isSetValue(CONFIDENCE_LEVELS, confidence) ? { confidence } : {}),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function normalizeBrowserMetadata(value) {
|
|
47
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
48
|
+
return null;
|
|
49
|
+
const record = value;
|
|
50
|
+
const label = normalizeOptionalString(record.label);
|
|
51
|
+
const origins = normalizeStringArray(record.origins);
|
|
52
|
+
const routes = normalizeStringArray(record.routes);
|
|
53
|
+
const targets = Array.isArray(record.targets)
|
|
54
|
+
? record.targets.map((entry) => normalizeBrowserTarget(entry)).filter((entry) => Boolean(entry))
|
|
55
|
+
: [];
|
|
56
|
+
if (!label && origins.length === 0 && routes.length === 0 && targets.length === 0) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...(label ? { label } : {}),
|
|
61
|
+
...(origins.length > 0 ? { origins } : {}),
|
|
62
|
+
...(routes.length > 0 ? { routes } : {}),
|
|
63
|
+
...(targets.length > 0 ? { targets } : {}),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function normalizeBrowserMetadataDocument(value) {
|
|
67
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
68
|
+
return null;
|
|
69
|
+
const record = value;
|
|
70
|
+
const schemaVersion = Number.isInteger(record.schemaVersion) && Number(record.schemaVersion) > 0
|
|
71
|
+
? Number(record.schemaVersion)
|
|
72
|
+
: TESTKIT_BROWSER_PROTOCOL_VERSION;
|
|
73
|
+
const browser = normalizeBrowserMetadata(record.browser);
|
|
74
|
+
if (!browser)
|
|
75
|
+
return null;
|
|
76
|
+
return {
|
|
77
|
+
schemaVersion,
|
|
78
|
+
browser,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export function normalizeCoverageGraphNode(value) {
|
|
82
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
83
|
+
return null;
|
|
84
|
+
const record = value;
|
|
85
|
+
const id = normalizeOptionalString(record.id);
|
|
86
|
+
const kind = normalizeOptionalString(record.kind);
|
|
87
|
+
const service = normalizeOptionalString(record.service);
|
|
88
|
+
const label = normalizeOptionalString(record.label);
|
|
89
|
+
if (!id || !kind || !isSetValue(NODE_KINDS, kind) || !service || !label)
|
|
90
|
+
return null;
|
|
91
|
+
const filePath = normalizeOptionalString(record.filePath);
|
|
92
|
+
const route = normalizeOptionalString(record.route);
|
|
93
|
+
const method = normalizeOptionalString(record.method);
|
|
94
|
+
const path = normalizeOptionalString(record.path);
|
|
95
|
+
const target = normalizeBrowserTarget(record.target);
|
|
96
|
+
const metadata = normalizeMetadataRecord(record.metadata);
|
|
97
|
+
return {
|
|
98
|
+
id,
|
|
99
|
+
kind,
|
|
100
|
+
service,
|
|
101
|
+
label,
|
|
102
|
+
...(filePath ? { filePath } : {}),
|
|
103
|
+
...(route ? { route } : {}),
|
|
104
|
+
...(method ? { method } : {}),
|
|
105
|
+
...(path ? { path } : {}),
|
|
106
|
+
...(target ? { target } : {}),
|
|
107
|
+
...(metadata ? { metadata } : {}),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function normalizeCoverageGraphEdge(value) {
|
|
111
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
112
|
+
return null;
|
|
113
|
+
const record = value;
|
|
114
|
+
const id = normalizeOptionalString(record.id);
|
|
115
|
+
const kind = normalizeOptionalString(record.kind);
|
|
116
|
+
const from = normalizeOptionalString(record.from);
|
|
117
|
+
const to = normalizeOptionalString(record.to);
|
|
118
|
+
if (!id || !kind || !isSetValue(EDGE_KINDS, kind) || !from || !to)
|
|
119
|
+
return null;
|
|
120
|
+
const confidence = normalizeOptionalString(record.confidence);
|
|
121
|
+
const metadata = normalizeMetadataRecord(record.metadata);
|
|
122
|
+
return {
|
|
123
|
+
id,
|
|
124
|
+
kind,
|
|
125
|
+
from,
|
|
126
|
+
to,
|
|
127
|
+
...(confidence && isSetValue(CONFIDENCE_LEVELS, confidence) ? { confidence } : {}),
|
|
128
|
+
...(metadata ? { metadata } : {}),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export function normalizeCoverageEvidence(value) {
|
|
132
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
133
|
+
return null;
|
|
134
|
+
const record = value;
|
|
135
|
+
const id = normalizeOptionalString(record.id);
|
|
136
|
+
const source = normalizeOptionalString(record.source);
|
|
137
|
+
const service = normalizeOptionalString(record.service);
|
|
138
|
+
const suiteName = normalizeOptionalString(record.suiteName);
|
|
139
|
+
const type = normalizeOptionalString(record.type) || normalizeOptionalString(record.selectionType);
|
|
140
|
+
const testFilePath = normalizeOptionalString(record.testFilePath);
|
|
141
|
+
const coveredNodeIds = normalizeStringArray(record.coveredNodeIds);
|
|
142
|
+
if (!id ||
|
|
143
|
+
!source ||
|
|
144
|
+
!isSetValue(EVIDENCE_SOURCES, source) ||
|
|
145
|
+
!service ||
|
|
146
|
+
!suiteName ||
|
|
147
|
+
!type ||
|
|
148
|
+
!testFilePath ||
|
|
149
|
+
coveredNodeIds.length === 0) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const confidence = normalizeOptionalString(record.confidence);
|
|
153
|
+
const details = normalizeEvidenceDetails(record.details);
|
|
154
|
+
return {
|
|
155
|
+
id,
|
|
156
|
+
source,
|
|
157
|
+
service,
|
|
158
|
+
suiteName,
|
|
159
|
+
type,
|
|
160
|
+
testFilePath,
|
|
161
|
+
coveredNodeIds,
|
|
162
|
+
...(confidence && isSetValue(CONFIDENCE_LEVELS, confidence) ? { confidence } : {}),
|
|
163
|
+
...(details ? { details } : {}),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function normalizeCoverageGraphDiagnostic(value) {
|
|
167
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
168
|
+
return null;
|
|
169
|
+
const record = value;
|
|
170
|
+
const level = normalizeOptionalString(record.level);
|
|
171
|
+
const code = normalizeOptionalString(record.code);
|
|
172
|
+
const filePath = normalizeOptionalString(record.filePath);
|
|
173
|
+
const service = normalizeOptionalString(record.service);
|
|
174
|
+
const message = normalizeOptionalString(record.message);
|
|
175
|
+
if (!level || !code || !filePath || !service || !message)
|
|
176
|
+
return null;
|
|
177
|
+
if (!isSetValue(DIAGNOSTIC_LEVELS, level))
|
|
178
|
+
return null;
|
|
179
|
+
return { level, code, filePath, service, message };
|
|
180
|
+
}
|
|
181
|
+
export function normalizeCoverageGraph(value) {
|
|
182
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
183
|
+
return null;
|
|
184
|
+
const record = value;
|
|
185
|
+
const schemaVersion = Number.isInteger(record.schemaVersion) && Number(record.schemaVersion) > 0
|
|
186
|
+
? Number(record.schemaVersion)
|
|
187
|
+
: TESTKIT_COVERAGE_GRAPH_VERSION;
|
|
188
|
+
const nodes = Array.isArray(record.nodes)
|
|
189
|
+
? record.nodes.map((entry) => normalizeCoverageGraphNode(entry)).filter((entry) => Boolean(entry))
|
|
190
|
+
: [];
|
|
191
|
+
const edges = Array.isArray(record.edges)
|
|
192
|
+
? record.edges.map((entry) => normalizeCoverageGraphEdge(entry)).filter((entry) => Boolean(entry))
|
|
193
|
+
: [];
|
|
194
|
+
const evidence = Array.isArray(record.evidence)
|
|
195
|
+
? record.evidence.map((entry) => normalizeCoverageEvidence(entry)).filter((entry) => Boolean(entry))
|
|
196
|
+
: [];
|
|
197
|
+
const diagnostics = Array.isArray(record.diagnostics)
|
|
198
|
+
? record.diagnostics
|
|
199
|
+
.map((entry) => normalizeCoverageGraphDiagnostic(entry))
|
|
200
|
+
.filter((entry) => Boolean(entry))
|
|
201
|
+
: [];
|
|
202
|
+
if (nodes.length === 0)
|
|
203
|
+
return null;
|
|
204
|
+
return {
|
|
205
|
+
schemaVersion,
|
|
206
|
+
nodes,
|
|
207
|
+
edges,
|
|
208
|
+
evidence,
|
|
209
|
+
diagnostics,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export function isPageOverlayResponse(value) {
|
|
213
|
+
return Boolean(normalizePageOverlayResponse(value));
|
|
214
|
+
}
|
|
215
|
+
export function normalizePageOverlayResponse(value) {
|
|
216
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
217
|
+
return null;
|
|
218
|
+
const record = value;
|
|
219
|
+
if (record.protocolVersion !== TESTKIT_BROWSER_PROTOCOL_VERSION)
|
|
220
|
+
return null;
|
|
221
|
+
if (!record.page || typeof record.page !== "object")
|
|
222
|
+
return null;
|
|
223
|
+
if (!record.match || typeof record.match !== "object")
|
|
224
|
+
return null;
|
|
225
|
+
if (!record.summary || typeof record.summary !== "object")
|
|
226
|
+
return null;
|
|
227
|
+
if (!Array.isArray(record.coverage) || !Array.isArray(record.failures))
|
|
228
|
+
return null;
|
|
229
|
+
const summary = record.summary;
|
|
230
|
+
if (!isSetValue(FAILURE_STATES, summary.failureState))
|
|
231
|
+
return null;
|
|
232
|
+
if (!isSetValue(COVERAGE_STATES, summary.coverageState))
|
|
233
|
+
return null;
|
|
234
|
+
return record;
|
|
235
|
+
}
|
|
236
|
+
export function createBridgeErrorResponse(code, message) {
|
|
237
|
+
return {
|
|
238
|
+
protocolVersion: TESTKIT_BROWSER_PROTOCOL_VERSION,
|
|
239
|
+
error: {
|
|
240
|
+
code,
|
|
241
|
+
message,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function normalizeEvidenceDetails(value) {
|
|
246
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
247
|
+
return null;
|
|
248
|
+
const record = value;
|
|
249
|
+
const requestPaths = normalizeStringArray(record.requestPaths);
|
|
250
|
+
const route = normalizeOptionalString(record.route);
|
|
251
|
+
const targets = Array.isArray(record.targets)
|
|
252
|
+
? record.targets.map((entry) => normalizeBrowserTarget(entry)).filter((entry) => Boolean(entry))
|
|
253
|
+
: [];
|
|
254
|
+
if (requestPaths.length === 0 && !route && targets.length === 0)
|
|
255
|
+
return null;
|
|
256
|
+
return {
|
|
257
|
+
...(requestPaths.length > 0 ? { requestPaths } : {}),
|
|
258
|
+
...(route ? { route } : {}),
|
|
259
|
+
...(targets.length > 0 ? { targets } : {}),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function normalizeMetadataRecord(value) {
|
|
263
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
264
|
+
return null;
|
|
265
|
+
const normalized = {};
|
|
266
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
267
|
+
const normalizedKey = normalizeOptionalString(key);
|
|
268
|
+
if (!normalizedKey)
|
|
269
|
+
continue;
|
|
270
|
+
if (entry === null ||
|
|
271
|
+
typeof entry === "string" ||
|
|
272
|
+
typeof entry === "number" ||
|
|
273
|
+
typeof entry === "boolean") {
|
|
274
|
+
normalized[normalizedKey] = entry;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return Object.keys(normalized).length > 0 ? normalized : null;
|
|
278
|
+
}
|
|
279
|
+
function normalizeStringArray(value) {
|
|
280
|
+
if (!Array.isArray(value))
|
|
281
|
+
return [];
|
|
282
|
+
return value.map((entry) => normalizeOptionalString(entry)).filter((entry) => Boolean(entry));
|
|
283
|
+
}
|
|
284
|
+
function normalizeOptionalString(value) {
|
|
285
|
+
if (typeof value !== "string")
|
|
286
|
+
return null;
|
|
287
|
+
const normalized = value.trim();
|
|
288
|
+
return normalized.length > 0 ? normalized : null;
|
|
289
|
+
}
|
|
290
|
+
function isSetValue(set, value) {
|
|
291
|
+
return typeof value === "string" && set.has(value);
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elench/testkit-protocol",
|
|
3
|
+
"version": "0.1.142",
|
|
4
|
+
"description": "Shared browser protocol for testkit bridge and extension consumers",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/",
|
|
17
|
+
"package.json"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -p tsconfig.build.json",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
23
|
+
},
|
|
24
|
+
"private": false
|
|
25
|
+
}
|