agentic-engineering-harness 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +17 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/config.js +4 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/sdd.js +2 -2
- package/dist/core/sdd.js.map +1 -1
- package/dist/core/types.d.ts +28 -1
- package/dist/delivery/finalize.d.ts +1 -1
- package/dist/delivery/finalize.js +6 -1
- package/dist/delivery/finalize.js.map +1 -1
- package/dist/evidence/graph.d.ts +1 -0
- package/dist/evidence/graph.js +4 -4
- package/dist/evidence/graph.js.map +1 -1
- package/dist/issues/intake.d.ts +1 -1
- package/dist/maturity/inventory.d.ts +30 -0
- package/dist/maturity/inventory.js +53 -0
- package/dist/maturity/inventory.js.map +1 -0
- package/dist/provenance/generate.d.ts +12 -1
- package/dist/provenance/generate.js +86 -10
- package/dist/provenance/generate.js.map +1 -1
- package/dist/providers/validation/bddExecution.d.ts +15 -0
- package/dist/providers/validation/bddExecution.js +107 -0
- package/dist/providers/validation/bddExecution.js.map +1 -0
- package/dist/providers/validation/integrationEnvironment.d.ts +12 -0
- package/dist/providers/validation/integrationEnvironment.js +101 -0
- package/dist/providers/validation/integrationEnvironment.js.map +1 -0
- package/dist/providers/validation/pact.d.ts +15 -0
- package/dist/providers/validation/pact.js +79 -0
- package/dist/providers/validation/pact.js.map +1 -0
- package/dist/providers/validation/protocol.d.ts +7 -0
- package/dist/providers/validation/protocol.js +35 -0
- package/dist/providers/validation/protocol.js.map +1 -0
- package/dist/providers/validation/providerUtils.d.ts +18 -0
- package/dist/providers/validation/providerUtils.js +40 -0
- package/dist/providers/validation/providerUtils.js.map +1 -0
- package/dist/providers/validation/registry.d.ts +21 -0
- package/dist/providers/validation/registry.js +59 -0
- package/dist/providers/validation/registry.js.map +1 -0
- package/dist/providers/validation/reqnroll.d.ts +7 -0
- package/dist/providers/validation/reqnroll.js +50 -0
- package/dist/providers/validation/reqnroll.js.map +1 -0
- package/dist/providers/validation/testExecution.d.ts +15 -0
- package/dist/providers/validation/testExecution.js +122 -0
- package/dist/providers/validation/testExecution.js.map +1 -0
- package/dist/providers/validation/types.d.ts +158 -0
- package/dist/providers/validation/types.js +2 -0
- package/dist/providers/validation/types.js.map +1 -0
- package/dist/spec/openspec.js +12 -7
- package/dist/spec/openspec.js.map +1 -1
- package/dist/validators/gherkin.js +5 -56
- package/dist/validators/gherkin.js.map +1 -1
- package/dist/validators/registry.js +42 -3
- package/dist/validators/registry.js.map +1 -1
- package/dist/validators/toolEvidence.js +2 -2
- package/dist/validators/toolEvidence.js.map +1 -1
- package/dist/validators/types.d.ts +2 -1
- package/docs/ARCHITECTURE.md +60 -2
- package/docs/COMPONENT_MATURITY.md +11 -11
- package/docs/OSS_STACK.md +5 -4
- package/docs/V0.2.md +4 -1
- package/docs/VALIDATION.md +54 -3
- package/docs/VALIDATION_COMPATIBILITY.md +19 -0
- package/docs/component-maturity.json +5 -5
- package/maturity/components.yaml +59 -0
- package/package.json +2 -1
- package/schemas/project.schema.json +2 -2
- package/schemas/validation-result.schema.json +84 -0
- package/templates/project.yaml +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bddExecution.js","sourceRoot":"","sources":["../../../src/providers/validation/bddExecution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ValidationCapability } from "../../core/types.js";
|
|
2
|
+
import type { IntegrationEnvironmentResult, ProviderDetection, ProviderDoctorResult, ProviderExecution, ProviderPlan, ValidationProvider, ValidationProviderContext } from "./types.js";
|
|
3
|
+
export declare class IntegrationEnvironmentProvider implements ValidationProvider<IntegrationEnvironmentResult> {
|
|
4
|
+
readonly id = "integration-environment";
|
|
5
|
+
readonly capabilities: ValidationCapability[];
|
|
6
|
+
detect(context: ValidationProviderContext): Promise<ProviderDetection | undefined>;
|
|
7
|
+
doctor(context: ValidationProviderContext): Promise<ProviderDoctorResult>;
|
|
8
|
+
plan(context: ValidationProviderContext, detection?: ProviderDetection): Promise<ProviderPlan>;
|
|
9
|
+
execute(context: ValidationProviderContext, plan: ProviderPlan): Promise<ProviderExecution>;
|
|
10
|
+
normalize(context: ValidationProviderContext, execution: ProviderExecution): Promise<IntegrationEnvironmentResult>;
|
|
11
|
+
}
|
|
12
|
+
export declare function validateEnvironmentRequirements(context: ValidationProviderContext): string[];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { commandExists } from "../../utils/process.js";
|
|
2
|
+
import { configuredCommand, doctorForCommand, executePlan, resolveCwd } from "./providerUtils.js";
|
|
3
|
+
import { persistRawArtifact } from "./protocol.js";
|
|
4
|
+
export class IntegrationEnvironmentProvider {
|
|
5
|
+
id = "integration-environment";
|
|
6
|
+
capabilities = ["integration-test"];
|
|
7
|
+
async detect(context) {
|
|
8
|
+
const configured = await configuredCommand(context);
|
|
9
|
+
const options = context.spec?.options ?? context.providerSpec?.options ?? {};
|
|
10
|
+
if (configured.command || typeof options.provisionCommand === "string")
|
|
11
|
+
return { provider: configured.provider === "configured-command" ? String(options.provider ?? "configured-environment") : configured.provider, command: configured.command ?? String(options.provisionCommand), runtime: "oci-or-project", reason: "explicit integration environment lifecycle" };
|
|
12
|
+
if (typeof options.image === "string" && (await commandExists("podman", context.root) || await commandExists("docker", context.root)))
|
|
13
|
+
return { provider: "oci", command: `${await commandExists("podman", context.root) ? "podman" : "docker"} run --rm --network=none ${options.image}`, runtime: "oci", reason: "explicit OCI image and available runtime" };
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
async doctor(context) {
|
|
17
|
+
const detection = await this.detect(context);
|
|
18
|
+
if (!detection)
|
|
19
|
+
return { provider: this.id, available: false, message: "No integration environment provider was configured." };
|
|
20
|
+
const security = validateEnvironmentRequirements(context);
|
|
21
|
+
if (security.length)
|
|
22
|
+
return { provider: detection.provider, available: false, message: security.join(" "), details: { securityFailures: security } };
|
|
23
|
+
return doctorForCommand(detection.command, resolveCwd(context), detection.provider, { runtime: detection.runtime });
|
|
24
|
+
}
|
|
25
|
+
async plan(context, detection) {
|
|
26
|
+
const selected = detection ?? await this.detect(context);
|
|
27
|
+
if (!selected?.command)
|
|
28
|
+
throw new Error("No integration environment provider or lifecycle command is configured.");
|
|
29
|
+
return { provider: selected.provider, capability: "integration-test", command: selected.command, cwd: resolveCwd(context), runtime: selected.runtime, env: connectionData(context), options: { timeoutMs: (context.spec?.timeoutSeconds ?? context.providerSpec?.timeoutSeconds ?? 900) * 1000 } };
|
|
30
|
+
}
|
|
31
|
+
async execute(context, plan) {
|
|
32
|
+
const options = context.spec?.options ?? context.providerSpec?.options ?? {};
|
|
33
|
+
const lifecycle = [];
|
|
34
|
+
const provision = String(options.provisionCommand ?? plan.command);
|
|
35
|
+
const readiness = typeof options.readinessCommand === "string" ? options.readinessCommand : undefined;
|
|
36
|
+
const test = typeof options.testCommand === "string" ? options.testCommand : undefined;
|
|
37
|
+
const cleanup = typeof options.cleanupCommand === "string" ? options.cleanupCommand : undefined;
|
|
38
|
+
const started = Date.now();
|
|
39
|
+
let stdout = "";
|
|
40
|
+
let stderr = "";
|
|
41
|
+
let exitCode = 0;
|
|
42
|
+
const run = async (label, command) => { const result = await executePlan({ ...plan, command }); stdout += `--- ${label} ---\n${result.stdout}\n`; stderr += result.stderr ? `--- ${label} stderr ---\n${result.stderr}\n` : ""; if (result.exitCode !== 0 && exitCode === 0)
|
|
43
|
+
exitCode = result.exitCode; lifecycle.push(`${label}:${result.exitCode === 0 ? "PASS" : "FAIL"}`); };
|
|
44
|
+
try {
|
|
45
|
+
await run("provision", provision);
|
|
46
|
+
if (readiness)
|
|
47
|
+
await run("readiness", readiness);
|
|
48
|
+
if (test)
|
|
49
|
+
await run("test", test);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
if (cleanup)
|
|
53
|
+
await run("cleanup", cleanup);
|
|
54
|
+
}
|
|
55
|
+
return { plan, exitCode, stdout: `${lifecycle.join(" ")}\n${stdout}`, stderr, durationMs: Date.now() - started, rawArtifact: await persistRawArtifact(context.root, context.rawArtifactDirectory, context.spec?.id ?? context.providerSpec?.id ?? "integration-environment", stdout, stderr) };
|
|
56
|
+
}
|
|
57
|
+
async normalize(context, execution) {
|
|
58
|
+
const lifecycle = { provisioned: /provision:PASS/.test(execution.stdout), ready: !/readiness:FAIL/.test(execution.stdout), tested: !/test:FAIL/.test(execution.stdout), cleaned: /cleanup:PASS/.test(execution.stdout), durationMs: execution.durationMs };
|
|
59
|
+
const requirements = environmentRequirements(context);
|
|
60
|
+
const failed = execution.exitCode !== 0 || !lifecycle.provisioned || !lifecycle.cleaned;
|
|
61
|
+
return { version: 1, provider: execution.plan.provider, capability: "integration-test", status: failed ? "FAIL" : "PASS", requirements, lifecycle, connectionData: redactConnectionData(execution.plan.env), rawArtifact: execution.rawArtifact };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function validateEnvironmentRequirements(context) {
|
|
65
|
+
const options = context.spec?.options ?? context.providerSpec?.options ?? {};
|
|
66
|
+
const failures = [];
|
|
67
|
+
const network = String(options.network ?? "isolated");
|
|
68
|
+
if (!["isolated", "none", "project"].includes(network))
|
|
69
|
+
failures.push(`Unsupported integration network '${network}'.`);
|
|
70
|
+
if (options.privileged === true)
|
|
71
|
+
failures.push("Privileged integration environments are not allowed by default.");
|
|
72
|
+
if (network === "host")
|
|
73
|
+
failures.push("Host networking must not be implicit.");
|
|
74
|
+
if (options.dockerSocket === true)
|
|
75
|
+
failures.push("Docker socket access is not allowed by default.");
|
|
76
|
+
if (Array.isArray(options.mounts) && options.mounts.some((mount) => String(mount).startsWith("/")))
|
|
77
|
+
failures.push("Absolute host mounts require an explicit policy adapter.");
|
|
78
|
+
if (Array.isArray(options.credentials) && options.credentials.length && options.credentialsAllowlist !== true)
|
|
79
|
+
failures.push("Credentials require an explicit allowlist.");
|
|
80
|
+
const data = options.connectionData;
|
|
81
|
+
if (data && typeof data === "object" && !Array.isArray(data) && Object.keys(data).some((key) => /(password|token|secret|private.?key)/i.test(key)) && options.connectionDataAllowlist !== true)
|
|
82
|
+
failures.push("Sensitive connection data requires an explicit allowlist.");
|
|
83
|
+
return failures;
|
|
84
|
+
}
|
|
85
|
+
function environmentRequirements(context) {
|
|
86
|
+
const options = context.spec?.options ?? context.providerSpec?.options ?? {};
|
|
87
|
+
const network = String(options.network ?? "isolated");
|
|
88
|
+
return [{ kind: String(options.kind ?? "service"), image: typeof options.image === "string" ? options.image : undefined, network, ephemeral: options.ephemeral !== false, ports: Array.isArray(options.ports) ? options.ports.map(Number).filter(Number.isFinite) : undefined, environment: Array.isArray(options.environment) ? options.environment.map(String) : undefined, mounts: Array.isArray(options.mounts) ? options.mounts.map(String) : undefined }];
|
|
89
|
+
}
|
|
90
|
+
function connectionData(context) {
|
|
91
|
+
const value = context.spec?.options?.connectionData ?? context.providerSpec?.options?.connectionData;
|
|
92
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
93
|
+
return undefined;
|
|
94
|
+
return Object.fromEntries(Object.entries(value).filter(([, item]) => typeof item === "string").map(([key, item]) => [key, item]));
|
|
95
|
+
}
|
|
96
|
+
function redactConnectionData(value) {
|
|
97
|
+
if (!value)
|
|
98
|
+
return undefined;
|
|
99
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, /(password|token|secret|private.?key)/i.test(key) ? "<redacted>" : item]));
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=integrationEnvironment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrationEnvironment.js","sourceRoot":"","sources":["../../../src/providers/validation/integrationEnvironment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ValidationCapability } from "../../core/types.js";
|
|
2
|
+
import type { ContractVerificationResult, ProviderDetection, ProviderDoctorResult, ProviderExecution, ProviderPlan, ValidationProvider, ValidationProviderContext } from "./types.js";
|
|
3
|
+
export declare class PactContractTestingProvider implements ValidationProvider<ContractVerificationResult> {
|
|
4
|
+
readonly id = "pact";
|
|
5
|
+
readonly capabilities: ValidationCapability[];
|
|
6
|
+
detect(context: ValidationProviderContext): Promise<ProviderDetection | undefined>;
|
|
7
|
+
doctor(context: ValidationProviderContext): Promise<ProviderDoctorResult>;
|
|
8
|
+
plan(context: ValidationProviderContext, detection?: ProviderDetection): Promise<ProviderPlan>;
|
|
9
|
+
execute(context: ValidationProviderContext, plan: ProviderPlan): Promise<ProviderExecution>;
|
|
10
|
+
normalize(context: ValidationProviderContext, execution: ProviderExecution): Promise<ContractVerificationResult>;
|
|
11
|
+
}
|
|
12
|
+
export declare function runPactVerification(context: ValidationProviderContext, provider?: ValidationProvider<ContractVerificationResult>): Promise<{
|
|
13
|
+
result: ContractVerificationResult;
|
|
14
|
+
required: boolean;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { commandExists } from "../../utils/process.js";
|
|
4
|
+
import { normalizePactOutput } from "../../validators/toolEvidence.js";
|
|
5
|
+
import { configuredCommand, doctorForCommand, executePlan, fileExists, resolveCwd } from "./providerUtils.js";
|
|
6
|
+
import { parseJson, persistRawArtifact } from "./protocol.js";
|
|
7
|
+
export class PactContractTestingProvider {
|
|
8
|
+
id = "pact";
|
|
9
|
+
capabilities = ["contract-test"];
|
|
10
|
+
async detect(context) {
|
|
11
|
+
const explicit = await configuredCommand(context);
|
|
12
|
+
if (explicit.command)
|
|
13
|
+
return { provider: explicit.provider, command: explicit.command, runtime: explicit.runtime, reason: "explicit Pact verifier command" };
|
|
14
|
+
const pactFile = optionString(context, "pactFile");
|
|
15
|
+
if (!pactFile || !(await fileExists(path.resolve(context.root, pactFile))))
|
|
16
|
+
return undefined;
|
|
17
|
+
if (await commandExists("pact", context.root))
|
|
18
|
+
return { provider: "pact-cli", command: "pact verifier", runtime: "pact-ffi", reason: "local Pact file and Pact CLI" };
|
|
19
|
+
if (await commandExists("pact_verifier_cli", context.root))
|
|
20
|
+
return { provider: "pact-verifier-cli", command: "pact_verifier_cli", runtime: "pact-ffi", reason: "local Pact file and standalone verifier" };
|
|
21
|
+
return { provider: "pact", command: undefined, runtime: "pact-ffi", reason: "local Pact file found but no official verifier executable is installed" };
|
|
22
|
+
}
|
|
23
|
+
async doctor(context) {
|
|
24
|
+
const detection = await this.detect(context);
|
|
25
|
+
if (!detection?.command)
|
|
26
|
+
return { provider: this.id, available: false, message: "Pact file is configured but the official Pact verifier is unavailable.", details: { pactFile: optionString(context, "pactFile") } };
|
|
27
|
+
return doctorForCommand(detection.command, resolveCwd(context), detection.provider, { runtime: detection.runtime });
|
|
28
|
+
}
|
|
29
|
+
async plan(context, detection) {
|
|
30
|
+
const selected = detection ?? await this.detect(context);
|
|
31
|
+
const configured = await configuredCommand(context);
|
|
32
|
+
if (configured.command && context.spec?.command)
|
|
33
|
+
return { provider: selected?.provider ?? configured.provider, capability: "contract-test", command: renderCommand(configured.command, context), cwd: resolveCwd(context), runtime: selected?.runtime ?? configured.runtime, options: { timeoutMs: (context.spec.timeoutSeconds ?? 900) * 1000 } };
|
|
34
|
+
const pactFile = optionString(context, "pactFile");
|
|
35
|
+
if (!pactFile)
|
|
36
|
+
throw new Error("Pact provider requires options.pactFile.");
|
|
37
|
+
const report = path.resolve(context.root, context.rawArtifactDirectory, `${context.spec?.id ?? "pact"}.report.json`);
|
|
38
|
+
const host = optionString(context, "hostname") ?? "127.0.0.1";
|
|
39
|
+
const port = optionNumber(context, "port") ?? 8080;
|
|
40
|
+
const command = selected?.provider === "pact-verifier-cli" ? `pact_verifier_cli -f ${quote(path.resolve(context.root, pactFile))} -h ${quote(host)} -p ${port} -j ${quote(report)}` : `pact verifier --file ${quote(path.resolve(context.root, pactFile))} --hostname ${quote(host)} --port ${port} --json ${quote(report)}`;
|
|
41
|
+
return { provider: selected?.provider ?? "pact", capability: "contract-test", command, cwd: resolveCwd(context), runtime: selected?.runtime ?? "pact-ffi", options: { timeoutMs: (context.spec?.timeoutSeconds ?? context.providerSpec?.timeoutSeconds ?? 900) * 1000, pactFile, report } };
|
|
42
|
+
}
|
|
43
|
+
async execute(context, plan) {
|
|
44
|
+
const execution = await executePlan(plan);
|
|
45
|
+
const id = context.spec?.id ?? context.providerSpec?.id ?? "pact";
|
|
46
|
+
return { ...execution, rawArtifact: await persistRawArtifact(context.root, context.rawArtifactDirectory, id, execution.stdout, execution.stderr) };
|
|
47
|
+
}
|
|
48
|
+
async normalize(context, execution) {
|
|
49
|
+
const report = typeof execution.plan.options?.report === "string" ? await readJson(path.resolve(execution.plan.cwd, execution.plan.options.report)) : undefined;
|
|
50
|
+
const parsed = report ?? parseJson(execution.stdout);
|
|
51
|
+
const failures = normalizePactOutput(parsed).map((finding) => ({ id: finding.rule, message: finding.message ?? "Pact interaction failed" }));
|
|
52
|
+
const summary = pactSummary(parsed, execution, failures.length);
|
|
53
|
+
const passed = execution.exitCode === 0 && failures.length === 0;
|
|
54
|
+
return { version: 1, provider: execution.plan.provider, capability: "contract-test", status: passed ? "PASS" : "FAIL", verifierCommand: execution.plan.command, pactFile: typeof execution.plan.options?.pactFile === "string" ? execution.plan.options.pactFile : undefined, providerUrl: providerUrl(execution.plan), summary, failures, requirements: requirementIds(context), rawArtifact: execution.rawArtifact };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export async function runPactVerification(context, provider = new PactContractTestingProvider()) {
|
|
58
|
+
const detection = await provider.detect(context);
|
|
59
|
+
if (!detection?.command)
|
|
60
|
+
return { result: { version: 1, provider: provider.id, capability: "contract-test", status: "SKIP", verifierCommand: "", summary: { total: 0, passed: 0, failed: 0, durationMs: 0 }, failures: [{ message: "An official Pact verifier command is required." }], requirements: requirementIds(context), rawArtifact: "" }, required: context.spec?.required ?? context.providerSpec?.required ?? true };
|
|
61
|
+
const plan = await provider.plan(context, detection);
|
|
62
|
+
const execution = await provider.execute(context, plan);
|
|
63
|
+
return { result: await provider.normalize(context, execution), required: context.spec?.required ?? context.providerSpec?.required ?? true };
|
|
64
|
+
}
|
|
65
|
+
function optionString(context, key) { const value = context.spec?.options?.[key] ?? context.providerSpec?.options?.[key]; return typeof value === "string" ? value : undefined; }
|
|
66
|
+
function requirementIds(context) { return (context.contract.requirements ?? []).filter((item) => item.capabilities?.includes("contract-test") || !item.capabilities?.length).map((item) => item.id); }
|
|
67
|
+
function optionNumber(context, key) { const value = context.spec?.options?.[key] ?? context.providerSpec?.options?.[key]; return typeof value === "number" ? value : undefined; }
|
|
68
|
+
function renderCommand(command, context) { return command.replaceAll("{taskId}", context.contract.task.id).replaceAll("{baseRef}", context.baseRef ?? "HEAD"); }
|
|
69
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
70
|
+
async function readJson(file) { try {
|
|
71
|
+
return JSON.parse(await fs.readFile(file, "utf8"));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return undefined;
|
|
75
|
+
} }
|
|
76
|
+
function pactSummary(value, execution, failureCount) { const record = value && typeof value === "object" && !Array.isArray(value) ? value : {}; const results = Array.isArray(record.interactionResults) ? record.interactionResults : []; const interactionCount = results.length || (Array.isArray(record.interactions) ? record.interactions.length : 0); const resultFailures = results.filter((item) => !["ok", "passed", "success", "verified"].includes(String(item?.result ?? "").toLowerCase())).length; const total = Number(record.total ?? record.summary?.total ?? 0) || interactionCount || failureCount; const failed = Number(record.failed ?? record.summary?.failed ?? 0) || resultFailures || failureCount; return { total: Math.max(total, failed), passed: Math.max(0, total - failed), failed, durationMs: execution.durationMs }; }
|
|
77
|
+
function providerUrl(plan) { const match = plan.command.match(/--hostname\s+'([^']+)'\s+--port\s+(\d+)|-h\s+'([^']+)'\s+-p\s+(\d+)/); if (!match)
|
|
78
|
+
return undefined; const host = match[1] ?? match[3]; const port = match[2] ?? match[4]; return `http://${host}:${port}`; }
|
|
79
|
+
//# sourceMappingURL=pact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pact.js","sourceRoot":"","sources":["../../../src/providers/validation/pact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ValidationCheck } from "../../core/types.js";
|
|
2
|
+
import type { BddExecutionResult, ContractVerificationResult, IntegrationEnvironmentResult, TestExecutionResult } from "./types.js";
|
|
3
|
+
export type NormalizedValidationResult = TestExecutionResult | BddExecutionResult | IntegrationEnvironmentResult | ContractVerificationResult;
|
|
4
|
+
export declare function persistRawArtifact(root: string, directory: string, id: string, stdout: string, stderr: string): Promise<string>;
|
|
5
|
+
export declare function resultCheck(id: string, category: string, result: NormalizedValidationResult, required: boolean): ValidationCheck;
|
|
6
|
+
export declare function parseJson(value: string): unknown;
|
|
7
|
+
export declare function stableFingerprint(value: unknown): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export async function persistRawArtifact(root, directory, id, stdout, stderr) {
|
|
5
|
+
const safe = id.replace(/[^A-Za-z0-9._-]/g, "-");
|
|
6
|
+
const output = path.resolve(root, directory, `${safe}.raw`);
|
|
7
|
+
await fs.mkdir(path.dirname(output), { recursive: true });
|
|
8
|
+
const body = `${stdout}${stderr ? `\n--- stderr ---\n${stderr}` : ""}`;
|
|
9
|
+
await fs.writeFile(output, body, "utf8");
|
|
10
|
+
return path.relative(root, output).replaceAll("\\", "/");
|
|
11
|
+
}
|
|
12
|
+
export function resultCheck(id, category, result, required) {
|
|
13
|
+
const failed = result.status === "FAIL";
|
|
14
|
+
const skipped = result.status === "SKIP";
|
|
15
|
+
return {
|
|
16
|
+
id,
|
|
17
|
+
category,
|
|
18
|
+
status: failed ? "FAIL" : skipped ? (required ? "FAIL" : "SKIP") : "PASS",
|
|
19
|
+
message: failed ? `${result.provider} ${category} failed.` : skipped ? `${result.provider} ${category} was skipped.` : `${result.provider} ${category} passed.`,
|
|
20
|
+
durationMs: "summary" in result ? result.summary.durationMs : result.lifecycle.durationMs,
|
|
21
|
+
details: { provider: result.provider, capability: result.capability, result, rawArtifact: result.rawArtifact }
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function parseJson(value) {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(value);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function stableFingerprint(value) {
|
|
33
|
+
return crypto.createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/providers/validation/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB,EAAE,EAAU,EAAE,MAAc,EAAE,MAAc;IAClH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACvE,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,QAAgB,EAAE,MAAkC,EAAE,QAAiB;IAC7G,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;IACzC,OAAO;QACL,EAAE;QACF,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;QACzE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,eAAe,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,UAAU;QAC/J,UAAU,EAAE,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;QACzF,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;KAC/G,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ProviderExecution, ProviderPlan, ValidationProviderContext } from "./types.js";
|
|
2
|
+
export declare function fileExists(file: string): Promise<boolean>;
|
|
3
|
+
export declare function readJsonFile<T>(file: string): Promise<T | undefined>;
|
|
4
|
+
export declare function configuredCommand(context: ValidationProviderContext, fallback?: string): Promise<{
|
|
5
|
+
command?: string;
|
|
6
|
+
runtime?: string;
|
|
7
|
+
provider: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function doctorForCommand(command: string | undefined, cwd: string, provider: string, details?: Record<string, unknown>): Promise<{
|
|
10
|
+
provider: string;
|
|
11
|
+
available: boolean;
|
|
12
|
+
message: string;
|
|
13
|
+
details: {
|
|
14
|
+
executable: string | undefined;
|
|
15
|
+
};
|
|
16
|
+
}>;
|
|
17
|
+
export declare function executePlan(plan: ProviderPlan): Promise<ProviderExecution>;
|
|
18
|
+
export declare function resolveCwd(context: ValidationProviderContext): string;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { commandExists, runProcess } from "../../utils/process.js";
|
|
4
|
+
export async function fileExists(file) {
|
|
5
|
+
try {
|
|
6
|
+
await fs.access(file);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function readJsonFile(file) {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(await fs.readFile(file, "utf8"));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function configuredCommand(context, fallback) {
|
|
22
|
+
const providerSpec = context.providerSpec;
|
|
23
|
+
const spec = context.spec;
|
|
24
|
+
const command = providerSpec?.command ?? spec?.command ?? fallback;
|
|
25
|
+
const provider = providerSpec?.provider ?? spec?.options?.provider;
|
|
26
|
+
return { command, runtime: typeof spec?.options?.runtime === "string" ? spec.options.runtime : undefined, provider: typeof provider === "string" ? provider : "configured-command" };
|
|
27
|
+
}
|
|
28
|
+
export async function doctorForCommand(command, cwd, provider, details = {}) {
|
|
29
|
+
const executable = command?.trim().split(/\s+/, 1)[0];
|
|
30
|
+
const available = Boolean(executable) && await commandExists(executable, cwd);
|
|
31
|
+
return { provider, available, message: available ? `${provider} is available.` : `${provider} command is unavailable.`, details: { ...details, executable } };
|
|
32
|
+
}
|
|
33
|
+
export async function executePlan(plan) {
|
|
34
|
+
const result = await runProcess(plan.command, { cwd: plan.cwd, timeoutMs: Number(plan.options?.timeoutMs ?? 900_000), env: plan.env });
|
|
35
|
+
return { plan, ...result, rawArtifact: "" };
|
|
36
|
+
}
|
|
37
|
+
export function resolveCwd(context) {
|
|
38
|
+
return path.resolve(context.root, context.providerSpec?.workingDirectory ?? context.spec?.workingDirectory ?? ".");
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=providerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerUtils.js","sourceRoot":"","sources":["../../../src/providers/validation/providerUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAY;IAChD,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAkC,EAAE,QAAiB;IAC3F,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,IAAI,QAAQ,CAAC;IACnE,MAAM,QAAQ,GAAG,YAAY,EAAE,QAAQ,IAAI,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;IACnE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC;AACvL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA2B,EAAE,GAAW,EAAE,QAAgB,EAAE,UAAmC,EAAE;IACtI,MAAM,UAAU,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,MAAM,aAAa,CAAC,UAAW,EAAE,GAAG,CAAC,CAAC;IAC/E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ,0BAA0B,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;AAChK,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAkB;IAClD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvI,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAkC;IAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,gBAAgB,IAAI,OAAO,CAAC,IAAI,EAAE,gBAAgB,IAAI,GAAG,CAAC,CAAC;AACrH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { HarnessProjectConfig, TaskContract, ValidationCapability, ValidationProviderSpec, ValidatorSpec } from "../../core/types.js";
|
|
2
|
+
import { resultCheck } from "./protocol.js";
|
|
3
|
+
import type { BddExecutionResult, ContractVerificationResult, IntegrationEnvironmentResult, TestExecutionResult, ValidationProvider, ValidationProviderContext } from "./types.js";
|
|
4
|
+
export type ValidationProviderResult = TestExecutionResult | BddExecutionResult | IntegrationEnvironmentResult | ContractVerificationResult;
|
|
5
|
+
export interface CapabilityResolution {
|
|
6
|
+
capability: ValidationCapability;
|
|
7
|
+
provider: string;
|
|
8
|
+
source: "explicit" | "detected" | "fallback";
|
|
9
|
+
command?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class ValidationCapabilityRegistry {
|
|
12
|
+
private readonly providers;
|
|
13
|
+
constructor();
|
|
14
|
+
register(provider: ValidationProvider<ValidationProviderResult>): void;
|
|
15
|
+
list(capability?: ValidationCapability): string[];
|
|
16
|
+
resolve(context: ValidationProviderContext): Promise<CapabilityResolution | undefined>;
|
|
17
|
+
}
|
|
18
|
+
export declare const validationCapabilityRegistry: ValidationCapabilityRegistry;
|
|
19
|
+
export declare function runCapabilityValidator(context: ValidationProviderContext, id: string, capability: ValidationCapability, required: boolean): Promise<ReturnType<typeof resultCheck>>;
|
|
20
|
+
export declare function providerSpecFor(config: HarnessProjectConfig, capability: ValidationCapability, spec?: ValidatorSpec): ValidationProviderSpec | undefined;
|
|
21
|
+
export declare function capabilityRequirements(contract: TaskContract): ValidationCapability[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { GenericBddExecutionProvider, runBddExecution } from "./bddExecution.js";
|
|
2
|
+
import { IntegrationEnvironmentProvider } from "./integrationEnvironment.js";
|
|
3
|
+
import { PactContractTestingProvider, runPactVerification } from "./pact.js";
|
|
4
|
+
import { ReqnrollBddProvider } from "./reqnroll.js";
|
|
5
|
+
import { resultCheck } from "./protocol.js";
|
|
6
|
+
import { ProjectNativeTestExecutionProvider, runTestExecution } from "./testExecution.js";
|
|
7
|
+
export class ValidationCapabilityRegistry {
|
|
8
|
+
providers = [];
|
|
9
|
+
constructor() {
|
|
10
|
+
this.register(new ProjectNativeTestExecutionProvider());
|
|
11
|
+
this.register(new GenericBddExecutionProvider());
|
|
12
|
+
this.register(new IntegrationEnvironmentProvider());
|
|
13
|
+
this.register(new PactContractTestingProvider());
|
|
14
|
+
}
|
|
15
|
+
register(provider) { this.providers.push(provider); }
|
|
16
|
+
list(capability) { return this.providers.filter((provider) => !capability || provider.capabilities.includes(capability)).map((provider) => provider.id); }
|
|
17
|
+
async resolve(context) {
|
|
18
|
+
const candidates = this.providers.filter((candidate) => candidate.capabilities.includes(context.capability));
|
|
19
|
+
const provider = (context.providerSpec?.provider ? candidates.find((candidate) => candidate.id === context.providerSpec?.provider) : undefined) ?? candidates[0];
|
|
20
|
+
if (!provider)
|
|
21
|
+
return undefined;
|
|
22
|
+
const detection = await provider.detect(context);
|
|
23
|
+
if (!detection)
|
|
24
|
+
return undefined;
|
|
25
|
+
return { capability: context.capability, provider: detection.provider, source: context.providerSpec || context.spec?.command ? "explicit" : "detected", command: detection.command };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export const validationCapabilityRegistry = new ValidationCapabilityRegistry();
|
|
29
|
+
export async function runCapabilityValidator(context, id, capability, required) {
|
|
30
|
+
const effective = { ...context, capability };
|
|
31
|
+
if (capability === "bdd") {
|
|
32
|
+
const execution = await runBddExecution(effective, effective.spec?.options?.provider === "reqnroll" ? new ReqnrollBddProvider() : undefined);
|
|
33
|
+
return resultCheck(id, "bdd", execution.result, required);
|
|
34
|
+
}
|
|
35
|
+
if (capability === "contract-test")
|
|
36
|
+
return resultCheck(id, "contract", (await runPactVerification(effective)).result, required);
|
|
37
|
+
if (effective.spec?.adapter === "integration-environment" || ["integration-environment", "oci", "docker", "podman"].includes(effective.providerSpec?.provider ?? "") || typeof (effective.spec?.options ?? effective.providerSpec?.options)?.provisionCommand === "string") {
|
|
38
|
+
const provider = new IntegrationEnvironmentProvider();
|
|
39
|
+
const doctor = await provider.doctor(effective);
|
|
40
|
+
if (!doctor.available)
|
|
41
|
+
return resultCheck(id, "integration-environment", { version: 1, provider: doctor.provider, capability: "integration-test", status: doctor.details?.securityFailures ? "FAIL" : "SKIP", requirements: [], lifecycle: { provisioned: false, ready: false, tested: false, cleaned: false, durationMs: 0 }, rawArtifact: "" }, required);
|
|
42
|
+
const detection = await provider.detect(effective);
|
|
43
|
+
if (!detection)
|
|
44
|
+
return resultCheck(id, "integration-environment", { version: 1, provider: provider.id, capability: "integration-test", status: "SKIP", requirements: [], lifecycle: { provisioned: false, ready: false, tested: false, cleaned: false, durationMs: 0 }, rawArtifact: "" }, required);
|
|
45
|
+
const plan = await provider.plan(effective, detection);
|
|
46
|
+
const execution = await provider.execute(effective, plan);
|
|
47
|
+
return resultCheck(id, "integration-environment", await provider.normalize(effective, execution), required);
|
|
48
|
+
}
|
|
49
|
+
return resultCheck(id, capability, (await runTestExecution(effective)).result, required);
|
|
50
|
+
}
|
|
51
|
+
export function providerSpecFor(config, capability, spec) {
|
|
52
|
+
const providerName = typeof spec?.options?.provider === "string" ? spec.options.provider : undefined;
|
|
53
|
+
return config.validation?.providers?.find((item) => item.capability === capability && (!providerName || item.provider === providerName || item.id === providerName));
|
|
54
|
+
}
|
|
55
|
+
export function capabilityRequirements(contract) {
|
|
56
|
+
const declared = [...(contract.verification?.capabilities ?? []), ...(contract.requirements ?? []).flatMap((item) => item.capabilities ?? [])];
|
|
57
|
+
return [...new Set(declared)];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/validation/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GenericBddExecutionProvider } from "./bddExecution.js";
|
|
2
|
+
import type { ProviderDetection, ValidationProviderContext } from "./types.js";
|
|
3
|
+
/** Optional compatibility adapter. It is never selected by the generic BDD path. */
|
|
4
|
+
export declare class ReqnrollBddProvider extends GenericBddExecutionProvider {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
detect(context: ValidationProviderContext): Promise<ProviderDetection | undefined>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { commandExists } from "../../utils/process.js";
|
|
4
|
+
import { GenericBddExecutionProvider } from "./bddExecution.js";
|
|
5
|
+
/** Optional compatibility adapter. It is never selected by the generic BDD path. */
|
|
6
|
+
export class ReqnrollBddProvider extends GenericBddExecutionProvider {
|
|
7
|
+
id = "reqnroll";
|
|
8
|
+
async detect(context) {
|
|
9
|
+
const explicit = await super.detect(context);
|
|
10
|
+
if (explicit)
|
|
11
|
+
return explicit;
|
|
12
|
+
if (!(await commandExists("dotnet", context.root)))
|
|
13
|
+
return undefined;
|
|
14
|
+
const project = await findProject(context.root);
|
|
15
|
+
if (!project)
|
|
16
|
+
return undefined;
|
|
17
|
+
const content = await fs.readFile(project, "utf8");
|
|
18
|
+
const filterProperty = /Reqnroll\.xUnit/i.test(content) ? "Category" : "TestCategory";
|
|
19
|
+
return { provider: "reqnroll", command: `dotnet test '${project.replaceAll("'", "'\\''")}' --filter '${filterProperty}=${context.contract.task.id}'`, runtime: ".NET", reason: "explicit optional Reqnroll compatibility adapter" };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function findProject(root) {
|
|
23
|
+
for (const file of await walk(root)) {
|
|
24
|
+
if (!file.endsWith(".csproj"))
|
|
25
|
+
continue;
|
|
26
|
+
try {
|
|
27
|
+
if (/Reqnroll\./i.test(await fs.readFile(file, "utf8")))
|
|
28
|
+
return file;
|
|
29
|
+
}
|
|
30
|
+
catch { /* generated/vendor project */ }
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
async function walk(root) {
|
|
35
|
+
const output = [];
|
|
36
|
+
const visit = async (directory) => {
|
|
37
|
+
for (const entry of await fs.readdir(directory, { withFileTypes: true })) {
|
|
38
|
+
if ([".git", "node_modules", "bin", "obj"].includes(entry.name))
|
|
39
|
+
continue;
|
|
40
|
+
const file = path.join(directory, entry.name);
|
|
41
|
+
if (entry.isDirectory())
|
|
42
|
+
await visit(file);
|
|
43
|
+
else
|
|
44
|
+
output.push(file);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
await visit(root);
|
|
48
|
+
return output;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=reqnroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reqnroll.js","sourceRoot":"","sources":["../../../src/providers/validation/reqnroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGhE,oFAAoF;AACpF,MAAM,OAAO,mBAAoB,SAAQ,2BAA2B;IAChD,EAAE,GAAW,UAAU,CAAC;IAEjC,KAAK,CAAC,MAAM,CAAC,OAAkC;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACrE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;QAC1I,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC;IACtO,CAAC;CACF;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,SAAS;QACxC,IAAI,CAAC;YAAC,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAY;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;QACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;;gBAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,MAAM,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ValidationCapability } from "../../core/types.js";
|
|
2
|
+
import type { ProviderDetection, ProviderDoctorResult, ProviderExecution, ProviderPlan, TestExecutionResult, ValidationProvider, ValidationProviderContext } from "./types.js";
|
|
3
|
+
export declare class ProjectNativeTestExecutionProvider implements ValidationProvider<TestExecutionResult> {
|
|
4
|
+
readonly id = "project-native-test";
|
|
5
|
+
readonly capabilities: ValidationCapability[];
|
|
6
|
+
detect(context: ValidationProviderContext): Promise<ProviderDetection | undefined>;
|
|
7
|
+
doctor(context: ValidationProviderContext): Promise<ProviderDoctorResult>;
|
|
8
|
+
plan(context: ValidationProviderContext, detection?: ProviderDetection): Promise<ProviderPlan>;
|
|
9
|
+
execute(context: ValidationProviderContext, plan: ProviderPlan): Promise<ProviderExecution>;
|
|
10
|
+
normalize(context: ValidationProviderContext, execution: ProviderExecution): Promise<TestExecutionResult>;
|
|
11
|
+
}
|
|
12
|
+
export declare function runTestExecution(context: ValidationProviderContext, provider?: ValidationProvider<TestExecutionResult>): Promise<{
|
|
13
|
+
result: TestExecutionResult;
|
|
14
|
+
checkRequired: boolean;
|
|
15
|
+
}>;
|