{"_id":"@dcc-bs/audio-recorder.bs.js","_rev":"6-7114a1a261d11d6840c54539dce8fa6e","name":"@dcc-bs/audio-recorder.bs.js","dist-tags":{"latest":"2.1.4"},"versions":{"2.0.0":{"name":"@dcc-bs/audio-recorder.bs.js","version":"2.0.0","keywords":["nuxt","audio","recorder","ffmpeg","nuxt-module","mp3"],"author":{"url":"https://www.bs.ch/daten/databs/dcc","name":"Data Competence Center Basel Stadt","email":"dcc@bs.ch"},"license":"MIT","_id":"@dcc-bs/audio-recorder.bs.js@2.0.0","maintainers":[{"name":"tbollinger","email":"tobias.bollinger@pm.me"},{"name":"yanickschraner","email":"yanick.schraner@bs.ch"}],"contributors":[{"name":"Yanick Schraner","email":"yanick.schraner@bs.ch"},{"name":"Tobias Bollinger","email":"tobias.bollinger@bs.ch"}],"homepage":"https://dcc-bs.github.io/documentation/","dist":{"shasum":"fe809037e3d9e603e4cd53be43dd88d6718abc2b","tarball":"https://registry.npmjs.org/@dcc-bs/audio-recorder.bs.js/-/audio-recorder.bs.js-2.0.0.tgz","fileCount":42,"integrity":"sha512-BzHBe6OJ5OtSdzSN7nB9HdhBsm2saIRQGS/QR4Ml7A7FoRfAW13pLgyQXusTIzbo7GDqpp/789Z3JXLIqwzweQ==","signatures":[{"sig":"MEUCIQC8cq5nWUm5vCM3tGL5M/GXo/NdowPFb4xcBjcTOJBKXQIgLG3zf292YHRASf76Hr9+yN9EQdLwjI2slp22cRgXZmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74399},"main":"./dist/module.mjs","type":"module","types":"./dist/types.d.mts","shasum":"fe809037e3d9e603e4cd53be43dd88d6718abc2b","exports":{".":{"style":"./dist/main.css","types":"./dist/types.d.mts","import":"./dist/module.mjs","require":"./dist/module.mjs"},"./prelude":{"types":"./dist/runtime/prelude.d.ts","import":"./dist/runtime/prelude.js","require":"./dist/runtime/prelude.js"}},"scripts":{"dev":"nuxi dev playground","lint":"biome format --write","test":"vitest","check":"biome check --fix","prepack":"bunx nuxt-module-build build","release":"bun lint && bun test && bun prepack && changelogen --release && git push --follow-tags","generate":"nuxi generate","test:e2e":"playwright test","dev:build":"nuxi build playground","test:watch":"vitest --watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"tbollinger","email":"tobias.bollinger@pm.me"},"_integrity":"sha512-BzHBe6OJ5OtSdzSN7nB9HdhBsm2saIRQGS/QR4Ml7A7FoRfAW13pLgyQXusTIzbo7GDqpp/789Z3JXLIqwzweQ==","repository":{"url":"https://github.com/DCC-BS/audio-recorder.bs.js","type":"git"},"_npmVersion":"10.8.3","description":"Audio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"dexie":"4.2.1","@nuxt/kit":"4.2.1","@ffmpeg/util":"0.12.2","@nuxtjs/i18n":"10.2.1","@ffmpeg/ffmpeg":"0.12.15","rollup-plugin-import-css":"4.1.2"},"publishConfig":{"registry":"https://npm.pkg.github.com/"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"4.2.1","vitest":"4.0.14","unbuild":"3.6.1","vue-tsc":"3.1.5","happy-dom":"20.0.10","typescript":"5.9.3","@types/node":"24.10.1","changelogen":"0.6.2","@nuxt/schema":"4.2.1","@biomejs/biome":"2.3.7","@nuxt/devtools":"3.1.1","publish-to-git":"1.2.0","@nuxt/test-utils":"3.20.1","@playwright/test":"1.57.0","@vitest/coverage-v8":"4.0.14","@nuxt/module-builder":"1.0.2","vitest-environment-nuxt":"1.0.1"},"peerDependencies":{"@nuxt/ui":"4.2.1","motion-v":"1.7.4"},"_npmOperationalInternal":{"tmp":"tmp/audio-recorder.bs.js_2.0.0_1764680370767_0.22847447887099004","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@dcc-bs/audio-recorder.bs.js","version":"2.0.1","keywords":["nuxt","audio","recorder","ffmpeg","nuxt-module","mp3"],"author":{"url":"https://www.bs.ch/daten/databs/dcc","name":"Data Competence Center Basel Stadt","email":"dcc@bs.ch"},"license":"MIT","_id":"@dcc-bs/audio-recorder.bs.js@2.0.1","maintainers":[{"name":"tbollinger","email":"tobias.bollinger@pm.me"},{"name":"yanickschraner","email":"yanick.schraner@bs.ch"}],"contributors":[{"name":"Yanick Schraner","email":"yanick.schraner@bs.ch"},{"name":"Tobias Bollinger","email":"tobias.bollinger@bs.ch"}],"homepage":"https://dcc-bs.github.io/documentation/","dist":{"shasum":"55e292b2a8b143155963a885161f59fb9355cc9a","tarball":"https://registry.npmjs.org/@dcc-bs/audio-recorder.bs.js/-/audio-recorder.bs.js-2.0.1.tgz","fileCount":42,"integrity":"sha512-bz0DWgrACa0gpKTh4NPMKpBbgbYmHVd+sHQznHeSq04a8QpwuUKROB0HE/QHF61RrE5SVC7heC18FT8iSyUuag==","signatures":[{"sig":"MEUCIENZbRVg3gIfBVVg4Pz6xWttMUHMVzrI+KQMcn7DmuxbAiEAk56EG1zCFidBdLCFECYLZhwFsBnWltKRWCjLchTSWj4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82239},"main":"./dist/module.mjs","type":"module","types":"./dist/types.d.mts","shasum":"55e292b2a8b143155963a885161f59fb9355cc9a","exports":{".":{"style":"./dist/main.css","types":"./dist/types.d.mts","import":"./dist/module.mjs","require":"./dist/module.mjs"},"./prelude":{"types":"./dist/runtime/prelude.d.ts","import":"./dist/runtime/prelude.js","require":"./dist/runtime/prelude.js"}},"scripts":{"dev":"nuxi dev playground","lint":"biome format --write","test":"vitest","check":"biome check --fix","prepack":"bunx nuxt-module-build build","release":"bun lint && bun test && bun prepack && changelogen --release && git push --follow-tags","generate":"nuxi generate","test:e2e":"playwright test","dev:build":"nuxi build playground","test:watch":"vitest --watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"tbollinger","email":"tobias.bollinger@pm.me"},"_integrity":"sha512-bz0DWgrACa0gpKTh4NPMKpBbgbYmHVd+sHQznHeSq04a8QpwuUKROB0HE/QHF61RrE5SVC7heC18FT8iSyUuag==","repository":{"url":"https://github.com/DCC-BS/audio-recorder.bs.js","type":"git"},"_npmVersion":"10.8.3","description":"Audio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"dexie":"4.2.1","@nuxt/kit":"4.2.1","@ffmpeg/util":"0.12.2","@nuxtjs/i18n":"10.2.1","@ffmpeg/ffmpeg":"0.12.15","rollup-plugin-import-css":"4.1.2"},"publishConfig":{"registry":"https://npm.pkg.github.com/"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"4.2.1","vitest":"4.0.14","unbuild":"3.6.1","vue-tsc":"3.1.5","happy-dom":"20.0.10","typescript":"5.9.3","@types/node":"24.10.1","changelogen":"0.6.2","@nuxt/schema":"4.2.1","@biomejs/biome":"2.3.7","@nuxt/devtools":"3.1.1","publish-to-git":"1.2.0","@nuxt/test-utils":"3.20.1","@playwright/test":"1.57.0","@vitest/coverage-v8":"4.0.14","@nuxt/module-builder":"1.0.2","vitest-environment-nuxt":"1.0.1"},"peerDependencies":{"@nuxt/ui":"4.2.1","motion-v":"1.7.4"},"_npmOperationalInternal":{"tmp":"tmp/audio-recorder.bs.js_2.0.1_1764688928141_0.9604613702775748","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@dcc-bs/audio-recorder.bs.js","version":"2.1.0","keywords":["nuxt","audio","recorder","ffmpeg","nuxt-module","mp3"],"author":{"url":"https://www.bs.ch/daten/databs/dcc","name":"Data Competence Center Basel Stadt","email":"dcc@bs.ch"},"license":"MIT","_id":"@dcc-bs/audio-recorder.bs.js@2.1.0","maintainers":[{"name":"tbollinger","email":"tobias.bollinger@pm.me"},{"name":"yanickschraner","email":"yanick.schraner@bs.ch"}],"contributors":[{"name":"Yanick Schraner","email":"yanick.schraner@bs.ch"},{"name":"Tobias Bollinger","email":"tobias.bollinger@bs.ch"}],"homepage":"https://dcc-bs.github.io/documentation/","bugs":{"url":"https://github.com/DCC-BS/audio-recorder.bs.js/issues"},"dist":{"shasum":"cdf8846e6d6d63eb8a79f4771222571ba2504efc","tarball":"https://registry.npmjs.org/@dcc-bs/audio-recorder.bs.js/-/audio-recorder.bs.js-2.1.0.tgz","fileCount":48,"integrity":"sha512-7LAFVONbzVURT/bq5uwH8Roc8WYOBJspGCGO0s/VFWkV8woY/rycbduypFsL+ulMapsp0jetuM9nbCk+1KW6+A==","signatures":[{"sig":"MEYCIQCW5t5/qnmdHNqjLRLtjZAFhdedDleVyKqvAJPWyH9x3gIhAN5Ht67a5gRG8ivGiTKWrASO/VJ2yKHAVsgZEN3PA35G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dcc-bs%2faudio-recorder.bs.js@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":91740},"main":"./dist/module.mjs","type":"module","types":"./dist/types.d.mts","exports":{".":{"style":"./dist/main.css","types":"./dist/types.d.mts","import":"./dist/module.mjs","require":"./dist/module.mjs"},"./prelude":{"types":"./dist/runtime/prelude.d.ts","import":"./dist/runtime/prelude.js","require":"./dist/runtime/prelude.js"}},"gitHead":"3fbdb7a1dc628ac67294dbec3102fcc1eea24862","scripts":{"dev":"nuxi dev playground","lint":"biome format --write","test":"vitest","check":"biome check --fix","prepack":"bunx nuxt-module-build build","release":"bun lint && bun test && bun prepack && changelogen --release && git push --follow-tags","generate":"nuxi generate","test:e2e":"playwright test","dev:build":"nuxi build playground","test:watch":"vitest --watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:58bbbb0e-60da-490b-8229-3e2e6fc440c5"}},"repository":{"url":"git+https://github.com/DCC-BS/audio-recorder.bs.js.git","type":"git"},"_npmVersion":"11.9.0","description":"Audio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"dexie":"4.3.0","@nuxt/kit":"4.3.1","@ffmpeg/util":"0.12.2","@nuxtjs/i18n":"10.2.3","caniuse-lite":"^1.0.30001776","@ffmpeg/ffmpeg":"0.12.15","baseline-browser-mapping":"^2.10.0","rollup-plugin-import-css":"4.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"4.3.1","vitest":"4.0.18","unbuild":"3.6.1","vue-tsc":"3.2.5","happy-dom":"20.8.3","typescript":"5.9.3","@types/node":"25.3.3","changelogen":"0.6.2","@nuxt/schema":"4.3.1","@biomejs/biome":"2.4.5","@nuxt/devtools":"3.2.2","publish-to-git":"1.2.0","@nuxt/test-utils":"4.0.0","@playwright/test":"1.58.2","@vitest/coverage-v8":"4.0.18","@nuxt/module-builder":"1.0.2","vitest-environment-nuxt":"1.0.1"},"peerDependencies":{"@nuxt/ui":"4.5.1","motion-v":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/audio-recorder.bs.js_2.1.0_1772724043183_0.550751790180958","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@dcc-bs/audio-recorder.bs.js","version":"2.1.1","keywords":["nuxt","audio","recorder","ffmpeg","nuxt-module","mp3"],"author":{"url":"https://www.bs.ch/daten/databs/dcc","name":"Data Competence Center Basel Stadt","email":"dcc@bs.ch"},"license":"MIT","_id":"@dcc-bs/audio-recorder.bs.js@2.1.1","maintainers":[{"name":"tbollinger","email":"tobias.bollinger@pm.me"},{"name":"yanickschraner","email":"yanick.schraner@bs.ch"}],"contributors":[{"name":"Yanick Schraner","email":"yanick.schraner@bs.ch"},{"name":"Tobias Bollinger","email":"tobias.bollinger@bs.ch"}],"homepage":"https://dcc-bs.github.io/documentation/","bugs":{"url":"https://github.com/DCC-BS/audio-recorder.bs.js/issues"},"dist":{"shasum":"ab485e00107e1ed2d8601f1ad0efdc26029f58fc","tarball":"https://registry.npmjs.org/@dcc-bs/audio-recorder.bs.js/-/audio-recorder.bs.js-2.1.1.tgz","fileCount":48,"integrity":"sha512-uyO+xGolBjy7ERIj4vP0Tq+9yS/LJdP4btiGqQVw8CxIcFCCO4Un6BKZeVSSTcIQ6Fu7aQLAOhKe3w+zlqi4mw==","signatures":[{"sig":"MEYCIQDsR57M+xIAimY2YP46Bg6t12ehAoWz7xSH8/TVzJj7CwIhAMCrJUP1JxheIwQxhJPek7UmSGQnHE7yo9vNRy5BORbO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dcc-bs%2faudio-recorder.bs.js@2.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":95260},"main":"./dist/module.mjs","type":"module","types":"./dist/types.d.mts","exports":{".":{"style":"./dist/main.css","types":"./dist/types.d.mts","import":"./dist/module.mjs","require":"./dist/module.mjs"},"./prelude":{"types":"./dist/runtime/prelude.d.ts","import":"./dist/runtime/prelude.js","require":"./dist/runtime/prelude.js"}},"gitHead":"a61b2c4ef33a23285595c0404276ed67e1a0ac88","scripts":{"dev":"nuxi dev playground","lint":"biome format --write","test":"vitest","check":"biome check --fix","prepack":"bunx nuxt-module-build build","release":"bun lint && bun test && bun prepack && changelogen --release && git push --follow-tags","generate":"nuxi generate","test:e2e":"playwright test","dev:build":"nuxi build playground","test:watch":"vitest --watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:58bbbb0e-60da-490b-8229-3e2e6fc440c5"}},"repository":{"url":"git+https://github.com/DCC-BS/audio-recorder.bs.js.git","type":"git"},"_npmVersion":"11.9.0","description":"Audio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"dexie":"4.3.0","@nuxt/kit":"4.3.1","@ffmpeg/util":"0.12.2","@nuxtjs/i18n":"10.2.3","caniuse-lite":"^1.0.30001776","@ffmpeg/ffmpeg":"0.12.15","baseline-browser-mapping":"^2.10.0","rollup-plugin-import-css":"4.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"4.3.1","vitest":"4.0.18","unbuild":"3.6.1","vue-tsc":"3.2.5","happy-dom":"20.8.3","typescript":"5.9.3","@types/node":"25.3.3","changelogen":"0.6.2","@nuxt/schema":"4.3.1","@biomejs/biome":"2.4.5","@nuxt/devtools":"3.2.2","publish-to-git":"1.2.0","@nuxt/test-utils":"4.0.0","@playwright/test":"1.58.2","@vitest/coverage-v8":"4.0.18","@nuxt/module-builder":"1.0.2","vitest-environment-nuxt":"1.0.1"},"peerDependencies":{"@nuxt/ui":"4.5.1","motion-v":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/audio-recorder.bs.js_2.1.1_1773139499662_0.30026311376588","host":"s3://npm-registry-packages-npm-production"}},"2.1.3":{"name":"@dcc-bs/audio-recorder.bs.js","version":"2.1.3","keywords":["nuxt","audio","recorder","ffmpeg","nuxt-module","mp3"],"author":{"url":"https://www.bs.ch/daten/databs/dcc","name":"Data Competence Center Basel Stadt","email":"dcc@bs.ch"},"license":"MIT","_id":"@dcc-bs/audio-recorder.bs.js@2.1.3","maintainers":[{"name":"tbollinger","email":"tobias.bollinger@pm.me"},{"name":"yanickschraner","email":"yanick.schraner@bs.ch"}],"contributors":[{"name":"Yanick Schraner","email":"yanick.schraner@bs.ch"},{"name":"Tobias Bollinger","email":"tobias.bollinger@bs.ch"}],"homepage":"https://dcc-bs.github.io/documentation/","bugs":{"url":"https://github.com/DCC-BS/audio-recorder.bs.js/issues"},"dist":{"shasum":"113523835d6fb46c7c11870b19f7fc4e6a81b3e5","tarball":"https://registry.npmjs.org/@dcc-bs/audio-recorder.bs.js/-/audio-recorder.bs.js-2.1.3.tgz","fileCount":48,"integrity":"sha512-hvup6UtgtGsnk7NaLtmeKKEUWK7n5qNm3RpfEHlnDuHoK2SGzna2S/dRMbAtAkP/7P9oq1pQDuvdkbITxhfQpw==","signatures":[{"sig":"MEUCIQD7YRTAPLW4f5j5RUi3lbaiqdX5QUiNdZHfAFhSE7X4BQIgGU8r/6aKB59ZNRvals40zMyUR60h9TL125IQ+b5qLhc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dcc-bs%2faudio-recorder.bs.js@2.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":97779},"main":"./dist/module.mjs","type":"module","types":"./dist/types.d.mts","exports":{".":{"style":"./dist/main.css","types":"./dist/types.d.mts","import":"./dist/module.mjs","require":"./dist/module.mjs"},"./prelude":{"types":"./dist/runtime/prelude.d.ts","import":"./dist/runtime/prelude.js","require":"./dist/runtime/prelude.js"}},"gitHead":"814622ae3b3eb338343162d2c2d384265589ba62","scripts":{"dev":"nuxi dev playground","lint":"biome format --write","test":"vitest","check":"biome check --fix","prepack":"bunx nuxt-module-build build","release":"bun lint && bun test && bun prepack && changelogen --release && git push --follow-tags","generate":"nuxi generate","test:e2e":"playwright test","dev:build":"nuxi build playground","test:watch":"vitest --watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","test:e2e:ui":"playwright test --ui","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:58bbbb0e-60da-490b-8229-3e2e6fc440c5"}},"repository":{"url":"git+https://github.com/DCC-BS/audio-recorder.bs.js.git","type":"git"},"_npmVersion":"11.11.0","description":"Audio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"dexie":"4.3.0","@nuxt/kit":"4.4.2","@ffmpeg/util":"0.12.2","@nuxtjs/i18n":"10.2.3","caniuse-lite":"^1.0.30001776","@ffmpeg/ffmpeg":"0.12.15","baseline-browser-mapping":"^2.10.0","rollup-plugin-import-css":"4.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"4.4.2","vitest":"4.1.0","unbuild":"3.6.1","vue-tsc":"3.2.5","happy-dom":"20.8.4","typescript":"5.9.3","@types/node":"25.5.0","changelogen":"0.6.2","@nuxt/schema":"4.4.2","@biomejs/biome":"2.4.6","@nuxt/devtools":"3.2.3","publish-to-git":"1.2.0","@nuxt/test-utils":"4.0.0","@playwright/test":"1.58.2","@vitest/coverage-v8":"4.1.0","@nuxt/module-builder":"1.0.2","vitest-environment-nuxt":"1.0.1"},"peerDependencies":{"@nuxt/ui":"4.5.1","motion-v":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/audio-recorder.bs.js_2.1.3_1776262644597_0.6335365175540013","host":"s3://npm-registry-packages-npm-production"}},"2.1.4":{"name":"@dcc-bs/audio-recorder.bs.js","description":"Audio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications.","version":"2.1.4","license":"MIT","type":"module","homepage":"https://dcc-bs.github.io/documentation/","author":{"name":"Data Competence Center Basel Stadt","email":"dcc@bs.ch","url":"https://www.bs.ch/daten/databs/dcc"},"keywords":["nuxt","audio","recorder","ffmpeg","nuxt-module","mp3"],"contributors":[{"name":"Yanick Schraner","email":"yanick.schraner@bs.ch"},{"name":"Tobias Bollinger","email":"tobias.bollinger@bs.ch"}],"repository":{"type":"git","url":"git+https://github.com/DCC-BS/audio-recorder.bs.js.git"},"publishConfig":{"access":"public"},"exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs","require":"./dist/module.mjs","style":"./dist/main.css"},"./prelude":{"types":"./dist/runtime/prelude.d.ts","import":"./dist/runtime/prelude.js","require":"./dist/runtime/prelude.js"}},"main":"./dist/module.mjs","types":"./dist/types.d.mts","scripts":{"prepack":"bunx nuxt-module-build build","generate":"nuxi generate","dev":"nuxi dev playground","dev:build":"nuxi build playground","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release":"bun run lint && bun run test && bun run prepack && changelogen --release && git push --follow-tags","lint":"biome format --write","check":"biome check --fix","test":"vitest run","test:watch":"vitest --watch","test:coverage":"vitest run --coverage","test:e2e":"playwright test","test:e2e:ui":"playwright test --ui"},"dependencies":{"@ffmpeg/ffmpeg":"0.12.15","@ffmpeg/util":"0.12.2","baseline-browser-mapping":"^2.10.0","caniuse-lite":"^1.0.30001776","dexie":"4.3.0","rollup-plugin-import-css":"4.2.0"},"devDependencies":{"@biomejs/biome":"2.4.6","@nuxt/devtools":"3.2.3","@nuxt/kit":"^4.5.0","@nuxt/module-builder":"1.0.2","@nuxt/schema":"4.5.1","@nuxt/test-utils":"4.0.0","@nuxtjs/i18n":"^10.5.0","@playwright/test":"1.58.2","@types/node":"25.5.0","@vitest/coverage-v8":"4.1.0","@vue/test-utils":"^2.4.11","changelogen":"0.6.2","happy-dom":"20.8.4","nuxt":"4.5.1","publish-to-git":"1.2.0","typescript":"5.9.3","unbuild":"3.6.1","vitest":"4.1.0","vitest-environment-nuxt":"1.0.1","vue-tsc":"3.2.5"},"peerDependencies":{"@nuxt/kit":"^4.0.0","@nuxt/ui":"4.5.1","@nuxtjs/i18n":"^10.0.0","motion-v":"2.0.0"},"gitHead":"63a3faf39f67cfec5fb1efcacf8cc222090f151d","_id":"@dcc-bs/audio-recorder.bs.js@2.1.4","bugs":{"url":"https://github.com/DCC-BS/audio-recorder.bs.js/issues"},"_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-NKS+xu9lWokF5gJpjyeiYeqbSlxxgqeRsVKakUV1/k3mDYj+9ytx7dQsflV6Yty8C2CfM8imlUvlkUO7nkBjHw==","shasum":"38d82bfaf23c22f9e61096d9bfb0f81d6d537c21","tarball":"https://registry.npmjs.org/@dcc-bs/audio-recorder.bs.js/-/audio-recorder.bs.js-2.1.4.tgz","fileCount":48,"unpackedSize":97901,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dcc-bs%2faudio-recorder.bs.js@2.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH5dNOGw4N3HcLjvAfCWiqRO9icuOf7itOrPN5pra1lbAiB2lWmaY2aCDK0j+m92kvk5ew3h3kIIIUT/rjssZPeBRg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:58bbbb0e-60da-490b-8229-3e2e6fc440c5"}},"directories":{},"maintainers":[{"name":"tbollinger","email":"tobias.bollinger@pm.me"},{"name":"yanickschraner","email":"yanick.schraner@bs.ch"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/audio-recorder.bs.js_2.1.4_1786373577613_0.1134362865320544"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-02T12:59:30.646Z","modified":"2026-08-10T14:52:58.144Z","2.0.0":"2025-12-02T12:59:30.962Z","2.0.1":"2025-12-02T15:22:08.326Z","2.1.0":"2026-03-05T15:20:43.323Z","2.1.1":"2026-03-10T10:44:59.894Z","2.1.3":"2026-04-15T14:17:24.764Z","2.1.4":"2026-08-10T14:52:57.773Z"},"bugs":{"url":"https://github.com/DCC-BS/audio-recorder.bs.js/issues"},"author":{"name":"Data Competence Center Basel Stadt","email":"dcc@bs.ch","url":"https://www.bs.ch/daten/databs/dcc"},"license":"MIT","homepage":"https://dcc-bs.github.io/documentation/","keywords":["nuxt","audio","recorder","ffmpeg","nuxt-module","mp3"],"repository":{"type":"git","url":"git+https://github.com/DCC-BS/audio-recorder.bs.js.git"},"description":"Audio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications.","contributors":[{"name":"Yanick Schraner","email":"yanick.schraner@bs.ch"},{"name":"Tobias Bollinger","email":"tobias.bollinger@bs.ch"}],"maintainers":[{"name":"tbollinger","email":"tobias.bollinger@pm.me"},{"name":"yanickschraner","email":"yanick.schraner@bs.ch"}],"readme":"# Audio Recorder (Nuxt Module)\n\n![GitHub package.json version](https://img.shields.io/github/package-json/v/DCC-BS/audio-recorder.bs.js)\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/DCC-BS/audio-recorder.bs.js/publish.yml)\n[![NPM Version](https://img.shields.io/npm/v/%40dcc-bs%2Faudio-recorder.bs.js)](https://www.npmjs.com/package/@dcc-bs/audio-recorder.bs.js)\n\nAudio Recorder is a powerful Nuxt.js module that provides advanced audio recording, processing, and management capabilities for web applications. This module includes Vue components, composables, and utilities for seamless audio recording integration with client-side storage and audio format conversion.\n\n<div align=\"center\">\n  <img src=\"./_img/showcase1.png\" alt=\"Audio Recorder Logo\" width=\"200\" />\n  <img src=\"./_img/showcase2.png\" alt=\"Audio Recorder Logo\" width=\"200\" />\n  <img src=\"./_img/showcase3.png\" alt=\"Audio Recorder Logo\" width=\"200\" />\n</div>\n\n## Features\n\n- **Audio Recording**: Web-based audio recording with AudioWorklet and PCM capture\n- **Audio Visualization**: Real-time audio visualization during recording\n- **Session Management**: Persistent audio session storage with IndexedDB\n- **Audio Conversion**: FFmpeg integration for PCM to MP3 conversion and concatenation\n- **Chunked Recording**: Configurable chunk intervals for efficient storage management\n- **Storage Services**: Client-side audio chunk storage with ArrayBuffer for optimal performance\n- **Session Explorer**: Browse and manage recorded audio sessions\n- **Abandoned Recording Recovery**: Automatic detection and recovery of interrupted recordings\n- **iOS Support**: Improved background recording support for iOS devices\n- **Internationalization**: Built-in i18n support (English and German)\n\n## Technology Stack\n\n- **Framework**: [Nuxt.js](https://nuxt.com/) module with Vue 3\n- **Package Manager**: [Bun](https://bun.sh/)\n- **Audio Processing**: [FFmpeg](https://github.com/ffmpegwasm/ffmpeg.wasm) WebAssembly\n- **Database**: [Dexie](https://dexie.org/) for IndexedDB management\n- **Animation**: [Motion-V](https://motion-v.netlify.app/) for smooth UI transitions\n- **Testing**: Playwright for e2e testing\n\n## Setup\n\n### Prerequisites\n\n- Node.js 18+\n- Bun package manager\n- Modern browser with MediaRecorder API support\n\n### Installation\n\nInstall the module to your Nuxt application:\n\n#### Using Bun\n```bash\nbun add @dcc-bs/audio-recorder.bs.js\n```\n\n#### Using NPM\n```bash\nnpm i @dcc-bs/audio-recorder.bs.js\n```\n\n#### Using Yarn\n```bash\nyarn add @dcc-bs/audio-recorder.bs.js\n```\n\n### Configuration\n\nAdd it to your `nuxt.config.ts`:\n\n```ts\nexport default defineNuxtConfig({\n    modules: [\n        '@dcc-bs/audio-recorder.bs.js',\n    ],\n})\n```\n\nunder the vite config in `nuxt.config.ts` configure dexie:\n```ts\nvite: {\n    resolve: {\n        alias: {\n            dexie: \"dexie/dist/dexie.mjs\",\n        },\n    },\n}\n```\n\nadd the following line to your main CSS file:\n```css\n@import '@dcc-bs/audio-recorder.bs.js';\n```\n\n## Client-Only Rendering\n\nAll components in this module use the `.client.vue` suffix, which means Nuxt automatically renders them only on the client side. This is required because audio recording relies on browser APIs (MediaRecorder, AudioContext, IndexedDB) that are not available during server-side rendering.\n\nAlternatively, you can also wrap any component with the [`<ClientOnly>` component](https://nuxt.com/docs/4.x/api/components/client-only):\n\n```vue\n<template>\n  <ClientOnly>\n    <AudioRecorder />\n  </ClientOnly>\n</template>\n```\n\nSee the [Nuxt client-only pages documentation](https://nuxt.com/docs/4.x/directory-structure/app/pages#client-only-pages) for more details on how Nuxt handles client-only rendering.\n\n## Usage\n\n### Basic Audio Recording\n\n```vue\n<template>\n  <div>\n    <AudioRecorder \n      :show-result=\"true\"\n      :auto-start=\"false\"\n      :store-to-db-interval=\"30\"\n      :logger=\"customLogger\"\n      @recording-started=\"onRecordingStarted\"\n      @recording-stopped=\"onRecordingStopped\"\n    />\n  </div>\n</template>\n\n<script setup>\nfunction customLogger(message) {\n  console.log('[AudioRecorder]:', message)\n}\n\nfunction onRecordingStarted(stream) {\n  console.log('Recording started:', stream)\n}\n\nfunction onRecordingStopped(audioBlob, audioUrl) {\n  console.log('Recording stopped:', { audioBlob, audioUrl })\n}\n</script>\n```\n\n### Using Audio Recording Composable\n\n#### RecordingOptions\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `onRecordingStarted` | `(stream: MediaStream) => void` | `() => {}` | Callback when recording starts, providing the MediaStream |\n| `onRecordingStopped` | `(audioBlob: Blob, audioUrl: string) => void` | `() => {}` | Callback when recording stops with the audio data |\n| `onError` | `(error: string) => void` | `() => {}` | Callback when an error occurs during recording |\n| `storeToDbInterval` | `number` | `30` | Interval in seconds to store audio chunks to IndexedDB |\n| `onStore` | `(mp3Blob: Blob) => void \\| Promise<void>` | `() => {}` | Callback when an MP3 chunk is created during recording (fires every `storeToDbInterval` seconds) |\n| `logger` | `(msg: string) => void` | `() => {}` | Custom logging function for debugging |\n| `disableDefaultStore` | `boolean` | `false` | Disable the default IndexedDB storage. Useful when you want to handle storage yourself via the `onStore` callback |\n\n#### Example\n\n```vue\n<script setup>\nimport { useAudioRecording, useAudioSessions } from '@dcc-bs/audio-recorder.bs.js'\n\nconst { \n  startRecording, \n  stopRecording, \n  recordingTime,\n  isRecording,\n  isProcessing,\n  audioUrl,\n  audioBlob,\n  currentSession,\n  error,\n  wasSuspended,\n  resetRecording\n} = useAudioRecording({\n  storeToDbInterval: 30,\n  disableDefaultStore: false,\n  logger: console.log,\n  onRecordingStarted: (stream) => {\n    console.log('Recording started')\n  },\n  onRecordingStopped: (audioBlob, audioUrl) => {\n    console.log('Recording completed')\n  },\n  onError: (error) => {\n    console.error('Recording error:', error)\n  },\n  onStore: (mp3Blob) => {\n    console.log('MP3 chunk stored:', mp3Blob)\n  }\n})\n\nconst { getMp3Blob, abandonedRecording, deleteAbandonedRecording } = useAudioSessions({\n  deleteOldSessionsDaysInterval: 7,\n  logger: console.log\n})\n\n// Start recording\nawait startRecording()\n\n// Stop recording\nawait stopRecording()\n\n// Download recorded audio as MP3 from a session\nasync function downloadAudio(sessionId) {\n  const blob = await getMp3Blob(sessionId)\n  if (blob) {\n    const url = URL.createObjectURL(blob)\n    const a = document.createElement('a')\n    a.href = url\n    a.download = `recording-${Date.now()}.mp3`\n    a.click()\n    URL.revokeObjectURL(url)\n  }\n}\n</script>\n```\n\n### Audio Session Explorer\n\n```vue\n<template>\n  <AudioSessionExplorer />\n</template>\n```\n\n## Components\n\n### AudioRecorder\n\nThe main recording component with start/stop controls and audio visualization.\n\n#### Props\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `showResult` | `boolean` | `true` | Whether to show the playback section after recording is complete |\n| `autoStart` | `boolean` | `false` | Automatically start recording when the component is mounted |\n| `storeToDbInterval` | `number` | `5` | Interval in seconds to store audio chunks to IndexedDB (e.g., 30 for 30 seconds) |\n| `logger` | `(msg: string) => void` | `undefined` | Optional custom logging function for debugging |\n\n#### Events\n\n| Event | Parameters | Description |\n|-------|------------|-------------|\n| `recording-started` | `stream: MediaStream` | Emitted when recording starts successfully |\n| `recording-stopped` | `audioBlob: Blob, audioUrl: string` | Emitted when recording stops with the audio data |\n\n#### Exposed Methods & Properties\n\nThe component exposes the following methods and reactive properties via template refs:\n\n| Property/Method | Type | Description |\n|-----------------|------|-------------|\n| `isRecording` | `Ref<boolean>` | Reactive boolean indicating if recording is in progress |\n| `startRecording` | `() => Promise<void>` | Method to start audio recording |\n| `stopRecording` | `() => Promise<void>` | Method to stop audio recording |\n| `recordingTime` | `Ref<number>` | Recording time in seconds |\n| `formattedRecordingTime` | `ComputedRef<string>` | Formatted recording time as \"MM:SS\" |\n| `error` | `Ref<string \\| null>` | Current error message, if any |\n| `audioUrl` | `Ref<string \\| null>` | URL of the recorded audio blob |\n\n#### Usage with Template Ref\n\n```vue\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue';\nimport type { AudioRecorder } from '#components';\n\nconst recorderRef = ref<typeof AudioRecorder>()\n\nconst isRecording = computed(() => recorderRef.value?.isRecording)\nconst formattedTime = computed(() => recorderRef.value?.formattedRecordingTime)\n\nfunction startRecording() {\n  recorderRef.value?.startRecording()\n}\n\nfunction stopRecording() {\n  recorderRef.value?.stopRecording()\n}\n</script>\n\n<template>\n  <div>\n    <AudioRecorder ref=\"recorderRef\" />\n    <button @click=\"startRecording\">Start</button>\n    <button @click=\"stopRecording\">Stop</button>\n    <p>Recording: {{ isRecording }}</p>\n    <p>Time: {{ formattedTime }}</p>\n  </div>\n</template>\n```\n\n### AudioVisualizer\n\nReal-time audio waveform visualization component that displays frequency data as animated bars.\n\n#### Props\n\n| Property | Type | Required | Description |\n|----------|------|----------|-------------|\n| `stream` | `MediaStream \\| undefined` | Yes | The audio stream to visualize |\n| `isRecording` | `boolean` | Yes | Whether recording is currently active (controls visualization updates) |\n\n#### Events\n\nThis component does not emit any events.\n\n#### Exposed Methods & Properties\n\nThis component does not expose any methods or properties via `defineExpose`.\n\n#### Usage\n\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\nconst audioStream = ref<MediaStream>()\nconst recordingState = ref(false)\n\n// Get stream from getUserMedia or other source\nnavigator.mediaDevices.getUserMedia({ audio: true })\n  .then(stream => {\n    audioStream.value = stream\n    recordingState.value = true\n  })\n</script>\n\n<template>\n  <div>\n    <AudioVisualizer \n      :stream=\"audioStream\" \n      :is-recording=\"recordingState\" \n    />\n  </div>\n</template>\n```\n\n#### Technical Details\n\n- Uses Web Audio API with `AudioContext` and `AnalyserNode`\n- FFT size: 256 for frequency analysis\n- Updates visualization every 50ms when recording\n- Displays 25 frequency bars (mirrored for visual symmetry)\n- Automatically cleans up audio context when recording stops\n- Responsive design with bars scaling based on frequency amplitude\n\n### AudioSessionExplorer\n\nBrowse and manage audio sessions component with customizable actions.\n\n#### Props\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `showDownloadButton` | `boolean` | `true` | Whether to show the default download button |\n| `showDeleteButton` | `boolean` | `true` | Whether to show the default delete button |\n| `customActions` | `CustomAction[]` | `[]` | Array of custom action buttons to display before the download button |\n\n#### CustomAction Interface\n\n```typescript\ninterface CustomAction {\n  label: string           // Button text\n  icon?: string          // Icon name (e.g., 'i-lucide-upload')\n  color?: string         // Button color (default: 'primary')\n  variant?: string       // Button variant (default: 'soft')\n  loading?: boolean      // External loading state\n  disabled?: boolean     // External disabled state\n  handler: (\n    sessionId: string,\n    mp3Blob: Blob,\n    deleteSession: () => Promise<void>\n  ) => void | Promise<void>\n}\n```\n\n#### Slots\n\n| Slot | Props | Description |\n|------|-------|-------------|\n| `actions` | `session`, `getMp3Blob`, `deleteSession` | Custom action buttons slot for maximum flexibility |\n\n#### Usage Examples\n\n**Basic usage:**\n```vue\n<template>\n  <AudioSessionExplorer />\n</template>\n```\n\n**With custom actions:**\n```vue\n<script setup lang=\"ts\">\nimport type { CustomAction } from '@dcc-bs/audio-recorder.bs.js'\n\nconst customActions: CustomAction[] = [\n  {\n    label: 'Upload',\n    icon: 'i-lucide-upload',\n    color: 'blue',\n    handler: async (sessionId, mp3Blob, deleteSession) => {\n      // Upload the blob to your server\n      await uploadToServer(mp3Blob)\n      \n      // Optionally delete the session after successful upload\n      await deleteSession()\n    }\n  },\n  {\n    label: 'Share',\n    icon: 'i-lucide-share',\n    color: 'green',\n    variant: 'outline',\n    handler: async (sessionId, mp3Blob) => {\n      // Share the audio blob\n      await shareAudio(mp3Blob)\n      // Session is kept (no deleteSession call)\n    }\n  }\n]\n</script>\n\n<template>\n  <AudioSessionExplorer :custom-actions=\"customActions\" />\n</template>\n```\n\n**Hide default buttons and use custom actions only:**\n```vue\n<script setup>\nconst customActions = [\n  {\n    label: 'Process',\n    icon: 'i-lucide-cog',\n    handler: async (sessionId, mp3Blob, deleteSession) => {\n      const processed = await processAudio(mp3Blob)\n      if (processed) {\n        await deleteSession()\n      }\n    }\n  }\n]\n</script>\n\n<template>\n  <AudioSessionExplorer\n    :custom-actions=\"customActions\"\n    :show-download-button=\"false\"\n    :show-delete-button=\"false\"\n  />\n</template>\n```\n\n**Using the actions slot for maximum control:**\n```vue\n<template>\n  <AudioSessionExplorer>\n    <template #actions=\"{ session, getMp3Blob, deleteSession }\">\n      <UButton\n        @click=\"async () => {\n          const blob = await getMp3Blob()\n          await customProcessing(blob, session.id)\n        }\"\n        color=\"purple\"\n        icon=\"i-lucide-sparkles\"\n      >\n        Custom Action\n      </UButton>\n    </template>\n  </AudioSessionExplorer>\n</template>\n```\n\n**Combining custom actions with slot:**\n```vue\n<script setup>\nconst customActions = [\n  {\n    label: 'Quick Upload',\n    icon: 'i-lucide-upload',\n    handler: async (sessionId, mp3Blob, deleteSession) => {\n      await quickUpload(mp3Blob)\n      await deleteSession()\n    }\n  }\n]\n</script>\n\n<template>\n  <AudioSessionExplorer :custom-actions=\"customActions\">\n    <template #actions=\"{ session, getMp3Blob }\">\n      <!-- Additional custom button via slot -->\n      <UButton @click=\"specialAction(session)\">\n        Special\n      </UButton>\n    </template>\n  </AudioSessionExplorer>\n</template>\n```\n\n#### Features\n\n- **Session List**: Displays all recorded audio sessions with metadata\n- **Download**: Export sessions as MP3 files (can be disabled)\n- **Delete**: Remove sessions from storage (can be disabled)\n- **Custom Actions**: Add custom buttons with access to the MP3 blob and delete functionality\n- **Loading States**: Automatic loading indicators for all actions\n- **Animations**: Smooth transitions using Motion-V\n- **Empty State**: User-friendly message when no sessions exist\n\n## Development\n\nStart the development playground:\n\n```bash\nbun dev\n```\n\nBuild the module:\n\n```bash\nbun dev:build\n```\n\nPrepare the development environment:\n\n```bash\nbun dev:prepare\n```\n\n## Testing\n\nRun unit tests:\n\n```bash\nbun test\n```\n\nRun tests with coverage:\n\n```bash\nbun test:coverage\n```\n\nRun end-to-end tests:\n\n```bash\nbun test:e2e\n```\n\nRun tests in watch mode:\n\n```bash\nbun test:watch\n```\n\n## Code Quality\n\nFormat code with Biome:\n\n```bash\nbun lint\n```\n\nRun linting and fixes:\n\n```bash\nbun check\n```\n\n## Architecture\n\n### Recording Pipeline\n\nThe module uses a modern AudioWorklet-based architecture for high-quality PCM audio capture:\n\n1. **AudioWorklet PCM Capture**: Raw PCM audio data is captured using a custom AudioWorkletProcessor (`pcm-recorder-worklet.js`)\n2. **Chunked Storage**: PCM data is accumulated in memory and periodically converted to MP3 chunks using FFmpeg.wasm\n3. **IndexedDB Persistence**: MP3 chunks are stored as ArrayBuffers in IndexedDB for efficient storage\n4. **Final Concatenation**: On recording completion, all MP3 chunks are concatenated into a single MP3 file\n\nThis architecture provides:\n- **Lower memory footprint** compared to MediaRecorder blob accumulation\n- **Better iOS compatibility** with AudioWorklet support\n- **Flexible chunk intervals** for customizable storage patterns\n- **Direct MP3 output** without intermediate WebM files\n\n### Database Schema\n\n**AudioSession**: Tracks recording metadata\n- `id`, `name`, `createdAt`, `chunkCount`, `totalSize`\n- `chunkIds`: Array maintaining chunk order\n- `sampleRate`, `numChannels`: PCM metadata for reconstruction\n\n**AudioChunk**: Stores MP3 audio chunks\n- `id`, `sessionId`, `createdAt`\n- `buffer`: ArrayBuffer containing MP3 data\n\n## Project Structure\n\n- `src/`: Main module source code\n  - `module.ts`: Nuxt module entry point\n  - `runtime/`: Runtime components and composables\n    - `assets/`: AudioWorklet processor files\n    - `components/`: Vue components for audio recording\n    - `composables/`: Audio recording composables and FFmpeg integration\n    - `services/`: Audio storage and database services\n    - `utils/`: Utility functions for microphone handling and PCM processing\n    - `lang/`: Internationalization files\n- `playground/`: Development playground and examples\n- `tests/`: Unit and integration tests\n  - `e2e/`: End-to-end tests with Playwright\n  - `nuxt/`: Nuxt-specific tests\n\n## Release\n\nTo release a new version:\n\n```bash\nbun release\n```\n\nThis will run linting, tests, build the module, generate changelog, and push with tags.\n\n## License\n\n[MIT](LICENSE) © Data Competence Center Basel-Stadt\n\n<a href=\"https://www.bs.ch/schwerpunkte/daten/databs/schwerpunkte/datenwissenschaften-und-ki\"><img src=\"https://github.com/DCC-BS/.github/blob/main/_imgs/databs_log.png?raw=true\" alt=\"DCC Logo\" width=\"200\" /></a>\n\nDatenwissenschaften und KI <br>\nDeveloped with ❤️ by DCC - Data Competence Center\n","readmeFilename":"README.md"}