From f877e0b266e1f61522f2090e3030b6bfc72c9aeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:40:42 +0100 Subject: [PATCH] Bump dompurify and jspdf in /web (#777) * Bump dompurify and jspdf in /web Bumps [dompurify](https://github.com/cure53/DOMPurify) to 3.3.1 and updates ancestor dependency [jspdf](https://github.com/parallax/jsPDF). These dependencies need to be updated together. Updates `dompurify` from 2.5.8 to 3.3.1 - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/2.5.8...3.3.1) Updates `jspdf` from 2.5.2 to 4.1.0 - [Release notes](https://github.com/parallax/jsPDF/releases) - [Changelog](https://github.com/parallax/jsPDF/blob/master/RELEASE.md) - [Commits](https://github.com/parallax/jsPDF/compare/v2.5.2...v4.1.0) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.3.1 dependency-type: indirect - dependency-name: jspdf dependency-version: 4.1.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] * fixes waypoint marker icon positions --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Christian Beutel <> --- web/package-lock.json | 88 ++++++++------ web/package.json | 2 +- .../trail/[handle]/[id]/print/+page.svelte | 111 ++++++++++++------ 3 files changed, 127 insertions(+), 74 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 52d11139..6e627edc 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -42,7 +42,7 @@ "instead": "^1.0.3", "isomorphic-xml2js": "^0.1.3", "json-diff-ts": "^4.8.1", - "jspdf": "^2.5.1", + "jspdf": "^4.1.0", "jszip": "^3.10.1", "maplibre-gl": "^4.7.1", "marked": "^16.2.0", @@ -2188,6 +2188,12 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", + "license": "MIT" + }, "node_modules/@types/pbf": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", @@ -2233,6 +2239,13 @@ "meshoptimizer": "~0.18.1" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/webxr": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.21.tgz", @@ -2432,18 +2445,6 @@ "node": "*" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/autoprefixer": { "version": "10.4.20", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", @@ -2600,18 +2601,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "license": "(MIT OR Apache-2.0)", - "bin": { - "btoa": "bin/btoa.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -3191,11 +3180,14 @@ "license": "MIT" }, "node_modules/dompurify": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.8.tgz", - "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", "license": "(MPL-2.0 OR Apache-2.0)", - "optional": true + "optional": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -3505,6 +3497,23 @@ "type": "^2.7.2" } }, + "node_modules/fast-png": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", + "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==", + "license": "MIT", + "dependencies": { + "@types/pako": "^2.0.3", + "iobuffer": "^5.3.2", + "pako": "^2.1.0" + } + }, + "node_modules/fast-png/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, "node_modules/fdir": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", @@ -3972,6 +3981,12 @@ "tslib": "2" } }, + "node_modules/iobuffer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", + "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==", + "license": "MIT" + }, "node_modules/is-arguments": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", @@ -4314,20 +4329,19 @@ "license": "MIT" }, "node_modules/jspdf": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.2.tgz", - "integrity": "sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.1.0.tgz", + "integrity": "sha512-xd1d/XRkwqnsq6FP3zH1Q+Ejqn2ULIJeDZ+FTKpaabVpZREjsJKRJwuokTNgdqOU+fl55KgbvgZ1pRTSWCP2kQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "atob": "^2.1.2", - "btoa": "^1.2.1", + "@babel/runtime": "^7.28.4", + "fast-png": "^6.2.0", "fflate": "^0.8.1" }, "optionalDependencies": { - "canvg": "^3.0.6", + "canvg": "^3.0.11", "core-js": "^3.6.0", - "dompurify": "^2.5.4", + "dompurify": "^3.3.1", "html2canvas": "^1.0.0-rc.5" } }, diff --git a/web/package.json b/web/package.json index 56b4b637..b9782dc7 100644 --- a/web/package.json +++ b/web/package.json @@ -63,7 +63,7 @@ "instead": "^1.0.3", "isomorphic-xml2js": "^0.1.3", "json-diff-ts": "^4.8.1", - "jspdf": "^2.5.1", + "jspdf": "^4.1.0", "jszip": "^3.10.1", "maplibre-gl": "^4.7.1", "marked": "^16.2.0", diff --git a/web/src/routes/map/trail/[handle]/[id]/print/+page.svelte b/web/src/routes/map/trail/[handle]/[id]/print/+page.svelte index 674ea59a..d4b05b11 100644 --- a/web/src/routes/map/trail/[handle]/[id]/print/+page.svelte +++ b/web/src/routes/map/trail/[handle]/[id]/print/+page.svelte @@ -94,14 +94,15 @@ }); function faUnicode(name: string) { - var testI = document.createElement('i'); + var testI = document.createElement("i"); var char; - testI.className = 'fa fa-' + name; + testI.className = "fa fa-" + name; document.body.appendChild(testI); - char = window.getComputedStyle( testI, ':before' ) - .content.replace(/'|"/g, ''); + char = window + .getComputedStyle(testI, ":before") + .content.replace(/'|"/g, ""); testI.remove(); @@ -111,10 +112,11 @@ function getTextHeight(text: string, doc: jsPDF, width: number) { let numLines = doc.splitTextToSize(text, width).length; - return (numLines * doc.getFontSize() * doc.getLineHeightFactor() - + return ( + (numLines * doc.getFontSize() * doc.getLineHeightFactor() - doc.getFontSize() * (doc.getLineHeightFactor() - 1)) / - doc.internal.scaleFactor; - + doc.internal.scaleFactor + ); } async function print() { @@ -203,7 +205,7 @@ doc.text( iconText, - iconPositionX + circleRadius - letterWidth / 2, + iconPositionX + 2 * circleRadius - letterWidth / 2 - 0.3, iconPositionY + circleRadius + letterHeight / 2 - 0.33, ); } @@ -380,19 +382,29 @@ } if (includeDescription && $trail.description) { - let textHeight = getTextHeight($trail.description, doc, width - 32) + let textHeight = getTextHeight( + $trail.description, + doc, + width - 32, + ); if (currentHeight + textHeight + 8 > height) { newPage(); } - doc.text(formatHTMLAsText($trail.description), 16, currentHeight, { - maxWidth: width - 32, - }); - currentHeight += getTextHeight($trail.description, doc, width - 32) + 8; + doc.text( + formatHTMLAsText($trail.description), + 16, + currentHeight, + { + maxWidth: width - 32, + }, + ); + currentHeight += + getTextHeight($trail.description, doc, width - 32) + 8; } if (includeWaypoints && $trail.expand?.waypoints_via_trail) { - const header = $_("waypoints", { values: { n: 2 } }) - let textHeight = getTextHeight(header, doc, width - 32) + const header = $_("waypoints", { values: { n: 2 } }); + let textHeight = getTextHeight(header, doc, width - 32); if (currentHeight + textHeight + 8 > height) { newPage(); } @@ -400,30 +412,58 @@ doc.text(header, 16, currentHeight); currentHeight += textHeight + 8; - ($trail.expand.waypoints_via_trail || []).forEach(waypoint => { - let description = waypoint.description || ""; - let name = waypoint.name || ""; + ($trail.expand.waypoints_via_trail || []).forEach( + (waypoint) => { + let description = waypoint.description || ""; + let name = waypoint.name || ""; - let textHeight = getTextHeight(`${name ? name + "\n" : ""}${description}`, doc, width - 32 - 8) + (name ? 2 : 0); - if (currentHeight + textHeight + 16 > height) { - newPage(); - } + let textHeight = + getTextHeight( + `${name ? name + "\n" : ""}${description}`, + doc, + width - 32 - 8, + ) + (name ? 2 : 0); + if (currentHeight + textHeight + 16 > height) { + newPage(); + } - doc.setFont("fa-solid-900", "normal"); - doc.text(String.fromCharCode(faUnicode(waypoint.icon || "circle")), 16, currentHeight); + doc.setFont("fa-solid-900", "normal"); + doc.text( + String.fromCharCode( + faUnicode(waypoint.icon || "circle"), + ), + 16, + currentHeight, + ); - if (name) { - doc.setFont("IBMPlexSans-SemiBold", "bold"); - doc.text(formatHTMLAsText(name), 24, currentHeight); - currentHeight += getTextHeight(formatHTMLAsText(name), doc, width - 32) + 2; - } + if (name) { + doc.setFont("IBMPlexSans-SemiBold", "bold"); + doc.text(formatHTMLAsText(name), 24, currentHeight); + currentHeight += + getTextHeight( + formatHTMLAsText(name), + doc, + width - 32, + ) + 2; + } - doc.setFont("IBMPlexSans-Regular", "normal"); - doc.text(formatHTMLAsText(description), 24, currentHeight, { - maxWidth: width - 32 - 8 - }); - currentHeight += getTextHeight(formatHTMLAsText(description), doc, width - 32 - 8) + 8; - }); + doc.setFont("IBMPlexSans-Regular", "normal"); + doc.text( + formatHTMLAsText(description), + 24, + currentHeight, + { + maxWidth: width - 32 - 8, + }, + ); + currentHeight += + getTextHeight( + formatHTMLAsText(description), + doc, + width - 32 - 8, + ) + 8; + }, + ); } addLogo(); @@ -533,7 +573,6 @@ showGrid = true; } } -