privalint 0.3.0 → 0.4.1

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 (64) hide show
  1. package/README.de.md +38 -0
  2. package/README.md +49 -11
  3. package/dist/assessment.d.ts +1 -1
  4. package/dist/assessment.js +45 -9
  5. package/dist/assessment.js.map +1 -1
  6. package/dist/capture.js +10 -3
  7. package/dist/capture.js.map +1 -1
  8. package/dist/cli.js +44 -11
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +21 -0
  11. package/dist/config.js +113 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/consent.js +70 -8
  14. package/dist/consent.js.map +1 -1
  15. package/dist/coverage.d.ts +13 -0
  16. package/dist/coverage.js +86 -0
  17. package/dist/coverage.js.map +1 -0
  18. package/dist/data/third-parties.js +9 -0
  19. package/dist/data/third-parties.js.map +1 -1
  20. package/dist/diagnostics.d.ts +7 -3
  21. package/dist/diagnostics.js +36 -8
  22. package/dist/diagnostics.js.map +1 -1
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.js +3 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/network.d.ts +3 -2
  27. package/dist/network.js +6 -4
  28. package/dist/network.js.map +1 -1
  29. package/dist/observations.d.ts +5 -1
  30. package/dist/observations.js +6 -1
  31. package/dist/observations.js.map +1 -1
  32. package/dist/policy.d.ts +6 -0
  33. package/dist/policy.js +37 -0
  34. package/dist/policy.js.map +1 -0
  35. package/dist/report-contract.d.ts +13 -0
  36. package/dist/report-contract.js +16 -0
  37. package/dist/report-contract.js.map +1 -0
  38. package/dist/reporters/capture.js +56 -4
  39. package/dist/reporters/capture.js.map +1 -1
  40. package/dist/reporters/markdown.js +6 -1
  41. package/dist/reporters/markdown.js.map +1 -1
  42. package/dist/reporters/messages.d.ts +1 -0
  43. package/dist/reporters/messages.js +6 -0
  44. package/dist/reporters/messages.js.map +1 -1
  45. package/dist/reporters/sarif.js +25 -11
  46. package/dist/reporters/sarif.js.map +1 -1
  47. package/dist/reporters/shared.js +3 -2
  48. package/dist/reporters/shared.js.map +1 -1
  49. package/dist/reporters/text.js +4 -0
  50. package/dist/reporters/text.js.map +1 -1
  51. package/dist/rules/reject-option.js +3 -1
  52. package/dist/rules/reject-option.js.map +1 -1
  53. package/dist/rules/third-party-embeds.js +2 -2
  54. package/dist/rules/third-party-embeds.js.map +1 -1
  55. package/dist/scan-options.d.ts +7 -1
  56. package/dist/scan-options.js.map +1 -1
  57. package/dist/scanner.js +95 -7
  58. package/dist/scanner.js.map +1 -1
  59. package/dist/types.d.ts +61 -2
  60. package/package.json +7 -1
  61. package/schemas/report-1.0.0.schema.json +813 -0
  62. package/schemas/report-1.1.0.schema.json +833 -0
  63. package/schemas/sarif-properties-1.0.0.schema.json +785 -0
  64. package/schemas/sarif-properties-1.1.0.schema.json +810 -0
package/README.de.md CHANGED
@@ -69,6 +69,44 @@ Details, Hintergründe und Lösungen stehen auf Englisch in [`docs/rules`](docs/
69
69
  Der Bericht erscheint auf Deutsch in der Zusammenfassung des Workflow-Laufs. Alle Eingaben und
70
70
  die Anbindung an GitHub Code Scanning beschreibt die [englische README](README.md#github-action).
71
71
 
72
+ Mit `pr-comment: true` wird ein vorhandener Bot-Kommentar aktualisiert oder einmalig erstellt.
73
+ Dafür benötigt der Job `pull-requests: write`. Bei Fork-PRs oder einem schreibgeschützten Token
74
+ wird der Kommentar ohne Scanfehler ausgelassen. Befunde mit einem fehlgeschlagenen Scan-Schritt
75
+ verhindern den Kommentar nicht.
76
+
77
+ ## Konfiguration, Berichtsversion und Fortschritt
78
+
79
+ Die CLI liest eine vorhandene `privalint.config.json`, alternativ `--config <datei>`.
80
+ CLI-Argumente haben Vorrang. JSON kann URL, Seitenlimit, Sprache, Länderprofil, Ladeoptionen,
81
+ Regel-Schweregrade und eine Anbieter-Freigabeliste enthalten. API-Aufrufer setzen `ruleSettings`
82
+ und `allow` ausdrücklich; `scan()` liest keine Konfigurationsdateien automatisch.
83
+
84
+ ```json
85
+ {
86
+ "url": "https://example.org",
87
+ "maxPages": 20,
88
+ "rules": { "third-party-cdns": "warning", "impressum-link": "off" },
89
+ "allow": { "vendors": ["Google Analytics"] }
90
+ }
91
+ ```
92
+
93
+ Freigegebene Anbieter bleiben als Hinweise mit Policy-Kennzeichnung sichtbar. Eine Freigabe ist
94
+ kein Nachweis von Einwilligung oder rechtlicher Zulässigkeit. Details stehen in der
95
+ [deutschen Anleitung](docs/configuration.de.md) und der [englischen Fassung](docs/configuration.md).
96
+
97
+ Neue Berichte enthalten `schemaVersion`, `scannerVersion` und die wirksamen `options`.
98
+ Ohne Schemaversion handelt es sich um einen alten Bericht. `ruleEvaluations[].outcome`
99
+ unterscheidet „Geprüft, kein Befund“, „Befund erkannt“ und „Nicht prüfbar“ mit Begründung.
100
+ `onProgress` liefert tatsächliche Phasen mit verstrichener Zeit und bereinigten Seiten-URLs,
101
+ keinen geschätzten Prozentwert. Die Exit-Code-Policy von CLI/Action bleibt erhalten.
102
+
103
+ Schema 1.1.0 ergänzt zufällige Scan-/Seiten-IDs und die Zuordnung von Erfassungsversuchen nach
104
+ Redirects. Eigenständige Schemas und Konformitätsbeispiele sind enthalten. Mit
105
+ `--fail-on-incomplete` bzw. Action-Input `fail-on-incomplete: true` wird unvollständige nötige
106
+ Beobachtung optional mit Exit 3 bewertet; Befunde mit Exit 1 haben Vorrang. Bewusst deaktivierte
107
+ Regeln und Consent-Prüfungen sind ausgenommen. Details stehen im
108
+ [Berichtsvertrag](docs/report-contract.de.md) und seiner [englischen Fassung](docs/report-contract.md).
109
+
72
110
  ## Öffentliche Webscanner und kontrollierte Erfassung
73
111
 
74
112
  `scan()` unterstützt einen `networkAdapter` und ein `AbortSignal`. Jeder HTTP-Hop einschließlich
package/README.md CHANGED
@@ -77,19 +77,26 @@ jobs:
77
77
  The report shows up in the job summary. With the SARIF upload, findings also appear under
78
78
  **Security → Code scanning**.
79
79
 
80
+ To create/update a PR comment, set `pr-comment: true` and grant the job `pull-requests: write`.
81
+ The action updates its own marked bot comment. Fork PRs and read-only tokens skip commenting
82
+ without failing the scan. Reports are posted even when findings make the scan step fail.
83
+ See [configuration and report APIs](docs/configuration.md) ([Deutsch](docs/configuration.de.md)).
84
+
80
85
  Scanning a preview deployment instead of production catches problems before they ship. Pass the
81
86
  preview URL from your hosting provider's deployment event or action output as `url`.
82
87
 
83
- | Input | Default | |
84
- | ------------- | ----------------- | ------------------------------------------- |
85
- | `url` | | Page to scan. Required. |
86
- | `max-pages` | `1` | How many pages of the same site to crawl. |
87
- | `fail-on` | `error` | `error`, `warning` or `never`. |
88
- | `disable` | | Comma-separated rule ids to skip. |
89
- | `lang` | `en` | Language of the report: `en` or `de`. |
90
- | `region` | `de` | Whose law to cite: `de`, `at`, `ch`, `eu`. |
91
- | `sarif-file` | `privalint.sarif` | Where to write SARIF. Empty to skip. |
92
- | `job-summary` | `true` | Add the Markdown report to the job summary. |
88
+ | Input | Default | |
89
+ | -------------------- | ----------------- | ----------------------------------------------------- |
90
+ | `url` | | Page to scan. Required. |
91
+ | `max-pages` | `1` | How many pages of the same site to crawl. |
92
+ | `fail-on` | `error` | `error`, `warning` or `never`. |
93
+ | `fail-on-incomplete` | `false` | Fail separately for incomplete required observations. |
94
+ | `disable` | | Comma-separated rule ids to skip. |
95
+ | `lang` | `en` | Language of the report: `en` or `de`. |
96
+ | `region` | `de` | Whose law to cite: `de`, `at`, `ch`, `eu`. |
97
+ | `sarif-file` | `privalint.sarif` | Where to write SARIF. Empty to skip. |
98
+ | `job-summary` | `true` | Add the Markdown report to the job summary. |
99
+ | `pr-comment` | `false` | Create/update a same-repository PR report comment. |
93
100
 
94
101
  Outputs: `exit-code`, and `sarif-file` when a report was written.
95
102
 
@@ -113,6 +120,9 @@ privalint <url> [options]
113
120
  Repeatable; .sarif, .json and .md pick their format,
114
121
  other extensions use --format
115
122
  --fail-on <level> error | warning | never (default error)
123
+ --fail-on-incomplete Exit 3 for incomplete required observations (opt-in)
124
+ --allow-incomplete Override failOnIncomplete from JSON config
125
+ --config <file> Select a JSON configuration file
116
126
  --disable <rules> Comma-separated rule ids to skip
117
127
  --settle <ms> Wait this long after load for late tags (default 2000)
118
128
  --timeout <ms> Navigation timeout per page (default 30000)
@@ -126,6 +136,8 @@ privalint <url> [options]
126
136
  ```
127
137
 
128
138
  Exit codes: `0` nothing at or above `--fail-on`, `1` findings, `2` bad arguments or a failed scan.
139
+ With `--fail-on-incomplete`, exit `3` means incomplete required observation. Findings exit `1`
140
+ takes precedence; intentional disabled-rule/consent exclusions are ignored by this gate.
129
141
 
130
142
  The first run needs a browser. If Playwright hasn't installed one yet:
131
143
 
@@ -157,6 +169,20 @@ npx privalint https://ihre-seite.ch --region ch --lang de
157
169
 
158
170
  ## Use it from code
159
171
 
172
+ CLI configuration is loaded from `privalint.config.json` when present, or `--config <file>`.
173
+ CLI flags override JSON settings. API callers pass `ruleSettings` and `allow` explicitly;
174
+ the API never loads a config file implicitly. Allowed vendors remain visible as info with a policy
175
+ annotation; allowlisting does not establish consent or legal approval.
176
+
177
+ ```json
178
+ {
179
+ "url": "https://example.org",
180
+ "maxPages": 20,
181
+ "rules": { "third-party-cdns": "warning", "impressum-link": "off" },
182
+ "allow": { "vendors": ["Google Analytics"] }
183
+ }
184
+ ```
185
+
160
186
  ```ts
161
187
  import { scan } from 'privalint';
162
188
 
@@ -166,6 +192,18 @@ for (const finding of result.findings) {
166
192
  }
167
193
  ```
168
194
 
195
+ New reports carry `schemaVersion`, `scannerVersion` and normalized `options`. An absent
196
+ schema version means a legacy report, not version 1. `ruleEvaluations[].outcome` explicitly
197
+ distinguishes `checked-no-finding`, `finding-detected` and `not-evaluable`, always with a fixed
198
+ `explanation` code. `onProgress` emits real stages (`starting`, `loading-page`, `checking-consent`,
199
+ `evaluating-rules`, `completed`) with elapsed time and redacted page URLs; it does not invent a
200
+ percentage. The CLI and Action keep their existing finding-threshold exit policy.
201
+
202
+ Schema 1.1.0 adds random scan/page IDs and explicit capture-to-page progress resolution, so redacted
203
+ pages remain distinguishable. Standalone schemas and complete/partial/skip/policy fixtures are
204
+ included. The [report contract and optional CI gate](docs/report-contract.md)
205
+ ([Deutsch](docs/report-contract.de.md)) explain validation and identity/exit-code semantics.
206
+
169
207
  ### Public web scanners and controlled capture
170
208
 
171
209
  `scan()` accepts a `networkAdapter` and `AbortSignal`. The adapter receives each HTTP hop,
@@ -232,7 +270,7 @@ No report claims legal compliance.
232
270
  ## Roadmap
233
271
 
234
272
  - PR comments from the Action
235
- - Config file (`privalint.config.ts`) for allowlists and per-rule severity
273
+ - Config migration helpers and report comparison (JSON config is available now)
236
274
  - Check the settings layer of banners and the "accept" path
237
275
  - More trackers, embeds and consent managers (see the
238
276
  [`good first issue`](https://github.com/jexcellence/privalint/labels/good%20first%20issue) label)
@@ -1,6 +1,6 @@
1
1
  import type { Lang } from './i18n.js';
2
2
  import type { Finding, PageSnapshot, Rule, RuleEvaluation } from './types.js';
3
- export declare function assessPage(page: PageSnapshot, rules: readonly Rule[], siteUrl: URL, lang: Lang, isStart: boolean, consentEnabled: boolean): {
3
+ export declare function assessPage(page: PageSnapshot, rules: readonly Rule[], siteUrl: URL, lang: Lang, isStart: boolean, consentEnabled: boolean, catalog?: readonly Rule[]): {
4
4
  findings: Finding[];
5
5
  evaluations: RuleEvaluation[];
6
6
  };
@@ -11,9 +11,9 @@ const REQUIREMENTS = {
11
11
  'reject-option': ['consent'],
12
12
  'trackers-after-reject': ['after-reject'],
13
13
  };
14
- export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled) {
14
+ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled, catalog = rules) {
15
15
  const findings = [];
16
- const allRules = new Map([...defaultRules, ...rules].map((rule) => [rule.id, rule]));
16
+ const allRules = new Map([...defaultRules, ...catalog].map((rule) => [rule.id, rule]));
17
17
  const selected = new Set(rules.map((rule) => rule.id));
18
18
  const complete = page.capture?.beforeConsentComplete ?? page.capture?.complete ?? page.error === undefined;
19
19
  const validPage = (page.error === undefined || page.capture?.document === true) &&
@@ -23,7 +23,7 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled)
23
23
  const available = {
24
24
  document: validPage && complete && (page.capture?.document ?? true),
25
25
  network: validPage,
26
- consent: validPage && page.consent?.bannerFound === true,
26
+ consent: validPage && page.consent?.bannerFound === true && page.consent.acceptLabel !== undefined,
27
27
  'after-reject': validPage && page.consent?.rejected === true,
28
28
  };
29
29
  const input = {
@@ -47,7 +47,15 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled)
47
47
  const requirements = rule.requires ?? REQUIREMENTS[rule.id] ?? ['document'];
48
48
  const consentRule = requirements.some((kind) => kind === 'consent' || kind === 'after-reject');
49
49
  if (!selected.has(rule.id)) {
50
- return { ruleId: rule.id, status: 'skipped', reason: 'disabled', partial: false };
50
+ return {
51
+ ruleId: rule.id,
52
+ status: 'skipped',
53
+ reason: 'disabled',
54
+ partial: false,
55
+ outcome: 'not-evaluable',
56
+ explanation: 'disabled',
57
+ findingCount: 0,
58
+ };
51
59
  }
52
60
  if (consentRule && (!isStart || !consentEnabled)) {
53
61
  return {
@@ -55,6 +63,9 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled)
55
63
  status: 'skipped',
56
64
  reason: !isStart ? 'not-start-page' : 'consent-disabled',
57
65
  partial: false,
66
+ outcome: 'not-evaluable',
67
+ explanation: !isStart ? 'not-start-page' : 'consent-disabled',
68
+ findingCount: 0,
58
69
  };
59
70
  }
60
71
  if (!requirements.every((kind) => available[kind])) {
@@ -63,17 +74,42 @@ export function assessPage(page, rules, siteUrl, lang, isStart, consentEnabled)
63
74
  status: 'not-evaluable',
64
75
  reason: 'missing-observation',
65
76
  partial: true,
77
+ outcome: 'not-evaluable',
78
+ explanation: requirements.includes('after-reject')
79
+ ? (page.consent?.reason ?? 'missing-reject-observation')
80
+ : requirements.includes('consent')
81
+ ? (page.consent?.reason ?? 'missing-consent-observation')
82
+ : 'incomplete-document',
83
+ findingCount: 0,
66
84
  };
67
85
  }
68
- findings.push(...rule.check({ page: input, siteUrl, lang }));
86
+ const detected = rule.check({ page: input, siteUrl, lang });
87
+ findings.push(...detected.map((finding) => ({
88
+ ...finding,
89
+ ...(page.pageId === undefined ? {} : { pageId: page.pageId }),
90
+ })));
91
+ const partial = requirements.includes('after-reject')
92
+ ? page.consent?.afterRejectComplete === false
93
+ : !complete;
69
94
  return {
70
95
  ruleId: rule.id,
71
96
  status: 'executed',
72
- partial: requirements.includes('after-reject')
73
- ? page.consent?.afterRejectComplete === false
74
- : !complete,
97
+ partial,
98
+ outcome: detected.length > 0 ? 'finding-detected' : partial ? 'not-evaluable' : 'checked-no-finding',
99
+ explanation: detected.length > 0
100
+ ? 'positive-evidence'
101
+ : partial
102
+ ? 'incomplete-observation'
103
+ : 'required-observations-available',
104
+ findingCount: detected.length,
75
105
  };
76
106
  });
77
- return { findings, evaluations };
107
+ return {
108
+ findings,
109
+ evaluations: evaluations.map((evaluation) => ({
110
+ ...evaluation,
111
+ ...(page.pageId === undefined ? {} : { pageId: page.pageId }),
112
+ })),
113
+ };
78
114
  }
79
115
  //# sourceMappingURL=assessment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assessment.js","sourceRoot":"","sources":["../src/assessment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,YAAY,GAA+C;IAC/D,sBAAsB,EAAE,CAAC,SAAS,CAAC;IACnC,cAAc,EAAE,CAAC,SAAS,CAAC;IAC3B,oBAAoB,EAAE,CAAC,SAAS,CAAC;IACjC,kBAAkB,EAAE,CAAC,SAAS,CAAC;IAC/B,gBAAgB,EAAE,CAAC,UAAU,CAAC;IAC9B,qBAAqB,EAAE,CAAC,UAAU,CAAC;IACnC,eAAe,EAAE,CAAC,SAAS,CAAC;IAC5B,uBAAuB,EAAE,CAAC,cAAc,CAAC;CAC1C,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,IAAkB,EAClB,KAAsB,EACtB,OAAY,EACZ,IAAU,EACV,OAAgB,EAChB,cAAuB;IAEvB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,QAAQ,GACZ,IAAI,CAAC,OAAO,EAAE,qBAAqB,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;IAC5F,MAAM,SAAS,GACb,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;QAC7D,IAAI,CAAC,MAAM,KAAK,IAAI;QACpB,IAAI,CAAC,MAAM,GAAG,GAAG;QACjB,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAqC;QAClD,QAAQ,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;QACnE,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI;QACxD,cAAc,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI;KAC7D,CAAC;IACF,MAAM,KAAK,GAAiB;QAC1B,GAAG,IAAI;QACP,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzC,2FAA2F;QAC3F,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;QACjD,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,OAAO,EAAE;oBACP,GAAG,IAAI,CAAC,OAAO;oBACf,WAAW,EAAE;wBACX,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW;wBAC3B,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;qBAC9D;iBACF;aACF,CAAC;KACP,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAkB,EAAE;QACtE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,cAAc,CAAC,CAAC;QAC/F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpF,CAAC;QACD,IAAI,WAAW,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB;gBACxD,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,qBAAqB;gBAC7B,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC5C,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,KAAK,KAAK;gBAC7C,CAAC,CAAC,CAAC,QAAQ;SACd,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"assessment.js","sourceRoot":"","sources":["../src/assessment.ts"],"names":[],"mappings":"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"}
package/dist/capture.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { observeConsent } from './consent.js';
2
- import { classifyLoadError, Diagnostics } from './diagnostics.js';
2
+ import { classifyLoadError, Diagnostics, diagnosticUrl } from './diagnostics.js';
3
3
  import { ControlledNetwork, networkLimits } from './network.js';
4
4
  import { DEFAULTS } from './scan-options.js';
5
5
  import { isFirstParty } from './url.js';
@@ -90,8 +90,13 @@ export async function capturePage(browser, url, siteUrl, options, checkConsent)
90
90
  snapshot.requests = [...requests];
91
91
  snapshot.requestCount = diagnostics.data.requests;
92
92
  document = true;
93
- beforeComplete = diagnostics.data.issueCount === 0 && snapshot.error === undefined;
93
+ beforeComplete = diagnostics.restrictingIssues === 0 && snapshot.error === undefined;
94
94
  if (checkConsent && options.consentCheck !== false) {
95
+ options.onProgress?.({
96
+ stage: 'checking-consent',
97
+ elapsedMs: 0,
98
+ pageUrl: diagnosticUrl(url),
99
+ });
95
100
  snapshot.consent = await observeConsent(page, context, requests, {
96
101
  settleMs: options.settleMs ?? DEFAULTS.settleMs,
97
102
  timeoutMs: options.timeoutMs ?? DEFAULTS.timeoutMs,
@@ -128,6 +133,8 @@ export async function capturePage(browser, url, siteUrl, options, checkConsent)
128
133
  bannerFound: snapshot.consent?.bannerFound ?? false,
129
134
  rejected: false,
130
135
  state: 'interaction-failed',
136
+ outcome: 'interaction-failed',
137
+ reason: 'browser-interaction-failed',
131
138
  error: kind,
132
139
  };
133
140
  }
@@ -145,7 +152,7 @@ export async function capturePage(browser, url, siteUrl, options, checkConsent)
145
152
  snapshot.consent.afterRejectComplete = !diagnostics.hasIssues('after-reject');
146
153
  }
147
154
  snapshot.capture = {
148
- complete: beforeComplete && diagnostics.data.issueCount === 0,
155
+ complete: beforeComplete && diagnostics.restrictingIssues === 0,
149
156
  beforeConsentComplete: beforeComplete,
150
157
  document,
151
158
  diagnostics: diagnostics.data,
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -2,6 +2,8 @@
2
2
  import { writeFile } from 'node:fs/promises';
3
3
  import { extname } from 'node:path';
4
4
  import { parseArgs } from 'node:util';
5
+ import { loadConfig } from './config.js';
6
+ import { assessCoverage } from './coverage.js';
5
7
  import { diagnosticUrl } from './diagnostics.js';
6
8
  import { LANGS } from './i18n.js';
7
9
  import { REGIONS } from './legal.js';
@@ -14,6 +16,7 @@ const CHANNELS = ['chrome', 'msedge'];
14
16
  const EXIT_OK = 0;
15
17
  const EXIT_FINDINGS = 1;
16
18
  const EXIT_ERROR = 2;
19
+ const EXIT_INCOMPLETE = 3;
17
20
  const HELP = `privalint ${VERSION}
18
21
  Find GDPR problems on a live website: trackers before consent or after
19
22
  "reject", Google Fonts, missing Impressum. Runs the site in a real browser.
@@ -28,13 +31,17 @@ Options
28
31
  Repeatable; .sarif, .json and .md pick their format,
29
32
  other extensions use --format
30
33
  --fail-on <level> error | warning | never (default error)
34
+ --fail-on-incomplete Exit 3 if required observation coverage is incomplete
35
+ --allow-incomplete Override failOnIncomplete from JSON config
31
36
  --disable <rules> Comma-separated rule ids to skip
37
+ --config <file> JSON config (default: ./privalint.config.json when present)
32
38
  --settle <ms> Wait this long after load for late tags (default 2000)
33
39
  --timeout <ms> Navigation timeout per page (default 30000)
34
40
  --locale <locale> Browser locale (default de-DE)
35
41
  --lang <lang> Language of the report: en | de (default en)
36
42
  --region <region> Whose law to cite: de | at | ch | eu (default de)
37
43
  --skip-consent Don't click "reject" on the consent banner
44
+ --consent Enable consent checking even if the JSON config disables it
38
45
  --headed Open a visible browser window instead of running headless
39
46
  --channel <name> Use an installed browser: chrome or msedge
40
47
  --list-rules Print the available rules and exit
@@ -45,6 +52,7 @@ Exit codes
45
52
  0 no findings at or above --fail-on
46
53
  1 findings at or above --fail-on
47
54
  2 invalid arguments or the scan failed
55
+ 3 incomplete coverage (opt-in; findings exit 1 takes precedence)
48
56
  `;
49
57
  const FORMAT_BY_EXTENSION = {
50
58
  '.sarif': 'sarif',
@@ -60,13 +68,17 @@ async function main(argv) {
60
68
  format: { type: 'string', short: 'f', default: 'text' },
61
69
  output: { type: 'string', short: 'o', multiple: true },
62
70
  'fail-on': { type: 'string', default: 'error' },
71
+ 'fail-on-incomplete': { type: 'boolean' },
72
+ 'allow-incomplete': { type: 'boolean' },
63
73
  disable: { type: 'string' },
74
+ config: { type: 'string' },
64
75
  settle: { type: 'string' },
65
76
  timeout: { type: 'string' },
66
77
  locale: { type: 'string' },
67
- lang: { type: 'string', default: 'en' },
68
- region: { type: 'string', default: 'de' },
78
+ lang: { type: 'string' },
79
+ region: { type: 'string' },
69
80
  'skip-consent': { type: 'boolean' },
81
+ consent: { type: 'boolean' },
70
82
  headed: { type: 'boolean' },
71
83
  channel: { type: 'string' },
72
84
  'list-rules': { type: 'boolean' },
@@ -88,19 +100,34 @@ async function main(argv) {
88
100
  }
89
101
  return EXIT_OK;
90
102
  }
91
- const target = parseTarget(positionals);
103
+ const config = await loadConfig(values.config);
104
+ const target = parseTarget(positionals.length === 0 && config.url ? [config.url] : positionals);
92
105
  const reportFormat = oneOf(values.format, FORMATS, '--format');
93
106
  const failOn = oneOf(values['fail-on'], FAIL_LEVELS, '--fail-on');
94
107
  const rules = selectRules(values.disable);
108
+ if (values['fail-on-incomplete'] && values['allow-incomplete']) {
109
+ throw new Error('Use either --fail-on-incomplete or --allow-incomplete, not both.');
110
+ }
111
+ const failOnIncomplete = values['fail-on-incomplete'] === true ||
112
+ (values['allow-incomplete'] !== true && config.failOnIncomplete === true);
113
+ if (values.consent && values['skip-consent']) {
114
+ throw new Error('Use either --consent or --skip-consent, not both.');
115
+ }
95
116
  const result = await scan(target.href, {
96
117
  rules,
97
- maxPages: wholeNumber(values['max-pages'], '--max-pages', 1),
98
- settleMs: wholeNumber(values.settle, '--settle', 0),
99
- timeoutMs: wholeNumber(values.timeout, '--timeout', 1),
100
- locale: values.locale,
101
- lang: oneOf(values.lang, LANGS, '--lang'),
102
- region: oneOf(values.region, REGIONS, '--region'),
103
- consentCheck: values['skip-consent'] !== true,
118
+ ...(config.rules === undefined ? {} : { ruleSettings: config.rules }),
119
+ ...(config.allow === undefined ? {} : { allow: config.allow }),
120
+ maxPages: wholeNumber(values['max-pages'], '--max-pages', 1) ?? config.maxPages,
121
+ settleMs: wholeNumber(values.settle, '--settle', 0) ?? config.settleMs,
122
+ timeoutMs: wholeNumber(values.timeout, '--timeout', 1) ?? config.timeoutMs,
123
+ locale: values.locale ?? config.locale,
124
+ lang: oneOf(values.lang ?? config.lang ?? 'en', LANGS, '--lang'),
125
+ region: oneOf(values.region ?? config.region ?? 'de', REGIONS, '--region'),
126
+ consentCheck: values.consent === true
127
+ ? true
128
+ : values['skip-consent'] === true
129
+ ? false
130
+ : (config.consentCheck ?? true),
104
131
  headed: values.headed === true,
105
132
  channel: values.channel === undefined ? undefined : oneOf(values.channel, CHANNELS, '--channel'),
106
133
  onPage: (page) => process.stderr.write(page.error === undefined
@@ -122,7 +149,13 @@ async function main(argv) {
122
149
  process.stdout.write('\n');
123
150
  }
124
151
  }
125
- return shouldFail(result.findings, failOn) ? EXIT_FINDINGS : EXIT_OK;
152
+ if (shouldFail(result.findings, failOn))
153
+ return EXIT_FINDINGS;
154
+ if (failOnIncomplete && !assessCoverage(result).complete) {
155
+ process.stderr.write('privalint: required observation coverage is incomplete (exit 3).\n');
156
+ return EXIT_INCOMPLETE;
157
+ }
158
+ return EXIT_OK;
126
159
  }
127
160
  function parseTarget(positionals) {
128
161
  const [raw, ...rest] = positionals;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type Lang } from './i18n.js';
2
+ import { type Region } from './legal.js';
3
+ import type { RuleSettings } from './types.js';
4
+ export interface PrivalintConfig {
5
+ url?: string;
6
+ maxPages?: number;
7
+ settleMs?: number;
8
+ timeoutMs?: number;
9
+ locale?: string;
10
+ lang?: Lang;
11
+ region?: Region;
12
+ consentCheck?: boolean;
13
+ failOnIncomplete?: boolean;
14
+ rules?: RuleSettings;
15
+ allow?: {
16
+ vendors: string[];
17
+ };
18
+ }
19
+ /** JSON only; no execution of repository-supplied code. Reject typos instead of ignoring them. */
20
+ export declare function parseConfig(value: unknown): PrivalintConfig;
21
+ export declare function loadConfig(file?: string, cwd?: string): Promise<PrivalintConfig>;