@hasna/testers 0.0.49 → 0.0.51
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/index.js +428 -31
- package/dist/db/scenarios.d.ts.map +1 -1
- package/dist/index.js +180 -24
- package/dist/lib/ai-client.d.ts.map +1 -1
- package/dist/lib/next-route-inventory.d.ts +11 -0
- package/dist/lib/next-route-inventory.d.ts.map +1 -1
- package/dist/lib/route-fixtures.d.ts +20 -0
- package/dist/lib/route-fixtures.d.ts.map +1 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/mcp/index.js +181 -25
- package/dist/server/index.js +181 -25
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -11567,6 +11567,156 @@ var init_browser = __esm(() => {
|
|
|
11567
11567
|
DEFAULT_VIEWPORT = { width: 1280, height: 720 };
|
|
11568
11568
|
});
|
|
11569
11569
|
|
|
11570
|
+
// src/lib/route-fixtures.ts
|
|
11571
|
+
function isRecord2(value) {
|
|
11572
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11573
|
+
}
|
|
11574
|
+
function envNameForParam(prefix, param) {
|
|
11575
|
+
return `${prefix}_${param.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/[^A-Za-z0-9]+/g, "_").toUpperCase()}`;
|
|
11576
|
+
}
|
|
11577
|
+
function readString(value) {
|
|
11578
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
11579
|
+
}
|
|
11580
|
+
function resolveReference(value, env) {
|
|
11581
|
+
if (value.startsWith("$?"))
|
|
11582
|
+
return env[value.slice(2)]?.trim() || undefined;
|
|
11583
|
+
if (value.startsWith("$"))
|
|
11584
|
+
return env[value.slice(1)]?.trim() || undefined;
|
|
11585
|
+
return value;
|
|
11586
|
+
}
|
|
11587
|
+
function scenarioFixtureValue(params, name, env) {
|
|
11588
|
+
if (!params)
|
|
11589
|
+
return;
|
|
11590
|
+
const routeFixtures = isRecord2(params["routeFixtures"]) ? params["routeFixtures"] : {};
|
|
11591
|
+
const raw = readString(routeFixtures[name]) ?? readString(params[name]);
|
|
11592
|
+
return raw ? resolveReference(raw, env) : undefined;
|
|
11593
|
+
}
|
|
11594
|
+
function envFixtureValue(name, env) {
|
|
11595
|
+
const candidates = [
|
|
11596
|
+
envNameForParam("TESTERS_ROUTE", name),
|
|
11597
|
+
envNameForParam("TESTERS_FIXTURE", name),
|
|
11598
|
+
envNameForParam("ALUMIA_FIXTURE", name),
|
|
11599
|
+
...PARAM_ENV_CANDIDATES[name] ?? []
|
|
11600
|
+
];
|
|
11601
|
+
for (const candidate of candidates) {
|
|
11602
|
+
const value = env[candidate]?.trim();
|
|
11603
|
+
if (value)
|
|
11604
|
+
return value;
|
|
11605
|
+
}
|
|
11606
|
+
return;
|
|
11607
|
+
}
|
|
11608
|
+
function defaultFixtureValue(name) {
|
|
11609
|
+
if (name === "orgSlug")
|
|
11610
|
+
return "test-org";
|
|
11611
|
+
if (name.toLowerCase().endsWith("slug")) {
|
|
11612
|
+
return `test-${name.replace(/Slug$/i, "").replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase() || "slug"}`;
|
|
11613
|
+
}
|
|
11614
|
+
if (name === "id" || name.toLowerCase().endsWith("id"))
|
|
11615
|
+
return DEFAULT_UUID;
|
|
11616
|
+
if (name.toLowerCase().includes("token"))
|
|
11617
|
+
return "test-token";
|
|
11618
|
+
return `test-${name.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase()}`;
|
|
11619
|
+
}
|
|
11620
|
+
function routeParamsFromPath(path) {
|
|
11621
|
+
if (!path)
|
|
11622
|
+
return [];
|
|
11623
|
+
const params = new Set;
|
|
11624
|
+
for (const match of path.matchAll(/:([A-Za-z0-9_]+)(?:\*\??)?/g)) {
|
|
11625
|
+
if (match[1])
|
|
11626
|
+
params.add(match[1]);
|
|
11627
|
+
}
|
|
11628
|
+
return [...params];
|
|
11629
|
+
}
|
|
11630
|
+
function resolveRouteFixtures(scenario, env = process.env) {
|
|
11631
|
+
const metadataParams = Array.isArray(scenario.metadata?.["fixtureParams"]) ? scenario.metadata["fixtureParams"].filter((value) => typeof value === "string") : [];
|
|
11632
|
+
const params = [...new Set([...metadataParams, ...routeParamsFromPath(scenario.targetPath)])];
|
|
11633
|
+
const values = {};
|
|
11634
|
+
const sources = {};
|
|
11635
|
+
const synthetic = [];
|
|
11636
|
+
for (const param of params) {
|
|
11637
|
+
const scenarioValue = scenarioFixtureValue(scenario.parameters, param, env);
|
|
11638
|
+
if (scenarioValue) {
|
|
11639
|
+
values[param] = scenarioValue;
|
|
11640
|
+
sources[param] = "scenario";
|
|
11641
|
+
continue;
|
|
11642
|
+
}
|
|
11643
|
+
const envValue = envFixtureValue(param, env);
|
|
11644
|
+
if (envValue) {
|
|
11645
|
+
values[param] = envValue;
|
|
11646
|
+
sources[param] = "env";
|
|
11647
|
+
continue;
|
|
11648
|
+
}
|
|
11649
|
+
values[param] = defaultFixtureValue(param);
|
|
11650
|
+
sources[param] = "default";
|
|
11651
|
+
synthetic.push(param);
|
|
11652
|
+
}
|
|
11653
|
+
const resolvedPath = scenario.targetPath ? resolveRoutePath(scenario.targetPath, values) : null;
|
|
11654
|
+
return {
|
|
11655
|
+
originalPath: scenario.targetPath,
|
|
11656
|
+
resolvedPath,
|
|
11657
|
+
params,
|
|
11658
|
+
values,
|
|
11659
|
+
sources,
|
|
11660
|
+
synthetic
|
|
11661
|
+
};
|
|
11662
|
+
}
|
|
11663
|
+
function resolveRoutePath(path, values) {
|
|
11664
|
+
return path.replace(/\/:([A-Za-z0-9_]+)\*\?/g, (_match, name) => {
|
|
11665
|
+
const value = values[name];
|
|
11666
|
+
return value ? `/${encodeRouteFixture(value, true)}` : "";
|
|
11667
|
+
}).replace(/:([A-Za-z0-9_]+)\*/g, (_match, name) => encodeRouteFixture(values[name] ?? defaultFixtureValue(name), true)).replace(/:([A-Za-z0-9_]+)/g, (_match, name) => encodeRouteFixture(values[name] ?? defaultFixtureValue(name), false));
|
|
11668
|
+
}
|
|
11669
|
+
function encodeRouteFixture(value, allowSlash) {
|
|
11670
|
+
if (allowSlash)
|
|
11671
|
+
return value.split("/").filter(Boolean).map(encodeURIComponent).join("/");
|
|
11672
|
+
return encodeURIComponent(value);
|
|
11673
|
+
}
|
|
11674
|
+
function materializeScenarioRoute(scenario, env = process.env) {
|
|
11675
|
+
const resolution = resolveRouteFixtures(scenario, env);
|
|
11676
|
+
if (!resolution.resolvedPath || resolution.resolvedPath === scenario.targetPath) {
|
|
11677
|
+
return { scenario, resolution };
|
|
11678
|
+
}
|
|
11679
|
+
const steps = scenario.steps.map((step) => {
|
|
11680
|
+
let next = step;
|
|
11681
|
+
for (const [name, value] of Object.entries(resolution.values)) {
|
|
11682
|
+
next = next.replaceAll(`:${name}`, value).replaceAll(`[${name}]`, value).replaceAll(`{${name}}`, value);
|
|
11683
|
+
}
|
|
11684
|
+
return next.replaceAll(scenario.targetPath ?? "", resolution.resolvedPath ?? "");
|
|
11685
|
+
});
|
|
11686
|
+
return {
|
|
11687
|
+
scenario: {
|
|
11688
|
+
...scenario,
|
|
11689
|
+
targetPath: resolution.resolvedPath,
|
|
11690
|
+
steps,
|
|
11691
|
+
metadata: {
|
|
11692
|
+
...scenario.metadata ?? {},
|
|
11693
|
+
routeFixtureResolution: resolution
|
|
11694
|
+
}
|
|
11695
|
+
},
|
|
11696
|
+
resolution
|
|
11697
|
+
};
|
|
11698
|
+
}
|
|
11699
|
+
function resolveStartUrl(baseUrl, targetPath) {
|
|
11700
|
+
try {
|
|
11701
|
+
return new URL(targetPath, baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`).toString();
|
|
11702
|
+
} catch {
|
|
11703
|
+
return `${baseUrl.replace(/\/+$/, "")}/${targetPath.replace(/^\/+/, "")}`;
|
|
11704
|
+
}
|
|
11705
|
+
}
|
|
11706
|
+
var DEFAULT_UUID = "00000000-0000-4000-8000-000000000000", PARAM_ENV_CANDIDATES;
|
|
11707
|
+
var init_route_fixtures = __esm(() => {
|
|
11708
|
+
PARAM_ENV_CANDIDATES = {
|
|
11709
|
+
orgSlug: ["TESTERS_ORG_SLUG", "SMOKE_ORG_SLUG", "ORG_SLUG"],
|
|
11710
|
+
orgId: ["TESTERS_ORG_ID", "SMOKE_ORG_ID", "ORG_ID"],
|
|
11711
|
+
projectSlug: ["TESTERS_PROJECT_SLUG", "SMOKE_PROJECT_SLUG", "PROJECT_SLUG"],
|
|
11712
|
+
projectId: ["TESTERS_PROJECT_ID", "SMOKE_PROJECT_ID", "PROJECT_ID"],
|
|
11713
|
+
workspaceId: ["TESTERS_WORKSPACE_ID", "SMOKE_WORKSPACE_ID", "WORKSPACE_ID"],
|
|
11714
|
+
agentId: ["TESTERS_AGENT_ID", "SMOKE_AGENT_ID", "AGENT_ID"],
|
|
11715
|
+
sessionId: ["TESTERS_SESSION_ID", "SMOKE_SESSION_ID", "SESSION_ID"],
|
|
11716
|
+
userId: ["TESTERS_USER_ID", "SMOKE_USER_ID", "USER_ID"]
|
|
11717
|
+
};
|
|
11718
|
+
});
|
|
11719
|
+
|
|
11570
11720
|
// src/lib/scanners/a11y.ts
|
|
11571
11721
|
var exports_a11y = {};
|
|
11572
11722
|
__export(exports_a11y, {
|
|
@@ -12409,33 +12559,35 @@ ${filtered.join(`
|
|
|
12409
12559
|
return { result: `Error executing ${toolName}: ${message}` };
|
|
12410
12560
|
}
|
|
12411
12561
|
}
|
|
12412
|
-
function resolveStartUrl(baseUrl, targetPath) {
|
|
12413
|
-
try {
|
|
12414
|
-
return new URL(targetPath, baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`).toString();
|
|
12415
|
-
} catch {
|
|
12416
|
-
return `${baseUrl.replace(/\/+$/, "")}/${targetPath.replace(/^\/+/, "")}`;
|
|
12417
|
-
}
|
|
12418
|
-
}
|
|
12419
12562
|
function buildScenarioUserMessage(scenario, baseUrl) {
|
|
12563
|
+
const { scenario: materializedScenario, resolution } = materializeScenarioRoute(scenario);
|
|
12420
12564
|
const userParts = [
|
|
12421
|
-
`**Scenario:** ${
|
|
12422
|
-
`**Description:** ${
|
|
12565
|
+
`**Scenario:** ${materializedScenario.name}`,
|
|
12566
|
+
`**Description:** ${materializedScenario.description}`
|
|
12423
12567
|
];
|
|
12424
12568
|
if (baseUrl) {
|
|
12425
12569
|
const normalizedBaseUrl = baseUrl.replace(/\/+$/, "");
|
|
12426
12570
|
userParts.push(`**Base URL:** ${normalizedBaseUrl}`);
|
|
12427
|
-
if (
|
|
12428
|
-
userParts.push(`**Start URL:** ${resolveStartUrl(normalizedBaseUrl,
|
|
12571
|
+
if (materializedScenario.targetPath) {
|
|
12572
|
+
userParts.push(`**Start URL:** ${resolveStartUrl(normalizedBaseUrl, materializedScenario.targetPath)}`);
|
|
12429
12573
|
}
|
|
12430
12574
|
userParts.push("**Navigation Boundary:** Treat the Base URL as the application under test. Resolve relative paths and in-app navigation against this origin. Do not navigate to another host unless a step explicitly includes an absolute external URL.");
|
|
12431
12575
|
}
|
|
12432
|
-
if (
|
|
12433
|
-
userParts.push(`**Target Path:** ${
|
|
12576
|
+
if (materializedScenario.targetPath) {
|
|
12577
|
+
userParts.push(`**Target Path:** ${materializedScenario.targetPath}`);
|
|
12578
|
+
}
|
|
12579
|
+
if (resolution.params.length > 0) {
|
|
12580
|
+
userParts.push("**Route Fixtures:**");
|
|
12581
|
+
for (const param of resolution.params) {
|
|
12582
|
+
const source = resolution.sources[param];
|
|
12583
|
+
const synthetic = source === "default" ? " synthetic" : "";
|
|
12584
|
+
userParts.push(`- :${param} = ${resolution.values[param]} (${source}${synthetic})`);
|
|
12585
|
+
}
|
|
12434
12586
|
}
|
|
12435
|
-
if (
|
|
12587
|
+
if (materializedScenario.steps.length > 0) {
|
|
12436
12588
|
userParts.push("**Steps:**");
|
|
12437
|
-
for (let i = 0;i <
|
|
12438
|
-
userParts.push(`${i + 1}. ${
|
|
12589
|
+
for (let i = 0;i < materializedScenario.steps.length; i++) {
|
|
12590
|
+
userParts.push(`${i + 1}. ${materializedScenario.steps[i]}`);
|
|
12439
12591
|
}
|
|
12440
12592
|
}
|
|
12441
12593
|
return userParts.join(`
|
|
@@ -12733,6 +12885,7 @@ function createClientForModel(model, apiKey) {
|
|
|
12733
12885
|
var activeHARs, activeCoverage, BROWSER_TOOLS;
|
|
12734
12886
|
var init_ai_client = __esm(() => {
|
|
12735
12887
|
init_types();
|
|
12888
|
+
init_route_fixtures();
|
|
12736
12889
|
activeHARs = new Map;
|
|
12737
12890
|
activeCoverage = new Map;
|
|
12738
12891
|
BROWSER_TOOLS = [
|
|
@@ -15482,6 +15635,7 @@ function savePersonaAuthCookies(id, cookies) {
|
|
|
15482
15635
|
// src/lib/runner.ts
|
|
15483
15636
|
init_browser();
|
|
15484
15637
|
init_ai_client();
|
|
15638
|
+
init_route_fixtures();
|
|
15485
15639
|
init_config2();
|
|
15486
15640
|
|
|
15487
15641
|
// src/lib/secrets-resolver.ts
|
|
@@ -16625,9 +16779,10 @@ function withTimeout(promise, ms, label) {
|
|
|
16625
16779
|
});
|
|
16626
16780
|
}
|
|
16627
16781
|
async function runSingleScenario(scenario, runId, options) {
|
|
16628
|
-
const
|
|
16782
|
+
const { scenario: materializedScenario, resolution: routeFixtureResolution } = materializeScenarioRoute(scenario);
|
|
16783
|
+
const scenarioType = materializedScenario.scenarioType ?? "browser";
|
|
16629
16784
|
if (scenarioType === "eval") {
|
|
16630
|
-
return runEvalScenario(
|
|
16785
|
+
return runEvalScenario(materializedScenario, { runId, baseUrl: options.url });
|
|
16631
16786
|
}
|
|
16632
16787
|
const config = loadConfig();
|
|
16633
16788
|
if (options.selfHeal !== undefined)
|
|
@@ -16668,7 +16823,7 @@ async function runSingleScenario(scenario, runId, options) {
|
|
|
16668
16823
|
runId,
|
|
16669
16824
|
scenarioId: scenario.id,
|
|
16670
16825
|
model,
|
|
16671
|
-
stepsTotal:
|
|
16826
|
+
stepsTotal: materializedScenario.steps.length || 10,
|
|
16672
16827
|
personaId: persona?.id ?? null,
|
|
16673
16828
|
personaName: persona?.name ?? null
|
|
16674
16829
|
});
|
|
@@ -16704,12 +16859,12 @@ async function runSingleScenario(scenario, runId, options) {
|
|
|
16704
16859
|
engine: effectiveOptions.engine
|
|
16705
16860
|
});
|
|
16706
16861
|
}
|
|
16707
|
-
const targetUrl =
|
|
16708
|
-
const scenarioTimeout =
|
|
16862
|
+
const targetUrl = materializedScenario.targetPath ? resolveStartUrl(options.url.replace(/\/$/, ""), materializedScenario.targetPath) : options.url;
|
|
16863
|
+
const scenarioTimeout = materializedScenario.timeoutMs ?? options.timeout ?? config.browser.timeout ?? 60000;
|
|
16709
16864
|
registerSession({
|
|
16710
16865
|
resultId: result.id,
|
|
16711
16866
|
runId,
|
|
16712
|
-
scenarioId:
|
|
16867
|
+
scenarioId: materializedScenario.id,
|
|
16713
16868
|
engine: effectiveOptions.engine ?? "playwright",
|
|
16714
16869
|
startUrl: targetUrl
|
|
16715
16870
|
});
|
|
@@ -16763,7 +16918,7 @@ async function runSingleScenario(scenario, runId, options) {
|
|
|
16763
16918
|
const agentResult = await withTimeout(runAgentLoop({
|
|
16764
16919
|
client,
|
|
16765
16920
|
page,
|
|
16766
|
-
scenario,
|
|
16921
|
+
scenario: materializedScenario,
|
|
16767
16922
|
screenshotter,
|
|
16768
16923
|
model,
|
|
16769
16924
|
runId,
|
|
@@ -16854,7 +17009,7 @@ async function runSingleScenario(scenario, runId, options) {
|
|
|
16854
17009
|
const baseReasoning = agentResult.reasoning ? agentResult.reasoning + lightpandaNote : lightpandaNote || "";
|
|
16855
17010
|
const assertionOutcome = await applyStructuredAssertionsToResult({
|
|
16856
17011
|
page,
|
|
16857
|
-
scenario,
|
|
17012
|
+
scenario: materializedScenario,
|
|
16858
17013
|
consoleErrors,
|
|
16859
17014
|
status: agentResult.status,
|
|
16860
17015
|
reasoning: baseReasoning
|
|
@@ -16875,6 +17030,7 @@ async function runSingleScenario(scenario, runId, options) {
|
|
|
16875
17030
|
costCents: estimateCost(model, agentResult.tokensUsed),
|
|
16876
17031
|
metadata: {
|
|
16877
17032
|
consoleLogs,
|
|
17033
|
+
...routeFixtureResolution.params.length > 0 ? { routeFixtureResolution } : {},
|
|
16878
17034
|
...networkErrors.length > 0 ? networkMeta : {},
|
|
16879
17035
|
...structuredAssertionMeta
|
|
16880
17036
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/lib/ai-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/lib/ai-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { CreateScenarioInput, Scenario, ScenarioPriority, TestingWorkflow, WorkflowExecutionInput } from "../types/index.js";
|
|
2
2
|
export type NextRouteKind = "page" | "api";
|
|
3
|
+
export type NextRouteActionKind = "link" | "button" | "form" | "input" | "api-method";
|
|
4
|
+
export interface NextRouteAction {
|
|
5
|
+
kind: NextRouteActionKind;
|
|
6
|
+
label: string;
|
|
7
|
+
target?: string;
|
|
8
|
+
sourceFile: string;
|
|
9
|
+
destructive: boolean;
|
|
10
|
+
requiresFixture: boolean;
|
|
11
|
+
}
|
|
3
12
|
export interface NextRouteInventoryItem {
|
|
4
13
|
kind: NextRouteKind;
|
|
5
14
|
routePath: string;
|
|
@@ -9,6 +18,8 @@ export interface NextRouteInventoryItem {
|
|
|
9
18
|
methods: string[];
|
|
10
19
|
dynamic: boolean;
|
|
11
20
|
requiresAuth: boolean;
|
|
21
|
+
fixtureParams: string[];
|
|
22
|
+
actions: NextRouteAction[];
|
|
12
23
|
tags: string[];
|
|
13
24
|
priority: ScenarioPriority;
|
|
14
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-route-inventory.d.ts","sourceRoot":"","sources":["../../src/lib/next-route-inventory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"next-route-inventory.d.ts","sourceRoot":"","sources":["../../src/lib/next-route-inventory.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC;AAC3C,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,sBAAsB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAkCD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,kBAAkB,CA4BrB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,sBAAsB,EAC5B,SAAS,CAAC,EAAE,MAAM,GACjB,mBAAmB,CA8DrB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,8BAA8B,CAuBhC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Scenario } from "../types/index.js";
|
|
2
|
+
export interface RouteFixtureResolution {
|
|
3
|
+
originalPath: string | null;
|
|
4
|
+
resolvedPath: string | null;
|
|
5
|
+
params: string[];
|
|
6
|
+
values: Record<string, string>;
|
|
7
|
+
sources: Record<string, "scenario" | "env" | "default">;
|
|
8
|
+
synthetic: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface MaterializedRouteScenario {
|
|
11
|
+
scenario: Scenario;
|
|
12
|
+
resolution: RouteFixtureResolution;
|
|
13
|
+
}
|
|
14
|
+
export declare function routeParamsFromPath(path: string | null | undefined): string[];
|
|
15
|
+
export declare function defaultRouteFixturesForParams(params: string[]): Record<string, string>;
|
|
16
|
+
export declare function resolveRouteFixtures(scenario: Scenario, env?: Record<string, string | undefined>): RouteFixtureResolution;
|
|
17
|
+
export declare function resolveRoutePath(path: string, values: Record<string, string>): string;
|
|
18
|
+
export declare function materializeScenarioRoute(scenario: Scenario, env?: Record<string, string | undefined>): MaterializedRouteScenario;
|
|
19
|
+
export declare function resolveStartUrl(baseUrl: string, targetPath: string): string;
|
|
20
|
+
//# sourceMappingURL=route-fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-fixtures.d.ts","sourceRoot":"","sources":["../../src/lib/route-fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IACxD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAoED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAO7E;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEtF;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,sBAAsB,CAoCxB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQrF;AAOD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,yBAAyB,CA6B3B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAM3E"}
|
package/dist/lib/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA8B7E,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,aAAa,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAA;KAAE,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EACA,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,qBAAqB,GACrB,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,GACf,0BAA0B,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAIxD,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEzD;AAMD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,EACvB,yBAAyB,CAAC,EAAE,MAAM,GACjC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,MAAM,CAM9F;AAED,KAAK,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AAEhF,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,KAAK,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAiBD,wBAAsB,iCAAiC,CAAC,KAAK,EAAE;IAC7D,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAyCtC;AA2BD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,CAsWjB;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA4M1C;AAUD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACnF,QAAQ,EAAE,CAqBZ;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACnF,OAAO,CAAC;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAY1C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACnF;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAqF1C"}
|