@jwiedeman/gtm-kit-nuxt 1.1.1 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,9 +1,9 @@
1
- # @react-gtm-kit/nuxt
1
+ # @jwiedeman/gtm-kit-nuxt
2
2
 
3
3
  [![CI](https://github.com/jwiedeman/react-gtm-kit/actions/workflows/ci.yml/badge.svg)](https://github.com/jwiedeman/react-gtm-kit/actions/workflows/ci.yml)
4
4
  [![Coverage](https://codecov.io/gh/jwiedeman/react-gtm-kit/graph/badge.svg?flag=nuxt)](https://codecov.io/gh/jwiedeman/react-gtm-kit)
5
- [![npm version](https://img.shields.io/npm/v/@react-gtm-kit/nuxt.svg)](https://www.npmjs.com/package/@react-gtm-kit/nuxt)
6
- [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@react-gtm-kit/nuxt)](https://bundlephobia.com/package/@react-gtm-kit/nuxt)
5
+ [![npm version](https://img.shields.io/npm/v/@jwiedeman/gtm-kit-nuxt.svg)](https://www.npmjs.com/package/@jwiedeman/gtm-kit-nuxt)
6
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@jwiedeman/gtm-kit-nuxt)](https://bundlephobia.com/package/@jwiedeman/gtm-kit-nuxt)
7
7
  [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
8
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
9
  [![Nuxt 3](https://img.shields.io/badge/Nuxt-3.0+-00DC82.svg?logo=nuxt.js)](https://nuxt.com/)
@@ -17,15 +17,15 @@ The Nuxt adapter for GTM Kit - native module with automatic page tracking and SS
17
17
  ## Installation
18
18
 
19
19
  ```bash
20
- npm install @react-gtm-kit/core @react-gtm-kit/nuxt
20
+ npm install @jwiedeman/gtm-kit @jwiedeman/gtm-kit-nuxt
21
21
  ```
22
22
 
23
23
  ```bash
24
- yarn add @react-gtm-kit/core @react-gtm-kit/nuxt
24
+ yarn add @jwiedeman/gtm-kit @jwiedeman/gtm-kit-nuxt
25
25
  ```
26
26
 
27
27
  ```bash
28
- pnpm add @react-gtm-kit/core @react-gtm-kit/nuxt
28
+ pnpm add @jwiedeman/gtm-kit @jwiedeman/gtm-kit-nuxt
29
29
  ```
30
30
 
31
31
  ---
@@ -36,7 +36,7 @@ pnpm add @react-gtm-kit/core @react-gtm-kit/nuxt
36
36
 
37
37
  ```ts
38
38
  // plugins/gtm.client.ts
39
- import { GtmPlugin } from '@react-gtm-kit/nuxt';
39
+ import { GtmPlugin } from '@jwiedeman/gtm-kit-nuxt';
40
40
 
41
41
  export default defineNuxtPlugin((nuxtApp) => {
42
42
  nuxtApp.vueApp.use(GtmPlugin, { containers: 'GTM-XXXXXX' });
@@ -47,7 +47,7 @@ export default defineNuxtPlugin((nuxtApp) => {
47
47
 
48
48
  ```vue
49
49
  <script setup>
50
- import { useGtm } from '@react-gtm-kit/vue';
50
+ import { useGtm } from '@jwiedeman/gtm-kit-vue';
51
51
 
52
52
  const { push } = useGtm();
53
53
 
@@ -76,8 +76,8 @@ push({ event: 'page_view' });
76
76
 
77
77
  ```ts
78
78
  // plugins/gtm.client.ts
79
- import { GtmPlugin } from '@react-gtm-kit/nuxt';
80
- import { consentPresets } from '@react-gtm-kit/core';
79
+ import { GtmPlugin } from '@jwiedeman/gtm-kit-nuxt';
80
+ import { consentPresets } from '@jwiedeman/gtm-kit';
81
81
 
82
82
  export default defineNuxtPlugin((nuxtApp) => {
83
83
  nuxtApp.vueApp.use(GtmPlugin, {
@@ -95,13 +95,13 @@ export default defineNuxtPlugin((nuxtApp) => {
95
95
 
96
96
  ## Available Composables
97
97
 
98
- All composables from `@react-gtm-kit/vue` are available:
98
+ All composables from `@jwiedeman/gtm-kit-vue` are available:
99
99
 
100
100
  ### `useGtm()`
101
101
 
102
102
  ```vue
103
103
  <script setup>
104
- import { useGtm } from '@react-gtm-kit/vue';
104
+ import { useGtm } from '@jwiedeman/gtm-kit-vue';
105
105
 
106
106
  const { push, updateConsent } = useGtm();
107
107
  </script>
@@ -111,7 +111,7 @@ const { push, updateConsent } = useGtm();
111
111
 
112
112
  ```vue
113
113
  <script setup>
114
- import { useGtmPush } from '@react-gtm-kit/vue';
114
+ import { useGtmPush } from '@jwiedeman/gtm-kit-vue';
115
115
 
116
116
  const push = useGtmPush();
117
117
 
@@ -123,7 +123,7 @@ push({ event: 'purchase', value: 99.99 });
123
123
 
124
124
  ```vue
125
125
  <script setup>
126
- import { useGtmConsent } from '@react-gtm-kit/vue';
126
+ import { useGtmConsent } from '@jwiedeman/gtm-kit-vue';
127
127
 
128
128
  const { updateConsent } = useGtmConsent();
129
129
  </script>
@@ -139,7 +139,7 @@ If you need custom page tracking:
139
139
 
140
140
  ```vue
141
141
  <script setup>
142
- import { useGtm } from '@react-gtm-kit/vue';
142
+ import { useGtm } from '@jwiedeman/gtm-kit-vue';
143
143
  import { useRoute } from 'vue-router';
144
144
  import { watch } from 'vue';
145
145
 
@@ -167,8 +167,8 @@ watch(
167
167
 
168
168
  ```ts
169
169
  // plugins/gtm.client.ts
170
- import { GtmPlugin } from '@react-gtm-kit/nuxt';
171
- import { consentPresets } from '@react-gtm-kit/core';
170
+ import { GtmPlugin } from '@jwiedeman/gtm-kit-nuxt';
171
+ import { consentPresets } from '@jwiedeman/gtm-kit';
172
172
 
173
173
  export default defineNuxtPlugin((nuxtApp) => {
174
174
  nuxtApp.vueApp.use(GtmPlugin, {
@@ -184,8 +184,8 @@ export default defineNuxtPlugin((nuxtApp) => {
184
184
  ```vue
185
185
  <!-- components/CookieBanner.vue -->
186
186
  <script setup>
187
- import { useGtmConsent } from '@react-gtm-kit/vue';
188
- import { consentPresets } from '@react-gtm-kit/core';
187
+ import { useGtmConsent } from '@jwiedeman/gtm-kit-vue';
188
+ import { consentPresets } from '@jwiedeman/gtm-kit';
189
189
 
190
190
  const { updateConsent } = useGtmConsent();
191
191
 
@@ -304,7 +304,7 @@ export default defineNuxtPlugin((nuxtApp) => {
304
304
 
305
305
  - Nuxt 3.0+
306
306
  - Vue 3.3+
307
- - `@react-gtm-kit/core` (peer dependency)
307
+ - `@jwiedeman/gtm-kit` (peer dependency)
308
308
 
309
309
  ---
310
310
 
package/dist/index.cjs CHANGED
@@ -4,7 +4,7 @@ var vue = require('vue');
4
4
  var gtmKitVue = require('@jwiedeman/gtm-kit-vue');
5
5
  var gtmKit = require('@jwiedeman/gtm-kit');
6
6
 
7
- var C=(t,e)=>{var o;t.use(gtmKitVue.GtmPlugin,e);let i=(o=t.config.globalProperties.$gtm)==null?void 0:o.client;if(!i)throw new Error("[gtm-kit/nuxt] Failed to initialize GTM client");return i},h=gtmKitVue.useGtm,N=gtmKitVue.useGtmPush,k=gtmKitVue.useGtmConsent,y=gtmKitVue.useGtmClient,v=t=>{let{route:e,eventName:i="page_view",includeQueryParams:o=!0,additionalData:n,trackInitialPageView:l=!0}=t,r=t.client;if(!r)try{r=gtmKitVue.useGtmClient();}catch(u){}if(!r){console.warn("[gtm-kit/nuxt] useTrackPageViews: No GTM client available. Make sure GtmPlugin is installed or pass a client option.");return}let s=vue.ref(""),c=()=>o?e.fullPath:e.path,p=()=>typeof n=="function"?n():n!=null?n:{},a=()=>{let u=c();u!==s.value&&(s.value=u,r.push({event:i,page_path:u,page_location:typeof window!="undefined"?window.location.href:void 0,page_title:typeof document!="undefined"?document.title:void 0,...p()}));};vue.onMounted(()=>{l&&a();}),vue.watch(()=>e.fullPath,()=>{a();});};
7
+ var C=(t,e)=>{var o;t.use(gtmKitVue.GtmPlugin,e);let i=(o=t.config.globalProperties.$gtm)==null?void 0:o.client;if(!i)throw new Error("[gtm-kit/nuxt] Failed to initialize GTM client");return i},h=gtmKitVue.useGtm,N=gtmKitVue.useGtmPush,k=gtmKitVue.useGtmConsent,y=gtmKitVue.useGtmClient,v=t=>{let{route:e,eventName:i="page_view",includeQueryParams:o=!0,additionalData:n,trackInitialPageView:l=!0}=t,r=t.client;if(!r)try{r=gtmKitVue.useGtmClient();}catch(u){}if(!r){console.warn("[gtm-kit/nuxt] useTrackPageViews: No GTM client available. Make sure GtmPlugin is installed or pass a client option.");return}let a=vue.ref(""),c=()=>o?e.fullPath:e.path,p=()=>typeof n=="function"?n():n!=null?n:{},s=()=>{let u=c();u!==a.value&&(a.value=u,r.push({event:i,page_path:u,page_location:typeof window!="undefined"?window.location.href:void 0,page_title:typeof document!="undefined"?document.title:void 0,...p()}));};vue.onMounted(()=>{l&&s();}),vue.watch(()=>e.fullPath,()=>{s();});};
8
8
 
9
9
  Object.defineProperty(exports, 'GTM_INJECTION_KEY', {
10
10
  enumerable: true,
@@ -34,10 +34,22 @@ Object.defineProperty(exports, 'useGtmReady', {
34
34
  enumerable: true,
35
35
  get: function () { return gtmKitVue.useGtmReady; }
36
36
  });
37
+ Object.defineProperty(exports, 'allGranted', {
38
+ enumerable: true,
39
+ get: function () { return gtmKit.allGranted; }
40
+ });
41
+ Object.defineProperty(exports, 'analyticsOnly', {
42
+ enumerable: true,
43
+ get: function () { return gtmKit.analyticsOnly; }
44
+ });
37
45
  Object.defineProperty(exports, 'consentPresets', {
38
46
  enumerable: true,
39
47
  get: function () { return gtmKit.consentPresets; }
40
48
  });
49
+ Object.defineProperty(exports, 'eeaDefault', {
50
+ enumerable: true,
51
+ get: function () { return gtmKit.eeaDefault; }
52
+ });
41
53
  Object.defineProperty(exports, 'pushEcommerce', {
42
54
  enumerable: true,
43
55
  get: function () { return gtmKit.pushEcommerce; }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/module.ts","../src/index.ts"],"names":["ref","watch","onMounted","GtmPlugin","useGtm","useGtmPush","useGtmConsent","useGtmClient","createNuxtGtmPlugin","app","options","_a","client","useNuxtGtm","useNuxtGtmPush","useNuxtGtmConsent","useNuxtGtmClient","useTrackPageViews","route","eventName","includeQueryParams","additionalData","trackInitialPageView","e","lastTrackedPath","getPagePath","getAdditionalData","trackPageView","pagePath","useGtmReady","GTM_INJECTION_KEY","consentPresets","pushEvent","pushEcommerce"],"mappings":"AAAA,OAAS,OAAAA,EAAK,SAAAC,EAAO,aAAAC,MAA2B,MAEhD,OACE,aAAAC,EACA,UAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,MAGK,yBAmCA,IAAMC,EAAsB,CAACC,EAAUC,IAAuC,CA7CrF,IAAAC,EA+CEF,EAAI,IAAIN,EAAWO,CAAO,EAG1B,IAAME,GAAUD,EAAAF,EAAI,OAAO,iBAA2C,OAAtD,YAAAE,EAA4D,OAE5E,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gDAAgD,EAGlE,OAAOA,CACT,EAeaC,EAAaT,EAMbU,EAAiBT,EAMjBU,EAAoBT,EAMpBU,EAAmBT,EAgEnBU,EAAqBP,GAAyC,CACzE,GAAM,CACJ,MAAAQ,EACA,UAAAC,EAAY,YACZ,mBAAAC,EAAqB,GACrB,eAAAC,EACA,qBAAAC,EAAuB,EACzB,EAAIZ,EAGAE,EAAgCF,EAAQ,OAE5C,GAAI,CAACE,EACH,GAAI,CACFA,EAASL,EAAa,CACxB,OAAQgB,EAAA,CAER,CAGF,GAAI,CAACX,EAAQ,CACX,QAAQ,KACN,sHAEF,EACA,MACF,CAEA,IAAMY,EAAkBxB,EAAY,EAAE,EAEhCyB,EAAc,IACdL,EACKF,EAAM,SAERA,EAAM,KAGTQ,EAAoB,IACpB,OAAOL,GAAmB,WACrBA,EAAe,EAEjBA,GAAA,KAAAA,EAAkB,CAAC,EAGtBM,EAAgB,IAAY,CAChC,IAAMC,EAAWH,EAAY,EAGzBG,IAAaJ,EAAgB,QAIjCA,EAAgB,MAAQI,EAExBhB,EAAQ,KAAK,CACX,MAAOO,EACP,UAAWS,EACX,cAAe,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OACtE,WAAY,OAAO,UAAa,YAAc,SAAS,MAAQ,OAC/D,GAAGF,EAAkB,CACvB,CAAC,EACH,EAGAxB,EAAU,IAAM,CACVoB,GACFK,EAAc,CAElB,CAAC,EAGD1B,EACE,IAAMiB,EAAM,SACZ,IAAM,CACJS,EAAc,CAChB,CACF,CACF,EC5NA,OACE,UAAAvB,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,eAAAsB,EACA,aAAA1B,EACA,qBAAA2B,MACK,yBAYP,OAAS,kBAAAC,EAAgB,aAAAC,EAAW,iBAAAC,MAAqB","sourcesContent":["import { ref, watch, onMounted, type App } from 'vue';\nimport { type GtmClient } from '@jwiedeman/gtm-kit';\nimport {\n GtmPlugin,\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n type GtmPluginOptions,\n type GtmContext\n} from '@jwiedeman/gtm-kit-vue';\n\n/**\n * Options for the Nuxt GTM module.\n * Extends the Vue plugin options.\n *\n * For automatic page tracking, use the `useTrackPageViews` composable\n * in your app.vue or layout component.\n */\nexport type NuxtGtmOptions = GtmPluginOptions;\n\n/**\n * Extended context for Nuxt with additional helpers.\n */\nexport interface NuxtGtmContext extends GtmContext {\n /** Track a page view manually */\n trackPageView: (path?: string, additionalData?: Record<string, unknown>) => void;\n}\n\n/**\n * Creates a Nuxt plugin for GTM Kit.\n * Use this in your Nuxt plugins directory.\n *\n * @example\n * ```ts\n * // plugins/gtm.client.ts\n * import { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n *\n * export default defineNuxtPlugin((nuxtApp) => {\n * createNuxtGtmPlugin(nuxtApp.vueApp, {\n * containers: 'GTM-XXXXXX'\n * });\n * });\n * ```\n */\nexport const createNuxtGtmPlugin = (app: App, options: NuxtGtmOptions): GtmClient => {\n // Install the Vue plugin\n app.use(GtmPlugin, options);\n\n // Get the client from the Vue plugin\n const client = (app.config.globalProperties as { $gtm?: GtmContext }).$gtm?.client;\n\n if (!client) {\n throw new Error('[gtm-kit/nuxt] Failed to initialize GTM client');\n }\n\n return client;\n};\n\n/**\n * Composable for accessing the full GTM context in Nuxt.\n * This is an alias for useGtm() from @jwiedeman/gtm-kit-vue.\n *\n * @example\n * ```vue\n * <script setup>\n * const { push, client } = useNuxtGtm();\n *\n * push({ event: 'custom_event' });\n * </script>\n * ```\n */\nexport const useNuxtGtm = useGtm;\n\n/**\n * Composable for pushing events in Nuxt.\n * This is an alias for useGtmPush() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmPush = useGtmPush;\n\n/**\n * Composable for consent management in Nuxt.\n * This is an alias for useGtmConsent() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmConsent = useGtmConsent;\n\n/**\n * Composable for accessing the raw GTM client in Nuxt.\n * This is an alias for useGtmClient() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmClient = useGtmClient;\n\n/**\n * Options for the useTrackPageViews composable.\n */\nexport interface TrackPageViewsOptions {\n /**\n * The GTM client instance to use.\n * If not provided, will use the client from the Vue plugin context.\n */\n client?: GtmClient;\n\n /**\n * Reactive route object to watch for changes.\n * Use useRoute() from Nuxt.\n */\n route: {\n fullPath: string;\n path: string;\n query?: Record<string, unknown>;\n };\n\n /**\n * Custom page view event name.\n * @default 'page_view'\n */\n eventName?: string;\n\n /**\n * Whether to include query parameters in page path.\n * @default true\n */\n includeQueryParams?: boolean;\n\n /**\n * Additional data to include with each page view event.\n */\n additionalData?: Record<string, unknown> | (() => Record<string, unknown>);\n\n /**\n * Whether to track the initial page view on mount.\n * @default true\n */\n trackInitialPageView?: boolean;\n}\n\n/**\n * Composable for automatic page view tracking with Nuxt Router.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n *\n * const route = useRoute();\n *\n * useTrackPageViews({\n * route,\n * eventName: 'page_view',\n * additionalData: { site_section: 'main' }\n * });\n * </script>\n * ```\n */\nexport const useTrackPageViews = (options: TrackPageViewsOptions): void => {\n const {\n route,\n eventName = 'page_view',\n includeQueryParams = true,\n additionalData,\n trackInitialPageView = true\n } = options;\n\n // Try to get client from options or from context\n let client: GtmClient | undefined = options.client;\n\n if (!client) {\n try {\n client = useGtmClient();\n } catch {\n // Client not available from context, will throw later if needed\n }\n }\n\n if (!client) {\n console.warn(\n '[gtm-kit/nuxt] useTrackPageViews: No GTM client available. ' +\n 'Make sure GtmPlugin is installed or pass a client option.'\n );\n return;\n }\n\n const lastTrackedPath = ref<string>('');\n\n const getPagePath = (): string => {\n if (includeQueryParams) {\n return route.fullPath;\n }\n return route.path;\n };\n\n const getAdditionalData = (): Record<string, unknown> => {\n if (typeof additionalData === 'function') {\n return additionalData();\n }\n return additionalData ?? {};\n };\n\n const trackPageView = (): void => {\n const pagePath = getPagePath();\n\n // Skip if this path was already tracked\n if (pagePath === lastTrackedPath.value) {\n return;\n }\n\n lastTrackedPath.value = pagePath;\n\n client!.push({\n event: eventName,\n page_path: pagePath,\n page_location: typeof window !== 'undefined' ? window.location.href : undefined,\n page_title: typeof document !== 'undefined' ? document.title : undefined,\n ...getAdditionalData()\n });\n };\n\n // Track initial page view on mount if enabled\n onMounted(() => {\n if (trackInitialPageView) {\n trackPageView();\n }\n });\n\n // Watch for route changes\n watch(\n () => route.fullPath,\n () => {\n trackPageView();\n }\n );\n};\n\n// Note: Type augmentation for NuxtApp.$gtm should be done in the user's project\n// by adding a type declaration file with:\n//\n// declare module '#app' {\n// interface NuxtApp {\n// $gtm: import('@jwiedeman/gtm-kit-vue').GtmContext;\n// }\n// }\n","export type { NuxtGtmOptions, NuxtGtmContext } from './module';\nexport {\n createNuxtGtmPlugin,\n useNuxtGtm,\n useNuxtGtmPush,\n useNuxtGtmConsent,\n useNuxtGtmClient,\n useTrackPageViews\n} from './module';\n\n// Re-export Vue composables for convenience\nexport {\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n useGtmReady,\n GtmPlugin,\n GTM_INJECTION_KEY\n} from '@jwiedeman/gtm-kit-vue';\n\n// Re-export core types for convenience\nexport type {\n CreateGtmClientOptions,\n GtmClient,\n ConsentState,\n ConsentRegionOptions,\n DataLayerValue,\n ScriptLoadState\n} from '@jwiedeman/gtm-kit';\n\nexport { consentPresets, pushEvent, pushEcommerce } from '@jwiedeman/gtm-kit';\n"]}
1
+ {"version":3,"sources":["../src/module.ts","../src/index.ts"],"names":["ref","watch","onMounted","GtmPlugin","useGtm","useGtmPush","useGtmConsent","useGtmClient","createNuxtGtmPlugin","app","options","_a","client","useNuxtGtm","useNuxtGtmPush","useNuxtGtmConsent","useNuxtGtmClient","useTrackPageViews","route","eventName","includeQueryParams","additionalData","trackInitialPageView","e","lastTrackedPath","getPagePath","getAdditionalData","trackPageView","pagePath","useGtmReady","GTM_INJECTION_KEY","consentPresets","eeaDefault","allGranted","analyticsOnly","pushEvent","pushEcommerce"],"mappings":"AAAA,OAAS,OAAAA,EAAK,SAAAC,EAAO,aAAAC,MAA2B,MAEhD,OACE,aAAAC,EACA,UAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,MAGK,yBAmCA,IAAMC,EAAsB,CAACC,EAAUC,IAAuC,CA7CrF,IAAAC,EA+CEF,EAAI,IAAIN,EAAWO,CAAO,EAG1B,IAAME,GAAUD,EAAAF,EAAI,OAAO,iBAA2C,OAAtD,YAAAE,EAA4D,OAE5E,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gDAAgD,EAGlE,OAAOA,CACT,EAeaC,EAAaT,EAMbU,EAAiBT,EAMjBU,EAAoBT,EAMpBU,EAAmBT,EAgEnBU,EAAqBP,GAAyC,CACzE,GAAM,CACJ,MAAAQ,EACA,UAAAC,EAAY,YACZ,mBAAAC,EAAqB,GACrB,eAAAC,EACA,qBAAAC,EAAuB,EACzB,EAAIZ,EAGAE,EAAgCF,EAAQ,OAE5C,GAAI,CAACE,EACH,GAAI,CACFA,EAASL,EAAa,CACxB,OAAQgB,EAAA,CAER,CAGF,GAAI,CAACX,EAAQ,CACX,QAAQ,KACN,sHAEF,EACA,MACF,CAEA,IAAMY,EAAkBxB,EAAY,EAAE,EAEhCyB,EAAc,IACdL,EACKF,EAAM,SAERA,EAAM,KAGTQ,EAAoB,IACpB,OAAOL,GAAmB,WACrBA,EAAe,EAEjBA,GAAA,KAAAA,EAAkB,CAAC,EAGtBM,EAAgB,IAAY,CAChC,IAAMC,EAAWH,EAAY,EAGzBG,IAAaJ,EAAgB,QAIjCA,EAAgB,MAAQI,EAExBhB,EAAQ,KAAK,CACX,MAAOO,EACP,UAAWS,EACX,cAAe,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OACtE,WAAY,OAAO,UAAa,YAAc,SAAS,MAAQ,OAC/D,GAAGF,EAAkB,CACvB,CAAC,EACH,EAGAxB,EAAU,IAAM,CACVoB,GACFK,EAAc,CAElB,CAAC,EAGD1B,EACE,IAAMiB,EAAM,SACZ,IAAM,CACJS,EAAc,CAChB,CACF,CACF,EC5NA,OACE,UAAAvB,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,eAAAsB,EACA,aAAA1B,EACA,qBAAA2B,MACK,yBAYP,OAAS,kBAAAC,EAAgB,cAAAC,EAAY,cAAAC,EAAY,iBAAAC,EAAe,aAAAC,EAAW,iBAAAC,MAAqB","sourcesContent":["import { ref, watch, onMounted, type App } from 'vue';\nimport { type GtmClient } from '@jwiedeman/gtm-kit';\nimport {\n GtmPlugin,\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n type GtmPluginOptions,\n type GtmContext\n} from '@jwiedeman/gtm-kit-vue';\n\n/**\n * Options for the Nuxt GTM module.\n * Extends the Vue plugin options.\n *\n * For automatic page tracking, use the `useTrackPageViews` composable\n * in your app.vue or layout component.\n */\nexport type NuxtGtmOptions = GtmPluginOptions;\n\n/**\n * Extended context for Nuxt with additional helpers.\n */\nexport interface NuxtGtmContext extends GtmContext {\n /** Track a page view manually */\n trackPageView: (path?: string, additionalData?: Record<string, unknown>) => void;\n}\n\n/**\n * Creates a Nuxt plugin for GTM Kit.\n * Use this in your Nuxt plugins directory.\n *\n * @example\n * ```ts\n * // plugins/gtm.client.ts\n * import { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n *\n * export default defineNuxtPlugin((nuxtApp) => {\n * createNuxtGtmPlugin(nuxtApp.vueApp, {\n * containers: 'GTM-XXXXXX'\n * });\n * });\n * ```\n */\nexport const createNuxtGtmPlugin = (app: App, options: NuxtGtmOptions): GtmClient => {\n // Install the Vue plugin\n app.use(GtmPlugin, options);\n\n // Get the client from the Vue plugin\n const client = (app.config.globalProperties as { $gtm?: GtmContext }).$gtm?.client;\n\n if (!client) {\n throw new Error('[gtm-kit/nuxt] Failed to initialize GTM client');\n }\n\n return client;\n};\n\n/**\n * Composable for accessing the full GTM context in Nuxt.\n * This is an alias for useGtm() from @jwiedeman/gtm-kit-vue.\n *\n * @example\n * ```vue\n * <script setup>\n * const { push, client } = useNuxtGtm();\n *\n * push({ event: 'custom_event' });\n * </script>\n * ```\n */\nexport const useNuxtGtm = useGtm;\n\n/**\n * Composable for pushing events in Nuxt.\n * This is an alias for useGtmPush() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmPush = useGtmPush;\n\n/**\n * Composable for consent management in Nuxt.\n * This is an alias for useGtmConsent() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmConsent = useGtmConsent;\n\n/**\n * Composable for accessing the raw GTM client in Nuxt.\n * This is an alias for useGtmClient() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmClient = useGtmClient;\n\n/**\n * Options for the useTrackPageViews composable.\n */\nexport interface TrackPageViewsOptions {\n /**\n * The GTM client instance to use.\n * If not provided, will use the client from the Vue plugin context.\n */\n client?: GtmClient;\n\n /**\n * Reactive route object to watch for changes.\n * Use useRoute() from Nuxt.\n */\n route: {\n fullPath: string;\n path: string;\n query?: Record<string, unknown>;\n };\n\n /**\n * Custom page view event name.\n * @default 'page_view'\n */\n eventName?: string;\n\n /**\n * Whether to include query parameters in page path.\n * @default true\n */\n includeQueryParams?: boolean;\n\n /**\n * Additional data to include with each page view event.\n */\n additionalData?: Record<string, unknown> | (() => Record<string, unknown>);\n\n /**\n * Whether to track the initial page view on mount.\n * @default true\n */\n trackInitialPageView?: boolean;\n}\n\n/**\n * Composable for automatic page view tracking with Nuxt Router.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n *\n * const route = useRoute();\n *\n * useTrackPageViews({\n * route,\n * eventName: 'page_view',\n * additionalData: { site_section: 'main' }\n * });\n * </script>\n * ```\n */\nexport const useTrackPageViews = (options: TrackPageViewsOptions): void => {\n const {\n route,\n eventName = 'page_view',\n includeQueryParams = true,\n additionalData,\n trackInitialPageView = true\n } = options;\n\n // Try to get client from options or from context\n let client: GtmClient | undefined = options.client;\n\n if (!client) {\n try {\n client = useGtmClient();\n } catch {\n // Client not available from context, will throw later if needed\n }\n }\n\n if (!client) {\n console.warn(\n '[gtm-kit/nuxt] useTrackPageViews: No GTM client available. ' +\n 'Make sure GtmPlugin is installed or pass a client option.'\n );\n return;\n }\n\n const lastTrackedPath = ref<string>('');\n\n const getPagePath = (): string => {\n if (includeQueryParams) {\n return route.fullPath;\n }\n return route.path;\n };\n\n const getAdditionalData = (): Record<string, unknown> => {\n if (typeof additionalData === 'function') {\n return additionalData();\n }\n return additionalData ?? {};\n };\n\n const trackPageView = (): void => {\n const pagePath = getPagePath();\n\n // Skip if this path was already tracked\n if (pagePath === lastTrackedPath.value) {\n return;\n }\n\n lastTrackedPath.value = pagePath;\n\n client!.push({\n event: eventName,\n page_path: pagePath,\n page_location: typeof window !== 'undefined' ? window.location.href : undefined,\n page_title: typeof document !== 'undefined' ? document.title : undefined,\n ...getAdditionalData()\n });\n };\n\n // Track initial page view on mount if enabled\n onMounted(() => {\n if (trackInitialPageView) {\n trackPageView();\n }\n });\n\n // Watch for route changes\n watch(\n () => route.fullPath,\n () => {\n trackPageView();\n }\n );\n};\n\n// Note: Type augmentation for NuxtApp.$gtm should be done in the user's project\n// by adding a type declaration file with:\n//\n// declare module '#app' {\n// interface NuxtApp {\n// $gtm: import('@jwiedeman/gtm-kit-vue').GtmContext;\n// }\n// }\n","export type { NuxtGtmOptions, NuxtGtmContext } from './module';\nexport {\n createNuxtGtmPlugin,\n useNuxtGtm,\n useNuxtGtmPush,\n useNuxtGtmConsent,\n useNuxtGtmClient,\n useTrackPageViews\n} from './module';\n\n// Re-export Vue composables for convenience\nexport {\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n useGtmReady,\n GtmPlugin,\n GTM_INJECTION_KEY\n} from '@jwiedeman/gtm-kit-vue';\n\n// Re-export core types for convenience\nexport type {\n CreateGtmClientOptions,\n GtmClient,\n ConsentState,\n ConsentRegionOptions,\n DataLayerValue,\n ScriptLoadState\n} from '@jwiedeman/gtm-kit';\n\nexport { consentPresets, eeaDefault, allGranted, analyticsOnly, pushEvent, pushEcommerce } from '@jwiedeman/gtm-kit';\n"]}
package/dist/index.d.cts CHANGED
@@ -3,7 +3,7 @@ import { GtmPluginOptions, GtmContext } from '@jwiedeman/gtm-kit-vue';
3
3
  export { GTM_INJECTION_KEY, GtmPlugin, useGtm, useGtmClient, useGtmConsent, useGtmPush, useGtmReady } from '@jwiedeman/gtm-kit-vue';
4
4
  import * as _jwiedeman_gtm_kit from '@jwiedeman/gtm-kit';
5
5
  import { GtmClient } from '@jwiedeman/gtm-kit';
6
- export { ConsentRegionOptions, ConsentState, CreateGtmClientOptions, DataLayerValue, GtmClient, ScriptLoadState, consentPresets, pushEcommerce, pushEvent } from '@jwiedeman/gtm-kit';
6
+ export { ConsentRegionOptions, ConsentState, CreateGtmClientOptions, DataLayerValue, GtmClient, ScriptLoadState, allGranted, analyticsOnly, consentPresets, eeaDefault, pushEcommerce, pushEvent } from '@jwiedeman/gtm-kit';
7
7
  import { App } from 'vue';
8
8
 
9
9
  /**
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import { GtmPluginOptions, GtmContext } from '@jwiedeman/gtm-kit-vue';
3
3
  export { GTM_INJECTION_KEY, GtmPlugin, useGtm, useGtmClient, useGtmConsent, useGtmPush, useGtmReady } from '@jwiedeman/gtm-kit-vue';
4
4
  import * as _jwiedeman_gtm_kit from '@jwiedeman/gtm-kit';
5
5
  import { GtmClient } from '@jwiedeman/gtm-kit';
6
- export { ConsentRegionOptions, ConsentState, CreateGtmClientOptions, DataLayerValue, GtmClient, ScriptLoadState, consentPresets, pushEcommerce, pushEvent } from '@jwiedeman/gtm-kit';
6
+ export { ConsentRegionOptions, ConsentState, CreateGtmClientOptions, DataLayerValue, GtmClient, ScriptLoadState, allGranted, analyticsOnly, consentPresets, eeaDefault, pushEcommerce, pushEvent } from '@jwiedeman/gtm-kit';
7
7
  import { App } from 'vue';
8
8
 
9
9
  /**
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { ref, onMounted, watch } from 'vue';
2
2
  import { GtmPlugin, useGtm, useGtmPush, useGtmConsent, useGtmClient } from '@jwiedeman/gtm-kit-vue';
3
3
  export { GTM_INJECTION_KEY, GtmPlugin, useGtm, useGtmClient, useGtmConsent, useGtmPush, useGtmReady } from '@jwiedeman/gtm-kit-vue';
4
- export { consentPresets, pushEcommerce, pushEvent } from '@jwiedeman/gtm-kit';
4
+ export { allGranted, analyticsOnly, consentPresets, eeaDefault, pushEcommerce, pushEvent } from '@jwiedeman/gtm-kit';
5
5
 
6
- var C=(t,e)=>{var o;t.use(GtmPlugin,e);let i=(o=t.config.globalProperties.$gtm)==null?void 0:o.client;if(!i)throw new Error("[gtm-kit/nuxt] Failed to initialize GTM client");return i},h=useGtm,N=useGtmPush,k=useGtmConsent,y=useGtmClient,v=t=>{let{route:e,eventName:i="page_view",includeQueryParams:o=!0,additionalData:n,trackInitialPageView:l=!0}=t,r=t.client;if(!r)try{r=useGtmClient();}catch(u){}if(!r){console.warn("[gtm-kit/nuxt] useTrackPageViews: No GTM client available. Make sure GtmPlugin is installed or pass a client option.");return}let s=ref(""),c=()=>o?e.fullPath:e.path,p=()=>typeof n=="function"?n():n!=null?n:{},a=()=>{let u=c();u!==s.value&&(s.value=u,r.push({event:i,page_path:u,page_location:typeof window!="undefined"?window.location.href:void 0,page_title:typeof document!="undefined"?document.title:void 0,...p()}));};onMounted(()=>{l&&a();}),watch(()=>e.fullPath,()=>{a();});};
6
+ var C=(t,e)=>{var o;t.use(GtmPlugin,e);let i=(o=t.config.globalProperties.$gtm)==null?void 0:o.client;if(!i)throw new Error("[gtm-kit/nuxt] Failed to initialize GTM client");return i},h=useGtm,N=useGtmPush,k=useGtmConsent,y=useGtmClient,v=t=>{let{route:e,eventName:i="page_view",includeQueryParams:o=!0,additionalData:n,trackInitialPageView:l=!0}=t,r=t.client;if(!r)try{r=useGtmClient();}catch(u){}if(!r){console.warn("[gtm-kit/nuxt] useTrackPageViews: No GTM client available. Make sure GtmPlugin is installed or pass a client option.");return}let a=ref(""),c=()=>o?e.fullPath:e.path,p=()=>typeof n=="function"?n():n!=null?n:{},s=()=>{let u=c();u!==a.value&&(a.value=u,r.push({event:i,page_path:u,page_location:typeof window!="undefined"?window.location.href:void 0,page_title:typeof document!="undefined"?document.title:void 0,...p()}));};onMounted(()=>{l&&s();}),watch(()=>e.fullPath,()=>{s();});};
7
7
 
8
8
  export { C as createNuxtGtmPlugin, h as useNuxtGtm, y as useNuxtGtmClient, k as useNuxtGtmConsent, N as useNuxtGtmPush, v as useTrackPageViews };
9
9
  //# sourceMappingURL=out.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/module.ts","../src/index.ts"],"names":["ref","watch","onMounted","GtmPlugin","useGtm","useGtmPush","useGtmConsent","useGtmClient","createNuxtGtmPlugin","app","options","_a","client","useNuxtGtm","useNuxtGtmPush","useNuxtGtmConsent","useNuxtGtmClient","useTrackPageViews","route","eventName","includeQueryParams","additionalData","trackInitialPageView","e","lastTrackedPath","getPagePath","getAdditionalData","trackPageView","pagePath","useGtmReady","GTM_INJECTION_KEY","consentPresets","pushEvent","pushEcommerce"],"mappings":"AAAA,OAAS,OAAAA,EAAK,SAAAC,EAAO,aAAAC,MAA2B,MAEhD,OACE,aAAAC,EACA,UAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,MAGK,yBAmCA,IAAMC,EAAsB,CAACC,EAAUC,IAAuC,CA7CrF,IAAAC,EA+CEF,EAAI,IAAIN,EAAWO,CAAO,EAG1B,IAAME,GAAUD,EAAAF,EAAI,OAAO,iBAA2C,OAAtD,YAAAE,EAA4D,OAE5E,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gDAAgD,EAGlE,OAAOA,CACT,EAeaC,EAAaT,EAMbU,EAAiBT,EAMjBU,EAAoBT,EAMpBU,EAAmBT,EAgEnBU,EAAqBP,GAAyC,CACzE,GAAM,CACJ,MAAAQ,EACA,UAAAC,EAAY,YACZ,mBAAAC,EAAqB,GACrB,eAAAC,EACA,qBAAAC,EAAuB,EACzB,EAAIZ,EAGAE,EAAgCF,EAAQ,OAE5C,GAAI,CAACE,EACH,GAAI,CACFA,EAASL,EAAa,CACxB,OAAQgB,EAAA,CAER,CAGF,GAAI,CAACX,EAAQ,CACX,QAAQ,KACN,sHAEF,EACA,MACF,CAEA,IAAMY,EAAkBxB,EAAY,EAAE,EAEhCyB,EAAc,IACdL,EACKF,EAAM,SAERA,EAAM,KAGTQ,EAAoB,IACpB,OAAOL,GAAmB,WACrBA,EAAe,EAEjBA,GAAA,KAAAA,EAAkB,CAAC,EAGtBM,EAAgB,IAAY,CAChC,IAAMC,EAAWH,EAAY,EAGzBG,IAAaJ,EAAgB,QAIjCA,EAAgB,MAAQI,EAExBhB,EAAQ,KAAK,CACX,MAAOO,EACP,UAAWS,EACX,cAAe,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OACtE,WAAY,OAAO,UAAa,YAAc,SAAS,MAAQ,OAC/D,GAAGF,EAAkB,CACvB,CAAC,EACH,EAGAxB,EAAU,IAAM,CACVoB,GACFK,EAAc,CAElB,CAAC,EAGD1B,EACE,IAAMiB,EAAM,SACZ,IAAM,CACJS,EAAc,CAChB,CACF,CACF,EC5NA,OACE,UAAAvB,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,eAAAsB,EACA,aAAA1B,EACA,qBAAA2B,MACK,yBAYP,OAAS,kBAAAC,EAAgB,aAAAC,EAAW,iBAAAC,MAAqB","sourcesContent":["import { ref, watch, onMounted, type App } from 'vue';\nimport { type GtmClient } from '@jwiedeman/gtm-kit';\nimport {\n GtmPlugin,\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n type GtmPluginOptions,\n type GtmContext\n} from '@jwiedeman/gtm-kit-vue';\n\n/**\n * Options for the Nuxt GTM module.\n * Extends the Vue plugin options.\n *\n * For automatic page tracking, use the `useTrackPageViews` composable\n * in your app.vue or layout component.\n */\nexport type NuxtGtmOptions = GtmPluginOptions;\n\n/**\n * Extended context for Nuxt with additional helpers.\n */\nexport interface NuxtGtmContext extends GtmContext {\n /** Track a page view manually */\n trackPageView: (path?: string, additionalData?: Record<string, unknown>) => void;\n}\n\n/**\n * Creates a Nuxt plugin for GTM Kit.\n * Use this in your Nuxt plugins directory.\n *\n * @example\n * ```ts\n * // plugins/gtm.client.ts\n * import { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n *\n * export default defineNuxtPlugin((nuxtApp) => {\n * createNuxtGtmPlugin(nuxtApp.vueApp, {\n * containers: 'GTM-XXXXXX'\n * });\n * });\n * ```\n */\nexport const createNuxtGtmPlugin = (app: App, options: NuxtGtmOptions): GtmClient => {\n // Install the Vue plugin\n app.use(GtmPlugin, options);\n\n // Get the client from the Vue plugin\n const client = (app.config.globalProperties as { $gtm?: GtmContext }).$gtm?.client;\n\n if (!client) {\n throw new Error('[gtm-kit/nuxt] Failed to initialize GTM client');\n }\n\n return client;\n};\n\n/**\n * Composable for accessing the full GTM context in Nuxt.\n * This is an alias for useGtm() from @jwiedeman/gtm-kit-vue.\n *\n * @example\n * ```vue\n * <script setup>\n * const { push, client } = useNuxtGtm();\n *\n * push({ event: 'custom_event' });\n * </script>\n * ```\n */\nexport const useNuxtGtm = useGtm;\n\n/**\n * Composable for pushing events in Nuxt.\n * This is an alias for useGtmPush() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmPush = useGtmPush;\n\n/**\n * Composable for consent management in Nuxt.\n * This is an alias for useGtmConsent() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmConsent = useGtmConsent;\n\n/**\n * Composable for accessing the raw GTM client in Nuxt.\n * This is an alias for useGtmClient() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmClient = useGtmClient;\n\n/**\n * Options for the useTrackPageViews composable.\n */\nexport interface TrackPageViewsOptions {\n /**\n * The GTM client instance to use.\n * If not provided, will use the client from the Vue plugin context.\n */\n client?: GtmClient;\n\n /**\n * Reactive route object to watch for changes.\n * Use useRoute() from Nuxt.\n */\n route: {\n fullPath: string;\n path: string;\n query?: Record<string, unknown>;\n };\n\n /**\n * Custom page view event name.\n * @default 'page_view'\n */\n eventName?: string;\n\n /**\n * Whether to include query parameters in page path.\n * @default true\n */\n includeQueryParams?: boolean;\n\n /**\n * Additional data to include with each page view event.\n */\n additionalData?: Record<string, unknown> | (() => Record<string, unknown>);\n\n /**\n * Whether to track the initial page view on mount.\n * @default true\n */\n trackInitialPageView?: boolean;\n}\n\n/**\n * Composable for automatic page view tracking with Nuxt Router.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n *\n * const route = useRoute();\n *\n * useTrackPageViews({\n * route,\n * eventName: 'page_view',\n * additionalData: { site_section: 'main' }\n * });\n * </script>\n * ```\n */\nexport const useTrackPageViews = (options: TrackPageViewsOptions): void => {\n const {\n route,\n eventName = 'page_view',\n includeQueryParams = true,\n additionalData,\n trackInitialPageView = true\n } = options;\n\n // Try to get client from options or from context\n let client: GtmClient | undefined = options.client;\n\n if (!client) {\n try {\n client = useGtmClient();\n } catch {\n // Client not available from context, will throw later if needed\n }\n }\n\n if (!client) {\n console.warn(\n '[gtm-kit/nuxt] useTrackPageViews: No GTM client available. ' +\n 'Make sure GtmPlugin is installed or pass a client option.'\n );\n return;\n }\n\n const lastTrackedPath = ref<string>('');\n\n const getPagePath = (): string => {\n if (includeQueryParams) {\n return route.fullPath;\n }\n return route.path;\n };\n\n const getAdditionalData = (): Record<string, unknown> => {\n if (typeof additionalData === 'function') {\n return additionalData();\n }\n return additionalData ?? {};\n };\n\n const trackPageView = (): void => {\n const pagePath = getPagePath();\n\n // Skip if this path was already tracked\n if (pagePath === lastTrackedPath.value) {\n return;\n }\n\n lastTrackedPath.value = pagePath;\n\n client!.push({\n event: eventName,\n page_path: pagePath,\n page_location: typeof window !== 'undefined' ? window.location.href : undefined,\n page_title: typeof document !== 'undefined' ? document.title : undefined,\n ...getAdditionalData()\n });\n };\n\n // Track initial page view on mount if enabled\n onMounted(() => {\n if (trackInitialPageView) {\n trackPageView();\n }\n });\n\n // Watch for route changes\n watch(\n () => route.fullPath,\n () => {\n trackPageView();\n }\n );\n};\n\n// Note: Type augmentation for NuxtApp.$gtm should be done in the user's project\n// by adding a type declaration file with:\n//\n// declare module '#app' {\n// interface NuxtApp {\n// $gtm: import('@jwiedeman/gtm-kit-vue').GtmContext;\n// }\n// }\n","export type { NuxtGtmOptions, NuxtGtmContext } from './module';\nexport {\n createNuxtGtmPlugin,\n useNuxtGtm,\n useNuxtGtmPush,\n useNuxtGtmConsent,\n useNuxtGtmClient,\n useTrackPageViews\n} from './module';\n\n// Re-export Vue composables for convenience\nexport {\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n useGtmReady,\n GtmPlugin,\n GTM_INJECTION_KEY\n} from '@jwiedeman/gtm-kit-vue';\n\n// Re-export core types for convenience\nexport type {\n CreateGtmClientOptions,\n GtmClient,\n ConsentState,\n ConsentRegionOptions,\n DataLayerValue,\n ScriptLoadState\n} from '@jwiedeman/gtm-kit';\n\nexport { consentPresets, pushEvent, pushEcommerce } from '@jwiedeman/gtm-kit';\n"]}
1
+ {"version":3,"sources":["../src/module.ts","../src/index.ts"],"names":["ref","watch","onMounted","GtmPlugin","useGtm","useGtmPush","useGtmConsent","useGtmClient","createNuxtGtmPlugin","app","options","_a","client","useNuxtGtm","useNuxtGtmPush","useNuxtGtmConsent","useNuxtGtmClient","useTrackPageViews","route","eventName","includeQueryParams","additionalData","trackInitialPageView","e","lastTrackedPath","getPagePath","getAdditionalData","trackPageView","pagePath","useGtmReady","GTM_INJECTION_KEY","consentPresets","eeaDefault","allGranted","analyticsOnly","pushEvent","pushEcommerce"],"mappings":"AAAA,OAAS,OAAAA,EAAK,SAAAC,EAAO,aAAAC,MAA2B,MAEhD,OACE,aAAAC,EACA,UAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,MAGK,yBAmCA,IAAMC,EAAsB,CAACC,EAAUC,IAAuC,CA7CrF,IAAAC,EA+CEF,EAAI,IAAIN,EAAWO,CAAO,EAG1B,IAAME,GAAUD,EAAAF,EAAI,OAAO,iBAA2C,OAAtD,YAAAE,EAA4D,OAE5E,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gDAAgD,EAGlE,OAAOA,CACT,EAeaC,EAAaT,EAMbU,EAAiBT,EAMjBU,EAAoBT,EAMpBU,EAAmBT,EAgEnBU,EAAqBP,GAAyC,CACzE,GAAM,CACJ,MAAAQ,EACA,UAAAC,EAAY,YACZ,mBAAAC,EAAqB,GACrB,eAAAC,EACA,qBAAAC,EAAuB,EACzB,EAAIZ,EAGAE,EAAgCF,EAAQ,OAE5C,GAAI,CAACE,EACH,GAAI,CACFA,EAASL,EAAa,CACxB,OAAQgB,EAAA,CAER,CAGF,GAAI,CAACX,EAAQ,CACX,QAAQ,KACN,sHAEF,EACA,MACF,CAEA,IAAMY,EAAkBxB,EAAY,EAAE,EAEhCyB,EAAc,IACdL,EACKF,EAAM,SAERA,EAAM,KAGTQ,EAAoB,IACpB,OAAOL,GAAmB,WACrBA,EAAe,EAEjBA,GAAA,KAAAA,EAAkB,CAAC,EAGtBM,EAAgB,IAAY,CAChC,IAAMC,EAAWH,EAAY,EAGzBG,IAAaJ,EAAgB,QAIjCA,EAAgB,MAAQI,EAExBhB,EAAQ,KAAK,CACX,MAAOO,EACP,UAAWS,EACX,cAAe,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OACtE,WAAY,OAAO,UAAa,YAAc,SAAS,MAAQ,OAC/D,GAAGF,EAAkB,CACvB,CAAC,EACH,EAGAxB,EAAU,IAAM,CACVoB,GACFK,EAAc,CAElB,CAAC,EAGD1B,EACE,IAAMiB,EAAM,SACZ,IAAM,CACJS,EAAc,CAChB,CACF,CACF,EC5NA,OACE,UAAAvB,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,eAAAsB,EACA,aAAA1B,EACA,qBAAA2B,MACK,yBAYP,OAAS,kBAAAC,EAAgB,cAAAC,EAAY,cAAAC,EAAY,iBAAAC,EAAe,aAAAC,EAAW,iBAAAC,MAAqB","sourcesContent":["import { ref, watch, onMounted, type App } from 'vue';\nimport { type GtmClient } from '@jwiedeman/gtm-kit';\nimport {\n GtmPlugin,\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n type GtmPluginOptions,\n type GtmContext\n} from '@jwiedeman/gtm-kit-vue';\n\n/**\n * Options for the Nuxt GTM module.\n * Extends the Vue plugin options.\n *\n * For automatic page tracking, use the `useTrackPageViews` composable\n * in your app.vue or layout component.\n */\nexport type NuxtGtmOptions = GtmPluginOptions;\n\n/**\n * Extended context for Nuxt with additional helpers.\n */\nexport interface NuxtGtmContext extends GtmContext {\n /** Track a page view manually */\n trackPageView: (path?: string, additionalData?: Record<string, unknown>) => void;\n}\n\n/**\n * Creates a Nuxt plugin for GTM Kit.\n * Use this in your Nuxt plugins directory.\n *\n * @example\n * ```ts\n * // plugins/gtm.client.ts\n * import { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n *\n * export default defineNuxtPlugin((nuxtApp) => {\n * createNuxtGtmPlugin(nuxtApp.vueApp, {\n * containers: 'GTM-XXXXXX'\n * });\n * });\n * ```\n */\nexport const createNuxtGtmPlugin = (app: App, options: NuxtGtmOptions): GtmClient => {\n // Install the Vue plugin\n app.use(GtmPlugin, options);\n\n // Get the client from the Vue plugin\n const client = (app.config.globalProperties as { $gtm?: GtmContext }).$gtm?.client;\n\n if (!client) {\n throw new Error('[gtm-kit/nuxt] Failed to initialize GTM client');\n }\n\n return client;\n};\n\n/**\n * Composable for accessing the full GTM context in Nuxt.\n * This is an alias for useGtm() from @jwiedeman/gtm-kit-vue.\n *\n * @example\n * ```vue\n * <script setup>\n * const { push, client } = useNuxtGtm();\n *\n * push({ event: 'custom_event' });\n * </script>\n * ```\n */\nexport const useNuxtGtm = useGtm;\n\n/**\n * Composable for pushing events in Nuxt.\n * This is an alias for useGtmPush() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmPush = useGtmPush;\n\n/**\n * Composable for consent management in Nuxt.\n * This is an alias for useGtmConsent() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmConsent = useGtmConsent;\n\n/**\n * Composable for accessing the raw GTM client in Nuxt.\n * This is an alias for useGtmClient() from @jwiedeman/gtm-kit-vue.\n */\nexport const useNuxtGtmClient = useGtmClient;\n\n/**\n * Options for the useTrackPageViews composable.\n */\nexport interface TrackPageViewsOptions {\n /**\n * The GTM client instance to use.\n * If not provided, will use the client from the Vue plugin context.\n */\n client?: GtmClient;\n\n /**\n * Reactive route object to watch for changes.\n * Use useRoute() from Nuxt.\n */\n route: {\n fullPath: string;\n path: string;\n query?: Record<string, unknown>;\n };\n\n /**\n * Custom page view event name.\n * @default 'page_view'\n */\n eventName?: string;\n\n /**\n * Whether to include query parameters in page path.\n * @default true\n */\n includeQueryParams?: boolean;\n\n /**\n * Additional data to include with each page view event.\n */\n additionalData?: Record<string, unknown> | (() => Record<string, unknown>);\n\n /**\n * Whether to track the initial page view on mount.\n * @default true\n */\n trackInitialPageView?: boolean;\n}\n\n/**\n * Composable for automatic page view tracking with Nuxt Router.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n *\n * const route = useRoute();\n *\n * useTrackPageViews({\n * route,\n * eventName: 'page_view',\n * additionalData: { site_section: 'main' }\n * });\n * </script>\n * ```\n */\nexport const useTrackPageViews = (options: TrackPageViewsOptions): void => {\n const {\n route,\n eventName = 'page_view',\n includeQueryParams = true,\n additionalData,\n trackInitialPageView = true\n } = options;\n\n // Try to get client from options or from context\n let client: GtmClient | undefined = options.client;\n\n if (!client) {\n try {\n client = useGtmClient();\n } catch {\n // Client not available from context, will throw later if needed\n }\n }\n\n if (!client) {\n console.warn(\n '[gtm-kit/nuxt] useTrackPageViews: No GTM client available. ' +\n 'Make sure GtmPlugin is installed or pass a client option.'\n );\n return;\n }\n\n const lastTrackedPath = ref<string>('');\n\n const getPagePath = (): string => {\n if (includeQueryParams) {\n return route.fullPath;\n }\n return route.path;\n };\n\n const getAdditionalData = (): Record<string, unknown> => {\n if (typeof additionalData === 'function') {\n return additionalData();\n }\n return additionalData ?? {};\n };\n\n const trackPageView = (): void => {\n const pagePath = getPagePath();\n\n // Skip if this path was already tracked\n if (pagePath === lastTrackedPath.value) {\n return;\n }\n\n lastTrackedPath.value = pagePath;\n\n client!.push({\n event: eventName,\n page_path: pagePath,\n page_location: typeof window !== 'undefined' ? window.location.href : undefined,\n page_title: typeof document !== 'undefined' ? document.title : undefined,\n ...getAdditionalData()\n });\n };\n\n // Track initial page view on mount if enabled\n onMounted(() => {\n if (trackInitialPageView) {\n trackPageView();\n }\n });\n\n // Watch for route changes\n watch(\n () => route.fullPath,\n () => {\n trackPageView();\n }\n );\n};\n\n// Note: Type augmentation for NuxtApp.$gtm should be done in the user's project\n// by adding a type declaration file with:\n//\n// declare module '#app' {\n// interface NuxtApp {\n// $gtm: import('@jwiedeman/gtm-kit-vue').GtmContext;\n// }\n// }\n","export type { NuxtGtmOptions, NuxtGtmContext } from './module';\nexport {\n createNuxtGtmPlugin,\n useNuxtGtm,\n useNuxtGtmPush,\n useNuxtGtmConsent,\n useNuxtGtmClient,\n useTrackPageViews\n} from './module';\n\n// Re-export Vue composables for convenience\nexport {\n useGtm,\n useGtmPush,\n useGtmConsent,\n useGtmClient,\n useGtmReady,\n GtmPlugin,\n GTM_INJECTION_KEY\n} from '@jwiedeman/gtm-kit-vue';\n\n// Re-export core types for convenience\nexport type {\n CreateGtmClientOptions,\n GtmClient,\n ConsentState,\n ConsentRegionOptions,\n DataLayerValue,\n ScriptLoadState\n} from '@jwiedeman/gtm-kit';\n\nexport { consentPresets, eeaDefault, allGranted, analyticsOnly, pushEvent, pushEcommerce } from '@jwiedeman/gtm-kit';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jwiedeman/gtm-kit-nuxt",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "Nuxt 3 module for GTM Kit - Google Tag Manager integration with auto page tracking.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,8 +41,8 @@
41
41
  "typecheck": "tsc --noEmit"
42
42
  },
43
43
  "dependencies": {
44
- "@jwiedeman/gtm-kit": "^1.1.1",
45
- "@jwiedeman/gtm-kit-vue": "^1.1.1"
44
+ "@jwiedeman/gtm-kit": "^1.1.3",
45
+ "@jwiedeman/gtm-kit-vue": "^1.1.3"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "nuxt": "^3.0.0",