@solvenza/cookies-compliance 1.2.1 → 1.5.3
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.
- package/README.md +960 -36
- package/bin/audit-cli.js +134 -13
- package/dist/audit.cjs +811 -0
- package/dist/audit.cjs.map +1 -0
- package/dist/audit.d.cts +60 -0
- package/dist/audit.d.ts +60 -0
- package/dist/audit.js +380 -0
- package/dist/audit.js.map +1 -0
- package/dist/chunk-C5QPXHTH.js +3557 -0
- package/dist/chunk-C5QPXHTH.js.map +1 -0
- package/dist/chunk-OHOHIAK6.js +442 -0
- package/dist/chunk-OHOHIAK6.js.map +1 -0
- package/dist/chunk-Q3FZFXQE.js +89 -0
- package/dist/chunk-UQU54ANZ.js +225 -0
- package/dist/chunk-UQU54ANZ.js.map +1 -0
- package/dist/chunk-W5MG56VI.js +269 -0
- package/dist/chunk-W5MG56VI.js.map +1 -0
- package/dist/consent.esm.cjs +2195 -84
- package/dist/consent.esm.cjs.map +1 -1
- package/dist/consent.esm.d.cts +173 -6
- package/dist/consent.esm.d.ts +173 -6
- package/dist/consent.esm.js +57 -23
- package/dist/consent.esm.js.map +1 -1
- package/dist/consent.min.js +437 -55
- package/dist/consent.min.js.map +1 -1
- package/dist/presets.cjs +495 -0
- package/dist/presets.cjs.map +1 -0
- package/dist/presets.d.cts +51 -0
- package/dist/presets.d.ts +51 -0
- package/dist/presets.js +16 -0
- package/dist/presets.js.map +1 -0
- package/dist/types--kyI7OOR.d.cts +314 -0
- package/dist/types--kyI7OOR.d.ts +314 -0
- package/dist/wrappers/angular.cjs +2341 -65
- package/dist/wrappers/angular.cjs.map +1 -1
- package/dist/wrappers/angular.d.cts +85 -5
- package/dist/wrappers/angular.d.ts +85 -5
- package/dist/wrappers/angular.js +217 -3
- package/dist/wrappers/angular.js.map +1 -1
- package/dist/wrappers/next.cjs +2353 -103
- package/dist/wrappers/next.cjs.map +1 -1
- package/dist/wrappers/next.d.cts +25 -1
- package/dist/wrappers/next.d.ts +25 -1
- package/dist/wrappers/next.js +30 -5
- package/dist/wrappers/next.js.map +1 -1
- package/dist/wrappers/nuxt.cjs +4171 -0
- package/dist/wrappers/nuxt.cjs.map +1 -0
- package/dist/wrappers/nuxt.d.cts +33 -0
- package/dist/wrappers/nuxt.d.ts +33 -0
- package/dist/wrappers/nuxt.js +51 -0
- package/dist/wrappers/nuxt.js.map +1 -0
- package/dist/wrappers/react.cjs +2336 -141
- package/dist/wrappers/react.cjs.map +1 -1
- package/dist/wrappers/react.d.cts +87 -1
- package/dist/wrappers/react.d.ts +87 -1
- package/dist/wrappers/react.js +21 -51
- package/dist/wrappers/react.js.map +1 -1
- package/dist/wrappers/vue.cjs +4163 -0
- package/dist/wrappers/vue.cjs.map +1 -0
- package/dist/wrappers/vue.d.cts +144 -0
- package/dist/wrappers/vue.d.ts +144 -0
- package/dist/wrappers/vue.js +28 -0
- package/dist/wrappers/vue.js.map +1 -0
- package/dist/wrappers/wordpress.js +1 -1
- package/package.json +26 -5
- package/schema.json +143 -4
- package/dist/chunk-DDAAVRWG.js +0 -25
- package/dist/chunk-FBRP4MSA.js +0 -1907
- package/dist/chunk-FBRP4MSA.js.map +0 -1
- package/dist/consent-engine-DOMyEKfk.d.cts +0 -193
- package/dist/consent-engine-DOMyEKfk.d.ts +0 -193
- /package/dist/{chunk-DDAAVRWG.js.map → chunk-Q3FZFXQE.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/audit/auditor.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ConsentConfig } from \"../core/types.js\";\nimport { resolveConfigPresets } from \"../presets/index.js\";\nimport type { AuditFinding, AuditOptions, AuditReport } from \"./types.js\";\n\n/**\n * Common third-party tracking script domains that require explicit prior consent under LSSI art. 22.2.\n */\nconst KNOWN_TRACKER_PATTERNS = [\n { domain: \"googletagmanager.com/gtm.js\", name: \"Google Tag Manager\", category: \"necessary_or_analytics\" },\n { domain: \"googletagmanager.com/gtag\", name: \"Google Analytics / Ads Gtag\", category: \"analytics\" },\n { domain: \"google-analytics.com/analytics.js\", name: \"Google Universal Analytics\", category: \"analytics\" },\n { domain: \"connect.facebook.net\", name: \"Meta / Facebook Pixel\", category: \"marketing\" },\n { domain: \"static.hotjar.com\", name: \"Hotjar Heatmaps & Feedback\", category: \"analytics\" },\n { domain: \"clarity.ms/tag\", name: \"Microsoft Clarity\", category: \"analytics\" },\n { domain: \"analytics.tiktok.com\", name: \"TikTok Pixel\", category: \"marketing\" },\n { domain: \"snap.licdn.com/insight\", name: \"LinkedIn Insight Tag\", category: \"marketing\" },\n { domain: \"cdn.segment.com/analytics\", name: \"Segment Analytics\", category: \"analytics\" },\n { domain: \"app.posthog.com/static\", name: \"PostHog Analytics\", category: \"analytics\" },\n { domain: \"mc.yandex.ru/metrika\", name: \"Yandex Metrika\", category: \"analytics\" },\n];\n\nexport class LssiAuditor {\n /**\n * Run complete compliance audit on configuration, source code, and/or live URL.\n */\n static async audit(options: AuditOptions): Promise<AuditReport> {\n const findings: AuditFinding[] = [];\n let scannedFilesCount = 0;\n\n // 1. Audit Configuration\n let resolvedConfig: ConsentConfig | null = null;\n if (options.config) {\n if (typeof options.config === \"string\") {\n try {\n const raw = fs.readFileSync(path.resolve(options.config), \"utf8\");\n resolvedConfig = resolveConfigPresets(JSON.parse(raw));\n } catch (err: any) {\n findings.push({\n id: \"CONFIG_FILE_ERROR\",\n rule: \"LSSI-CONFIG-001\",\n severity: \"CRITICAL\",\n category: \"CONFIG\",\n message: `No se pudo leer el archivo de configuración: ${err.message}`,\n remediation: \"Verifica que la ruta al archivo consent.json sea válida y contenga JSON bien formado.\",\n });\n }\n } else {\n resolvedConfig = resolveConfigPresets(options.config);\n }\n } else if (options.configPath) {\n try {\n const raw = fs.readFileSync(path.resolve(options.configPath), \"utf8\");\n resolvedConfig = resolveConfigPresets(JSON.parse(raw));\n } catch (err: any) {\n findings.push({\n id: \"CONFIG_FILE_ERROR\",\n rule: \"LSSI-CONFIG-001\",\n severity: \"CRITICAL\",\n category: \"CONFIG\",\n message: `No se pudo leer el archivo de configuración en '${options.configPath}': ${err.message}`,\n remediation: \"Especifica una ruta válida con --config <ruta>.\",\n });\n }\n }\n\n if (resolvedConfig) {\n this.auditConfig(resolvedConfig, findings);\n }\n\n // 2. Audit Source Code Directory\n if (options.srcDir && fs.existsSync(path.resolve(options.srcDir))) {\n scannedFilesCount = this.auditSourceDirectory(path.resolve(options.srcDir), findings);\n }\n\n // 3. Audit Live URL if provided\n if (options.url) {\n await this.auditLiveUrl(options.url, findings);\n }\n\n // Calculate score and summary\n const criticalCount = findings.filter((f) => f.severity === \"CRITICAL\").length;\n const warningCount = findings.filter((f) => f.severity === \"WARNING\").length;\n const infoCount = findings.filter((f) => f.severity === \"INFO\").length;\n\n const penalty = criticalCount * 25 + warningCount * 10 + infoCount * 2;\n const score = Math.max(0, 100 - penalty);\n const compliant = criticalCount === 0;\n\n return {\n timestamp: new Date().toISOString(),\n compliant,\n score,\n summary: {\n critical: criticalCount,\n warnings: warningCount,\n info: infoCount,\n totalPassed: Math.max(0, 10 - criticalCount - warningCount),\n },\n findings,\n scannedFilesCount,\n };\n }\n\n /**\n * Validate consent configuration against LSSI art. 22.2 and AEPD guidelines.\n */\n static auditConfig(config: ConsentConfig, findings: AuditFinding[]): void {\n if (!config.categories || typeof config.categories !== \"object\") {\n findings.push({\n id: \"CONFIG_NO_CATEGORIES\",\n rule: \"AEPD-CATEGORIES-001\",\n severity: \"CRITICAL\",\n category: \"CONFIG\",\n message: \"No se encontraron categorías de consentimiento definidas.\",\n remediation: \"Declara al menos la categoría 'necessary' y las categorías opcionales ('analytics', 'marketing').\",\n });\n return;\n }\n\n // Necessary category check\n const nec = config.categories[\"necessary\"];\n if (!nec) {\n findings.push({\n id: \"CONFIG_MISSING_NECESSARY\",\n rule: \"LSSI-NECESSARY-001\",\n severity: \"CRITICAL\",\n category: \"CONFIG\",\n message: \"Falta la categoría obligatoria 'necessary' (cookies técnicas y de seguridad).\",\n remediation: \"Añade 'necessary: { required: true, label: \\\"Necesarias\\\", description: \\\"...\\\" }'.\",\n });\n } else if (nec.required !== true) {\n findings.push({\n id: \"CONFIG_NECESSARY_NOT_REQUIRED\",\n rule: \"LSSI-NECESSARY-002\",\n severity: \"CRITICAL\",\n category: \"CONFIG\",\n message: \"La categoría 'necessary' debe tener siempre 'required: true'.\",\n remediation: \"Establece required: true en la categoría necessary.\",\n });\n }\n\n // AEPD Legal Guardrail: NO pre-checked optional boxes allowed\n for (const [catId, cat] of Object.entries(config.categories)) {\n if (catId !== \"necessary\" && !cat.required) {\n if (cat.default === true) {\n findings.push({\n id: \"CONFIG_PRECHECKED_OPTIONAL\",\n rule: \"AEPD-PRECHECK-001\",\n severity: \"CRITICAL\",\n category: \"LEGAL\",\n message: `Violación AEPD: La categoría opcional '${catId}' tiene default: true (casilla pre-marcada).`,\n details: \"Las directrices de la AEPD y el RGPD prohíben taxativamente las casillas preactivadas por defecto.\",\n remediation: \"Establece default: false en todas las categorías opcionales.\",\n });\n }\n }\n }\n\n // Policy links check\n const hasPrivacy = !!(config.policy?.privacyUrl || (config.translations && Object.values(config.translations).some((t) => t.policy?.privacyUrl)));\n const hasCookies = !!(config.policy?.cookiesUrl || (config.translations && Object.values(config.translations).some((t) => t.policy?.cookiesUrl)));\n\n if (!hasPrivacy) {\n findings.push({\n id: \"CONFIG_MISSING_PRIVACY_URL\",\n rule: \"RGPD-POLICY-001\",\n severity: \"WARNING\",\n category: \"LEGAL\",\n message: \"No se ha configurado un enlace a la Política de Privacidad ('policy.privacyUrl').\",\n remediation: \"Añade policy.privacyUrl: '/politica-privacidad' en consent.json.\",\n });\n }\n\n if (!hasCookies) {\n findings.push({\n id: \"CONFIG_MISSING_COOKIES_URL\",\n rule: \"LSSI-POLICY-001\",\n severity: \"WARNING\",\n category: \"LEGAL\",\n message: \"No se ha configurado un enlace a la Política de Cookies ('policy.cookiesUrl').\",\n remediation: \"Añade policy.cookiesUrl: '/politica-cookies' en consent.json.\",\n });\n }\n\n // Floating badge revocation check\n const badge = config.ui?.floatingBadge;\n if (badge === false) {\n findings.push({\n id: \"CONFIG_FLOATING_BADGE_DISABLED\",\n rule: \"AEPD-REVOCATION-001\",\n severity: \"WARNING\",\n category: \"LEGAL\",\n message: \"El botón flotante de revocación ('ui.floatingBadge') está desactivado.\",\n details: \"La AEPD exige que retirar el consentimiento sea tan fácil como otorgarlo.\",\n remediation: \"Mantén el floatingBadge activado o asegúrate de incluir un botón persistente [data-consent-open] en el footer.\",\n });\n }\n }\n\n /**\n * Scan source code directory for unblocked third-party scripts.\n */\n static auditSourceDirectory(dirPath: string, findings: AuditFinding[]): number {\n let count = 0;\n const files = this.walkDir(dirPath);\n\n const validExtensions = new Set([\".html\", \".htm\", \".jsx\", \".tsx\", \".vue\", \".php\", \".js\", \".ts\", \".mjs\"]);\n\n for (const filePath of files) {\n const ext = path.extname(filePath).toLowerCase();\n if (!validExtensions.has(ext)) continue;\n if (\n filePath.includes(\"node_modules\") ||\n filePath.includes(\"dist\") ||\n filePath.includes(\".git\") ||\n filePath.includes(\"/audit/\") ||\n filePath.includes(\"\\\\audit\\\\\") ||\n filePath.includes(\"/presets/\") ||\n filePath.includes(\"\\\\presets\\\\\") ||\n filePath.includes(\"tests/\") ||\n filePath.includes(\"tests\\\\\")\n ) {\n continue;\n }\n\n count++;\n try {\n const content = fs.readFileSync(filePath, \"utf8\");\n\n // 1. Scan for <script ...> tags (including multiline tags)\n const scriptTagRegex = /<\\s*script\\b([^>]*)>/gi;\n let match: RegExpExecArray | null;\n\n while ((match = scriptTagRegex.exec(content)) !== null) {\n const tagAttributes = match[1];\n const fullTag = match[0];\n const offset = match.index;\n const lineNumber = content.substring(0, offset).split(\"\\n\").length;\n\n for (const tracker of KNOWN_TRACKER_PATTERNS) {\n if (tagAttributes.includes(tracker.domain) || fullTag.includes(tracker.domain)) {\n const isBlocked =\n tagAttributes.includes('type=\"text/plain\"') ||\n tagAttributes.includes(\"type='text/plain'\") ||\n tagAttributes.includes(\"data-consent\") ||\n tagAttributes.includes(\"data-src\");\n\n if (!isBlocked) {\n findings.push({\n id: \"SRC_UNBLOCKED_TRACKER\",\n rule: \"LSSI-SCRIPT-ISOLATION-001\",\n severity: \"CRITICAL\",\n category: \"SOURCE_CODE\",\n message: `Script de seguimiento no bloqueado detectado (${tracker.name}): '${tracker.domain}'`,\n file: path.relative(process.cwd(), filePath),\n line: lineNumber,\n details: fullTag.replace(/\\s+/g, \" \").trim(),\n remediation: `Modifica el script para usar type=\"text/plain\" data-src=\"...\" data-consent=\"${tracker.category}\" o envuélvelo en un <ConsentGate>.`,\n });\n }\n }\n }\n }\n\n // 2. Scan for raw script imports or trackers in JS/TS/JSX/TSX/Vue files (excluding blocked script blocks)\n // Remove all <script type=\"text/plain\" ...>...</script> blocks from raw inspection\n const sanitizedContent = content.replace(/<\\s*script\\b[^>]*type=[\"']text\\/plain[\"'][^>]*>[\\s\\S]*?<\\s*\\/\\s*script\\s*>/gi, \"\");\n const lines = sanitizedContent.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i];\n const line = rawLine.trim();\n\n // Skip comments, metadata, or already handled script tags\n if (\n line.startsWith(\"//\") ||\n line.startsWith(\"*\") ||\n line.startsWith(\"/*\") ||\n line.includes(\"lssi-ignore\") ||\n line.includes(\"<script\") ||\n line.includes(\"data-src\") ||\n line.includes(\"type=\\\"text/plain\\\"\") ||\n line.includes(\"type='text/plain'\")\n ) {\n continue;\n }\n\n for (const tracker of KNOWN_TRACKER_PATTERNS) {\n if (line.includes(tracker.domain)) {\n const isBlocked =\n line.includes(\"ConsentGate\") ||\n line.includes(\"consentGate\") ||\n line.includes(\"useConsent\") ||\n line.includes(\"useConsentService\") ||\n line.includes(\"data-consent\") ||\n line.includes(\"text/plain\");\n\n if (!isBlocked) {\n findings.push({\n id: \"SRC_UNBLOCKED_TRACKER\",\n rule: \"LSSI-SCRIPT-ISOLATION-001\",\n severity: \"CRITICAL\",\n category: \"SOURCE_CODE\",\n message: `Referencia a rastreador sin control de consentimiento detectada (${tracker.name}): '${tracker.domain}'`,\n file: path.relative(process.cwd(), filePath),\n line: i + 1,\n details: line.trim(),\n remediation: `Envuelve la invocación en un bloque condicional 'useConsent(\"${tracker.category}\")' o componente <ConsentGate>.`,\n });\n }\n }\n }\n }\n } catch {}\n }\n\n return count;\n }\n\n /**\n * Audit live URL by fetching HTML and verifying pre-consent isolation.\n */\n static async auditLiveUrl(url: string, findings: AuditFinding[]): Promise<void> {\n try {\n const res = await fetch(url, { headers: { \"User-Agent\": \"Solvenza-LSSI-Auditor/1.5.3\" } });\n if (!res.ok) {\n findings.push({\n id: \"URL_FETCH_FAILED\",\n rule: \"LSSI-URL-001\",\n severity: \"WARNING\",\n category: \"LIVE_URL\",\n message: `No se pudo conectar a la URL '${url}' (HTTP ${res.status}).`,\n });\n return;\n }\n\n const html = await res.text();\n\n // Check for raw unblocked tracker scripts in live HTML\n for (const tracker of KNOWN_TRACKER_PATTERNS) {\n const regex = new RegExp(`<script[^>]*src=[\"'][^\"']*${tracker.domain.replace(\".\", \"\\\\.\")}[^\"']*[\"'][^>]*>`, \"gi\");\n const matches = html.match(regex);\n if (matches) {\n for (const match of matches) {\n if (!match.includes('type=\"text/plain\"') && !match.includes(\"data-consent\")) {\n findings.push({\n id: \"URL_RAW_TRACKER_LEAK\",\n rule: \"LSSI-LEAK-001\",\n severity: \"CRITICAL\",\n category: \"LIVE_URL\",\n message: `Fuga de rastreador en tiempo de ejecución: script '${tracker.name}' cargado antes del consentimiento.`,\n details: match,\n remediation: `Asegúrate de que '${tracker.name}' se inyecte con type=\"text/plain\" data-consent=\"...\".`,\n });\n }\n }\n }\n }\n } catch (err: any) {\n findings.push({\n id: \"URL_CONNECT_ERROR\",\n rule: \"LSSI-URL-002\",\n severity: \"WARNING\",\n category: \"LIVE_URL\",\n message: `Error al escanear la URL '${url}': ${err.message}`,\n });\n }\n }\n\n /**\n * Generate GitHub Actions markdown step summary.\n */\n static formatGitHubSummary(report: AuditReport): string {\n const statusEmoji = report.compliant ? \"✅\" : \"❌\";\n const statusText = report.compliant\n ? \"**APROBADO (Cumplimiento LSSI / AEPD / RGPD Correcto)**\"\n : \"**RECHAZADO (Violaciones Críticas de Privacidad Detectadas)**\";\n\n let md = `## ${statusEmoji} Auditoría de Cumplimiento LSSI & AEPD - Solvenza Cookies Compliance\\n\\n`;\n md += `> **Resultado:** ${statusText} \\n`;\n md += `> **Puntuación de Cumplimiento:** **${report.score} / 100** \\n`;\n md += `> **Archivos Escaneados:** ${report.scannedFilesCount} | **Fecha:** ${new Date(report.timestamp).toUTCString()}\\n\\n`;\n\n md += `### 📊 Resumen de Hallazgos:\\n\\n`;\n md += `| Gravedad | Cantidad | Descripción |\\n`;\n md += `|---|---|---|\\n`;\n md += `| 🔴 **CRÍTICO** | **${report.summary.critical}** | Violaciones legales directas (riesgo de sanción AEPD) |\\n`;\n md += `| 🟡 **ADVERTENCIA** | **${report.summary.warnings}** | Recomendaciones técnicas y mejores prácticas |\\n`;\n md += `| 🔵 **INFO** | **${report.summary.info}** | Sugerencias de optimización |\\n\\n`;\n\n if (report.findings.length > 0) {\n md += `### 🔍 Detalle de Hallazgos:\\n\\n`;\n md += `| Regla | Gravedad | Categoría | Archivo/Línea | Mensaje | Solución |\\n`;\n md += `|---|---|---|---|---|---|\\n`;\n\n for (const f of report.findings) {\n const sevBadge = f.severity === \"CRITICAL\" ? \"🔴 CRÍTICO\" : f.severity === \"WARNING\" ? \"🟡 ADVERTENCIA\" : \"🔵 INFO\";\n const location = f.file ? `\\`${f.file}${f.line ? `:${f.line}` : \"\"}\\`` : \"-\";\n const remediation = f.remediation ? f.remediation.replace(/\\|/g, \"\\\\|\") : \"-\";\n const message = f.message.replace(/\\|/g, \"\\\\|\");\n md += `| \\`${f.rule}\\` | ${sevBadge} | ${f.category} | ${location} | ${message} | ${remediation} |\\n`;\n }\n md += `\\n`;\n } else {\n md += `🎉 **No se encontraron violaciones ni fugas de privacidad.** Todos los recursos de terceros cumplen con el aislamiento previo al consentimiento (LSSI art. 22.2).\\n\\n`;\n }\n\n return md;\n }\n\n private static walkDir(dir: string): string[] {\n let results: string[] = [];\n try {\n const list = fs.readdirSync(dir);\n for (const file of list) {\n const fullPath = path.join(dir, file);\n const stat = fs.statSync(fullPath);\n if (stat && stat.isDirectory()) {\n results = results.concat(this.walkDir(fullPath));\n } else {\n results.push(fullPath);\n }\n }\n } catch {}\n return results;\n }\n}\n"],"mappings":"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","names":["_a"]}
|