diff options
fix: split bundles, reproducible builds (hopefully)
-rw-r--r-- | Makefile | 6 | ||||
-rwxr-xr-x | contrib/compress-worker.mjs | 13 | ||||
-rwxr-xr-x | contrib/ensure-reproducible-builds.sh | 29 | ||||
-rwxr-xr-x | contrib/strip-srcmap.sh | 6 | ||||
-rw-r--r-- | manifest.json | 2 | ||||
-rw-r--r-- | package.json | 4 | ||||
-rw-r--r-- | pnpm-lock.yaml | 9 | ||||
-rw-r--r-- | src/routes/Monaco.svelte | 39 | ||||
-rw-r--r-- | src/routes/ts-worker.ts | 11 | ||||
-rw-r--r-- | svelte.config.js | 13 | ||||
-rw-r--r-- | vite.config.ts | 1 |
11 files changed, 112 insertions, 21 deletions
@@ -5,7 +5,8 @@ mozaddons: $(MAKE) deepclean $(MAKE) bootstrap pnpm i - $(MAKE) build + $(MAKE) build-reproducible + contrib/strip-srcmap.sh $(MAKE) pack clean: @@ -21,5 +22,8 @@ bootstrap: build: pnpm build +build-reproducible: + pnpm build-reproducible + pack: contrib/pack diff --git a/contrib/compress-worker.mjs b/contrib/compress-worker.mjs new file mode 100755 index 0000000..5c26694 --- /dev/null +++ b/contrib/compress-worker.mjs @@ -0,0 +1,13 @@ +#!/usr/bin/env node +import { readFileSync, writeFileSync } from 'node:fs'; +import { brotliCompressSync } from 'zlib'; + +writeFileSync( + 'static/generated/ts-worker.js.br', + brotliCompressSync( + readFileSync( + 'node_modules/monaco-editor/esm/vs/language/typescript/ts.worker.js' + ), + {} + ) +); diff --git a/contrib/ensure-reproducible-builds.sh b/contrib/ensure-reproducible-builds.sh new file mode 100755 index 0000000..f9b880a --- /dev/null +++ b/contrib/ensure-reproducible-builds.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env zsh +set -e +echo "First Build" +make mozaddons +# Zips are unstable with hashes +cd artifacts +ZIPNAME="$(jq -r '.name + "-" + .version + "-unsigned.zip"' ../manifest.json)" +unzip "$ZIPNAME" +rm "$ZIPNAME" +HASH1="$( (find . -type f -print0 | sort -z | xargs -0 sha512sum; + find . \( -type f -o -type d \) -print0 | sort -z | \ + xargs -0 stat -c '%n %a') \ + | sha512sum)" +cd .. +echo "Got Hash $HASH1" +sleep 1; +echo "Second Build" +make mozaddons +# Zips are unstable with hashes +cd artifacts +unzip "$ZIPNAME" +rm "$ZIPNAME" +HASH2="$( (find . -type f -print0 | sort -z | xargs -0 sha512sum; + find . \( -type f -o -type d \) -print0 | sort -z | \ + xargs -0 stat -c '%n %a') \ + | sha512sum)" +cd .. +echo "Got Hash $HASH2" +if [[ "$HASH1" != "$HASH2" ]]; then echo -e "\x1b[0;31mNot reproducible!\x1b[0m"; fi;
\ No newline at end of file diff --git a/contrib/strip-srcmap.sh b/contrib/strip-srcmap.sh new file mode 100755 index 0000000..a87ab03 --- /dev/null +++ b/contrib/strip-srcmap.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env zsh +set -eax +# some source maps are >20MB, we can't keep that going. +for f in $(find build/uwu -name '*.js' -or -name '*.mjs'); do + grep -v sourceMappingURL= "$f" > /tmp/a && mv /tmp/a "$f" +done diff --git a/manifest.json b/manifest.json index 1c749a6..9a95478 100644 --- a/manifest.json +++ b/manifest.json @@ -1,5 +1,5 @@ { - "description": "A minimal extension for manipulation of HTTP Requests and Responses; a fancy wrapper around browser.webRequest", + "description": "A minimal extension for manipulation of HTTP Requests and Responses; a fancy wrapper around browser.webRequest. Should be treated as a more restricted single-script userscript manager.", "manifest_version": 2, "name": "httptool", "version": "1.0", diff --git a/package.json b/package.json index 9a49872..d05594e 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,12 @@ "scripts": { "dev": "concurrently -k --restart-tries -1 --restart-after 1000 \"vite build --mode development --watch\" \"vite build --mode development --watch --config vite.config.background.ts\" \"./do-webext-dev\"", "build": "concurrently --kill-others-on-fail \"vite build\" \"vite build --config vite.config.background.ts\"", + "build-reproducible": "REPRODUCIBLE=1 pnpm build", "preview": "web-ext run -p ff-ext --reload -f ./browser-launcher -s ./build", "prepare": "svelte-kit sync || echo ''", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "install": "mkdir -p static/generated && cp node_modules/esbuild-wasm/esbuild.wasm static/generated/esbuild.wasm" + "install": "mkdir -p static/generated && cp node_modules/esbuild-wasm/esbuild.wasm static/generated/esbuild.wasm && contrib/compress-worker.mjs" }, "devDependencies": { "@sveltejs/adapter-static": "^3.0.8", @@ -39,6 +40,7 @@ ] }, "dependencies": { + "brotli-wasm": "3.0.1", "esbuild-wasm": "^0.25.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5af7044..924d7b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + brotli-wasm: + specifier: 3.0.1 + version: 3.0.1 esbuild-wasm: specifier: ^0.25.0 version: 0.25.0 @@ -851,6 +854,10 @@ packages: brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brotli-wasm@3.0.1: + resolution: {integrity: sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A==} + engines: {node: '>=v18.0.0'} + browserslist@4.24.4: resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2981,6 +2988,8 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brotli-wasm@3.0.1: {} + browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001700 diff --git a/src/routes/Monaco.svelte b/src/routes/Monaco.svelte index 409ab39..cfe9767 100644 --- a/src/routes/Monaco.svelte +++ b/src/routes/Monaco.svelte @@ -1,11 +1,11 @@ <script lang="ts"> import type monaco from 'monaco-editor'; import { onDestroy, onMount } from 'svelte'; - import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'; - import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'; - import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'; - import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'; - import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'; + // import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'; + // import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'; + // import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker'; + // import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'; + // import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'; // @ts-ignore import wrqTypes from '@types/webextension-polyfill/namespaces/webRequest.d.ts?raw'; // @ts-ignore @@ -37,20 +37,29 @@ declare global { onMount(async () => { // @ts-ignore globalThis.MonacoEnvironment = { - getWorker: function (_moduleId: any, label: string) { + getWorker: async (_moduleId: any, label: string) => { if (label === 'json') { - return new jsonWorker(); - } - if (label === 'css' || label === 'scss' || label === 'less') { - return new cssWorker(); - } - if (label === 'html' || label === 'handlebars' || label === 'razor') { - return new htmlWorker(); + return new ( + await import( + 'monaco-editor/esm/vs/language/json/json.worker?worker' + ) + ).default(); } + // if (label === 'css' || label === 'scss' || label === 'less') { + // return new cssWorker(); + // } + // if (label === 'html' || label === 'handlebars' || label === 'razor') { + // return new htmlWorker(); + // } if (label === 'typescript' || label === 'javascript') { - return new tsWorker(); + return await ( + await import('./ts-worker') + ).default; } - return new editorWorker(); + // return new editorWorker(); + return new ( + await import('monaco-editor/esm/vs/editor/editor.worker?worker') + ).default(); }, }; diff --git a/src/routes/ts-worker.ts b/src/routes/ts-worker.ts new file mode 100644 index 0000000..460885c --- /dev/null +++ b/src/routes/ts-worker.ts @@ -0,0 +1,11 @@ +export default (async () => { + const contents = new TextDecoder().decode( + (await (await import('brotli-wasm')).default).decompress( + await fetch('./generated/ts-worker.js.br') + .then((v) => v.arrayBuffer()) + .then((v) => new Uint8Array(v)) + ) + ); + const worker = new Worker(`data:text/javascript;base64,${btoa(contents)}`); + return worker; +})(); diff --git a/svelte.config.js b/svelte.config.js index bcb9810..77a4461 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -2,6 +2,7 @@ import adapter from './adapter/index.js'; import { sveltePreprocess } from 'svelte-preprocess'; import autoprefixer from 'autoprefixer'; import { transform } from 'esbuild'; +import { readFileSync } from 'node:fs'; /** @type {import('@sveltejs/kit').Config} */ const config = { @@ -43,10 +44,16 @@ const config = { handleHttpError: 'ignore', }, appDir: 'uwu', - output: { - bundleStrategy: 'single', - }, embedded: true, + version: { + name: process.env.REPRODUCIBLE + ? `REPRODUCIBLE-BUILD-${readFileSync( + '.git/' + + readFileSync('.git/HEAD', 'utf-8').split('\n')[0].split(': ')[1], + 'utf-8' + ).trim()}` + : Date.now().toString(36), + }, }, }; diff --git a/vite.config.ts b/vite.config.ts index 8fbd8ee..511e09d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,6 +6,7 @@ export default defineConfig({ plugins: [sveltekit(), tailwindcss()], build: { sourcemap: 'inline', + assetsInlineLimit: 8192, }, dev: { sourcemap: { |