privalint 0.1.1 → 0.3.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 (78) hide show
  1. package/README.de.md +117 -0
  2. package/README.md +55 -1
  3. package/dist/assessment.d.ts +6 -0
  4. package/dist/assessment.js +79 -0
  5. package/dist/assessment.js.map +1 -0
  6. package/dist/capture.d.ts +5 -0
  7. package/dist/capture.js +155 -0
  8. package/dist/capture.js.map +1 -0
  9. package/dist/cli.js +12 -3
  10. package/dist/cli.js.map +1 -1
  11. package/dist/consent.d.ts +3 -0
  12. package/dist/consent.js +13 -6
  13. package/dist/consent.js.map +1 -1
  14. package/dist/diagnostics.d.ts +27 -0
  15. package/dist/diagnostics.js +187 -0
  16. package/dist/diagnostics.js.map +1 -0
  17. package/dist/i18n.d.ts +5 -0
  18. package/dist/i18n.js +3 -0
  19. package/dist/i18n.js.map +1 -0
  20. package/dist/index.d.ts +5 -0
  21. package/dist/index.js +5 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/legal.d.ts +10 -0
  24. package/dist/legal.js +99 -0
  25. package/dist/legal.js.map +1 -0
  26. package/dist/network.d.ts +67 -0
  27. package/dist/network.js +235 -0
  28. package/dist/network.js.map +1 -0
  29. package/dist/observations.d.ts +3 -0
  30. package/dist/observations.js +4 -0
  31. package/dist/observations.js.map +1 -0
  32. package/dist/reporters/capture.d.ts +5 -0
  33. package/dist/reporters/capture.js +35 -0
  34. package/dist/reporters/capture.js.map +1 -0
  35. package/dist/reporters/markdown.js +21 -12
  36. package/dist/reporters/markdown.js.map +1 -1
  37. package/dist/reporters/messages.d.ts +21 -0
  38. package/dist/reporters/messages.js +68 -0
  39. package/dist/reporters/messages.js.map +1 -0
  40. package/dist/reporters/sarif.js +31 -1
  41. package/dist/reporters/sarif.js.map +1 -1
  42. package/dist/reporters/shared.d.ts +1 -3
  43. package/dist/reporters/shared.js +0 -17
  44. package/dist/reporters/shared.js.map +1 -1
  45. package/dist/reporters/text.js +23 -15
  46. package/dist/reporters/text.js.map +1 -1
  47. package/dist/rules/google-fonts.js +28 -10
  48. package/dist/rules/google-fonts.js.map +1 -1
  49. package/dist/rules/impressum-link.js +21 -8
  50. package/dist/rules/impressum-link.js.map +1 -1
  51. package/dist/rules/links.d.ts +2 -0
  52. package/dist/rules/links.js +2 -0
  53. package/dist/rules/links.js.map +1 -1
  54. package/dist/rules/pre-consent-trackers.js +20 -7
  55. package/dist/rules/pre-consent-trackers.js.map +1 -1
  56. package/dist/rules/privacy-policy-link.js +12 -5
  57. package/dist/rules/privacy-policy-link.js.map +1 -1
  58. package/dist/rules/reject-option.js +28 -8
  59. package/dist/rules/reject-option.js.map +1 -1
  60. package/dist/rules/third-party-cdns.js +10 -3
  61. package/dist/rules/third-party-cdns.js.map +1 -1
  62. package/dist/rules/third-party-embeds.js +10 -3
  63. package/dist/rules/third-party-embeds.js.map +1 -1
  64. package/dist/rules/third-party-hits.js +2 -1
  65. package/dist/rules/third-party-hits.js.map +1 -1
  66. package/dist/rules/tracker-hits.d.ts +4 -2
  67. package/dist/rules/tracker-hits.js +16 -4
  68. package/dist/rules/tracker-hits.js.map +1 -1
  69. package/dist/rules/trackers-after-reject.js +24 -12
  70. package/dist/rules/trackers-after-reject.js.map +1 -1
  71. package/dist/scan-options.d.ts +39 -0
  72. package/dist/scan-options.js +2 -0
  73. package/dist/scan-options.js.map +1 -0
  74. package/dist/scanner.d.ts +4 -32
  75. package/dist/scanner.js +87 -104
  76. package/dist/scanner.js.map +1 -1
  77. package/dist/types.d.ts +70 -0
  78. package/package.json +11 -6
@@ -1 +1 @@
1
- {"version":3,"file":"consent.js","sourceRoot":"","sources":["../src/consent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"consent.js","sourceRoot":"","sources":["../src/consent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { BrowserContext, Request } from 'playwright';
2
+ import type { CapturePhase, LoadDiagnostic, LoadDiagnostics, LoadIssueKind, RecordedRequest } from './types.js';
3
+ /** Safe for diagnostics and operational logs. Raw URLs remain internal rule input. */
4
+ export declare function diagnosticUrl(raw: string): string;
5
+ /** Classify known transport codes; never persist arbitrary exception messages. */
6
+ export declare function classifyLoadError(error: unknown): LoadIssueKind;
7
+ export declare class Diagnostics {
8
+ private readonly maxIssues;
9
+ private readonly maxRecords;
10
+ readonly data: LoadDiagnostics;
11
+ phase: CapturePhase;
12
+ private readonly pending;
13
+ private readonly earlyFailures;
14
+ private stopped;
15
+ private readonly phaseIssues;
16
+ constructor(maxIssues: number, maxRecords?: number);
17
+ attach(context: BrowserContext, records: RecordedRequest[]): void;
18
+ private finish;
19
+ /** Defer storage until requestfailed to avoid counting adapter + browser errors twice. */
20
+ fail(request: Request, kind: LoadIssueKind, limit?: LoadDiagnostic['limit']): void;
21
+ failUrl(url: string, kind: LoadIssueKind, limit?: LoadDiagnostic['limit']): void;
22
+ add(kind: LoadIssueKind, url: string, extra?: Pick<LoadDiagnostic, 'status' | 'limit'>, phase?: CapturePhase): void;
23
+ private store;
24
+ hasIssues(phase: CapturePhase): boolean;
25
+ /** Freeze before closing the context: teardown errors are not resource failures. */
26
+ stop(): void;
27
+ }
@@ -0,0 +1,187 @@
1
+ /** Safe for diagnostics and operational logs. Raw URLs remain internal rule input. */
2
+ export function diagnosticUrl(raw) {
3
+ try {
4
+ const url = new URL(raw);
5
+ return /^https?:$/.test(url.protocol) ? `${url.origin}/[redacted]` : '[redacted]';
6
+ }
7
+ catch {
8
+ return '[redacted]';
9
+ }
10
+ }
11
+ /** Classify known transport codes; never persist arbitrary exception messages. */
12
+ export function classifyLoadError(error) {
13
+ const parts = [];
14
+ let cause = error;
15
+ for (let depth = 0; depth < 4 && cause instanceof Error; depth++) {
16
+ parts.push(cause.message, 'code' in cause ? String(cause.code) : '');
17
+ cause = cause.cause;
18
+ }
19
+ const text = parts.length > 0 ? parts.join(' ') : String(error);
20
+ if (/ERR_NAME_NOT_RESOLVED|ENOTFOUND|EAI_AGAIN/i.test(text))
21
+ return 'dns';
22
+ if (/ERR_CERT|ERR_SSL|CERT_|TLS|SELF_SIGNED|UNABLE_TO_VERIFY_LEAF/i.test(text))
23
+ return 'tls';
24
+ if (/timeout|timed.?out|ETIMEDOUT/i.test(text))
25
+ return 'timeout';
26
+ if (/ERR_CONNECTION|ECONN|ENETUNREACH|EHOSTUNREACH|socket hang up/i.test(text)) {
27
+ return 'connection';
28
+ }
29
+ return 'browser-failure';
30
+ }
31
+ export class Diagnostics {
32
+ maxIssues;
33
+ maxRecords;
34
+ data = {
35
+ requests: 0,
36
+ omittedRequests: 0,
37
+ responses: 0,
38
+ finished: 0,
39
+ failed: 0,
40
+ blocked: 0,
41
+ httpErrors: 0,
42
+ bytes: 0,
43
+ issueCount: 0,
44
+ dropped: 0,
45
+ issues: [],
46
+ };
47
+ phase = 'before-consent';
48
+ pending = new Map();
49
+ earlyFailures = new Map();
50
+ stopped = false;
51
+ phaseIssues = { 'before-consent': 0, 'after-reject': 0 };
52
+ constructor(maxIssues, maxRecords = 5_000) {
53
+ this.maxIssues = maxIssues;
54
+ this.maxRecords = maxRecords;
55
+ }
56
+ attach(context, records) {
57
+ context.on('request', (request) => {
58
+ if (this.stopped)
59
+ return;
60
+ const record = {
61
+ url: request.url(),
62
+ resourceType: request.resourceType(),
63
+ outcome: 'pending',
64
+ };
65
+ if (records.length < this.maxRecords)
66
+ records.push(record);
67
+ else {
68
+ this.data.omittedRequests++;
69
+ if (this.data.omittedRequests === 1)
70
+ this.add('resource-limit', request.url(), { limit: 'requests' });
71
+ }
72
+ const early = this.earlyFailures.get(request.url());
73
+ const issue = early?.shift();
74
+ if (early?.length === 0)
75
+ this.earlyFailures.delete(request.url());
76
+ this.pending.set(request, { record, phase: this.phase, ...(issue ? { issue } : {}) });
77
+ this.data.requests++;
78
+ });
79
+ context.on('response', (response) => {
80
+ if (this.stopped)
81
+ return;
82
+ const entry = this.pending.get(response.request());
83
+ if (entry === undefined)
84
+ return;
85
+ entry.record.outcome = 'response';
86
+ entry.record.status = response.status();
87
+ this.data.responses++;
88
+ if (response.status() >= 400) {
89
+ this.data.httpErrors++;
90
+ this.add('http-error', response.url(), { status: response.status() }, entry.phase);
91
+ }
92
+ });
93
+ context.on('requestfinished', (request) => this.finish(request));
94
+ context.on('requestfailed', (request) => {
95
+ const entry = this.pending.get(request);
96
+ if (entry === undefined || this.stopped)
97
+ return;
98
+ entry.record.outcome = 'failed';
99
+ const issue = entry.issue ?? {
100
+ kind: classifyLoadError(request.failure()?.errorText),
101
+ url: diagnosticUrl(request.url()),
102
+ phase: entry.phase,
103
+ };
104
+ if (issue.kind === 'security-blocked')
105
+ this.data.blocked++;
106
+ this.store(issue);
107
+ this.data.failed++;
108
+ this.pending.delete(request);
109
+ });
110
+ }
111
+ finish(request) {
112
+ if (this.stopped || !this.pending.delete(request))
113
+ return;
114
+ this.data.finished++;
115
+ }
116
+ /** Defer storage until requestfailed to avoid counting adapter + browser errors twice. */
117
+ fail(request, kind, limit) {
118
+ const entry = this.pending.get(request);
119
+ if (entry === undefined)
120
+ return;
121
+ entry.issue = {
122
+ kind,
123
+ phase: entry.phase,
124
+ url: diagnosticUrl(request.url()),
125
+ ...(limit === undefined ? {} : { limit }),
126
+ };
127
+ }
128
+ failUrl(url, kind, limit) {
129
+ if (this.stopped)
130
+ return;
131
+ for (const [request, entry] of this.pending) {
132
+ if (request.url() === url && entry.issue === undefined) {
133
+ this.fail(request, kind, limit);
134
+ return;
135
+ }
136
+ }
137
+ // CDP can pause a request before Playwright emits it. Associate the reason on arrival.
138
+ const early = this.earlyFailures.get(url) ?? [];
139
+ early.push({
140
+ kind,
141
+ url: diagnosticUrl(url),
142
+ phase: this.phase,
143
+ ...(limit === undefined ? {} : { limit }),
144
+ });
145
+ this.earlyFailures.set(url, early);
146
+ }
147
+ add(kind, url, extra = {}, phase = this.phase) {
148
+ if (!this.stopped)
149
+ this.store({ kind, phase, url: diagnosticUrl(url), ...extra });
150
+ }
151
+ store(issue) {
152
+ this.phaseIssues[issue.phase]++;
153
+ this.data.issueCount++;
154
+ if (this.data.issues.length < this.maxIssues)
155
+ this.data.issues.push(issue);
156
+ else
157
+ this.data.dropped++;
158
+ }
159
+ hasIssues(phase) {
160
+ return this.phaseIssues[phase] > 0;
161
+ }
162
+ /** Freeze before closing the context: teardown errors are not resource failures. */
163
+ stop() {
164
+ if (this.stopped)
165
+ return;
166
+ for (const [request, entry] of this.pending) {
167
+ entry.record.outcome = 'failed';
168
+ const issue = entry.issue ?? {
169
+ kind: 'timeout',
170
+ phase: entry.phase,
171
+ url: diagnosticUrl(request.url()),
172
+ };
173
+ if (issue.kind === 'security-blocked')
174
+ this.data.blocked++;
175
+ this.store(issue);
176
+ this.data.failed++;
177
+ }
178
+ this.pending.clear();
179
+ for (const issues of this.earlyFailures.values()) {
180
+ for (const issue of issues)
181
+ this.store(issue);
182
+ }
183
+ this.earlyFailures.clear();
184
+ this.stopped = true;
185
+ }
186
+ }
187
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare const LANGS: readonly ['en', 'de'];
2
+ export type Lang = (typeof LANGS)[number];
3
+ /** One string per language. Adding a language makes every missing translation a type error. */
4
+ export type Text = Record<Lang, string>;
5
+ export declare const say: (lang: Lang, text: Text) => string;
package/dist/i18n.js ADDED
@@ -0,0 +1,3 @@
1
+ export const LANGS = ['en', 'de'];
2
+ export const say = (lang, text) => text[lang];
3
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,CAAU,CAAC;AAM3C,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAU,EAAE,IAAU,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,9 @@
1
+ export { type ConsentCheckOptions, observeConsent } from './consent.js';
1
2
  export { type Tracker, type TrackerCategory, trackers } from './data/trackers.js';
3
+ export { diagnosticUrl } from './diagnostics.js';
4
+ export { LANGS, type Lang, type Text } from './i18n.js';
5
+ export { legalReferences, REGIONS, type Region } from './legal.js';
6
+ export { type NetworkAdapter, NetworkError, type NetworkLimits, type NetworkRequest, type NetworkResponse, } from './network.js';
2
7
  export { defaultRules, googleFonts, impressumLink, preConsentTrackers, privacyPolicyLink, rejectOption, thirdPartyCdns, thirdPartyEmbeds, trackersAfterReject, } from './rules/index.js';
3
8
  export { type ScanOptions, scan } from './scanner.js';
4
9
  export type * from './types.js';
package/dist/index.js CHANGED
@@ -1,4 +1,9 @@
1
+ export { observeConsent } from './consent.js';
1
2
  export { trackers } from './data/trackers.js';
3
+ export { diagnosticUrl } from './diagnostics.js';
4
+ export { LANGS } from './i18n.js';
5
+ export { legalReferences, REGIONS } from './legal.js';
6
+ export { NetworkError, } from './network.js';
2
7
  export { defaultRules, googleFonts, impressumLink, preConsentTrackers, privacyPolicyLink, rejectOption, thirdPartyCdns, thirdPartyEmbeds, trackersAfterReject, } from './rules/index.js';
3
8
  export { scan } from './scanner.js';
4
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAoB,IAAI,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAsC,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAwB,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AACnE,OAAO,EAEL,YAAY,GAIb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAoB,IAAI,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Finding } from './types.js';
2
+ export declare const REGIONS: readonly ['de', 'at', 'ch', 'eu'];
3
+ export type Region = (typeof REGIONS)[number];
4
+ export declare const legalReferences: (ruleId: string, region: Region) => string[] | undefined;
5
+ /**
6
+ * Attaches the legal basis of the chosen country to each finding and adjusts
7
+ * its severity where that country's law is softer or stricter. Findings of
8
+ * custom rules without an entry above are left as they are.
9
+ */
10
+ export declare function applyRegion(findings: readonly Finding[], region: Region): Finding[];
package/dist/legal.js ADDED
@@ -0,0 +1,99 @@
1
+ export const REGIONS = ['de', 'at', 'ch', 'eu'];
2
+ /**
3
+ * Legal basis per rule and country, cited the way lawyers in that country
4
+ * would cite it. `eu` is for sites outside Germany, Austria and Switzerland
5
+ * and refers to the EU instruments directly.
6
+ */
7
+ const LEGAL = {
8
+ 'pre-consent-trackers': {
9
+ de: ['§ 25 Abs. 1 TDDDG', 'Art. 6 Abs. 1 lit. a DSGVO', 'EuGH C-673/17 (Planet49)'],
10
+ at: ['§ 165 Abs. 3 TKG 2021', 'Art. 6 Abs. 1 lit. a DSGVO', 'EuGH C-673/17 (Planet49)'],
11
+ ch: ['Art. 45c FMG', 'Art. 6 DSG'],
12
+ eu: ['Art. 5(3) ePrivacy Directive', 'Art. 6(1)(a) GDPR', 'CJEU C-673/17 (Planet49)'],
13
+ },
14
+ 'trackers-after-reject': {
15
+ de: ['§ 25 Abs. 1 TDDDG', 'Art. 7 Abs. 3 DSGVO'],
16
+ at: ['§ 165 Abs. 3 TKG 2021', 'Art. 7 Abs. 3 DSGVO'],
17
+ ch: ['Art. 45c FMG', 'Art. 30 Abs. 2 lit. b DSG'],
18
+ eu: ['Art. 5(3) ePrivacy Directive', 'Art. 7(3) GDPR'],
19
+ },
20
+ 'reject-option': {
21
+ de: [
22
+ '§ 25 Abs. 1 TDDDG',
23
+ 'Art. 4 Nr. 11 DSGVO',
24
+ 'EDSA Cookie-Banner-Taskforce, 17.01.2023',
25
+ 'DSK-Beschluss, 22.03.2023 (Pur-Abo-Modelle)',
26
+ ],
27
+ at: [
28
+ '§ 165 Abs. 3 TKG 2021',
29
+ 'Art. 4 Nr. 11 DSGVO',
30
+ 'EDSA Cookie-Banner-Taskforce, 17.01.2023',
31
+ ],
32
+ ch: ['Art. 45c FMG', 'EDÖB, Leitfaden zu Cookies (2025)'],
33
+ eu: ['Art. 4(11) GDPR', 'Art. 7(3) GDPR', 'EDPB Cookie Banner Taskforce report, 17.01.2023'],
34
+ },
35
+ 'google-fonts': {
36
+ de: ['Art. 6 Abs. 1 DSGVO', 'LG München I, 20.01.2022, Az. 3 O 17493/20'],
37
+ at: ['Art. 6 Abs. 1 DSGVO'],
38
+ ch: ['Art. 6 DSG'],
39
+ eu: ['Art. 6(1) GDPR'],
40
+ },
41
+ 'third-party-embeds': {
42
+ de: ['Art. 6 Abs. 1 DSGVO', '§ 25 Abs. 1 TDDDG'],
43
+ at: ['Art. 6 Abs. 1 DSGVO', '§ 165 Abs. 3 TKG 2021'],
44
+ ch: ['Art. 6 DSG', 'Art. 45c FMG'],
45
+ eu: ['Art. 6(1) GDPR', 'Art. 5(3) ePrivacy Directive'],
46
+ },
47
+ 'third-party-cdns': {
48
+ de: ['Art. 6 Abs. 1 DSGVO'],
49
+ at: ['Art. 6 Abs. 1 DSGVO'],
50
+ ch: ['Art. 6 DSG'],
51
+ eu: ['Art. 6(1) GDPR'],
52
+ },
53
+ 'impressum-link': {
54
+ de: ['§ 5 DDG', 'BGH, 20.07.2006, Az. I ZR 228/03'],
55
+ at: ['§ 5 ECG', '§ 25 MedienG'],
56
+ ch: ['Art. 3 Abs. 1 lit. s UWG'],
57
+ eu: ['Art. 5 Directive 2000/31/EC (e-commerce)'],
58
+ },
59
+ 'privacy-policy-link': {
60
+ de: ['Art. 12 DSGVO', 'Art. 13 DSGVO'],
61
+ at: ['Art. 12 DSGVO', 'Art. 13 DSGVO'],
62
+ ch: ['Art. 19 DSG'],
63
+ eu: ['Art. 12 GDPR', 'Art. 13 GDPR'],
64
+ },
65
+ };
66
+ export const legalReferences = (ruleId, region) => LEGAL[ruleId]?.[region];
67
+ /**
68
+ * Attaches the legal basis of the chosen country to each finding and adjusts
69
+ * its severity where that country's law is softer or stricter. Findings of
70
+ * custom rules without an entry above are left as they are.
71
+ */
72
+ export function applyRegion(findings, region) {
73
+ return findings.map((finding) => {
74
+ const references = legalReferences(finding.ruleId, region);
75
+ return {
76
+ ...finding,
77
+ severity: severityFor(finding, region),
78
+ ...(references === undefined ? {} : { references }),
79
+ };
80
+ });
81
+ }
82
+ /**
83
+ * Switzerland uses an opt-out model for cookies and tracking (Art. 45c FMG) and
84
+ * requires an imprint only for offers in electronic commerce, so those findings
85
+ * drop one level there. Ignoring an explicit refusal stays as serious as anywhere.
86
+ */
87
+ const SOFTER_IN_SWITZERLAND = new Set([
88
+ 'pre-consent-trackers',
89
+ 'third-party-embeds',
90
+ 'impressum-link',
91
+ ]);
92
+ function severityFor(finding, region) {
93
+ if (region === 'ch' && SOFTER_IN_SWITZERLAND.has(finding.ruleId)) {
94
+ return lower(finding.severity);
95
+ }
96
+ return finding.severity;
97
+ }
98
+ const lower = (severity) => (severity === 'error' ? 'warning' : 'info');
99
+ //# sourceMappingURL=legal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legal.js","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { BrowserContext, Page } from 'playwright';
2
+ import { type Diagnostics } from './diagnostics.js';
3
+ import type { LoadDiagnostic, LoadIssueKind } from './types.js';
4
+ export interface NetworkRequest {
5
+ url: string;
6
+ method: string;
7
+ headers: Record<string, string>;
8
+ body: Uint8Array | null;
9
+ resourceType: string;
10
+ /** Covers execution and body consumption. The adapter must honour cancellation. */
11
+ signal: AbortSignal;
12
+ }
13
+ export interface NetworkResponse {
14
+ status: number;
15
+ headers?: Record<string, string | string[]>;
16
+ /** Stream bodies to enforce byte limits before buffering the entire response. */
17
+ body?: string | Uint8Array | AsyncIterable<Uint8Array>;
18
+ }
19
+ /** Fetch exactly ONE HTTP hop, never follow redirects. Caller owns shared transport clients. */
20
+ export type NetworkAdapter = (request: NetworkRequest) => Promise<NetworkResponse>;
21
+ export interface NetworkLimits {
22
+ concurrency?: number;
23
+ maxRequests?: number;
24
+ maxResponseBytes?: number;
25
+ maxTotalBytes?: number;
26
+ maxRedirects?: number;
27
+ /** Starts on dequeue; queue wait is bounded separately by captureTimeoutMs. */
28
+ requestTimeoutMs?: number;
29
+ }
30
+ export declare const NETWORK_DEFAULTS: {
31
+ concurrency: number;
32
+ maxRequests: number;
33
+ maxResponseBytes: number;
34
+ maxTotalBytes: number;
35
+ maxRedirects: number;
36
+ requestTimeoutMs: number;
37
+ };
38
+ export declare class NetworkError extends Error {
39
+ readonly kind: Exclude<LoadIssueKind, 'http-error'>;
40
+ readonly limit?: LoadDiagnostic['limit'];
41
+ constructor(kind: Exclude<LoadIssueKind, 'http-error'>, limit?: LoadDiagnostic['limit']);
42
+ }
43
+ export declare function networkLimits(options?: NetworkLimits): Required<NetworkLimits>;
44
+ /** Chromium Fetch interception includes redirect hops that Playwright route() auto-continues. */
45
+ export declare class ControlledNetwork {
46
+ private readonly adapter;
47
+ private readonly limits;
48
+ private readonly diagnostics;
49
+ private readonly signal;
50
+ private readonly queue;
51
+ private readonly tasks;
52
+ private readonly sessions;
53
+ private active;
54
+ private admitted;
55
+ private closed;
56
+ constructor(adapter: NetworkAdapter, limits: Required<NetworkLimits>, diagnostics: Diagnostics, signal: AbortSignal);
57
+ attach(context: BrowserContext): Promise<void>;
58
+ attachPage(page: Page): Promise<void>;
59
+ private intercept;
60
+ private pump;
61
+ private handle;
62
+ private readBody;
63
+ private abort;
64
+ close(): Promise<void>;
65
+ }
66
+ /** Abort without retaining caller reasons or leaving listeners attached. */
67
+ export declare function withSignal<T>(operation: Promise<T>, signal: AbortSignal): Promise<T>;