@slashgear/gdpr-cookie-scanner 1.0.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 (85) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +11 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +44 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -0
  5. package/.github/PULL_REQUEST_TEMPLATE.md +24 -0
  6. package/.github/workflows/ci.yml +38 -0
  7. package/.github/workflows/release.yml +57 -0
  8. package/.idea/gdpr-report.iml +8 -0
  9. package/.idea/modules.xml +8 -0
  10. package/.idea/vcs.xml +6 -0
  11. package/CHANGELOG.md +7 -0
  12. package/CLAUDE.md +75 -0
  13. package/CODE_OF_CONDUCT.md +41 -0
  14. package/CONTRIBUTING.md +79 -0
  15. package/LICENSE +21 -0
  16. package/README.md +127 -0
  17. package/SECURITY.md +15 -0
  18. package/dist/analyzers/compliance.d.ts +13 -0
  19. package/dist/analyzers/compliance.d.ts.map +1 -0
  20. package/dist/analyzers/compliance.js +171 -0
  21. package/dist/analyzers/compliance.js.map +1 -0
  22. package/dist/analyzers/wording.d.ts +13 -0
  23. package/dist/analyzers/wording.d.ts.map +1 -0
  24. package/dist/analyzers/wording.js +91 -0
  25. package/dist/analyzers/wording.js.map +1 -0
  26. package/dist/classifiers/cookie-classifier.d.ts +8 -0
  27. package/dist/classifiers/cookie-classifier.d.ts.map +1 -0
  28. package/dist/classifiers/cookie-classifier.js +108 -0
  29. package/dist/classifiers/cookie-classifier.js.map +1 -0
  30. package/dist/classifiers/network-classifier.d.ts +9 -0
  31. package/dist/classifiers/network-classifier.d.ts.map +1 -0
  32. package/dist/classifiers/network-classifier.js +51 -0
  33. package/dist/classifiers/network-classifier.js.map +1 -0
  34. package/dist/classifiers/tracker-list.d.ts +16 -0
  35. package/dist/classifiers/tracker-list.d.ts.map +1 -0
  36. package/dist/classifiers/tracker-list.js +86 -0
  37. package/dist/classifiers/tracker-list.js.map +1 -0
  38. package/dist/cli.d.ts +3 -0
  39. package/dist/cli.d.ts.map +1 -0
  40. package/dist/cli.js +110 -0
  41. package/dist/cli.js.map +1 -0
  42. package/dist/report/generator.d.ts +19 -0
  43. package/dist/report/generator.d.ts.map +1 -0
  44. package/dist/report/generator.js +552 -0
  45. package/dist/report/generator.js.map +1 -0
  46. package/dist/scanner/browser.d.ts +11 -0
  47. package/dist/scanner/browser.d.ts.map +1 -0
  48. package/dist/scanner/browser.js +38 -0
  49. package/dist/scanner/browser.js.map +1 -0
  50. package/dist/scanner/consent-modal.d.ts +5 -0
  51. package/dist/scanner/consent-modal.d.ts.map +1 -0
  52. package/dist/scanner/consent-modal.js +244 -0
  53. package/dist/scanner/consent-modal.js.map +1 -0
  54. package/dist/scanner/cookies.d.ts +11 -0
  55. package/dist/scanner/cookies.d.ts.map +1 -0
  56. package/dist/scanner/cookies.js +30 -0
  57. package/dist/scanner/cookies.js.map +1 -0
  58. package/dist/scanner/index.d.ts +9 -0
  59. package/dist/scanner/index.d.ts.map +1 -0
  60. package/dist/scanner/index.js +146 -0
  61. package/dist/scanner/index.js.map +1 -0
  62. package/dist/scanner/network.d.ts +8 -0
  63. package/dist/scanner/network.d.ts.map +1 -0
  64. package/dist/scanner/network.js +41 -0
  65. package/dist/scanner/network.js.map +1 -0
  66. package/dist/types.d.ts +105 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +52 -0
  71. package/renovate.json +17 -0
  72. package/src/analyzers/compliance.ts +203 -0
  73. package/src/analyzers/wording.ts +112 -0
  74. package/src/classifiers/cookie-classifier.ts +125 -0
  75. package/src/classifiers/network-classifier.ts +65 -0
  76. package/src/classifiers/tracker-list.ts +105 -0
  77. package/src/cli.ts +134 -0
  78. package/src/report/generator.ts +703 -0
  79. package/src/scanner/browser.ts +52 -0
  80. package/src/scanner/consent-modal.ts +276 -0
  81. package/src/scanner/cookies.ts +43 -0
  82. package/src/scanner/index.ts +163 -0
  83. package/src/scanner/network.ts +51 -0
  84. package/src/types.ts +134 -0
  85. package/tsconfig.json +18 -0
package/src/types.ts ADDED
@@ -0,0 +1,134 @@
1
+ export type CookieCategory =
2
+ | "strictly-necessary"
3
+ | "analytics"
4
+ | "advertising"
5
+ | "social"
6
+ | "personalization"
7
+ | "unknown";
8
+
9
+ export type ConsentButtonType = "accept" | "reject" | "preferences" | "close" | "unknown";
10
+
11
+ export interface ScannedCookie {
12
+ name: string;
13
+ domain: string;
14
+ path: string;
15
+ value: string;
16
+ expires: number | null; // timestamp, null = session cookie
17
+ httpOnly: boolean;
18
+ secure: boolean;
19
+ sameSite: string | null;
20
+ category: CookieCategory;
21
+ requiresConsent: boolean;
22
+ capturedAt: "before-interaction" | "after-accept" | "after-reject";
23
+ }
24
+
25
+ export interface NetworkRequest {
26
+ url: string;
27
+ method: string;
28
+ resourceType: string;
29
+ initiator: string | null;
30
+ isThirdParty: boolean;
31
+ trackerCategory: TrackerCategory | null;
32
+ trackerName: string | null;
33
+ capturedAt: "before-interaction" | "after-accept" | "after-reject";
34
+ responseStatus: number | null;
35
+ contentType: string | null;
36
+ }
37
+
38
+ export type TrackerCategory =
39
+ | "analytics"
40
+ | "advertising"
41
+ | "social"
42
+ | "fingerprinting"
43
+ | "pixel"
44
+ | "cdn"
45
+ | "unknown";
46
+
47
+ export interface ConsentButton {
48
+ type: ConsentButtonType;
49
+ text: string;
50
+ selector: string;
51
+ isVisible: boolean;
52
+ boundingBox: { x: number; y: number; width: number; height: number } | null;
53
+ fontSize: number | null;
54
+ backgroundColor: string | null;
55
+ textColor: string | null;
56
+ contrastRatio: number | null;
57
+ clickDepth: number; // how many clicks needed to reach this button
58
+ }
59
+
60
+ export interface ConsentCheckbox {
61
+ name: string;
62
+ label: string;
63
+ isCheckedByDefault: boolean;
64
+ category: CookieCategory;
65
+ selector: string;
66
+ }
67
+
68
+ export interface ConsentModal {
69
+ detected: boolean;
70
+ selector: string | null;
71
+ text: string;
72
+ buttons: ConsentButton[];
73
+ checkboxes: ConsentCheckbox[];
74
+ hasGranularControls: boolean;
75
+ layerCount: number; // number of clicks to reach full options
76
+ screenshotPath: string | null;
77
+ }
78
+
79
+ export interface DarkPatternIssue {
80
+ type: DarkPatternType;
81
+ severity: "critical" | "warning" | "info";
82
+ description: string;
83
+ evidence: string;
84
+ }
85
+
86
+ export type DarkPatternType =
87
+ | "asymmetric-prominence" // Accept more visible than Reject
88
+ | "click-asymmetry" // More clicks needed to reject
89
+ | "pre-ticked" // Checkboxes pre-ticked
90
+ | "misleading-wording" // Ambiguous button labels
91
+ | "cookie-wall" // No access without consent
92
+ | "nudging" // Visual nudging toward accept
93
+ | "no-reject-button" // No clear reject option
94
+ | "buried-reject" // Reject buried in sub-menus
95
+ | "auto-consent" // Scroll/navigation as consent
96
+ | "missing-info"; // Missing required information
97
+
98
+ export interface ComplianceScore {
99
+ total: number; // 0-100
100
+ breakdown: {
101
+ consentValidity: number; // 0-25: freely given, specific, informed, unambiguous
102
+ easyRefusal: number; // 0-25: reject as easy as accept
103
+ transparency: number; // 0-25: clear info, partner names, purposes
104
+ cookieBehavior: number; // 0-25: no cookies before consent, cookies respected
105
+ };
106
+ issues: DarkPatternIssue[];
107
+ grade: "A" | "B" | "C" | "D" | "F";
108
+ }
109
+
110
+ export interface ScanOptions {
111
+ url: string;
112
+ outputDir: string;
113
+ timeout: number; // ms
114
+ screenshots: boolean;
115
+ locale: string;
116
+ verbose: boolean;
117
+ userAgent?: string;
118
+ }
119
+
120
+ export interface ScanResult {
121
+ url: string;
122
+ scanDate: string;
123
+ duration: number; // ms
124
+ modal: ConsentModal;
125
+ cookiesBeforeInteraction: ScannedCookie[];
126
+ cookiesAfterAccept: ScannedCookie[];
127
+ cookiesAfterReject: ScannedCookie[];
128
+ networkBeforeInteraction: NetworkRequest[];
129
+ networkAfterAccept: NetworkRequest[];
130
+ networkAfterReject: NetworkRequest[];
131
+ compliance: ComplianceScore;
132
+ screenshotPaths: string[];
133
+ errors: string[];
134
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "dist",
7
+ "rootDir": "src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "declaration": true,
12
+ "declarationMap": true,
13
+ "sourceMap": true,
14
+ "resolveJsonModule": true
15
+ },
16
+ "include": ["src/**/*"],
17
+ "exclude": ["node_modules", "dist"]
18
+ }