From 3c7251bd53092d5424be78dbabf59ab26ee0d489 Mon Sep 17 00:00:00 2001 From: Peter Todd Date: Mon, 22 Jun 2026 13:00:52 +0100 Subject: [PATCH] Build codec worker as standalone artifact --- .changeset/solid-codec-worker.md | 5 ++ packages/zarrextra/README.md | 3 +- packages/zarrextra/package.json | 6 +-- packages/zarrextra/vite.config.ts | 88 +++++++++++++++++-------------- 4 files changed, 58 insertions(+), 44 deletions(-) create mode 100644 .changeset/solid-codec-worker.md diff --git a/.changeset/solid-codec-worker.md b/.changeset/solid-codec-worker.md new file mode 100644 index 00000000..23dabbad --- /dev/null +++ b/.changeset/solid-codec-worker.md @@ -0,0 +1,5 @@ +--- +"zarrextra": patch +--- + +Build the codec worker as a self-contained artifact for Vite consumers. diff --git a/packages/zarrextra/README.md b/packages/zarrextra/README.md index 7b2532cd..8317b608 100644 --- a/packages/zarrextra/README.md +++ b/packages/zarrextra/README.md @@ -119,4 +119,5 @@ required for that path. Optional dependencies: `@fideus-labs/fizarrita`, `@fideus-labs/worker-pool`, `@cornerstonejs/codec-openjpeg`, and `@cornerstonejs/codec-openjph` (bundled into -the worker script). +the default worker script). Future worker entries may let applications opt into +lighter worker bundles when JP2K or HTJ2K codecs are not needed. diff --git a/packages/zarrextra/package.json b/packages/zarrextra/package.json index ae032b78..b3fdaa90 100644 --- a/packages/zarrextra/package.json +++ b/packages/zarrextra/package.json @@ -18,14 +18,12 @@ "import": "./dist/codec-worker.js" } }, - "files": [ - "dist" - ], + "files": ["dist"], "publishConfig": { "access": "public" }, "scripts": { - "build": "vite build", + "build": "vite build && vite build --mode codec-worker", "dev": "vite build --watch", "test": "vitest run", "test:watch": "vitest", diff --git a/packages/zarrextra/vite.config.ts b/packages/zarrextra/vite.config.ts index 3597ca50..8d533876 100644 --- a/packages/zarrextra/vite.config.ts +++ b/packages/zarrextra/vite.config.ts @@ -1,50 +1,60 @@ import { resolve } from 'node:path'; -import { defineConfig } from 'vitest/config'; import dts from 'vite-plugin-dts'; +import { defineConfig } from 'vitest/config'; const pkgExternals = ['zarrita', '@fideus-labs/fizarrita', '@fideus-labs/worker-pool']; -export default defineConfig({ - plugins: [ - dts({ - outDir: 'dist', - include: ['src'], - exclude: ['**/*.test.ts', 'src/workers/codec-worker.ts'], - }), - ], - build: { - lib: { - entry: { - index: resolve(__dirname, 'src/index.ts'), - workers: resolve(__dirname, 'src/workers/index.ts'), - 'codec-worker': resolve(__dirname, 'src/workers/codec-worker.ts'), +export default defineConfig(({ mode }) => { + const isCodecWorkerBuild = mode === 'codec-worker'; + + return { + plugins: [ + !isCodecWorkerBuild && + dts({ + outDir: 'dist', + include: ['src'], + exclude: [ + '**/*.test.ts', + 'src/workers/codec-worker.ts', + 'src/workers/codec-worker-init.ts', + ], + }), + ], + build: { + emptyOutDir: !isCodecWorkerBuild, + lib: { + entry: isCodecWorkerBuild + ? resolve(__dirname, 'src/workers/codec-worker.ts') + : { + index: resolve(__dirname, 'src/index.ts'), + workers: resolve(__dirname, 'src/workers/index.ts'), + }, + formats: ['es'], + fileName: isCodecWorkerBuild ? () => 'codec-worker.js' : undefined, }, - formats: ['es'], - }, - rollupOptions: { - external(id, parentId) { - if (parentId?.includes('codec-worker')) { - return false; - } - if (parentId?.includes('workers')) { + rollupOptions: { + external(id) { + if (isCodecWorkerBuild) { + return false; + } return pkgExternals.includes(id); - } - return id === 'zarrita'; - }, - output: { - entryFileNames: '[name].js', + }, + output: { + codeSplitting: isCodecWorkerBuild ? false : undefined, + entryFileNames: '[name].js', + }, }, + sourcemap: true, + target: 'es2022', }, - sourcemap: true, - target: 'es2022', - }, - test: { - globals: true, - environment: 'node', - include: ['tests/**/*.spec.ts'], - coverage: { - provider: 'v8', - reporter: ['text', 'json', 'html'], + test: { + globals: true, + environment: 'node', + include: ['tests/**/*.spec.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + }, }, - }, + }; });