diff --git a/docs/content/3.nuxt/2.configuration.md b/docs/content/3.nuxt/2.configuration.md
index 54f9ff6..d006cc6 100644
--- a/docs/content/3.nuxt/2.configuration.md
+++ b/docs/content/3.nuxt/2.configuration.md
@@ -8,44 +8,48 @@ Don't forget to regenerate the .nuxt folder after installation and .env alterati
## Basic installation
-The basic and required configuration can be done as follows:
+The Cookiebot ID is configured via Nuxt's [runtime config](https://nuxt.com/docs/guide/going-further/runtime-config), which keeps it out of your build and allows it to be overridden at runtime via environment variables.
-
-::code-group
-```ts [Module options nuxt.config.ts]
+```ts [nuxt.config.ts]
export default defineNuxtConfig({
modules: ["@ambitiondev/nuxt-cookiebot"],
- cookiebot: {
- cookieBotId: 'COOKIEBOT_ID_HERE',
+ cookiebot: {},
+ runtimeConfig: {
+ public: {
+ cookiebot: {
+ id: 'COOKIEBOT_ID_HERE',
+ },
+ },
},
});
```
-```ts [Inline options nuxt.config.ts]
-export default defineNuxtConfig({
- modules: [["@ambitiondev/nuxt-cookiebot", {
- cookieBotId: 'COOKIEBOT_ID_HERE',
- }]]
-});
-```
-::
### .env usage
-Nuxt comes with built-in .env support, so you can easily use it like this:
+Nuxt automatically maps `NUXT_PUBLIC_*` environment variables to `runtimeConfig.public`. You can set your Cookiebot ID without touching `nuxt.config.ts`:
::code-group
```ts [.env]
-COOKIEBOT_ID=supersecret
+NUXT_PUBLIC_COOKIEBOT_ID=supersecret
```
```ts [nuxt.config.ts]
export default defineNuxtConfig({
modules: ["@ambitiondev/nuxt-cookiebot"],
- cookiebot: {
- cookieBotId: import.meta.env.COOKIEBOT_ID,
+ cookiebot: {},
+ runtimeConfig: {
+ public: {
+ cookiebot: {
+ id: '', // overridden by NUXT_PUBLIC_COOKIEBOT_ID at runtime
+ },
+ },
},
});
```
-::
+::
+
+::alert{type="info"}
+The `runtimeConfig.public.cookiebot.id` key is automatically registered by the module. You only need to declare it in your config if you want to set a default value.
+::
[api-ref-href]: /api
diff --git a/docs/content/3.nuxt/4.advanced-usage.md b/docs/content/3.nuxt/4.advanced-usage.md
index 5259b47..4d1be16 100644
--- a/docs/content/3.nuxt/4.advanced-usage.md
+++ b/docs/content/3.nuxt/4.advanced-usage.md
@@ -37,7 +37,13 @@ export default defineNuxtConfig({
cookiebot: {
// disable auto consent banner when overriding with composable
autoConsentBanner: false,
- cookieBotId: "COOKIEBOT_ID_HERE",
+ },
+ runtimeConfig: {
+ public: {
+ cookiebot: {
+ id: "COOKIEBOT_ID_HERE",
+ },
+ },
},
});
```
diff --git a/package-lock.json b/package-lock.json
index 1f4420d..50f3ce0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -86,6 +86,7 @@
"version": "7.25.7",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz",
"integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==",
+ "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.25.7",
@@ -2980,6 +2981,7 @@
"version": "3.13.2",
"resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.13.2.tgz",
"integrity": "sha512-KvRw21zU//wdz25IeE1E5m/aFSzhJloBRAQtv+evcFeZvuroIxpIQuUqhbzuwznaUwpiWbmwlcsp5uOWmi4vwA==",
+ "peer": true,
"dependencies": {
"@nuxt/schema": "3.13.2",
"c12": "^1.11.2",
@@ -3779,48 +3781,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@nuxt/vite-builder/node_modules/meow": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
- "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize": "^1.2.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@nuxt/vite-builder/node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/@nuxt/vite-builder/node_modules/vite-plugin-checker": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.8.0.tgz",
@@ -3887,17 +3847,6 @@
}
}
},
- "node_modules/@nuxt/vite-builder/node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@nuxtjs/i18n": {
"version": "8.5.5",
"resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.5.5.tgz",
@@ -4149,6 +4098,7 @@
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz",
"integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"@octokit/auth-token": "^3.0.0",
"@octokit/graphql": "^5.0.0",
@@ -5456,6 +5406,7 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz",
"integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.11.0",
"@typescript-eslint/types": "8.11.0",
@@ -6180,6 +6131,7 @@
"resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz",
"integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==",
"dev": true,
+ "peer": true,
"dependencies": {
"js-beautify": "^1.14.9",
"vue-component-type-helpers": "^2.0.0"
@@ -6269,6 +6221,7 @@
"version": "8.12.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -6846,6 +6799,7 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001663",
"electron-to-chromium": "^1.5.28",
@@ -8508,9 +8462,10 @@
}
},
"node_modules/defu": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
- "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "license": "MIT"
},
"node_modules/delayed-stream": {
"version": "1.0.0",
@@ -8829,29 +8784,6 @@
"node": ">= 0.8"
}
},
- "node_modules/encoding": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
- "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "iconv-lite": "^0.6.2"
- }
- },
- "node_modules/encoding/node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -9040,6 +8972,7 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
"integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.11.0",
@@ -10464,6 +10397,7 @@
"resolved": "https://registry.npmjs.org/h3/-/h3-1.13.0.tgz",
"integrity": "sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==",
"dev": true,
+ "peer": true,
"dependencies": {
"cookie-es": "^1.2.2",
"crossws": ">=0.2.0 <0.4.0",
@@ -10503,6 +10437,7 @@
"resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-15.7.4.tgz",
"integrity": "sha512-r1vadDYGMtsHAAsqhDuk4IpPvr6N8MGKy5ntBo7tSdim+pWDxus2PNqOcOt8LuDZ4t3KJHE+gCuzupcx/GKnyQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"entities": "^4.5.0",
"webidl-conversions": "^7.0.0",
@@ -11518,6 +11453,7 @@
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz",
"integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==",
"dev": true,
+ "peer": true,
"dependencies": {
"cssstyle": "^4.1.0",
"data-urls": "^5.0.0",
@@ -12262,6 +12198,7 @@
"resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz",
"integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==",
"devOptional": true,
+ "peer": true,
"dependencies": {
"@babel/parser": "^7.25.4",
"@babel/types": "^7.25.4",
@@ -12338,6 +12275,7 @@
"resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
"integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"@types/minimist": "^1.2.0",
"camelcase-keys": "^6.2.2",
@@ -13147,6 +13085,7 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=12"
},
@@ -13303,6 +13242,7 @@
"resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.9.7.tgz",
"integrity": "sha512-aKXvtNrWkOCMsQbsk4A0qQdBjrJ1ZcvwlTQevI/LAgLWLYc5L7Q/YiYxGLal4ITyNSlzir1Cm1D2ZxnYhmpMEw==",
"dev": true,
+ "peer": true,
"dependencies": {
"@cloudflare/kv-asset-handler": "^0.3.4",
"@netlify/functions": "^2.8.0",
@@ -13795,6 +13735,7 @@
"resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.14.0.tgz",
"integrity": "sha512-MhG4QR6D95jQxhnwKfdKXulZ8Yqy1nbpwbotbxY5IcabOzpEeTB8hYn2BFkmYdMUB0no81qpv2ldZmVCT9UsnQ==",
"dev": true,
+ "peer": true,
"bin": {
"nuxi": "bin/nuxi.mjs",
"nuxi-ng": "bin/nuxi.mjs",
@@ -14371,6 +14312,7 @@
"integrity": "sha512-fc833c3UKo6kuoG4z0kSKet17yWym3VzcQ+yPWYspxxxd8GFVVk42+9wieyVQDi9YqtKZQ6PdQfSEPm59/M7SA==",
"dev": true,
"hasInstallScript": true,
+ "peer": true,
"dependencies": {
"@napi-rs/wasm-runtime": "0.2.4",
"@nrwl/tao": "19.8.4",
@@ -14752,6 +14694,7 @@
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
+ "peer": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@@ -15236,6 +15179,7 @@
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz",
"integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==",
"dev": true,
+ "peer": true,
"bin": {
"playwright-core": "cli.js"
},
@@ -15270,6 +15214,7 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.1.0",
@@ -16506,6 +16451,7 @@
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
"integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
"devOptional": true,
+ "peer": true,
"dependencies": {
"@types/estree": "1.0.6"
},
@@ -17727,6 +17673,7 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=12"
},
@@ -17992,6 +17939,7 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"devOptional": true,
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -18982,6 +18930,7 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
"integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
"dev": true,
+ "peer": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@@ -19576,6 +19525,7 @@
"resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz",
"integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==",
"dev": true,
+ "peer": true,
"dependencies": {
"@vitest/expect": "2.1.3",
"@vitest/mocker": "2.1.3",
@@ -19711,6 +19661,7 @@
"version": "3.5.11",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.11.tgz",
"integrity": "sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==",
+ "peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.11",
"@vue/compiler-sfc": "3.5.11",
@@ -19822,6 +19773,7 @@
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.13.1.tgz",
"integrity": "sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==",
"dev": true,
+ "peer": true,
"dependencies": {
"@intlify/core-base": "9.13.1",
"@intlify/shared": "9.13.1",
@@ -19842,6 +19794,7 @@
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz",
"integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
"dev": true,
+ "peer": true,
"dependencies": {
"@vue/devtools-api": "^6.6.4"
},
@@ -19894,16 +19847,6 @@
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"dev": true
},
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=10.13.0"
- }
- },
"node_modules/webpack-virtual-modules": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
@@ -20368,7 +20311,8 @@
"dependencies": {
"@ambitiondev/cookiebot-common": "^3.2.4",
"@ambitiondev/vue-cookiebot": "^3.2.4",
- "@nuxt/kit": "^3.13.2"
+ "@nuxt/kit": "^3.13.2",
+ "defu": "^6.1.7"
},
"devDependencies": {
"@nuxt/devtools": "latest",
diff --git a/packages/nuxt/.env.dist b/packages/nuxt/.env.dist
index 8c870ae..7639f49 100644
--- a/packages/nuxt/.env.dist
+++ b/packages/nuxt/.env.dist
@@ -1 +1 @@
-VITE_COOKIEBOT_ID=supersecret
+NUXT_PUBLIC_COOKIEBOT_ID=supersecret
diff --git a/packages/nuxt/module.d.ts b/packages/nuxt/module.d.ts
index 3c05ddf..2d2c35c 100644
--- a/packages/nuxt/module.d.ts
+++ b/packages/nuxt/module.d.ts
@@ -4,3 +4,11 @@ declare module '#cookiebot-options' {
const pluginOptions: ModuleOptions;
export = pluginOptions;
}
+
+declare module 'nuxt/schema' {
+ interface PublicRuntimeConfig {
+ cookiebot: {
+ id: string;
+ };
+ }
+}
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 346f905..e1b7339 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -9,7 +9,8 @@
"dependencies": {
"@ambitiondev/cookiebot-common": "^3.2.4",
"@ambitiondev/vue-cookiebot": "^3.2.4",
- "@nuxt/kit": "^3.13.2"
+ "@nuxt/kit": "^3.13.2",
+ "defu": "^6.1.7"
},
"description": "Implementation for Cookiebot in Nuxt applications",
"devDependencies": {
diff --git a/packages/nuxt/playground/env.d.ts b/packages/nuxt/playground/env.d.ts
deleted file mode 100644
index 00c6b44..0000000
--- a/packages/nuxt/playground/env.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-///
-
-interface ImportMetaEnv {
- readonly COOKIEBOT_ID: string;
-}
-
-interface ImportMeta {
- readonly env: ImportMetaEnv;
-}
diff --git a/packages/nuxt/playground/nuxt.config.ts b/packages/nuxt/playground/nuxt.config.ts
index 1ff317e..687cd00 100644
--- a/packages/nuxt/playground/nuxt.config.ts
+++ b/packages/nuxt/playground/nuxt.config.ts
@@ -1,10 +1,15 @@
export default defineNuxtConfig({
modules: ['../src/module', '@nuxtjs/i18n'],
- cookiebot: {
- cookieBotId: import.meta.env.VITE_COOKIEBOT_ID,
- },
+ cookiebot: {},
devtools: { enabled: true },
i18n: {
vueI18n: './i18n.config.ts',
},
+ runtimeConfig: {
+ public: {
+ cookiebot: {
+ id: '',
+ },
+ },
+ },
});
diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts
index 90ebae4..9dcc749 100644
--- a/packages/nuxt/src/module.ts
+++ b/packages/nuxt/src/module.ts
@@ -8,11 +8,12 @@ import {
defineNuxtModule,
isNuxt2,
} from '@nuxt/kit';
+import { defu } from 'defu';
// Package
import { name, version } from '../package.json';
-export interface ModuleOptions extends PluginOptions {
+export interface ModuleOptions extends Omit {
/**
* Configure if the consent banner should be shown automatically. Defaults to `true`.
* Override this behaviour if you would like to add stateful logic to the consent banner.
@@ -34,13 +35,17 @@ export default defineNuxtModule({
// Default configuration options of the Nuxt module
defaults: {
autoConsentBanner: true,
- cookieBotId: '',
},
async setup(options, nuxt) {
const { error } = useLogger();
const { resolve } = createResolver(import.meta.url);
const runtimeDir = await resolve('./runtime');
+ nuxt.options.runtimeConfig.public.cookiebot = defu(
+ nuxt.options.runtimeConfig.public.cookiebot as { id: string },
+ { id: '' }
+ );
+
// Inject options via virtual template
nuxt.options.alias['#cookiebot-options'] = addTemplate({
filename: 'cookiebot-options.mjs',
diff --git a/packages/nuxt/src/runtime/composable.ts b/packages/nuxt/src/runtime/composable.ts
index 0ee762b..70ecd57 100644
--- a/packages/nuxt/src/runtime/composable.ts
+++ b/packages/nuxt/src/runtime/composable.ts
@@ -1,5 +1,5 @@
// Vendor
-import { computed, useServerHead, useNuxtApp, type MaybeRef } from '#imports';
+import { computed, useServerHead, useNuxtApp, useRuntimeConfig, type MaybeRef } from '#imports';
import {
CB_NAME,
consentBannerURL,
@@ -16,8 +16,11 @@ import * as pluginOptions from '#cookiebot-options';
export function useCookiebot(settings?: Partial): CookiebotComposable {
const nuxt = useNuxtApp();
const { deprecationNotice, error } = useLogger();
+ const runtimeConfig = useRuntimeConfig();
+
const _options = {
...pluginOptions,
+ cookieBotId: runtimeConfig.public.cookiebot.id,
...settings,
} as PluginOptions;
diff --git a/packages/nuxt/src/runtime/plugin.ts b/packages/nuxt/src/runtime/plugin.ts
index a31082e..949a37f 100644
--- a/packages/nuxt/src/runtime/plugin.ts
+++ b/packages/nuxt/src/runtime/plugin.ts
@@ -2,7 +2,7 @@
import { CB_NAME, consentBannerURL, useLogger } from '@ambitiondev/cookiebot-common';
// App imports
-import { defineNuxtPlugin, useRouter } from '#app';
+import { defineNuxtPlugin, useRouter, useRuntimeConfig } from '#app';
import { useServerHead } from '#imports';
// Module Imports
@@ -14,7 +14,10 @@ export default defineNuxtPlugin((nuxt) => {
'$i18n' in nuxt && 'locale' in nuxt.$i18n ? (nuxt.$i18n.locale.value as string) : undefined;
const router = useRouter();
const { error } = useLogger();
- const { autoConsentBanner, cookieBotId, culture = defaultLocale, ...rest } = pluginOptions;
+ const runtimeConfig = useRuntimeConfig();
+
+ const { autoConsentBanner, culture = defaultLocale, ...rest } = pluginOptions;
+ const cookieBotId = runtimeConfig.public.cookiebot.id;
if (!cookieBotId?.length) {
return error('No Cookiebot ID given. Aborting...');
diff --git a/packages/nuxt/tests/fixtures/cookiebot/nuxt.config.ts b/packages/nuxt/tests/fixtures/cookiebot/nuxt.config.ts
index 8bdbd55..cfc8b78 100644
--- a/packages/nuxt/tests/fixtures/cookiebot/nuxt.config.ts
+++ b/packages/nuxt/tests/fixtures/cookiebot/nuxt.config.ts
@@ -3,7 +3,12 @@ import MyModule from '../../../src/module';
export default defineNuxtConfig({
modules: [MyModule as unknown as NuxtModule>],
- cookiebot: {
- cookieBotId: import.meta.env.VITE_COOKIEBOT_ID,
+ cookiebot: {},
+ runtimeConfig: {
+ public: {
+ cookiebot: {
+ id: '',
+ },
+ },
},
});