From f3f61d0e19782e413e027ce78ad0fa4af1d056ec Mon Sep 17 00:00:00 2001 From: 01zulfi <85733202+01zulfi@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:59:52 +0500 Subject: [PATCH] clipper: remove unneeded code & packages Signed-off-by: 01zulfi <85733202+01zulfi@users.noreply.github.com> --- packages/clipper/package-lock.json | 467 ++------------------------ packages/clipper/package.json | 4 +- packages/clipper/src/css-tokenizer.ts | 176 ---------- packages/clipper/src/styles.ts | 349 ------------------- packages/clipper/src/utils.ts | 9 - 5 files changed, 37 insertions(+), 968 deletions(-) delete mode 100644 packages/clipper/src/css-tokenizer.ts diff --git a/packages/clipper/package-lock.json b/packages/clipper/package-lock.json index 3fb133ea6..4cd23cfa0 100644 --- a/packages/clipper/package-lock.json +++ b/packages/clipper/package-lock.json @@ -1,7 +1,7 @@ { "name": "@notesnook/clipper", "version": "2.1.3", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -11,9 +11,7 @@ "license": "GPL-3.0-or-later", "dependencies": { "@mozilla/readability": "^0.4.2", - "css-what": "6.1.0", - "hyperapp": "^2.0.22", - "specificity": "^0.4.1" + "hyperapp": "^2.0.22" }, "devDependencies": { "@playwright/test": "1.48.2", @@ -22,9 +20,7 @@ } }, "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "version": "1.6.0", "dev": true, "license": "MIT", "optional": true, @@ -34,9 +30,7 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.6.0", "dev": true, "license": "MIT", "optional": true, @@ -46,8 +40,6 @@ }, "node_modules/@emnapi/wasi-threads": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", "optional": true, @@ -57,15 +49,11 @@ }, "node_modules/@module-federation/error-codes": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.18.0.tgz", - "integrity": "sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/runtime": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.18.0.tgz", - "integrity": "sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw==", "dev": true, "license": "MIT", "dependencies": { @@ -76,8 +64,6 @@ }, "node_modules/@module-federation/runtime-core": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.18.0.tgz", - "integrity": "sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ==", "dev": true, "license": "MIT", "dependencies": { @@ -87,8 +73,6 @@ }, "node_modules/@module-federation/runtime-tools": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.18.0.tgz", - "integrity": "sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA==", "dev": true, "license": "MIT", "dependencies": { @@ -98,15 +82,11 @@ }, "node_modules/@module-federation/sdk": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.18.0.tgz", - "integrity": "sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.18.0.tgz", - "integrity": "sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -116,16 +96,13 @@ }, "node_modules/@mozilla/readability": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.4.2.tgz", - "integrity": "sha512-48MJXzi4Dhy2fJ3lGjmwdEJKoMmn3oiYew9n/1OW6cZy78hAzRIyDJDBCGrg4PBFDyY4xos+H4LCFn5QVRDcfw==", + "license": "Apache-2.0", "engines": { "node": ">=10.0.0" } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.6.tgz", - "integrity": "sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==", + "version": "1.0.7", "dev": true, "license": "MIT", "optional": true, @@ -137,9 +114,8 @@ }, "node_modules/@playwright/test": { "version": "1.48.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz", - "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "playwright": "1.48.2" }, @@ -151,17 +127,15 @@ } }, "node_modules/@rsbuild/core": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.5.13.tgz", - "integrity": "sha512-P+TCvZCVpBYZ3GDdnzR/tZKicE41khJIqIRlJYnEc9dwUfX1/eqRf8lA8yrsbB5iZbSfj1iOoH1N25cCQ3hhuA==", + "version": "1.5.17", "dev": true, "license": "MIT", "dependencies": { "@rspack/core": "1.5.8", "@rspack/lite-tapable": "~1.0.1", "@swc/helpers": "^0.5.17", - "core-js": "~3.45.1", - "jiti": "^2.6.0" + "core-js": "~3.46.0", + "jiti": "^2.6.1" }, "bin": { "rsbuild": "bin/rsbuild.js" @@ -172,8 +146,6 @@ }, "node_modules/@rspack/binding": { "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.8.tgz", - "integrity": "sha512-/91CzhRl9r5BIQCgGsS7jA6MDbw1I2BQpbfcUUdkdKl2P79K3Zo/Mw/TvKzS86catwLaUQEgkGRmYawOfPg7ow==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -189,7 +161,19 @@ "@rspack/binding-win32-x64-msvc": "1.5.8" } }, - "node_modules/@rspack/binding-darwin-arm64": { + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.5.8", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding/node_modules/@rspack/binding-darwin-arm64": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.8.tgz", "integrity": "sha512-spJfpOSN3f7V90ic45/ET2NKB2ujAViCNmqb0iGurMNQtFRq+7Kd+jvVKKGXKBHBbsQrFhidSWbbqy2PBPGK8g==", @@ -203,7 +187,7 @@ "darwin" ] }, - "node_modules/@rspack/binding-darwin-x64": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-darwin-x64": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.8.tgz", "integrity": "sha512-YFOzeL1IBknBcri8vjUp43dfUBylCeQnD+9O9p0wZmLAw7DtpN5JEOe2AkGo8kdTqJjYKI+cczJPKIw6lu1LWw==", @@ -217,7 +201,7 @@ "darwin" ] }, - "node_modules/@rspack/binding-linux-arm64-gnu": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-linux-arm64-gnu": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.8.tgz", "integrity": "sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ==", @@ -231,7 +215,7 @@ "linux" ] }, - "node_modules/@rspack/binding-linux-arm64-musl": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-linux-arm64-musl": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.8.tgz", "integrity": "sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw==", @@ -245,7 +229,7 @@ "linux" ] }, - "node_modules/@rspack/binding-linux-x64-gnu": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-linux-x64-gnu": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.8.tgz", "integrity": "sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA==", @@ -259,7 +243,7 @@ "linux" ] }, - "node_modules/@rspack/binding-linux-x64-musl": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-linux-x64-musl": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.8.tgz", "integrity": "sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w==", @@ -273,7 +257,7 @@ "linux" ] }, - "node_modules/@rspack/binding-wasm32-wasi": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-wasm32-wasi": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.8.tgz", "integrity": "sha512-cfg3niNHeJuxuml1Vy9VvaJrI/5TakzoaZvKX2g5S24wfzR50Eyy4JAsZ+L2voWQQp1yMJbmPYPmnTCTxdJQBQ==", @@ -287,7 +271,7 @@ "@napi-rs/wasm-runtime": "^1.0.5" } }, - "node_modules/@rspack/binding-win32-arm64-msvc": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-win32-arm64-msvc": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.8.tgz", "integrity": "sha512-7i3ZTHFXKfU/9Jm9XhpMkrdkxO7lfeYMNVEGkuU5dyBfRMQj69dRgPL7zJwc2plXiqu9LUOl+TwDNTjap7Q36g==", @@ -301,7 +285,7 @@ "win32" ] }, - "node_modules/@rspack/binding-win32-ia32-msvc": { + "node_modules/@rspack/binding/node_modules/@rspack/binding-win32-ia32-msvc": { "version": "1.5.8", "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.8.tgz", "integrity": "sha512-7ZPPWO11J+soea1+mnfaPpQt7GIodBM7A86dx6PbXgVEoZmetcWPrCF2NBfXxQWOKJ9L3RYltC4z+ZyXRgMOrw==", @@ -315,24 +299,8 @@ "win32" ] }, - "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.8.tgz", - "integrity": "sha512-N/zXQgzIxME3YUzXT8qnyzxjqcnXudWOeDh8CAG9zqTCnCiy16SFfQ/cQgEoLlD9geQntV6jx2GbDDI5kpDGMQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rspack/core": { "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.5.8.tgz", - "integrity": "sha512-sUd2LfiDhqYVfvknuoz0+/c+wSpn693xotnG5g1CSWKZArbtwiYzBIVnNlcHGmuoBRsnj/TkSq8dTQ7gwfBroQ==", "dev": true, "license": "MIT", "dependencies": { @@ -354,8 +322,6 @@ }, "node_modules/@rspack/lite-tapable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", - "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", "dev": true, "license": "MIT", "engines": { @@ -364,8 +330,6 @@ }, "node_modules/@swc/helpers": { "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -374,8 +338,6 @@ }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, @@ -384,9 +346,7 @@ } }, "node_modules/core-js": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", - "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "version": "3.46.0", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -395,40 +355,12 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/hyperapp": { "version": "2.0.22", - "resolved": "https://registry.npmjs.org/hyperapp/-/hyperapp-2.0.22.tgz", - "integrity": "sha512-3uf9HjnjrhbfykowFNEObZewBEo4DXJIM+9FnGkiR9E4H2eh2f921SzMCMS69X5nN3A7KFfmZc9KCKh/7TQBFA==" + "license": "MIT" }, "node_modules/jiti": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", "bin": { @@ -437,9 +369,8 @@ }, "node_modules/playwright": { "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz", - "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "playwright-core": "1.48.2" }, @@ -455,9 +386,8 @@ }, "node_modules/playwright-core": { "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz", - "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==", "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -467,341 +397,16 @@ }, "node_modules/slugify": { "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, - "node_modules/specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "bin": { - "specificity": "bin/specificity" - } - }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" } - }, - "dependencies": { - "@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", - "dev": true, - "optional": true, - "requires": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@module-federation/error-codes": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.18.0.tgz", - "integrity": "sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==", - "dev": true - }, - "@module-federation/runtime": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.18.0.tgz", - "integrity": "sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw==", - "dev": true, - "requires": { - "@module-federation/error-codes": "0.18.0", - "@module-federation/runtime-core": "0.18.0", - "@module-federation/sdk": "0.18.0" - } - }, - "@module-federation/runtime-core": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.18.0.tgz", - "integrity": "sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ==", - "dev": true, - "requires": { - "@module-federation/error-codes": "0.18.0", - "@module-federation/sdk": "0.18.0" - } - }, - "@module-federation/runtime-tools": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.18.0.tgz", - "integrity": "sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA==", - "dev": true, - "requires": { - "@module-federation/runtime": "0.18.0", - "@module-federation/webpack-bundler-runtime": "0.18.0" - } - }, - "@module-federation/sdk": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.18.0.tgz", - "integrity": "sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A==", - "dev": true - }, - "@module-federation/webpack-bundler-runtime": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.18.0.tgz", - "integrity": "sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==", - "dev": true, - "requires": { - "@module-federation/runtime": "0.18.0", - "@module-federation/sdk": "0.18.0" - } - }, - "@mozilla/readability": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.4.2.tgz", - "integrity": "sha512-48MJXzi4Dhy2fJ3lGjmwdEJKoMmn3oiYew9n/1OW6cZy78hAzRIyDJDBCGrg4PBFDyY4xos+H4LCFn5QVRDcfw==" - }, - "@napi-rs/wasm-runtime": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.6.tgz", - "integrity": "sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==", - "dev": true, - "optional": true, - "requires": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, - "@playwright/test": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz", - "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==", - "dev": true, - "requires": { - "playwright": "1.48.2" - } - }, - "@rsbuild/core": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.5.13.tgz", - "integrity": "sha512-P+TCvZCVpBYZ3GDdnzR/tZKicE41khJIqIRlJYnEc9dwUfX1/eqRf8lA8yrsbB5iZbSfj1iOoH1N25cCQ3hhuA==", - "dev": true, - "requires": { - "@rspack/core": "1.5.8", - "@rspack/lite-tapable": "~1.0.1", - "@swc/helpers": "^0.5.17", - "core-js": "~3.45.1", - "jiti": "^2.6.0" - } - }, - "@rspack/binding": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.8.tgz", - "integrity": "sha512-/91CzhRl9r5BIQCgGsS7jA6MDbw1I2BQpbfcUUdkdKl2P79K3Zo/Mw/TvKzS86catwLaUQEgkGRmYawOfPg7ow==", - "dev": true, - "requires": { - "@rspack/binding-darwin-arm64": "1.5.8", - "@rspack/binding-darwin-x64": "1.5.8", - "@rspack/binding-linux-arm64-gnu": "1.5.8", - "@rspack/binding-linux-arm64-musl": "1.5.8", - "@rspack/binding-linux-x64-gnu": "1.5.8", - "@rspack/binding-linux-x64-musl": "1.5.8", - "@rspack/binding-wasm32-wasi": "1.5.8", - "@rspack/binding-win32-arm64-msvc": "1.5.8", - "@rspack/binding-win32-ia32-msvc": "1.5.8", - "@rspack/binding-win32-x64-msvc": "1.5.8" - } - }, - "@rspack/binding-darwin-arm64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.8.tgz", - "integrity": "sha512-spJfpOSN3f7V90ic45/ET2NKB2ujAViCNmqb0iGurMNQtFRq+7Kd+jvVKKGXKBHBbsQrFhidSWbbqy2PBPGK8g==", - "dev": true, - "optional": true - }, - "@rspack/binding-darwin-x64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.8.tgz", - "integrity": "sha512-YFOzeL1IBknBcri8vjUp43dfUBylCeQnD+9O9p0wZmLAw7DtpN5JEOe2AkGo8kdTqJjYKI+cczJPKIw6lu1LWw==", - "dev": true, - "optional": true - }, - "@rspack/binding-linux-arm64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.8.tgz", - "integrity": "sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ==", - "dev": true, - "optional": true - }, - "@rspack/binding-linux-arm64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.8.tgz", - "integrity": "sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw==", - "dev": true, - "optional": true - }, - "@rspack/binding-linux-x64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.8.tgz", - "integrity": "sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA==", - "dev": true, - "optional": true - }, - "@rspack/binding-linux-x64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.8.tgz", - "integrity": "sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w==", - "dev": true, - "optional": true - }, - "@rspack/binding-wasm32-wasi": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.8.tgz", - "integrity": "sha512-cfg3niNHeJuxuml1Vy9VvaJrI/5TakzoaZvKX2g5S24wfzR50Eyy4JAsZ+L2voWQQp1yMJbmPYPmnTCTxdJQBQ==", - "dev": true, - "optional": true, - "requires": { - "@napi-rs/wasm-runtime": "^1.0.5" - } - }, - "@rspack/binding-win32-arm64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.8.tgz", - "integrity": "sha512-7i3ZTHFXKfU/9Jm9XhpMkrdkxO7lfeYMNVEGkuU5dyBfRMQj69dRgPL7zJwc2plXiqu9LUOl+TwDNTjap7Q36g==", - "dev": true, - "optional": true - }, - "@rspack/binding-win32-ia32-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.8.tgz", - "integrity": "sha512-7ZPPWO11J+soea1+mnfaPpQt7GIodBM7A86dx6PbXgVEoZmetcWPrCF2NBfXxQWOKJ9L3RYltC4z+ZyXRgMOrw==", - "dev": true, - "optional": true - }, - "@rspack/binding-win32-x64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.8.tgz", - "integrity": "sha512-N/zXQgzIxME3YUzXT8qnyzxjqcnXudWOeDh8CAG9zqTCnCiy16SFfQ/cQgEoLlD9geQntV6jx2GbDDI5kpDGMQ==", - "dev": true, - "optional": true - }, - "@rspack/core": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.5.8.tgz", - "integrity": "sha512-sUd2LfiDhqYVfvknuoz0+/c+wSpn693xotnG5g1CSWKZArbtwiYzBIVnNlcHGmuoBRsnj/TkSq8dTQ7gwfBroQ==", - "dev": true, - "requires": { - "@module-federation/runtime-tools": "0.18.0", - "@rspack/binding": "1.5.8", - "@rspack/lite-tapable": "1.0.1" - } - }, - "@rspack/lite-tapable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", - "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", - "dev": true - }, - "@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, - "requires": { - "tslib": "^2.8.0" - } - }, - "@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "core-js": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", - "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", - "dev": true - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "hyperapp": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/hyperapp/-/hyperapp-2.0.22.tgz", - "integrity": "sha512-3uf9HjnjrhbfykowFNEObZewBEo4DXJIM+9FnGkiR9E4H2eh2f921SzMCMS69X5nN3A7KFfmZc9KCKh/7TQBFA==" - }, - "jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true - }, - "playwright": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz", - "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==", - "dev": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.48.2" - } - }, - "playwright-core": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz", - "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==", - "dev": true - }, - "slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true - }, - "specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==" - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } } } diff --git a/packages/clipper/package.json b/packages/clipper/package.json index e95d84b4b..06e404312 100644 --- a/packages/clipper/package.json +++ b/packages/clipper/package.json @@ -33,8 +33,6 @@ }, "dependencies": { "@mozilla/readability": "^0.4.2", - "css-what": "6.1.0", - "hyperapp": "^2.0.22", - "specificity": "^0.4.1" + "hyperapp": "^2.0.22" } } diff --git a/packages/clipper/src/css-tokenizer.ts b/packages/clipper/src/css-tokenizer.ts deleted file mode 100644 index a2b8822af..000000000 --- a/packages/clipper/src/css-tokenizer.ts +++ /dev/null @@ -1,176 +0,0 @@ -/* -This file is part of the Notesnook project (https://notesnook.com/) - -Copyright (C) 2023 Streetwriters (Private) Limited - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -const from = String.fromCharCode; - -function trim(value: string): string { - return value.trim(); -} - -function charat(value: string, index: number): number { - return value.charCodeAt(index) | 0; -} - -function strlen(value: string): number { - return value.length; -} - -function substr(value: string, begin: number, end: number): string { - return value.slice(begin, end); -} - -function append(value: T, array: T[]): T { - array.push(value); - return value; -} - -let line = 1; -let column = 1; -let length = 0; -let position = 0; -let character = 0; -let characters = ""; - -function next(): number { - character = position < length ? charat(characters, position++) : 0; - - if ((column++, character === 10)) (column = 1), line++; - - return character; -} - -function peek(): number { - return charat(characters, position); -} - -function slice(begin: number, end: number): string { - return substr(characters, begin, end); -} - -function token(type: number): number { - switch (type) { - // \0 \t \n \r \s whitespace token - case 0: - case 9: - case 10: - case 13: - case 32: - return 5; - - // ! + , / > @ ~ isolate token - case 33: - case 42: - case 43: - case 44: - case 47: - case 62: - case 64: - case 126: - case 59: /* ; { } breakpoint token */ - case 123: - case 125: - return 4; - // : accompanied token - case 58: - return 3; - // " ' ( [ opening delimit token - case 34: - case 39: - case 40: - case 91: - return 2; - // ) ] closing delimit token - case 41: - case 93: - return 1; - } - - return 0; -} - -function alloc(value: string): [] { - line = column = 1; - length = strlen((characters = value)); - position = 0; - return []; -} - -function dealloc(value: T): T { - characters = ""; - return value; -} - -function delimit(type: number): string { - return trim( - slice( - position - 1, - delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type) - ) - ); -} - -export function tokenize(value: string): string[] { - return dealloc(tokenizer(alloc(value))); -} - -function tokenizer(children: string[]): string[] { - while (next()) - switch (token(character)) { - case 0: - append(identifier(position - 1), children); - break; - case 2: - append(delimit(character), children); - break; - default: - append(from(character), children); - } - - return children; -} - -function delimiter(type: number): number { - while (next()) - switch (character) { - // ] ) " ' - case type: - return position; - // " ' - case 34: - case 39: - if (type !== 34 && type !== 39) delimiter(character); - break; - // ( - case 40: - if (type === 41) delimiter(type); - break; - // \ - case 92: - next(); - break; - } - - return position; -} - -function identifier(index: number): string { - while (!token(peek())) next(); - - return slice(index, position); -} diff --git a/packages/clipper/src/styles.ts b/packages/clipper/src/styles.ts index f3c4b15fe..1eea8a7b6 100644 --- a/packages/clipper/src/styles.ts +++ b/packages/clipper/src/styles.ts @@ -17,57 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ import { constructUrl, FetchOptions } from "./fetch.js"; -import { compare, calculate, SpecificityArray } from "specificity"; -import { tokenize } from "./css-tokenizer.js"; -import { stringify, parse, SelectorType } from "css-what"; -import { safeQuerySelectorAll } from "./utils.js"; - -const SHORTHANDS = [ - "animation", - "background", - "border", - "border-block-end", - "border-block-start", - "border-bottom", - "border-color", - "border-image", - "border-inline-end", - "border-inline-start", - "border-left", - "border-radius", - "border-right", - "border-style", - "border-top", - "border-width", - "column-rule", - "columns", - "contain-intrinsic-size", - "flex", - "flex-flow", - "font", - "gap", - "grid", - "grid-area", - "grid-column", - "grid-row", - "grid-template", - "grid-gap", - "list-style", - "margin", - "mask", - "offset", - "outline", - "overflow", - "padding", - "place-content", - "place-items", - "place-self", - "scroll-margin", - "scroll-padding", - "text-decoration", - "text-emphasis", - "transition" -]; export async function inlineStylesheets(options?: FetchOptions) { for (const sheet of document.styleSheets) { @@ -113,224 +62,6 @@ async function downloadStylesheet(href: string, options?: FetchOptions) { } } -type StyleableElement = HTMLElement | SVGElement; -type BaseStyle = { - rule: CSSStyleDeclaration; - href: URL | null; -}; -type SpecifiedStyle = BaseStyle & { - specificity: SpecificityArray; -}; -type PseudoElementStyle = BaseStyle & { - pseudoElement: string; -}; -type CSSStyledElements = Map; -type CSSPseudoElements = Map; - -export async function cacheStylesheets(documentStyles: CSSStyleDeclaration) { - const styledElements: CSSStyledElements = new Map(); - const styledPseudoElements: CSSPseudoElements = new Map(); - - for (const sheet of document.styleSheets) { - if (await skipStyleSheet(sheet)) continue; - let href = sheet.href || undefined; - if (!href && sheet.ownerNode instanceof HTMLElement) - href = sheet.ownerNode.getAttribute("href") || undefined; - - walkRules( - sheet.cssRules, - documentStyles, - styledElements, - styledPseudoElements, - href - ); - } - - return { - getPseudo(element: StyleableElement, pseudoElement: string) { - const styles = styledPseudoElements - .get(element) - ?.filter((s) => s.pseudoElement.includes(pseudoElement)); - if (!styles || !styles.length) return; - - return getElementStyles(element, styles, documentStyles); - }, - get(element: StyleableElement) { - const styles = styledElements.get(element); - if (!styles) return; - - const allStyles = styles.sort((a, b) => - compare(a.specificity, b.specificity) - ); - allStyles.push({ - rule: element.style, - specificity: [0, 0, 0, 0], - href: null - }); - - return getElementStyles(element, allStyles, documentStyles); - } - }; -} - -function walkRules( - cssRules: CSSRuleList, - documentStyles: CSSStyleDeclaration, - styled: CSSStyledElements, - pseudoElements: CSSPseudoElements, - href?: string -) { - for (const rule of cssRules) { - if (rule instanceof CSSStyleRule) { - if (isPseudoSelector(rule.selectorText)) { - const selectors = parsePseudoSelector(rule.selectorText); - - for (const selector of selectors) { - if (!selector || !selector.selector.trim()) continue; - const elements = safeQuerySelectorAll( - document, - selector.selector - ) as NodeListOf; - - for (const element of elements) { - if ( - !(element instanceof HTMLElement) && - !(element instanceof SVGElement) - ) - continue; - - const styles: PseudoElementStyle[] = - pseudoElements.get(element) || []; - pseudoElements.set(element, styles); - - styles.push({ - rule: rule.style, - href: getBaseUrl(href), - pseudoElement: selector.pseudoElement - }); - } - } - } - - const elements = safeQuerySelectorAll( - document, - rule.selectorText - ) as NodeListOf; - - for (const element of elements) { - if ( - !(element instanceof HTMLElement) && - !(element instanceof SVGElement) - ) - continue; - - const parts = rule.selectorText.split(","); - const styles: SpecifiedStyle[] = styled.get(element) || []; - styled.set(element, styles); - - for (const part of parts) { - try { - const specificity = calculate(part)[0]; - styles.push({ - specificity: specificity.specificityArray, - rule: rule.style, - href: getBaseUrl(href) - }); - break; - } catch (e) { - console.error(e, href && getBaseUrl(href)); - // ignore - } - } - } - } else if ( - rule instanceof CSSMediaRule && - window.matchMedia(rule.conditionText).matches - ) { - walkRules(rule.cssRules, documentStyles, styled, pseudoElements, href); - } else if ( - rule instanceof CSSSupportsRule && - CSS.supports(rule.conditionText) - ) { - walkRules(rule.cssRules, documentStyles, styled, pseudoElements, href); - } - } -} - -function getElementStyles( - element: StyleableElement, - styles: BaseStyle[], - documentStyles: CSSStyleDeclaration -) { - const newStyles = newStyleDeclaration(); - const computedStyle = lazyComputedStyle(element); - const overrides = ["display"]; - - for (const style of styles) { - for (const property of [...style.rule, ...SHORTHANDS]) { - let value = style.rule.getPropertyValue(property); - if (overrides.includes(property)) - value = computedStyle.style.getPropertyValue(property); - - if (value.trim()) { - setStyle( - newStyles, - property, - value, - (variable) => { - return ( - computedStyle.style.getPropertyValue(variable) || - documentStyles.getPropertyValue(variable) - ); - }, - (url) => { - console.log("resolving url", url, style.href); - if (url.startsWith("data:") || !style.href) return url; - console.log("resolving url", url, style.href.href); - if (url.startsWith("/")) - return new URL(`${style.href.origin}${url}`).href; - - return new URL(`${style.href.href}${url}`).href; - }, - style.rule.getPropertyPriority(property) - ); - } - } - } - return newStyles; -} - -function setStyle( - target: CSSStyleDeclaration, - property: string, - value: string, - get: (variable: string) => string, - resolveUrl: (variable: string) => string, - priority?: string -) { - value = resolveCssVariables(value, get); - value = resolveCssUrl(value, resolveUrl); - - target.setProperty(property, value, priority); -} - -function newStyleDeclaration() { - const sheet = new CSSStyleSheet(); - sheet.insertRule(".dummy{}"); - return (sheet.cssRules[0] as CSSStyleRule).style; -} - -function lazyComputedStyle(element: StyleableElement) { - let computedStyle: CSSStyleDeclaration | undefined; - - return Object.defineProperty({}, "style", { - get: () => { - if (!computedStyle) computedStyle = getComputedStyle(element); - return computedStyle; - } - }) as { style: CSSStyleDeclaration }; -} - async function skipStyleSheet(sheet: CSSStyleSheet, options?: FetchOptions) { try { sheet.cssRules.length; @@ -349,86 +80,6 @@ async function skipStyleSheet(sheet: CSSStyleSheet, options?: FetchOptions) { .includes("print"); } -function resolveCssVariables(css: string, get: (variable: string) => string) { - const tokens = tokenize(css); - const finalTokens: string[] = []; - for (let i = 0; i < tokens.length; ++i) { - const token = tokens[i]; - if (token === "var") { - const args = tokenize(tokens[++i].slice(1, -1)); - const [variable, operator, space, ...restArgs] = args; - - const value = get(variable); - if (value) { - finalTokens.push(value); - } else if (operator && restArgs.length <= 1) { - finalTokens.push(restArgs[0] || space); - } else if (operator && restArgs.length === 2) { - finalTokens.push(resolveCssVariables(restArgs.join(""), get)); - } - } else if (token.startsWith("(") && token.endsWith(")")) { - finalTokens.push("(", resolveCssVariables(token.slice(1, -1), get), ")"); - } else finalTokens.push(token); - } - return finalTokens.join(""); -} - -function resolveCssUrl(css: string, get: (url: string) => string) { - const tokens = tokenize(css); - const finalTokens: string[] = []; - for (let i = 0; i < tokens.length; ++i) { - const token = tokens[i]; - if (token === "url" && !tokens[i + 1].startsWith("(data")) { - const url = tokens[++i].slice(2, -2); - const resolvedUrl = get(url); - if (resolvedUrl) { - finalTokens.push(token); - finalTokens.push('("'); - finalTokens.push(resolvedUrl); - finalTokens.push('")'); - } - } else finalTokens.push(token); - } - return finalTokens.join(""); -} - -function getBaseUrl(href?: string | null) { - if (!href) return null; - if (href.startsWith("/")) href = `${document.location.origin}${href}`; - const url = new URL(href); - const basepath = url.pathname.split("/").slice(0, -1).join("/"); - return new URL(`${url.origin}${basepath}/`); -} - -function isPseudoSelector(text: string) { - return ( - text.includes(":before") || - text.includes(":after") || - text.includes("::after") || - text.includes("::before") - ); -} - -function parsePseudoSelector(selector: string) { - const output = []; - const selectors = parse(selector); - for (const part of selectors) { - const pseduoElementIndex = part.findIndex( - (s) => - (s.type === SelectorType.Pseudo || - s.type === SelectorType.PseudoElement) && - (s.name === "after" || s.name === "before") - ); - if (pseduoElementIndex <= -1) continue; - - output.push({ - selector: stringify([part.slice(0, pseduoElementIndex)]), - pseudoElement: stringify([part.slice(pseduoElementIndex)]) - }); - } - return output; -} - export async function addStylesToHead( head: HTMLHeadElement, options?: FetchOptions diff --git a/packages/clipper/src/utils.ts b/packages/clipper/src/utils.ts index e9e570006..06504aa29 100644 --- a/packages/clipper/src/utils.ts +++ b/packages/clipper/src/utils.ts @@ -165,14 +165,6 @@ function getRootStylesheet() { return null; } -function safeQuerySelectorAll(root: Node, selector: string) { - try { - return (root as HTMLElement).querySelectorAll(selector); - } catch (e) { - return new NodeList(); - } -} - const SVGElements = [ "altGlyph", "altGlyphDef", @@ -272,6 +264,5 @@ export { escapeXhtml, width, height, - safeQuerySelectorAll, isSVGElement };