@hasna/testers 0.0.28 → 0.0.30

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.
Files changed (81) hide show
  1. package/LICENSE +1 -154
  2. package/README.md +92 -0
  3. package/dist/cli/index.js +1354 -79
  4. package/dist/db/database.d.ts.map +1 -1
  5. package/dist/db/personas.d.ts.map +1 -1
  6. package/dist/db/runs.d.ts +29 -0
  7. package/dist/db/runs.d.ts.map +1 -1
  8. package/dist/db/scenarios.d.ts +12 -0
  9. package/dist/db/scenarios.d.ts.map +1 -1
  10. package/dist/db/sessions.d.ts +36 -0
  11. package/dist/db/sessions.d.ts.map +1 -0
  12. package/dist/db/step-results.d.ts +30 -0
  13. package/dist/db/step-results.d.ts.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +818 -25
  17. package/dist/lib/a11y-audit.d.ts +54 -0
  18. package/dist/lib/a11y-audit.d.ts.map +1 -0
  19. package/dist/lib/api-discovery.d.ts +46 -0
  20. package/dist/lib/api-discovery.d.ts.map +1 -0
  21. package/dist/lib/assertions.d.ts.map +1 -1
  22. package/dist/lib/auth-profiles.d.ts +16 -0
  23. package/dist/lib/auth-profiles.d.ts.map +1 -0
  24. package/dist/lib/auth-session-pool.d.ts +57 -0
  25. package/dist/lib/auth-session-pool.d.ts.map +1 -0
  26. package/dist/lib/batch-actions.d.ts +44 -0
  27. package/dist/lib/batch-actions.d.ts.map +1 -0
  28. package/dist/lib/browser-compat.d.ts +14 -0
  29. package/dist/lib/browser-compat.d.ts.map +1 -0
  30. package/dist/lib/browser.d.ts +6 -7
  31. package/dist/lib/browser.d.ts.map +1 -1
  32. package/dist/lib/ci.d.ts +12 -0
  33. package/dist/lib/ci.d.ts.map +1 -1
  34. package/dist/lib/config.d.ts.map +1 -1
  35. package/dist/lib/discovery.d.ts +33 -0
  36. package/dist/lib/discovery.d.ts.map +1 -0
  37. package/dist/lib/dom-mutation.d.ts +53 -0
  38. package/dist/lib/dom-mutation.d.ts.map +1 -0
  39. package/dist/lib/environment.d.ts +26 -0
  40. package/dist/lib/environment.d.ts.map +1 -0
  41. package/dist/lib/health-scan.d.ts +2 -1
  42. package/dist/lib/health-scan.d.ts.map +1 -1
  43. package/dist/lib/hybrid-runner.d.ts.map +1 -1
  44. package/dist/lib/junit-export.d.ts +24 -0
  45. package/dist/lib/junit-export.d.ts.map +1 -0
  46. package/dist/lib/network-mock.d.ts +38 -0
  47. package/dist/lib/network-mock.d.ts.map +1 -0
  48. package/dist/lib/offline-mode.d.ts +31 -0
  49. package/dist/lib/offline-mode.d.ts.map +1 -0
  50. package/dist/lib/pdf-export.d.ts +27 -0
  51. package/dist/lib/pdf-export.d.ts.map +1 -0
  52. package/dist/lib/performance.d.ts +65 -0
  53. package/dist/lib/performance.d.ts.map +1 -0
  54. package/dist/lib/pr-comment.d.ts +27 -0
  55. package/dist/lib/pr-comment.d.ts.map +1 -0
  56. package/dist/lib/preview-detect.d.ts +27 -0
  57. package/dist/lib/preview-detect.d.ts.map +1 -0
  58. package/dist/lib/prod-debug.d.ts +77 -0
  59. package/dist/lib/prod-debug.d.ts.map +1 -0
  60. package/dist/lib/recorder.d.ts +42 -0
  61. package/dist/lib/recorder.d.ts.map +1 -1
  62. package/dist/lib/repo-discovery.d.ts +102 -0
  63. package/dist/lib/repo-discovery.d.ts.map +1 -0
  64. package/dist/lib/repo-executor.d.ts +56 -0
  65. package/dist/lib/repo-executor.d.ts.map +1 -0
  66. package/dist/lib/responsive.d.ts +43 -0
  67. package/dist/lib/responsive.d.ts.map +1 -0
  68. package/dist/lib/runner.d.ts +1 -0
  69. package/dist/lib/runner.d.ts.map +1 -1
  70. package/dist/lib/scenario-chain.d.ts +52 -0
  71. package/dist/lib/scenario-chain.d.ts.map +1 -0
  72. package/dist/lib/templates.d.ts.map +1 -1
  73. package/dist/lib/webhooks.d.ts +3 -0
  74. package/dist/lib/webhooks.d.ts.map +1 -1
  75. package/dist/mcp/index.js +852 -74
  76. package/dist/sdk/index.d.ts +48 -0
  77. package/dist/sdk/index.d.ts.map +1 -0
  78. package/dist/server/index.js +276 -29
  79. package/dist/types/index.d.ts +66 -2
  80. package/dist/types/index.d.ts.map +1 -1
  81. package/package.json +2 -2
@@ -0,0 +1,54 @@
1
+ import type { Page } from "playwright";
2
+ export type A11yLevel = "A" | "AA" | "AAA";
3
+ export interface A11yViolation {
4
+ id: string;
5
+ impact: "critical" | "serious" | "moderate" | "minor";
6
+ description: string;
7
+ help: string;
8
+ helpUrl: string;
9
+ nodes: {
10
+ html: string;
11
+ target: string[];
12
+ failureSummary?: string;
13
+ }[];
14
+ }
15
+ export interface A11yAuditResult {
16
+ violations: A11yViolation[];
17
+ passes: {
18
+ id: string;
19
+ description: string;
20
+ }[];
21
+ incomplete: {
22
+ id: string;
23
+ description: string;
24
+ impact?: string;
25
+ }[];
26
+ url: string;
27
+ timestamp: string;
28
+ totalViolations: number;
29
+ criticalCount: number;
30
+ seriousCount: number;
31
+ moderateCount: number;
32
+ minorCount: number;
33
+ }
34
+ export interface A11yAuditOptions {
35
+ level?: A11yLevel;
36
+ /** Specific rules to run (by default, runs all) */
37
+ rules?: string[];
38
+ /** Elements to exclude from scanning */
39
+ exclude?: string[];
40
+ }
41
+ /**
42
+ * Run axe-core accessibility audit on the current page.
43
+ * Injects axe via CDN and runs accessibility checks.
44
+ */
45
+ export declare function runA11yAudit(page: Page, options?: A11yAuditOptions): Promise<A11yAuditResult>;
46
+ /**
47
+ * Check if any violations exceed the given severity threshold.
48
+ */
49
+ export declare function hasA11yIssues(result: A11yAuditResult, maxImpact?: A11yViolation["impact"]): boolean;
50
+ /**
51
+ * Format accessibility audit results as a human-readable report.
52
+ */
53
+ export declare function formatA11yResults(result: A11yAuditResult): string;
54
+ //# sourceMappingURL=a11y-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-audit.d.ts","sourceRoot":"","sources":["../../src/lib/a11y-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAqE1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,GAAE,aAAa,CAAC,QAAQ,CAAW,GAAG,OAAO,CAU5G;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CA8BjE"}
@@ -0,0 +1,46 @@
1
+ import type { Page } from "playwright";
2
+ export interface DiscoveredEndpoint {
3
+ url: string;
4
+ method: string;
5
+ status: number;
6
+ resourceType: string;
7
+ responseSize: number;
8
+ responseTime: number;
9
+ hasAuth: boolean;
10
+ }
11
+ export interface ApiDiscoveryOptions {
12
+ /** Duration to monitor network traffic (ms) */
13
+ durationMs?: number;
14
+ /** Filter to only XHR/fetch requests */
15
+ onlyXhr?: boolean;
16
+ /** Filter URLs by pattern */
17
+ urlPattern?: string | RegExp;
18
+ }
19
+ /**
20
+ * Discover API endpoints by monitoring network traffic during page navigation.
21
+ * Useful for generating API health check scenarios from actual network activity.
22
+ */
23
+ export declare function discoverApiEndpoints(page: Page, options?: ApiDiscoveryOptions): Promise<DiscoveredEndpoint[]>;
24
+ /**
25
+ * Generate API check scenarios from discovered endpoints.
26
+ * Returns CreateScenarioInput objects ready to insert into the DB.
27
+ */
28
+ export declare function generateApiScenarios(endpoints: DiscoveredEndpoint[]): Array<{
29
+ name: string;
30
+ description: string;
31
+ type: string;
32
+ apiUrl: string;
33
+ method: string;
34
+ expectedStatus: number;
35
+ tags: string[];
36
+ priority: string;
37
+ }>;
38
+ /**
39
+ * Group endpoints by base URL pattern.
40
+ */
41
+ export declare function groupEndpoints(endpoints: DiscoveredEndpoint[]): Record<string, DiscoveredEndpoint[]>;
42
+ /**
43
+ * Summarize discovered endpoints.
44
+ */
45
+ export declare function summarizeEndpoints(endpoints: DiscoveredEndpoint[]): string;
46
+ //# sourceMappingURL=api-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-discovery.d.ts","sourceRoot":"","sources":["../../src/lib/api-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAwB,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyD/B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAeD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAWpG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM,CA0B1E"}
@@ -1 +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"}
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;AAGnD,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;AA4MD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA4H3D;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,16 @@
1
+ import type { Page, BrowserContext } from "playwright";
2
+ import type { AuthProfile } from "../types/index.js";
3
+ /**
4
+ * Login using an AuthProfile based on the configured strategy.
5
+ * This is the entry point for persona-based authentication in the test runner.
6
+ */
7
+ export declare function authenticateWithProfile(page: Page, context: BrowserContext, profile: AuthProfile, baseUrl: string): Promise<void>;
8
+ /**
9
+ * Serialize an AuthProfile to a plain object for storage in the database.
10
+ */
11
+ export declare function serializeProfile(profile: AuthProfile): Record<string, string | null>;
12
+ /**
13
+ * Deserialize a database row into an AuthProfile.
14
+ */
15
+ export declare function deserializeProfile(row: Record<string, string | null>): AuthProfile;
16
+ //# sourceMappingURL=auth-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-profiles.d.ts","sourceRoot":"","sources":["../../src/lib/auth-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,mBAAmB,CAAC;AAEnE;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAoBf;AAgGD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAgBpF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,WAAW,CAgBlF"}
@@ -0,0 +1,57 @@
1
+ import type { BrowserContext, Cookie } from "playwright";
2
+ export interface AuthSessionEntry {
3
+ personaId: string;
4
+ personaName: string;
5
+ context: BrowserContext;
6
+ cookies: Cookie[];
7
+ loginUrl: string;
8
+ loggedInAt: string;
9
+ lastRefreshedAt: string;
10
+ }
11
+ export interface AuthSessionPoolOptions {
12
+ /** Max age of a session before it needs re-login (ms, default 30 min) */
13
+ sessionMaxAgeMs?: number;
14
+ }
15
+ /**
16
+ * Manages pre-authenticated browser sessions for multiple personas.
17
+ * Each persona with auth credentials gets its own persistent browser context
18
+ * with cookies/localStorage restored, so test scenarios start authenticated.
19
+ */
20
+ export declare class AuthenticatedSessionPool {
21
+ private readonly sessions;
22
+ private readonly sessionMaxAgeMs;
23
+ constructor(options?: AuthSessionPoolOptions);
24
+ /**
25
+ * Pre-login a single persona — launches a browser context with restored auth state.
26
+ * If the persona has no auth credentials, returns null.
27
+ */
28
+ addPersona(personaId: string): Promise<AuthSessionEntry | null>;
29
+ /**
30
+ * Get an authenticated context for a persona. Returns null if not authenticated.
31
+ */
32
+ getContext(personaId: string): BrowserContext | null;
33
+ /**
34
+ * Get all active session entries.
35
+ */
36
+ getSessions(): AuthSessionEntry[];
37
+ /**
38
+ * Check if a persona has an active session.
39
+ */
40
+ hasSession(personaId: string): boolean;
41
+ /**
42
+ * Remove and close a persona's session.
43
+ */
44
+ removePersona(personaId: string): Promise<void>;
45
+ /**
46
+ * Refresh all sessions by re-login.
47
+ */
48
+ refreshAll(): Promise<void>;
49
+ /**
50
+ * Close all sessions and release resources.
51
+ */
52
+ closeAll(): Promise<void>;
53
+ private isSessionFresh;
54
+ private removeSession;
55
+ private resolveBaseUrl;
56
+ }
57
+ //# sourceMappingURL=auth-session-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-session-pool.d.ts","sourceRoot":"","sources":["../../src/lib/auth-session-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKzD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,OAAO,CAAC,EAAE,sBAAsB;IAI5C;;;OAGG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IA8CrE;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAQpD;;OAEG;IACH,WAAW,IAAI,gBAAgB,EAAE;IAIjC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKtC;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,OAAO,CAAC,cAAc;YAKR,aAAa;IAc3B,OAAO,CAAC,cAAc;CASvB"}
@@ -0,0 +1,44 @@
1
+ import type { Page } from "playwright";
2
+ export interface BatchAction {
3
+ /** Unique identifier for this action within the batch */
4
+ id: string;
5
+ /** Type of browser action to perform */
6
+ type: "click" | "type" | "fill" | "press" | "scroll" | "evaluate" | "screenshot" | "wait";
7
+ /** CSS selector target (not needed for scroll/evaluate/screenshot) */
8
+ selector?: string;
9
+ /** Text/value to type or fill */
10
+ value?: string;
11
+ /** Key to press (for type=press) */
12
+ key?: string;
13
+ /** Scroll amount in pixels (for type=scroll) */
14
+ scrollAmount?: number;
15
+ /** JS to evaluate (for type=evaluate) */
16
+ script?: string;
17
+ /** Timeout for this action in ms */
18
+ timeout?: number;
19
+ }
20
+ export interface BatchActionResult {
21
+ id: string;
22
+ status: "passed" | "failed" | "timeout";
23
+ durationMs: number;
24
+ error?: string;
25
+ value?: unknown;
26
+ screenshotBuffer?: Buffer;
27
+ }
28
+ /**
29
+ * Execute multiple browser actions in parallel on the same page.
30
+ * This speeds up multi-step tests that have independent actions
31
+ * (e.g., filling multiple form fields simultaneously).
32
+ *
33
+ * Returns results for all actions, including failures (does not throw).
34
+ */
35
+ export declare function batchActions(page: Page, actions: BatchAction[]): Promise<BatchActionResult[]>;
36
+ /**
37
+ * Check if any action in the batch failed.
38
+ */
39
+ export declare function hasBatchFailures(results: BatchActionResult[]): boolean;
40
+ /**
41
+ * Format batch results as a summary string.
42
+ */
43
+ export declare function formatBatchResults(results: BatchActionResult[]): string;
44
+ //# sourceMappingURL=batch-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-actions.d.ts","sourceRoot":"","sources":["../../src/lib/batch-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IAC1F,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,WAAW,EAAE,GACrB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmC9B;AAyED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAcvE"}
@@ -0,0 +1,14 @@
1
+ import type { Page } from "playwright";
2
+ export interface AriaSnapshot {
3
+ tree: string;
4
+ interactive_count: number;
5
+ refs: Record<string, {
6
+ role: string;
7
+ name: string;
8
+ }>;
9
+ }
10
+ export declare function takeSnapshot(page: Page, sessionId: string): Promise<AriaSnapshot>;
11
+ export declare function getRefLocator(page: Page, sessionId: string, ref: string): Promise<ReturnType<Page["locator"]>>;
12
+ export declare function applyStealthPatches(page: Page): Promise<void>;
13
+ export declare function getDeepPerformance(page: Page): Promise<unknown>;
14
+ //# sourceMappingURL=browser-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-compat.d.ts","sourceRoot":"","sources":["../../src/lib/browser-compat.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAavC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAcvF;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAOtC;AAID,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnE;AAID,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE"}
@@ -1,5 +1,4 @@
1
1
  import type { Browser, Page } from "playwright";
2
- import type { BrowserEngine } from "../types/index.js";
3
2
  interface ViewportSize {
4
3
  width: number;
5
4
  height: number;
@@ -7,7 +6,7 @@ interface ViewportSize {
7
6
  interface LaunchOptions {
8
7
  headless?: boolean;
9
8
  viewport?: ViewportSize;
10
- engine?: BrowserEngine;
9
+ engine?: import("../types/index.js").BrowserEngine;
11
10
  }
12
11
  interface PageOptions {
13
12
  viewport?: ViewportSize;
@@ -23,12 +22,12 @@ export declare function launchBrowser(options?: LaunchOptions): Promise<Browser>
23
22
  * user agent, and locale settings.
24
23
  */
25
24
  export declare function getPage(browser: Browser, options?: PageOptions & {
26
- engine?: BrowserEngine;
25
+ engine?: import("../types/index.js").BrowserEngine;
27
26
  }): Promise<Page>;
28
27
  /**
29
28
  * Closes a browser instance gracefully.
30
29
  */
31
- export declare function closeBrowser(browser: Browser, engine?: BrowserEngine): Promise<void>;
30
+ export declare function closeBrowser(browser: Browser, engine?: import("../types/index.js").BrowserEngine): Promise<void>;
32
31
  /**
33
32
  * A pool of reusable browser instances to avoid the overhead of
34
33
  * launching a new browser for every test scenario.
@@ -42,7 +41,7 @@ export declare class BrowserPool {
42
41
  constructor(size: number, options?: {
43
42
  headless?: boolean;
44
43
  viewport?: ViewportSize;
45
- engine?: BrowserEngine;
44
+ engine?: import("../types/index.js").BrowserEngine;
46
45
  });
47
46
  /**
48
47
  * Acquires a browser and page from the pool. Reuses an idle browser
@@ -70,10 +69,10 @@ export interface BrowserConfig {
70
69
  headless: boolean;
71
70
  viewport?: ViewportSize;
72
71
  }
73
- export declare function launchBrowserEngine(engine: BrowserEngine, config: BrowserConfig): Promise<Browser>;
72
+ export declare function launchBrowserEngine(engine: import("../types/index.js").BrowserEngine, config: BrowserConfig): Promise<Browser>;
74
73
  /**
75
74
  * Installs Chromium for Playwright using bunx.
76
75
  */
77
- export declare function installBrowser(engine?: BrowserEngine): Promise<void>;
76
+ export declare function installBrowser(engine?: import("../types/index.js").BrowserEngine): Promise<void>;
78
77
  export {};
79
78
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAUvD,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,CAuD7E;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,CAwBf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB1F;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;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1E"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/lib/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYhD,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,OAAO,mBAAmB,EAAE,aAAa,CAAC;CACpD;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,CAoE7E;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,aAAa,CAAA;CAAE,GAC7E,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtH;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,CAA4C;gBAGjE,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,aAAa,CAAA;KAAE;IAQ/G;;;;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;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,OAAO,mBAAmB,EAAE,aAAa,EACjD,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtG"}
package/dist/lib/ci.d.ts CHANGED
@@ -1,5 +1,17 @@
1
1
  import type { Run, Result } from "../types/index.js";
2
2
  export declare function generateGitHubActionsWorkflow(): string;
3
+ /**
4
+ * Build a Markdown PR comment from a run + its results.
5
+ *
6
+ * Exported for testing. The format is:
7
+ * - Headline with pass/fail icon, counts, pass-rate, URL
8
+ * - Table of scenario results (capped at 20 rows)
9
+ * - Optional link to a dashboard
10
+ * - Footer attribution
11
+ */
12
+ export declare function formatPRComment(run: Run, results: Result[], dashboardUrl?: string): string;
13
+ /** Resolve the PR number from options or GitHub Actions env vars. Returns `null` if not resolvable. */
14
+ export declare function resolvePullRequestNumber(explicit?: number): number | null;
3
15
  export declare function postGitHubComment(run: Run, results: Result[], options?: {
4
16
  prNumber?: number;
5
17
  dashboardUrl?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../../src/lib/ci.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,6BAA6B,IAAI,MAAM,CA6BtD;AA+BD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,OAAO,CAAC,CAuClB"}
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../../src/lib/ci.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGrD,wBAAgB,6BAA6B,IAAI,MAAM,CAkCtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAiD1F;AAED,uGAAuG;AACvG,wBAAgB,wBAAwB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBzE;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,OAAO,CAAC,CA6BlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAOpE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAiBhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,aAAa,CAiD1C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKrD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAOpE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAiBhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,aAAa,CAkD1C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKrD"}
@@ -0,0 +1,33 @@
1
+ type FileScenario = {
2
+ name: string;
3
+ description?: string;
4
+ steps?: string[];
5
+ tags?: string[];
6
+ priority?: "low" | "medium" | "high" | "critical";
7
+ model?: string;
8
+ targetPath?: string;
9
+ requiresAuth?: boolean;
10
+ };
11
+ export interface TestersConfig {
12
+ url?: string;
13
+ model?: string;
14
+ tags?: string[];
15
+ scenarios?: FileScenario[];
16
+ projectId?: string;
17
+ }
18
+ /**
19
+ * Load scenarios from a .testers.yml config file.
20
+ */
21
+ export declare function loadTestersConfig(configPath: string): TestersConfig;
22
+ /**
23
+ * Discover scenarios from files (.testers.yml or tests/scenarios/*.yaml).
24
+ * Upserts them into the DB, returning created/updated/deduped counts.
25
+ */
26
+ export declare function discoverScenariosFromFiles(projectRoot?: string): {
27
+ created: number;
28
+ updated: number;
29
+ deduped: number;
30
+ total: number;
31
+ };
32
+ export {};
33
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/lib/discovery.ts"],"names":[],"mappings":"AAIA,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoJD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAOnE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,CAAC,EAAE,MAAM,GACnB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA+CtE"}
@@ -0,0 +1,53 @@
1
+ import type { Page } from "playwright";
2
+ export interface MutationEvent {
3
+ type: "added" | "removed" | "changed";
4
+ selector: string;
5
+ tagName?: string;
6
+ text?: string;
7
+ previousValue?: string;
8
+ currentValue?: string;
9
+ timestamp: number;
10
+ attribute?: string;
11
+ }
12
+ export interface MutationOptions {
13
+ /** Subtree to watch (default: "body") */
14
+ rootSelector?: string;
15
+ /** Watch for childList changes */
16
+ childList?: boolean;
17
+ /** Watch for attribute changes */
18
+ attributes?: boolean;
19
+ /** Watch for character data changes */
20
+ characterData?: boolean;
21
+ /** Track text changes on specific attributes */
22
+ attributeFilter?: string[];
23
+ }
24
+ /**
25
+ * Detect DOM mutations during test execution.
26
+ * Returns a function that retrieves accumulated mutation events.
27
+ * Useful for verifying that async UI updates actually happened.
28
+ */
29
+ export declare function watchMutations(page: Page, options?: MutationOptions): () => Promise<MutationEvent[]>;
30
+ /**
31
+ * Wait for a specific DOM mutation to occur (element added).
32
+ * Useful as a replacement for arbitrary sleep delays.
33
+ */
34
+ export declare function waitForElement(page: Page, selector: string, timeout?: number): Promise<boolean>;
35
+ /**
36
+ * Wait for a specific element to be removed from the DOM.
37
+ */
38
+ export declare function waitForElementRemoved(page: Page, selector: string, timeout?: number): Promise<boolean>;
39
+ /**
40
+ * Wait for text content to appear on the page.
41
+ */
42
+ export declare function waitForText(page: Page, text: string, timeout?: number): Promise<boolean>;
43
+ /**
44
+ * Snapshot the current DOM structure for comparison.
45
+ * Returns a compacted HTML string of the body.
46
+ */
47
+ export declare function snapshotDOM(page: Page): Promise<string>;
48
+ /**
49
+ * Compare two DOM snapshots and return a list of differences.
50
+ */
51
+ export declare function compareSnapshots(before: string, after: string): string[];
52
+ export declare function extractElements(html: string): Record<string, string>;
53
+ //# sourceMappingURL=dom-mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-mutation.d.ts","sourceRoot":"","sources":["../../src/lib/dom-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CA6FpG;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnG;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1G;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAW5F;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBxE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcpE"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Auto-detect the environment from the URL and annotate test runs
3
+ * with prod/staging/dev environment information.
4
+ */
5
+ export type Environment = "production" | "staging" | "development" | "unknown";
6
+ export interface EnvironmentInfo {
7
+ env: Environment;
8
+ host: string;
9
+ protocol: string;
10
+ domain: string;
11
+ label: string;
12
+ }
13
+ /**
14
+ * Detect the environment from a URL.
15
+ * Uses host patterns to determine prod vs staging vs dev.
16
+ */
17
+ export declare function detectEnvironment(url: string): EnvironmentInfo;
18
+ /**
19
+ * Override environment detection via environment variable.
20
+ */
21
+ export declare function getEnvironmentOverride(): Environment | null;
22
+ /**
23
+ * Get environment info for a URL, respecting any override.
24
+ */
25
+ export declare function getEnvInfo(url: string): EnvironmentInfo;
26
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/lib/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CA2D9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,WAAW,GAAG,IAAI,CAM3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CASvD"}
@@ -5,7 +5,8 @@ export interface HealthScanOptions {
5
5
  projectId?: string;
6
6
  headed?: boolean;
7
7
  timeoutMs?: number;
8
- scanners?: ("console" | "network" | "links" | "performance" | "injection" | "pii")[];
8
+ scanners?: ("console" | "network" | "links" | "performance" | "injection" | "pii" | "a11y")[];
9
+ wcagLevel?: "A" | "AA" | "AAA";
9
10
  injectionEndpoint?: string;
10
11
  injectionInputField?: string;
11
12
  maxPages?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"health-scan.d.ts","sourceRoot":"","sources":["../../src/lib/health-scan.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AAI/D,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC;IACrF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAID,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8E1F"}
1
+ {"version":3,"file":"health-scan.d.ts","sourceRoot":"","sources":["../../src/lib/health-scan.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AAI/D,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9F,SAAS,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAID,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwF1F"}
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-runner.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid-runner.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Result } from "../types/index.js";
2
+ export interface JUnitTestSuite {
3
+ name: string;
4
+ tests: number;
5
+ failures: number;
6
+ errors: number;
7
+ skipped: number;
8
+ time: number;
9
+ timestamp: string;
10
+ testCases: JUnitTestCase[];
11
+ }
12
+ export interface JUnitTestCase {
13
+ name: string;
14
+ classname: string;
15
+ time: number;
16
+ failure?: string;
17
+ error?: string;
18
+ skipped?: boolean;
19
+ }
20
+ /**
21
+ * Convert test results to JUnit XML format for CI/CD integration.
22
+ */
23
+ export declare function toJUnitXml(runId: string, results: Result[], baseUrl: string): string;
24
+ //# sourceMappingURL=junit-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junit-export.d.ts","sourceRoot":"","sources":["../../src/lib/junit-export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,CA4CR"}
@@ -0,0 +1,38 @@
1
+ import type { Page } from "playwright";
2
+ export interface MockRule {
3
+ /** URL pattern to intercept (string, regex pattern, or glob) */
4
+ url: string | RegExp;
5
+ /** HTTP method to match (omit for all methods) */
6
+ method?: string;
7
+ /** If true, abort the request with given error code */
8
+ abort?: boolean | string;
9
+ /** Override status code (e.g. 200, 404, 500) */
10
+ status?: number;
11
+ /** Override response headers */
12
+ headers?: Record<string, string>;
13
+ /** Override response body (JSON string or raw) */
14
+ body?: string | object;
15
+ /** Simulate network delay in ms */
16
+ delay?: number;
17
+ }
18
+ /**
19
+ * Sets up network interception and mocking on a Playwright page.
20
+ * Returns the active rules count.
21
+ */
22
+ export declare function setupNetworkMocks(page: Page, rules: MockRule[]): Promise<number>;
23
+ /**
24
+ * Creates common mock patterns for testing.
25
+ */
26
+ export declare const MockPresets: {
27
+ /** Mock all API calls to return empty 200 */
28
+ emptyApi: () => MockRule[];
29
+ /** Mock a specific endpoint to return 500 */
30
+ serverError: (path: string) => MockRule[];
31
+ /** Mock a specific endpoint to timeout */
32
+ timeout: (path: string, _delayMs?: number) => MockRule[];
33
+ /** Block third-party trackers */
34
+ blockTrackers: () => MockRule[];
35
+ /** Mock auth token endpoint */
36
+ mockAuth: (token?: string) => MockRule[];
37
+ };
38
+ //# sourceMappingURL=network-mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-mock.d.ts","sourceRoot":"","sources":["../../src/lib/network-mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAS,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCtF;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB,6CAA6C;oBAC/B,QAAQ,EAAE;IAIxB,6CAA6C;wBACzB,MAAM,KAAG,QAAQ,EAAE;IAIvC,0CAA0C;oBAC1B,MAAM,wBAAqB,QAAQ,EAAE;IAIrD,iCAAiC;yBACd,QAAQ,EAAE;IAI7B,+BAA+B;kCACO,QAAQ,EAAE;CAGjD,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Page, BrowserContext } from "playwright";
2
+ export type ThrottleProfile = {
3
+ download: number;
4
+ upload: number;
5
+ latency: number;
6
+ label: string;
7
+ };
8
+ export declare const THROTTLE_PROFILES: Record<string, ThrottleProfile>;
9
+ /**
10
+ * Take the browser offline by aborting all network requests.
11
+ */
12
+ export declare function goOffline(context: BrowserContext): Promise<void>;
13
+ /**
14
+ * Bring the browser back online.
15
+ */
16
+ export declare function goOnline(context: BrowserContext): Promise<void>;
17
+ /**
18
+ * Test if a page handles offline state gracefully.
19
+ * Returns true if the page showed an offline indicator.
20
+ */
21
+ export declare function testOfflineHandling(page: Page, timeout?: number): Promise<boolean>;
22
+ /**
23
+ * Enable throttling via CDP (Chromium DevTools Protocol).
24
+ * Only works with Chromium/Playwright.
25
+ */
26
+ export declare function enableThrottling(context: BrowserContext, profile: ThrottleProfile | keyof typeof THROTTLE_PROFILES): Promise<void>;
27
+ /**
28
+ * Disable CDP-based throttling (re-enable normal network).
29
+ */
30
+ export declare function disableThrottling(context: BrowserContext): Promise<void>;
31
+ //# sourceMappingURL=offline-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline-mode.d.ts","sourceRoot":"","sources":["../../src/lib/offline-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAK7D,CAAC;AAEF;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBtF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,OAAO,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxI;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E"}