From 7bec92ca99bfbd383e6c9b3005810fd22625aeaf Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 1 May 2025 23:13:32 +0200 Subject: [PATCH 1/5] fix: superdough worklets bundling --- packages/superdough/superdough.mjs | 2 +- .../vite-plugin-bundle-audioworklet.js | 46 +++++++++++++++++++ packages/superdough/vite.config.js | 3 +- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 packages/superdough/vite-plugin-bundle-audioworklet.js diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 0c4d2395..a1dc30b7 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -8,7 +8,7 @@ import './feedbackdelay.mjs'; import './reverb.mjs'; import './vowel.mjs'; import { clamp, nanFallback, _mod } from './util.mjs'; -import workletsUrl from './worklets.mjs?worker&url'; +import workletsUrl from './worklets.mjs?audioworklet'; import { createFilter, gainNode, getCompressor, getWorklet } from './helpers.mjs'; import { map } from 'nanostores'; import { logger } from './logger.mjs'; diff --git a/packages/superdough/vite-plugin-bundle-audioworklet.js b/packages/superdough/vite-plugin-bundle-audioworklet.js new file mode 100644 index 00000000..13351cc5 --- /dev/null +++ b/packages/superdough/vite-plugin-bundle-audioworklet.js @@ -0,0 +1,46 @@ +import { createLogger, build } from 'vite'; + +const end = '?audioworklet'; + +export function bundleAudioWorkletPlugin() /* : PluginOption */ { + let viteConfig /* : UserConfig */; + + return { + name: 'vite-plugin-bundle-audioworklet', + apply: 'build', + enforce: 'post', + + config(config) { + viteConfig = config; + }, + + async transform(_code, id) { + if (!id.endsWith(end)) { + return; + } + const entry = id.replace(end, ''); + const quietLogger = createLogger(); + quietLogger.info = () => undefined; + + const output = await build({ + configFile: false, + clearScreen: false, + customLogger: quietLogger, + build: { + lib: { + entry, + name: '_', + formats: ['iife'], + }, + write: false, + }, + }); + if (!(output instanceof Array)) { + throw new Error('Expected output to be Array'); + } + const iife = output[0].output[0].code; + const encoded = Buffer.from(iife, 'utf8').toString('base64'); + return `export default "data:text/javascript;base64,${encoded}";`; + }, + }; +} diff --git a/packages/superdough/vite.config.js b/packages/superdough/vite.config.js index d94e37f4..a38b9b22 100644 --- a/packages/superdough/vite.config.js +++ b/packages/superdough/vite.config.js @@ -1,10 +1,11 @@ import { defineConfig } from 'vite'; import { dependencies } from './package.json'; import { resolve } from 'path'; +import { bundleAudioWorkletPlugin } from './vite-plugin-bundle-audioworklet'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [], + plugins: [bundleAudioWorkletPlugin()], build: { lib: { entry: resolve(__dirname, 'index.mjs'), From fdbbcd2dd250b47f3f17f392e084dee2c932e3d8 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 1 May 2025 23:26:04 +0200 Subject: [PATCH 2/5] add vite-plugin-bundle-audioworklet and use it both from website and superdough --- packages/superdough/package.json | 3 ++- packages/superdough/vite.config.js | 2 +- .../package.json | 19 +++++++++++++++++++ .../vite-plugin-bundle-audioworklet.js | 6 ++++-- pnpm-lock.yaml | 17 ++++++++++++++--- website/astro.config.mjs | 2 ++ website/package.json | 3 ++- 7 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 packages/vite-plugin-bundle-audioworklet/package.json rename packages/{superdough => vite-plugin-bundle-audioworklet}/vite-plugin-bundle-audioworklet.js (89%) diff --git a/packages/superdough/package.json b/packages/superdough/package.json index dd0ed52b..79c4349e 100644 --- a/packages/superdough/package.json +++ b/packages/superdough/package.json @@ -32,7 +32,8 @@ }, "homepage": "https://github.com/tidalcycles/strudel#readme", "devDependencies": { - "vite": "^6.0.11" + "vite": "^6.0.11", + "vite-plugin-bundle-audioworklet": "workspace:*" }, "dependencies": { "nanostores": "^0.11.3" diff --git a/packages/superdough/vite.config.js b/packages/superdough/vite.config.js index a38b9b22..10ac0f06 100644 --- a/packages/superdough/vite.config.js +++ b/packages/superdough/vite.config.js @@ -1,7 +1,7 @@ import { defineConfig } from 'vite'; import { dependencies } from './package.json'; import { resolve } from 'path'; -import { bundleAudioWorkletPlugin } from './vite-plugin-bundle-audioworklet'; +import bundleAudioWorkletPlugin from 'vite-plugin-bundle-audioworklet'; // https://vitejs.dev/config/ export default defineConfig({ diff --git a/packages/vite-plugin-bundle-audioworklet/package.json b/packages/vite-plugin-bundle-audioworklet/package.json new file mode 100644 index 00000000..82dc2f1d --- /dev/null +++ b/packages/vite-plugin-bundle-audioworklet/package.json @@ -0,0 +1,19 @@ +{ + "name": "vite-plugin-bundle-audioworklet", + "main": "./vite-plugin-bundle-audioworklet.js", + "version": "0.1.0", + "description": "", + "keywords": [ + "tidalcycles", + "strudel", + "pattern", + "livecoding", + "algorave" + ], + "author": "Felix Roos ", + "license": "AGPL-3.0-or-later", + "type": "module", + "devDependencies": { + "vite": "^6.0.11" + } +} diff --git a/packages/superdough/vite-plugin-bundle-audioworklet.js b/packages/vite-plugin-bundle-audioworklet/vite-plugin-bundle-audioworklet.js similarity index 89% rename from packages/superdough/vite-plugin-bundle-audioworklet.js rename to packages/vite-plugin-bundle-audioworklet/vite-plugin-bundle-audioworklet.js index 13351cc5..4c5634ba 100644 --- a/packages/superdough/vite-plugin-bundle-audioworklet.js +++ b/packages/vite-plugin-bundle-audioworklet/vite-plugin-bundle-audioworklet.js @@ -2,12 +2,12 @@ import { createLogger, build } from 'vite'; const end = '?audioworklet'; -export function bundleAudioWorkletPlugin() /* : PluginOption */ { +function bundleAudioWorkletPlugin() /* : PluginOption */ { let viteConfig /* : UserConfig */; return { name: 'vite-plugin-bundle-audioworklet', - apply: 'build', + /* apply: 'build', */ enforce: 'post', config(config) { @@ -44,3 +44,5 @@ export function bundleAudioWorkletPlugin() /* : PluginOption */ { }, }; } + +export default bundleAudioWorkletPlugin; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32fd711e..e8667c5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,7 +41,7 @@ importers: version: 2.2.7 '@vitest/coverage-v8': specifier: 3.0.4 - version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0)) + version: 3.0.4(vitest@3.0.4) '@vitest/ui': specifier: ^3.0.4 version: 3.0.4(vitest@3.0.4) @@ -476,6 +476,9 @@ importers: vite: specifier: ^6.0.11 version: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + vite-plugin-bundle-audioworklet: + specifier: workspace:* + version: link:../vite-plugin-bundle-audioworklet packages/tidal: dependencies: @@ -540,6 +543,12 @@ importers: specifier: ^3.0.4 version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + packages/vite-plugin-bundle-audioworklet: + devDependencies: + vite: + specifier: ^6.0.11 + version: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) + packages/web: dependencies: '@strudel/core': @@ -780,6 +789,9 @@ importers: sharp: specifier: ^0.33.5 version: 0.33.5 + vite-plugin-bundle-audioworklet: + specifier: workspace:* + version: link:../packages/vite-plugin-bundle-audioworklet workbox-window: specifier: ^7.3.0 version: 7.3.0 @@ -7561,7 +7573,6 @@ packages: workbox-google-analytics@7.0.0: resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained workbox-navigation-preload@7.0.0: resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} @@ -10248,7 +10259,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.0.4(vitest@3.0.4)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 diff --git a/website/astro.config.mjs b/website/astro.config.mjs index 63158422..151c48fc 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -5,6 +5,7 @@ import remarkToc from 'remark-toc'; import rehypeSlug from 'rehype-slug'; import rehypeAutolinkHeadings from 'rehype-autolink-headings'; import rehypeUrls from 'rehype-urls'; +import bundleAudioWorkletPlugin from 'vite-plugin-bundle-audioworklet'; import tailwind from '@astrojs/tailwind'; import AstroPWA from '@vite-pwa/astro'; @@ -134,6 +135,7 @@ export default defineConfig({ site, base, vite: { + plugins: [bundleAudioWorkletPlugin()], ssr: { // Example: Force a broken package to skip SSR processing, if needed // external: ['fraction.js'], // https://github.com/infusion/Fraction.js/issues/51 diff --git a/website/package.json b/website/package.json index 257ff643..8e980f1c 100644 --- a/website/package.json +++ b/website/package.json @@ -73,6 +73,7 @@ "@vite-pwa/astro": "^0.5.0", "html-escaper": "^3.0.3", "sharp": "^0.33.5", - "workbox-window": "^7.3.0" + "workbox-window": "^7.3.0", + "vite-plugin-bundle-audioworklet": "workspace:*" } } From f993056fb1989c22463afb51f00bdf5d18f5373b Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 1 May 2025 23:30:14 +0200 Subject: [PATCH 3/5] fix: tests -> use vite plugin in tests as well --- vitest.config.ts => vitest.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename vitest.config.ts => vitest.config.js (66%) diff --git a/vitest.config.ts b/vitest.config.js similarity index 66% rename from vitest.config.ts rename to vitest.config.js index 026f0b7c..b16857c4 100644 --- a/vitest.config.ts +++ b/vitest.config.js @@ -1,7 +1,9 @@ -import { configDefaults, defineConfig } from 'vitest/config'; +import { defineConfig } from 'vitest/config'; +import bundleAudioWorkletPlugin from './packages/vite-plugin-bundle-audioworklet/vite-plugin-bundle-audioworklet'; /// export default defineConfig({ + plugins: [bundleAudioWorkletPlugin()], test: { reporters: 'verbose', isolate: false, From 22f114be5973a0be93572e7159bef732a00516b0 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 1 May 2025 23:35:20 +0200 Subject: [PATCH 4/5] update metadata --- packages/vite-plugin-bundle-audioworklet/package.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/vite-plugin-bundle-audioworklet/package.json b/packages/vite-plugin-bundle-audioworklet/package.json index 82dc2f1d..443818cf 100644 --- a/packages/vite-plugin-bundle-audioworklet/package.json +++ b/packages/vite-plugin-bundle-audioworklet/package.json @@ -4,14 +4,11 @@ "version": "0.1.0", "description": "", "keywords": [ - "tidalcycles", - "strudel", - "pattern", - "livecoding", - "algorave" + "vite", + "audioworklet" ], "author": "Felix Roos ", - "license": "AGPL-3.0-or-later", + "license": "MIT", "type": "module", "devDependencies": { "vite": "^6.0.11" From 6f2e026e4accb67f8ce5f3d138ea6c6fedf083d7 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 1 May 2025 23:49:47 +0200 Subject: [PATCH 5/5] fix: import in vitest config --- package.json | 3 ++- pnpm-lock.yaml | 3 +++ vitest.config.js => vitest.config.mjs | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) rename vitest.config.js => vitest.config.mjs (80%) diff --git a/package.json b/package.json index df50f1f4..01c3e7d5 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "jsdoc-json": "^2.0.2", "lerna": "^8.1.9", "prettier": "^3.4.2", - "vitest": "^3.0.4" + "vitest": "^3.0.4", + "vite-plugin-bundle-audioworklet": "workspace:*" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8667c5d..46c45887 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ importers: prettier: specifier: ^3.4.2 version: 3.4.2 + vite-plugin-bundle-audioworklet: + specifier: workspace:* + version: link:packages/vite-plugin-bundle-audioworklet vitest: specifier: ^3.0.4 version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(@vitest/ui@3.0.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(yaml@2.7.0) diff --git a/vitest.config.js b/vitest.config.mjs similarity index 80% rename from vitest.config.js rename to vitest.config.mjs index b16857c4..dcdde113 100644 --- a/vitest.config.js +++ b/vitest.config.mjs @@ -1,5 +1,5 @@ import { defineConfig } from 'vitest/config'; -import bundleAudioWorkletPlugin from './packages/vite-plugin-bundle-audioworklet/vite-plugin-bundle-audioworklet'; +import bundleAudioWorkletPlugin from 'vite-plugin-bundle-audioworklet'; /// export default defineConfig({