@hasna/testers 0.0.6 → 0.0.8
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 +1424 -395
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/environments.d.ts +22 -0
- package/dist/db/environments.d.ts.map +1 -0
- package/dist/db/runs.d.ts.map +1 -1
- package/dist/db/scenarios.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +422 -171
- package/dist/lib/assertions.d.ts +26 -0
- package/dist/lib/assertions.d.ts.map +1 -0
- package/dist/lib/browser-lightpanda.d.ts +43 -0
- package/dist/lib/browser-lightpanda.d.ts.map +1 -0
- package/dist/lib/browser.d.ts +9 -3
- package/dist/lib/browser.d.ts.map +1 -1
- package/dist/lib/ci.d.ts +2 -0
- package/dist/lib/ci.d.ts.map +1 -0
- package/dist/lib/openapi-import.d.ts +8 -0
- package/dist/lib/openapi-import.d.ts.map +1 -0
- package/dist/lib/recorder.d.ts +24 -0
- package/dist/lib/recorder.d.ts.map +1 -0
- package/dist/lib/runner.d.ts +1 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/visual-diff.d.ts +36 -0
- package/dist/lib/visual-diff.d.ts.map +1 -0
- package/dist/mcp/index.js +341 -12
- package/dist/server/index.js +335 -12
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
import type { Assertion } from "../types/index.js";
|
|
3
|
+
export interface AssertionResult {
|
|
4
|
+
assertion: Assertion;
|
|
5
|
+
passed: boolean;
|
|
6
|
+
actual: string;
|
|
7
|
+
error?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function evaluateAssertions(page: Page, assertions: Assertion[]): Promise<AssertionResult[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Parse a CLI-format assertion string into an Assertion object.
|
|
12
|
+
*
|
|
13
|
+
* Formats:
|
|
14
|
+
* "selector:.dashboard visible"
|
|
15
|
+
* "selector:.dashboard not-visible"
|
|
16
|
+
* "text:.header contains:Welcome"
|
|
17
|
+
* "text:.header equals:Welcome Home"
|
|
18
|
+
* "no-console-errors"
|
|
19
|
+
* "url:contains:/dashboard"
|
|
20
|
+
* "title:contains:My App"
|
|
21
|
+
* "count:.items eq:5"
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseAssertionString(str: string): Assertion;
|
|
24
|
+
export declare function allAssertionsPassed(results: AssertionResult[]): boolean;
|
|
25
|
+
export declare function formatAssertionResults(results: AssertionResult[]): string;
|
|
26
|
+
//# sourceMappingURL=assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../src/lib/assertions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAkB5B;AAmGD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA4E3D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAEvE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAoBzE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type Browser, type Page } from "playwright";
|
|
2
|
+
import { type ChildProcess } from "child_process";
|
|
3
|
+
/**
|
|
4
|
+
* Check if Lightpanda browser is installed (optional dependency).
|
|
5
|
+
*/
|
|
6
|
+
export declare function isLightpandaAvailable(): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Start Lightpanda as a CDP server on a random available port.
|
|
9
|
+
* Returns the WebSocket endpoint URL.
|
|
10
|
+
*/
|
|
11
|
+
export declare function startLightpandaServer(port?: number): Promise<{
|
|
12
|
+
process: ChildProcess;
|
|
13
|
+
wsEndpoint: string;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Launch a Lightpanda browser via CDP and return a Playwright Browser instance.
|
|
17
|
+
*/
|
|
18
|
+
export declare function launchLightpanda(_options?: {
|
|
19
|
+
viewport?: {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
};
|
|
23
|
+
}): Promise<Browser>;
|
|
24
|
+
/**
|
|
25
|
+
* Create a page from a Lightpanda-connected browser.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getLightpandaPage(browser: Browser, options?: {
|
|
28
|
+
viewport?: {
|
|
29
|
+
width: number;
|
|
30
|
+
height: number;
|
|
31
|
+
};
|
|
32
|
+
userAgent?: string;
|
|
33
|
+
locale?: string;
|
|
34
|
+
}): Promise<Page>;
|
|
35
|
+
/**
|
|
36
|
+
* Close a Lightpanda browser and kill the server process.
|
|
37
|
+
*/
|
|
38
|
+
export declare function closeLightpanda(browser: Browser): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Install Lightpanda browser.
|
|
41
|
+
*/
|
|
42
|
+
export declare function installLightpanda(): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=browser-lightpanda.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-lightpanda.d.ts","sourceRoot":"","sources":["../../src/lib/browser-lightpanda.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKzD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA4B/C;AAuBD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAwExD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC1D,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9F,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAerE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAcvD"}
|
package/dist/lib/browser.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Browser, type Page } from "playwright";
|
|
2
|
+
export type BrowserEngine = "playwright" | "lightpanda";
|
|
2
3
|
interface ViewportSize {
|
|
3
4
|
width: number;
|
|
4
5
|
height: number;
|
|
@@ -6,6 +7,7 @@ interface ViewportSize {
|
|
|
6
7
|
interface LaunchOptions {
|
|
7
8
|
headless?: boolean;
|
|
8
9
|
viewport?: ViewportSize;
|
|
10
|
+
engine?: BrowserEngine;
|
|
9
11
|
}
|
|
10
12
|
interface PageOptions {
|
|
11
13
|
viewport?: ViewportSize;
|
|
@@ -20,11 +22,13 @@ export declare function launchBrowser(options?: LaunchOptions): Promise<Browser>
|
|
|
20
22
|
* Creates a new page in the given browser with optional viewport,
|
|
21
23
|
* user agent, and locale settings.
|
|
22
24
|
*/
|
|
23
|
-
export declare function getPage(browser: Browser, options?: PageOptions
|
|
25
|
+
export declare function getPage(browser: Browser, options?: PageOptions & {
|
|
26
|
+
engine?: BrowserEngine;
|
|
27
|
+
}): Promise<Page>;
|
|
24
28
|
/**
|
|
25
29
|
* Closes a browser instance gracefully.
|
|
26
30
|
*/
|
|
27
|
-
export declare function closeBrowser(browser: Browser): Promise<void>;
|
|
31
|
+
export declare function closeBrowser(browser: Browser, engine?: BrowserEngine): Promise<void>;
|
|
28
32
|
/**
|
|
29
33
|
* A pool of reusable browser instances to avoid the overhead of
|
|
30
34
|
* launching a new browser for every test scenario.
|
|
@@ -34,9 +38,11 @@ export declare class BrowserPool {
|
|
|
34
38
|
private readonly maxSize;
|
|
35
39
|
private readonly headless;
|
|
36
40
|
private readonly viewport;
|
|
41
|
+
private readonly engine;
|
|
37
42
|
constructor(size: number, options?: {
|
|
38
43
|
headless?: boolean;
|
|
39
44
|
viewport?: ViewportSize;
|
|
45
|
+
engine?: BrowserEngine;
|
|
40
46
|
});
|
|
41
47
|
/**
|
|
42
48
|
* Acquires a browser and page from the pool. Reuses an idle browser
|
|
@@ -59,6 +65,6 @@ export declare class BrowserPool {
|
|
|
59
65
|
/**
|
|
60
66
|
* Installs Chromium for Playwright using bunx.
|
|
61
67
|
*/
|
|
62
|
-
export declare function installBrowser(): Promise<void>;
|
|
68
|
+
export declare function installBrowser(engine?: BrowserEngine): Promise<void>;
|
|
63
69
|
export {};
|
|
64
70
|
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAI/D,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAI/D,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,YAAY,CAAC;AAExD,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CA2B7E;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,GACjD,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IAExC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAGrC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,aAAa,CAAA;KAAE;IAQnF;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IAqC1D;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAO/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAShC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1E"}
|
package/dist/lib/ci.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../../src/lib/ci.ts"],"names":[],"mappings":"AAAA,wBAAgB,6BAA6B,IAAI,MAAM,CA4BtD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CreateScenarioInput } from "../types/index.js";
|
|
2
|
+
import { createScenario } from "../db/scenarios.js";
|
|
3
|
+
export declare function parseOpenAPISpec(filePathOrUrl: string): CreateScenarioInput[];
|
|
4
|
+
export declare function importFromOpenAPI(filePathOrUrl: string, projectId?: string): {
|
|
5
|
+
imported: number;
|
|
6
|
+
scenarios: ReturnType<typeof createScenario>[];
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=openapi-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-import.d.ts","sourceRoot":"","sources":["../../src/lib/openapi-import.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA0CpD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAwE7E;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EAAE,CAAA;CAAE,CAMtE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CreateScenarioInput } from "../types/index.js";
|
|
2
|
+
import { createScenario } from "../db/scenarios.js";
|
|
3
|
+
export interface RecordedAction {
|
|
4
|
+
type: "navigate" | "click" | "fill" | "select" | "press" | "scroll";
|
|
5
|
+
selector?: string;
|
|
6
|
+
value?: string;
|
|
7
|
+
url?: string;
|
|
8
|
+
key?: string;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
}
|
|
11
|
+
export interface RecordingResult {
|
|
12
|
+
actions: RecordedAction[];
|
|
13
|
+
url: string;
|
|
14
|
+
duration: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function recordSession(url: string, options?: {
|
|
17
|
+
timeout?: number;
|
|
18
|
+
}): Promise<RecordingResult>;
|
|
19
|
+
export declare function actionsToScenarioInput(recording: RecordingResult, name: string, projectId?: string): CreateScenarioInput;
|
|
20
|
+
export declare function recordAndSave(url: string, name: string, projectId?: string): Promise<{
|
|
21
|
+
recording: RecordingResult;
|
|
22
|
+
scenario: ReturnType<typeof createScenario>;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/lib/recorder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,eAAe,CAAC,CAwH1B;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,mBAAmB,CAsCrB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,SAAS,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;CAAE,CAAC,CAKtF"}
|
package/dist/lib/runner.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface RunOptions {
|
|
|
8
8
|
projectId?: string;
|
|
9
9
|
apiKey?: string;
|
|
10
10
|
screenshotDir?: string;
|
|
11
|
+
engine?: "playwright" | "lightpanda";
|
|
11
12
|
}
|
|
12
13
|
export interface RunEvent {
|
|
13
14
|
type: "scenario:start" | "scenario:pass" | "scenario:fail" | "scenario:error" | "screenshot:captured" | "run:complete" | "step:tool_call" | "step:tool_result" | "step:thinking";
|
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,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,MAAM,mBAAmB,CAAC;AAY/D,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,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EACA,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,qBAAqB,GACrB,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,CAAC;IACpB,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;CACrB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAIxD,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEzD;AAkBD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,CAmGjB;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,CAwH1C;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,CAuB1C;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,CAmF1C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Run } from "../types/index.js";
|
|
2
|
+
export interface VisualDiffResult {
|
|
3
|
+
scenarioId: string;
|
|
4
|
+
stepNumber: number;
|
|
5
|
+
action: string;
|
|
6
|
+
baselinePath: string;
|
|
7
|
+
currentPath: string;
|
|
8
|
+
diffPercent: number;
|
|
9
|
+
isRegression: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Mark a run as the visual baseline. Unsets any previous baseline for the same project.
|
|
13
|
+
*/
|
|
14
|
+
export declare function setBaseline(runId: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get the most recent baseline run, optionally filtered by project.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getBaseline(projectId?: string): Run | null;
|
|
19
|
+
/**
|
|
20
|
+
* Compare two image files at the byte level.
|
|
21
|
+
* Since we cannot use sharp/canvas, we do a raw buffer comparison.
|
|
22
|
+
*/
|
|
23
|
+
export declare function compareImages(image1Path: string, image2Path: string): {
|
|
24
|
+
diffPercent: number;
|
|
25
|
+
diffPixels: number;
|
|
26
|
+
totalPixels: number;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Compare screenshots from two runs, matching by scenario + step number.
|
|
30
|
+
*/
|
|
31
|
+
export declare function compareRunScreenshots(runId: string, baselineRunId: string, threshold?: number): VisualDiffResult[];
|
|
32
|
+
/**
|
|
33
|
+
* Format visual diff results for terminal output with colored diff percentages.
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatVisualDiffTerminal(results: VisualDiffResult[], threshold?: number): string;
|
|
36
|
+
//# sourceMappingURL=visual-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-diff.d.ts","sourceRoot":"","sources":["../../src/lib/visual-diff.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAID;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAiB/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAc1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAuClE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,SAAS,GAAE,MAA0B,GACpC,gBAAgB,EAAE,CAiDpB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,GAAE,MAA0B,GACpC,MAAM,CA2CR"}
|