privalint 0.2.0 → 0.4.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.
Files changed (75) hide show
  1. package/README.de.md +68 -2
  2. package/README.md +77 -13
  3. package/dist/assessment.d.ts +6 -0
  4. package/dist/assessment.js +115 -0
  5. package/dist/assessment.js.map +1 -0
  6. package/dist/capture.d.ts +5 -0
  7. package/dist/capture.js +162 -0
  8. package/dist/capture.js.map +1 -0
  9. package/dist/cli.js +48 -14
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config.d.ts +21 -0
  12. package/dist/config.js +113 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/consent.d.ts +3 -0
  15. package/dist/consent.js +81 -12
  16. package/dist/consent.js.map +1 -1
  17. package/dist/coverage.d.ts +13 -0
  18. package/dist/coverage.js +86 -0
  19. package/dist/coverage.js.map +1 -0
  20. package/dist/data/third-parties.js +9 -0
  21. package/dist/data/third-parties.js.map +1 -1
  22. package/dist/diagnostics.d.ts +28 -0
  23. package/dist/diagnostics.js +202 -0
  24. package/dist/diagnostics.js.map +1 -0
  25. package/dist/index.d.ts +6 -0
  26. package/dist/index.js +6 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/network.d.ts +68 -0
  29. package/dist/network.js +237 -0
  30. package/dist/network.js.map +1 -0
  31. package/dist/observations.d.ts +3 -0
  32. package/dist/observations.js +4 -0
  33. package/dist/observations.js.map +1 -0
  34. package/dist/policy.d.ts +6 -0
  35. package/dist/policy.js +37 -0
  36. package/dist/policy.js.map +1 -0
  37. package/dist/report-contract.d.ts +13 -0
  38. package/dist/report-contract.js +16 -0
  39. package/dist/report-contract.js.map +1 -0
  40. package/dist/reporters/capture.d.ts +5 -0
  41. package/dist/reporters/capture.js +87 -0
  42. package/dist/reporters/capture.js.map +1 -0
  43. package/dist/reporters/markdown.js +13 -1
  44. package/dist/reporters/markdown.js.map +1 -1
  45. package/dist/reporters/messages.d.ts +1 -0
  46. package/dist/reporters/messages.js +18 -6
  47. package/dist/reporters/messages.js.map +1 -1
  48. package/dist/reporters/sarif.js +48 -10
  49. package/dist/reporters/sarif.js.map +1 -1
  50. package/dist/reporters/shared.js +3 -2
  51. package/dist/reporters/shared.js.map +1 -1
  52. package/dist/reporters/text.js +10 -2
  53. package/dist/reporters/text.js.map +1 -1
  54. package/dist/rules/google-fonts.js +2 -1
  55. package/dist/rules/google-fonts.js.map +1 -1
  56. package/dist/rules/reject-option.js +6 -4
  57. package/dist/rules/reject-option.js.map +1 -1
  58. package/dist/rules/third-party-embeds.js +2 -2
  59. package/dist/rules/third-party-embeds.js.map +1 -1
  60. package/dist/rules/third-party-hits.js +2 -1
  61. package/dist/rules/third-party-hits.js.map +1 -1
  62. package/dist/rules/tracker-hits.js +2 -1
  63. package/dist/rules/tracker-hits.js.map +1 -1
  64. package/dist/scan-options.d.ts +45 -0
  65. package/dist/scan-options.js +2 -0
  66. package/dist/scan-options.js.map +1 -0
  67. package/dist/scanner.d.ts +4 -38
  68. package/dist/scanner.js +177 -114
  69. package/dist/scanner.js.map +1 -1
  70. package/dist/types.d.ts +119 -0
  71. package/package.json +7 -1
  72. package/schemas/report-1.0.0.schema.json +813 -0
  73. package/schemas/report-1.1.0.schema.json +833 -0
  74. package/schemas/sarif-properties-1.0.0.schema.json +785 -0
  75. package/schemas/sarif-properties-1.1.0.schema.json +810 -0
@@ -1 +1 @@
1
- {"version":3,"file":"third-party-hits.js","sourceRoot":"","sources":["../../src/rules/third-party-hits.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CACnC,QAAoC,EACpC,IAA6C;IAE7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC"}
1
+ {"version":3,"file":"third-party-hits.js","sourceRoot":"","sources":["../../src/rules/third-party-hits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CACnC,QAAoC,EACpC,IAA6C;IAE7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { findTrackerByCookie, findTrackerByUrl, } from '../data/trackers.js';
2
2
  import { say } from '../i18n.js';
3
+ import { observedRequests } from '../observations.js';
3
4
  const MAX_EVIDENCE = 5;
4
5
  /** Matches requests and cookies against the tracker list, grouped by vendor. */
5
6
  export function findTrackerHits(requests, cookies, lang) {
@@ -10,7 +11,7 @@ export function findTrackerHits(requests, cookies, lang) {
10
11
  hit.evidence.add(evidence);
11
12
  hits.set(tracker.vendor, hit);
12
13
  };
13
- for (const request of requests) {
14
+ for (const request of observedRequests(requests)) {
14
15
  const tracker = findTrackerByUrl(request.url);
15
16
  if (tracker !== undefined) {
16
17
  record(tracker, `${requestLabel} ${request.url}`);
@@ -1 +1 @@
1
- {"version":3,"file":"tracker-hits.js","sourceRoot":"","sources":["../../src/rules/tracker-hits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAa,GAAG,EAAa,MAAM,YAAY,CAAC;AAGvD,MAAM,YAAY,GAAG,CAAC,CAAC;AAQvB,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAC7B,QAAoC,EACpC,OAAkC,EAClC,IAAU;IAEV,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuD,CAAC;IAC5E,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,QAAgB,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;QACjF,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,EAAE,GAAG,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GACX,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;YAChC,gBAAgB,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,EAAE,UAAU,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO;QACP,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC;KAC/C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,eAAe,GAAkC;IACrD,SAAS,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7C,WAAW,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE;IACjD,gBAAgB,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,EAAE;IAChE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE;IAC5C,sBAAsB,EAAE,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,2BAA2B,EAAE;IACvF,aAAa,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAyB,EAAE,IAAU,EAAE,EAAE,CACrE,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"tracker-hits.js","sourceRoot":"","sources":["../../src/rules/tracker-hits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAa,GAAG,EAAa,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,YAAY,GAAG,CAAC,CAAC;AAQvB,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAC7B,QAAoC,EACpC,OAAkC,EAClC,IAAU;IAEV,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuD,CAAC;IAC5E,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,QAAgB,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;QACjF,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,EAAE,GAAG,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GACX,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;YAChC,gBAAgB,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,EAAE,UAAU,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO;QACP,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC;KAC/C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,eAAe,GAAkC;IACrD,SAAS,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE;IAC7C,WAAW,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE;IACjD,gBAAgB,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,EAAE;IAChE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE;IAC5C,sBAAsB,EAAE,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,2BAA2B,EAAE;IACvF,aAAa,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAyB,EAAE,IAAU,EAAE,EAAE,CACrE,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { Lang } from './i18n.js';
2
+ import type { Region } from './legal.js';
3
+ import type { NetworkAdapter, NetworkLimits } from './network.js';
4
+ import type { PageSnapshot, Rule, RuleSettings, ScanProgressEvent } from './types.js';
5
+ export interface ScanOptions {
6
+ maxPages?: number | undefined;
7
+ settleMs?: number | undefined;
8
+ /** Navigation/network-idle timeout, distinct from transport and capture deadlines. */
9
+ timeoutMs?: number | undefined;
10
+ locale?: string | undefined;
11
+ lang?: Lang | undefined;
12
+ /** Tool classification profile; does not determine which law applies. */
13
+ region?: Region | undefined;
14
+ rules?: readonly Rule[];
15
+ ruleSettings?: RuleSettings;
16
+ allow?: {
17
+ vendors: readonly string[];
18
+ };
19
+ /** Synchronous notification; exceptions propagate after resource cleanup. */
20
+ onProgress?: (event: ScanProgressEvent) => void;
21
+ /** Legacy test helper: third-party requests receive synthetic empty responses. */
22
+ offline?: boolean;
23
+ consentCheck?: boolean | undefined;
24
+ headed?: boolean | undefined;
25
+ channel?: string | undefined;
26
+ /** Trusted hook receiving RAW observations. Do not log/expose without redaction. */
27
+ onPage?: (snapshot: PageSnapshot) => void;
28
+ /** Caller-owned transport; scan owns browser, fresh per-page contexts and request signals. */
29
+ networkAdapter?: NetworkAdapter;
30
+ /** Per-page budgets across initial loading and rejection. Requires networkAdapter. */
31
+ networkLimits?: NetworkLimits;
32
+ signal?: AbortSignal;
33
+ /** Entire capture including queue wait and consent; default 60s with an adapter. */
34
+ captureTimeoutMs?: number;
35
+ /** Stored issue details per page; counters are never truncated. Default 100. */
36
+ maxDiagnostics?: number;
37
+ /** Legacy default: throw on start-page navigation failure. Adapter default: report it. */
38
+ failureMode?: 'throw' | 'report';
39
+ }
40
+ export declare const DEFAULTS: {
41
+ maxPages: number;
42
+ settleMs: number;
43
+ timeoutMs: number;
44
+ locale: string;
45
+ };
@@ -0,0 +1,2 @@
1
+ export const DEFAULTS = { maxPages: 1, settleMs: 2_000, timeoutMs: 30_000, locale: 'de-DE' };
2
+ //# sourceMappingURL=scan-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-options.js","sourceRoot":"","sources":["../src/scan-options.ts"],"names":[],"mappings":"AAsCA,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC"}
package/dist/scanner.d.ts CHANGED
@@ -1,39 +1,5 @@
1
- import type { Lang } from './i18n.js';
2
- import { type Region } from './legal.js';
3
- import type { PageSnapshot, Rule, ScanResult } from './types.js';
4
- export interface ScanOptions {
5
- /** Maximum number of pages on the same site to visit, starting with the given URL. */
6
- maxPages?: number | undefined;
7
- /** Extra time to wait after the network is idle, to catch delayed tags. */
8
- settleMs?: number | undefined;
9
- /** Navigation timeout per page. */
10
- timeoutMs?: number | undefined;
11
- locale?: string | undefined;
12
- /** Language of messages and fixes in the findings. */
13
- lang?: Lang | undefined;
14
- /** Country whose law the findings are judged by. */
15
- region?: Region | undefined;
16
- rules?: readonly Rule[];
17
- /**
18
- * Answer every third-party request with an empty response instead of fetching it.
19
- * Requests are still recorded. Used by the test suite to stay off the network.
20
- */
21
- offline?: boolean;
22
- /**
23
- * Click "reject" on the start page's consent banner and record what still loads.
24
- * On by default.
25
- */
26
- consentCheck?: boolean | undefined;
27
- /**
28
- * Open a visible browser window instead of running headless. Some sites only show their
29
- * consent banner to regular browsers. Needs a display, so it doesn't work on CI runners.
30
- */
31
- headed?: boolean | undefined;
32
- /**
33
- * Use an installed browser instead of Playwright's bundled Chromium,
34
- * e.g. `chrome` or `msedge`.
35
- */
36
- channel?: string | undefined;
37
- onPage?: (snapshot: PageSnapshot) => void;
38
- }
1
+ import { type ScanOptions } from './scan-options.js';
2
+ import type { ScanResult } from './types.js';
3
+ export type { ScanOptions } from './scan-options.js';
4
+ export declare function throwIfAborted(signal?: AbortSignal): void;
39
5
  export declare function scan(target: string, options?: ScanOptions): Promise<ScanResult>;
package/dist/scanner.js CHANGED
@@ -1,47 +1,121 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { chromium } from 'playwright';
2
- import { observeConsent } from './consent.js';
3
+ import { assessPage } from './assessment.js';
4
+ import { capturePage } from './capture.js';
5
+ import { diagnosticUrl } from './diagnostics.js';
3
6
  import { applyRegion } from './legal.js';
7
+ import { VERSION } from './meta.js';
8
+ import { networkLimits } from './network.js';
9
+ import { applyPolicy, ruleSetting, validateRuleSettings } from './policy.js';
10
+ import { REPORT_SCHEMA_VERSION } from './report-contract.js';
4
11
  import { defaultRules } from './rules/index.js';
5
- import { crawlTarget, isFirstParty, withoutHash } from './url.js';
6
- const DEFAULTS = {
7
- maxPages: 1,
8
- settleMs: 2_000,
9
- timeoutMs: 30_000,
10
- locale: 'de-DE',
11
- lang: 'en',
12
- region: 'de',
13
- };
12
+ import { DEFAULTS } from './scan-options.js';
13
+ import { crawlTarget, withoutHash } from './url.js';
14
+ function integer(value, name, minimum) {
15
+ if (!Number.isSafeInteger(value) || value < minimum) {
16
+ throw new RangeError(`${name} must be a safe integer of at least ${minimum}`);
17
+ }
18
+ }
19
+ export function throwIfAborted(signal) {
20
+ if (signal?.aborted)
21
+ throw new DOMException('Scan aborted', 'AbortError');
22
+ }
14
23
  export async function scan(target, options = {}) {
24
+ throwIfAborted(options.signal);
15
25
  const startedAt = Date.now();
16
- const rules = options.rules ?? defaultRules;
17
- const maxPages = Math.max(1, options.maxPages ?? DEFAULTS.maxPages);
18
- const lang = options.lang ?? DEFAULTS.lang;
19
- const region = options.region ?? DEFAULTS.region;
26
+ const scanId = randomUUID();
27
+ const emit = (event) => options.onProgress?.({ ...event, scanId, elapsedMs: Date.now() - startedAt });
28
+ emit({ stage: 'starting', elapsedMs: 0 });
29
+ const configuredRules = options.rules ?? defaultRules;
30
+ validateRuleSettings(options.ruleSettings ?? {}, [...defaultRules, ...configuredRules]);
31
+ if (options.allow &&
32
+ (!Array.isArray(options.allow.vendors) ||
33
+ !options.allow.vendors.every((vendor) => typeof vendor === 'string' && vendor.length > 0))) {
34
+ throw new TypeError('allow.vendors must contain non-empty vendor names');
35
+ }
36
+ const rules = configuredRules.filter((rule) => ruleSetting(options.ruleSettings, rule.id) !== 'off');
37
+ const maxPages = options.maxPages ?? DEFAULTS.maxPages;
38
+ integer(maxPages, 'maxPages', 1);
39
+ integer(options.settleMs ?? DEFAULTS.settleMs, 'settleMs', 0);
40
+ integer(options.timeoutMs ?? DEFAULTS.timeoutMs, 'timeoutMs', 1);
41
+ integer(options.maxDiagnostics ?? 100, 'maxDiagnostics', 0);
42
+ if (options.captureTimeoutMs !== undefined)
43
+ integer(options.captureTimeoutMs, 'captureTimeoutMs', 1);
44
+ if (options.networkLimits && !options.networkAdapter) {
45
+ throw new TypeError('networkLimits requires networkAdapter');
46
+ }
47
+ if (options.networkAdapter && options.offline) {
48
+ throw new TypeError('offline cannot be combined with networkAdapter');
49
+ }
50
+ if (options.networkAdapter)
51
+ networkLimits(options.networkLimits);
52
+ const lang = options.lang ?? 'en';
53
+ const region = options.region ?? 'de';
20
54
  let siteUrl = new URL(target);
55
+ if (!/^https?:$/.test(siteUrl.protocol))
56
+ throw new TypeError('Expected an HTTP(S) target');
21
57
  const browser = await chromium.launch({
22
58
  headless: options.headed !== true,
23
59
  ...(options.channel === undefined ? {} : { channel: options.channel }),
24
60
  });
25
61
  try {
62
+ throwIfAborted(options.signal);
26
63
  const snapshots = [];
27
64
  const queue = [siteUrl.href];
28
65
  const seen = new Set(queue);
29
- const captured = new Set();
66
+ const pageIds = new Map();
30
67
  let url = queue.shift();
31
68
  while (url !== undefined && snapshots.length < maxPages) {
69
+ throwIfAborted(options.signal);
32
70
  const isStart = snapshots.length === 0;
33
- const snapshot = await capturePage(browser, url, siteUrl, options, isStart);
71
+ const pageIndex = snapshots.length;
72
+ const captureId = randomUUID();
73
+ emit({
74
+ stage: 'loading-page',
75
+ elapsedMs: 0,
76
+ pageUrl: diagnosticUrl(url),
77
+ pageIndex,
78
+ captureId,
79
+ });
80
+ let progressFailure;
81
+ const snapshot = await capturePage(browser, url, siteUrl, {
82
+ ...options,
83
+ onProgress: (event) => {
84
+ try {
85
+ emit({ ...event, pageIndex, captureId });
86
+ }
87
+ catch (error) {
88
+ progressFailure = { error };
89
+ throw error;
90
+ }
91
+ },
92
+ }, isStart);
93
+ if (progressFailure)
94
+ throw progressFailure.error;
34
95
  if (isStart) {
35
- if (snapshot.error !== undefined) {
36
- throw new Error(`Could not load ${url}: ${snapshot.error}`);
96
+ const failureMode = options.failureMode ?? (options.networkAdapter ? 'report' : 'throw');
97
+ if (snapshot.error !== undefined && failureMode === 'throw') {
98
+ throw new Error(`Could not load ${diagnosticUrl(url)}: ${snapshot.error}`);
37
99
  }
38
- // Follow redirects like http -> https or apex -> www for the rest of the crawl.
39
100
  siteUrl = new URL(snapshot.finalUrl);
40
101
  }
41
- // Several links can redirect to the same page; only lint it once.
42
102
  const finalUrl = withoutHash(snapshot.finalUrl);
43
- if (!captured.has(finalUrl)) {
44
- captured.add(finalUrl);
103
+ const existingPage = pageIds.get(finalUrl);
104
+ const { pageId, pageIndex: resolvedIndex } = existingPage ?? {
105
+ pageId: randomUUID(),
106
+ pageIndex,
107
+ };
108
+ pageIds.set(finalUrl, { pageId, pageIndex: resolvedIndex });
109
+ snapshot.pageId = pageId;
110
+ emit({
111
+ stage: 'page-captured',
112
+ elapsedMs: 0,
113
+ pageUrl: diagnosticUrl(snapshot.finalUrl),
114
+ captureId,
115
+ pageId,
116
+ pageIndex: resolvedIndex,
117
+ });
118
+ if (existingPage === undefined) {
45
119
  seen.add(finalUrl);
46
120
  snapshots.push(snapshot);
47
121
  options.onPage?.(snapshot);
@@ -55,121 +129,110 @@ export async function scan(target, options = {}) {
55
129
  }
56
130
  url = queue.shift();
57
131
  }
58
- // Pages that failed, returned an error status or redirected off-site are listed but not linted.
59
- const observed = snapshots
60
- .filter((page) => page.error === undefined &&
61
- (page.status === null || page.status < 400) &&
62
- isFirstParty(page.finalUrl, siteUrl))
63
- .flatMap((page) => rules.flatMap((rule) => rule.check({ siteUrl, page, lang })));
64
- const findings = applyRegion(observed, region);
65
- return {
132
+ throwIfAborted(options.signal);
133
+ const assessments = snapshots.map((page, index) => {
134
+ emit({
135
+ stage: 'evaluating-rules',
136
+ elapsedMs: 0,
137
+ pageIndex: index,
138
+ ...(page.pageId === undefined ? {} : { pageId: page.pageId }),
139
+ pageUrl: diagnosticUrl(page.finalUrl),
140
+ });
141
+ return assessPage(page, rules, siteUrl, lang, index === 0, options.consentCheck !== false, configuredRules);
142
+ });
143
+ const partial = assessments.some((assessment) => assessment.evaluations.some((evaluation) => evaluation.partial || evaluation.reason === 'consent-disabled')) || snapshots.some((page) => !page.capture?.complete);
144
+ const result = {
145
+ scanId,
146
+ schemaVersion: REPORT_SCHEMA_VERSION,
147
+ scannerVersion: VERSION,
148
+ options: {
149
+ maxPages,
150
+ settleMs: options.settleMs ?? DEFAULTS.settleMs,
151
+ timeoutMs: options.timeoutMs ?? DEFAULTS.timeoutMs,
152
+ locale: options.locale ?? DEFAULTS.locale,
153
+ lang,
154
+ region,
155
+ consentCheck: options.consentCheck !== false,
156
+ headed: options.headed === true,
157
+ channel: options.channel ?? 'chromium',
158
+ captureTimeoutMs: options.captureTimeoutMs ?? (options.networkAdapter ? 60_000 : null),
159
+ maxDiagnostics: options.maxDiagnostics ?? 100,
160
+ failureMode: options.failureMode ?? (options.networkAdapter ? 'report' : 'throw'),
161
+ captureMode: options.networkAdapter
162
+ ? 'adapter'
163
+ : options.offline
164
+ ? 'offline-fixture'
165
+ : 'native',
166
+ networkLimits: options.networkAdapter ? networkLimits(options.networkLimits) : null,
167
+ selectedRules: rules.map((rule) => rule.id),
168
+ ruleSettings: { ...options.ruleSettings },
169
+ allowedVendors: [...(options.allow?.vendors ?? [])],
170
+ },
66
171
  siteUrl: siteUrl.href,
67
172
  lang,
68
173
  region,
69
174
  scannedAt: new Date(startedAt).toISOString(),
70
175
  durationMs: Date.now() - startedAt,
71
- pages: snapshots.map((page) => ({
176
+ pages: snapshots.map((page, index) => ({
177
+ ...(page.pageId === undefined ? {} : { pageId: page.pageId }),
72
178
  url: page.url,
73
179
  finalUrl: page.finalUrl,
74
180
  status: page.status,
75
- requestCount: page.requests.length,
181
+ requestCount: page.requestCount ?? page.requests.length,
76
182
  cookieCount: page.cookies.length,
77
183
  ...(page.error === undefined ? {} : { error: page.error }),
184
+ ...(page.capture === undefined ? {} : { capture: page.capture }),
185
+ ruleEvaluations: assessments[index]?.evaluations ?? [],
78
186
  })),
79
187
  ...consentSummary(snapshots[0]),
80
- findings,
188
+ findings: applyPolicy(applyRegion(assessments.flatMap((assessment) => assessment.findings), region), options.ruleSettings, options.allow?.vendors),
81
189
  rules: rules.map(({ check: _check, ...meta }) => meta),
190
+ coverage: partial ? 'partial' : 'complete',
82
191
  };
192
+ emit({ stage: 'completed', elapsedMs: 0 });
193
+ return options.networkAdapter ? redactReport(result) : result;
83
194
  }
84
195
  finally {
85
196
  await browser.close();
86
197
  }
87
198
  }
88
199
  function consentSummary(start) {
89
- if (start?.consent === undefined) {
200
+ if (start?.consent === undefined)
90
201
  return {};
91
- }
92
202
  const { afterReject: _afterReject, ...summary } = start.consent;
93
203
  return { consent: summary };
94
204
  }
95
- async function capturePage(browser, url, siteUrl, options, checkConsent) {
96
- // A fresh context per page means no cookies or storage carry over:
97
- // every page is seen the way a first-time visitor sees it.
98
- const context = await browser.newContext({ locale: options.locale ?? DEFAULTS.locale });
99
- const requests = [];
100
- try {
101
- if (options.offline) {
102
- await context.route('**/*', (route) => isFirstParty(route.request().url(), siteUrl)
103
- ? route.continue()
104
- : route.fulfill({ status: 200, body: '' }));
105
- }
106
- const page = await context.newPage();
107
- page.on('request', (request) => {
108
- requests.push({ url: request.url(), resourceType: request.resourceType() });
109
- });
110
- const response = await page.goto(url, {
111
- waitUntil: 'load',
112
- timeout: options.timeoutMs ?? DEFAULTS.timeoutMs,
113
- });
114
- await page
115
- .waitForLoadState('networkidle', { timeout: options.timeoutMs ?? DEFAULTS.timeoutMs })
116
- .catch(() => {
117
- // Long-polling or streaming pages never go idle; carry on with what we have.
118
- });
119
- await page.waitForTimeout(options.settleMs ?? DEFAULTS.settleMs);
120
- const links = await page.$$eval('a[href]', (anchors) => anchors.map((a) => ({
121
- href: a.href,
122
- text: [a.textContent, a.getAttribute('aria-label'), a.getAttribute('title')]
123
- .filter(Boolean)
124
- .join(' ')
125
- .replace(/\s+/g, ' ')
126
- .trim()
127
- .slice(0, 200),
128
- })));
129
- const resourceHints = await page.$$eval('link[rel][href]', (elements) => elements.map((link) => ({
130
- rel: (link.getAttribute('rel') ?? '').toLowerCase(),
131
- href: link.href,
132
- })));
133
- const cookies = (await context.cookies()).map(({ name, domain, path, expires }) => ({
134
- name,
135
- domain,
136
- path,
137
- expires,
138
- }));
139
- const snapshot = {
140
- url,
141
- finalUrl: page.url(),
142
- status: response?.status() ?? null,
143
- // Copy: the listener keeps writing to `requests` during the consent check.
144
- requests: [...requests],
145
- cookies,
146
- links,
147
- resourceHints,
148
- };
149
- if (checkConsent && options.consentCheck !== false) {
150
- snapshot.consent = await observeConsent(page, context, requests, {
151
- settleMs: options.settleMs ?? DEFAULTS.settleMs,
152
- timeoutMs: options.timeoutMs ?? DEFAULTS.timeoutMs,
153
- });
154
- }
155
- return snapshot;
156
- }
157
- catch (error) {
158
- // Downloads, timeouts and crashed pages should not end the whole crawl.
159
- const message = error instanceof Error ? error.message : String(error);
160
- return {
161
- url,
162
- finalUrl: url,
163
- status: null,
164
- requests,
165
- cookies: [],
166
- links: [],
167
- resourceHints: [],
168
- error: message.split('\n')[0] ?? message,
169
- };
170
- }
171
- finally {
172
- await context.close();
173
- }
205
+ /** Adapter reports omit URL credentials, paths, queries and fragments by default. */
206
+ function redactReport(result) {
207
+ const redactText = (text) => text.replace(/https?:\/\/[^\s<>"']+/gi, diagnosticUrl);
208
+ return {
209
+ ...result,
210
+ siteUrl: diagnosticUrl(result.siteUrl),
211
+ ...(result.consent === undefined
212
+ ? {}
213
+ : {
214
+ consent: {
215
+ ...result.consent,
216
+ ...(result.consent.acceptLabel === undefined
217
+ ? {}
218
+ : { acceptLabel: redactText(result.consent.acceptLabel) }),
219
+ ...(result.consent.rejectLabel === undefined
220
+ ? {}
221
+ : { rejectLabel: redactText(result.consent.rejectLabel) }),
222
+ },
223
+ }),
224
+ pages: result.pages.map((page) => ({
225
+ ...page,
226
+ url: diagnosticUrl(page.url),
227
+ finalUrl: diagnosticUrl(page.finalUrl),
228
+ })),
229
+ findings: result.findings.map((finding) => ({
230
+ ...finding,
231
+ pageUrl: diagnosticUrl(finding.pageUrl),
232
+ message: redactText(finding.message),
233
+ evidence: finding.evidence.map(redactText),
234
+ ...(finding.fix === undefined ? {} : { fix: redactText(finding.fix) }),
235
+ })),
236
+ };
174
237
  }
175
238
  //# sourceMappingURL=scanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}