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: '', + }, + }, }, });