@jwiedeman/gtm-kit-cli 1.1.2 → 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,8 +1,8 @@
1
- # @react-gtm-kit/cli
1
+ # @jwiedeman/gtm-kit-cli
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=cli)](https://codecov.io/gh/jwiedeman/react-gtm-kit)
5
- [![npm version](https://img.shields.io/npm/v/@react-gtm-kit/cli.svg)](https://www.npmjs.com/package/@react-gtm-kit/cli)
5
+ [![npm version](https://img.shields.io/npm/v/@jwiedeman/gtm-kit-cli.svg)](https://www.npmjs.com/package/@jwiedeman/gtm-kit-cli)
6
6
  [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
8
  [![Node.js](https://img.shields.io/badge/Node.js-18+-339933.svg?logo=node.js)](https://nodejs.org/)
@@ -16,7 +16,7 @@ The CLI tool for GTM Kit - get up and running in under 60 seconds.
16
16
  ## Quick Start
17
17
 
18
18
  ```bash
19
- npx @react-gtm-kit/cli init
19
+ npx @jwiedeman/gtm-kit-cli init
20
20
  ```
21
21
 
22
22
  That's it. The CLI will:
@@ -34,10 +34,11 @@ That's it. The CLI will:
34
34
  ### `init` - Interactive Setup
35
35
 
36
36
  ```bash
37
- npx @react-gtm-kit/cli init
37
+ npx @jwiedeman/gtm-kit-cli init
38
38
  ```
39
39
 
40
40
  Walks you through the complete setup with prompts for:
41
+
41
42
  - GTM container ID
42
43
  - Consent Mode v2 configuration
43
44
  - File locations
@@ -45,7 +46,7 @@ Walks you through the complete setup with prompts for:
45
46
  ### `init <GTM-ID>` - Quick Setup
46
47
 
47
48
  ```bash
48
- npx @react-gtm-kit/cli init GTM-XXXXXX
49
+ npx @jwiedeman/gtm-kit-cli init GTM-XXXXXX
49
50
  ```
50
51
 
51
52
  Skip the prompts if you already know your GTM ID.
@@ -53,7 +54,7 @@ Skip the prompts if you already know your GTM ID.
53
54
  ### `detect` - Framework Detection
54
55
 
55
56
  ```bash
56
- npx @react-gtm-kit/cli detect
57
+ npx @jwiedeman/gtm-kit-cli detect
57
58
  ```
58
59
 
59
60
  Shows what framework and package manager the CLI detected.
@@ -61,7 +62,7 @@ Shows what framework and package manager the CLI detected.
61
62
  ### `validate <GTM-ID>` - ID Validation
62
63
 
63
64
  ```bash
64
- npx @react-gtm-kit/cli validate GTM-XXXXXX
65
+ npx @jwiedeman/gtm-kit-cli validate GTM-XXXXXX
65
66
  ```
66
67
 
67
68
  Validates a GTM container ID format.
@@ -69,7 +70,7 @@ Validates a GTM container ID format.
69
70
  ### `generate <GTM-ID>` - Code Generation
70
71
 
71
72
  ```bash
72
- npx @react-gtm-kit/cli generate GTM-XXXXXX
73
+ npx @jwiedeman/gtm-kit-cli generate GTM-XXXXXX
73
74
  ```
74
75
 
75
76
  Generates setup code without installing packages.
@@ -78,13 +79,13 @@ Generates setup code without installing packages.
78
79
 
79
80
  ## Supported Frameworks
80
81
 
81
- | Framework | Detection | Priority |
82
- |-----------|-----------|----------|
83
- | Nuxt 3 | `nuxt.config.ts/js` | Highest |
84
- | Next.js | `next.config.ts/js/mjs` | High |
85
- | Vue 3 | `vue` in dependencies | Medium |
86
- | React | `react` in dependencies | Low |
87
- | Vanilla | Default fallback | Lowest |
82
+ | Framework | Detection | Priority |
83
+ | --------- | ----------------------- | -------- |
84
+ | Nuxt 3 | `nuxt.config.ts/js` | Highest |
85
+ | Next.js | `next.config.ts/js/mjs` | High |
86
+ | Vue 3 | `vue` in dependencies | Medium |
87
+ | React | `react` in dependencies | Low |
88
+ | Vanilla | Default fallback | Lowest |
88
89
 
89
90
  The CLI uses priority order because some projects have multiple frameworks (e.g., Next.js includes React).
90
91
 
@@ -94,12 +95,12 @@ The CLI uses priority order because some projects have multiple frameworks (e.g.
94
95
 
95
96
  The CLI automatically detects your package manager:
96
97
 
97
- | Package Manager | Detection |
98
- |-----------------|-----------|
99
- | pnpm | `pnpm-lock.yaml` |
100
- | yarn | `yarn.lock` |
101
- | bun | `bun.lockb` |
102
- | npm | Default fallback |
98
+ | Package Manager | Detection |
99
+ | --------------- | ---------------- |
100
+ | pnpm | `pnpm-lock.yaml` |
101
+ | yarn | `yarn.lock` |
102
+ | bun | `bun.lockb` |
103
+ | npm | Default fallback |
103
104
 
104
105
  ---
105
106
 
@@ -109,14 +110,10 @@ The CLI automatically detects your package manager:
109
110
 
110
111
  ```tsx
111
112
  // src/gtm.tsx (generated)
112
- import { GtmProvider } from '@react-gtm-kit/react-modern';
113
+ import { GtmProvider } from '@jwiedeman/gtm-kit-react';
113
114
 
114
115
  export function GtmWrapper({ children }) {
115
- return (
116
- <GtmProvider config={{ containers: 'GTM-XXXXXX' }}>
117
- {children}
118
- </GtmProvider>
119
- );
116
+ return <GtmProvider config={{ containers: 'GTM-XXXXXX' }}>{children}</GtmProvider>;
120
117
  }
121
118
  ```
122
119
 
@@ -124,7 +121,7 @@ export function GtmWrapper({ children }) {
124
121
 
125
122
  ```ts
126
123
  // src/plugins/gtm.ts (generated)
127
- import { GtmPlugin } from '@react-gtm-kit/vue';
124
+ import { GtmPlugin } from '@jwiedeman/gtm-kit-vue';
128
125
 
129
126
  export function setupGtm(app) {
130
127
  app.use(GtmPlugin, { containers: 'GTM-XXXXXX' });
@@ -135,7 +132,7 @@ export function setupGtm(app) {
135
132
 
136
133
  ```tsx
137
134
  // app/layout.tsx additions (generated)
138
- import { GtmHeadScript, GtmNoScript } from '@react-gtm-kit/next';
135
+ import { GtmHeadScript, GtmNoScript } from '@jwiedeman/gtm-kit-next';
139
136
 
140
137
  // Add to <head>: <GtmHeadScript containers="GTM-XXXXXX" />
141
138
  // Add to <body>: <GtmNoScript containers="GTM-XXXXXX" />
@@ -145,7 +142,7 @@ import { GtmHeadScript, GtmNoScript } from '@react-gtm-kit/next';
145
142
 
146
143
  ```ts
147
144
  // plugins/gtm.client.ts (generated)
148
- import { GtmPlugin } from '@react-gtm-kit/nuxt';
145
+ import { GtmPlugin } from '@jwiedeman/gtm-kit-nuxt';
149
146
 
150
147
  export default defineNuxtPlugin((nuxtApp) => {
151
148
  nuxtApp.vueApp.use(GtmPlugin, { containers: 'GTM-XXXXXX' });
@@ -161,7 +158,7 @@ export default defineNuxtPlugin((nuxtApp) => {
161
158
  Preview what would happen without making changes.
162
159
 
163
160
  ```bash
164
- npx @react-gtm-kit/cli init --dry-run
161
+ npx @jwiedeman/gtm-kit-cli init --dry-run
165
162
  ```
166
163
 
167
164
  ### `--typescript` / `--no-typescript`
@@ -169,8 +166,8 @@ npx @react-gtm-kit/cli init --dry-run
169
166
  Force TypeScript or JavaScript output.
170
167
 
171
168
  ```bash
172
- npx @react-gtm-kit/cli init --typescript
173
- npx @react-gtm-kit/cli init --no-typescript
169
+ npx @jwiedeman/gtm-kit-cli init --typescript
170
+ npx @jwiedeman/gtm-kit-cli init --no-typescript
174
171
  ```
175
172
 
176
173
  ### `--consent`
@@ -178,7 +175,7 @@ npx @react-gtm-kit/cli init --no-typescript
178
175
  Include Consent Mode v2 configuration.
179
176
 
180
177
  ```bash
181
- npx @react-gtm-kit/cli init --consent
178
+ npx @jwiedeman/gtm-kit-cli init --consent
182
179
  ```
183
180
 
184
181
  ---
@@ -191,10 +188,10 @@ The CLI checks for config files and dependencies. If detection is wrong:
191
188
 
192
189
  ```bash
193
190
  # Check what was detected
194
- npx @react-gtm-kit/cli detect
191
+ npx @jwiedeman/gtm-kit-cli detect
195
192
 
196
193
  # You can manually install the right packages
197
- npm install @react-gtm-kit/core @react-gtm-kit/react-modern
194
+ npm install @jwiedeman/gtm-kit @jwiedeman/gtm-kit-react
198
195
  ```
199
196
 
200
197
  ### "Permission denied"
@@ -203,10 +200,10 @@ On Unix systems, you may need to use `npx` or install globally:
203
200
 
204
201
  ```bash
205
202
  # Use npx (recommended)
206
- npx @react-gtm-kit/cli init
203
+ npx @jwiedeman/gtm-kit-cli init
207
204
 
208
205
  # Or install globally
209
- npm install -g @react-gtm-kit/cli
206
+ npm install -g @jwiedeman/gtm-kit-cli
210
207
  gtm-kit init
211
208
  ```
212
209
 
@@ -217,7 +214,7 @@ If automatic installation fails:
217
214
  1. Check your internet connection
218
215
  2. Try installing manually:
219
216
  ```bash
220
- npm install @react-gtm-kit/core @react-gtm-kit/react-modern
217
+ npm install @jwiedeman/gtm-kit @jwiedeman/gtm-kit-react
221
218
  ```
222
219
  3. Check for npm registry issues
223
220
 
@@ -226,7 +223,7 @@ If automatic installation fails:
226
223
  ## Programmatic Usage
227
224
 
228
225
  ```ts
229
- import { detectFramework, detectPackageManager, validateGtmId, generateCode } from '@react-gtm-kit/cli';
226
+ import { detectFramework, detectPackageManager, validateGtmId, generateCode } from '@jwiedeman/gtm-kit-cli';
230
227
 
231
228
  // Detect framework
232
229
  const framework = await detectFramework('./my-project');
package/dist/cli.js CHANGED
@@ -142,7 +142,10 @@ var detectFramework = (dir = process.cwd()) => {
142
142
  reason: "Found Vue plugin in vite.config"
143
143
  };
144
144
  }
145
- } catch (e) {
145
+ } catch (error) {
146
+ if (process.env.DEBUG) {
147
+ console.debug(`[gtm-kit] Could not read ${viteConfig}:`, error);
148
+ }
146
149
  }
147
150
  }
148
151
  if (pkg && getDependencyVersion(pkg, "react")) {
@@ -183,7 +186,10 @@ var detectFramework = (dir = process.cwd()) => {
183
186
  reason: "Found .jsx or .tsx files in src/"
184
187
  };
185
188
  }
186
- } catch (e) {
189
+ } catch (error) {
190
+ if (process.env.DEBUG) {
191
+ console.debug(`[gtm-kit] Could not read ${srcDir}:`, error);
192
+ }
187
193
  }
188
194
  }
189
195
  return {
@@ -1093,18 +1099,23 @@ var runInit = async (quickId, options = {}) => {
1093
1099
  for (const file of files) {
1094
1100
  const filePath = path2.join(process.cwd(), file.filename);
1095
1101
  const dir = path2.dirname(filePath);
1096
- if (!fs2.existsSync(dir)) {
1097
- fs2.mkdirSync(dir, { recursive: true });
1098
- }
1099
- if (fs2.existsSync(filePath)) {
1100
- const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);
1101
- if (!overwrite) {
1102
- print.info(`Skipped: ${file.filename}`);
1103
- continue;
1102
+ try {
1103
+ if (!fs2.existsSync(dir)) {
1104
+ fs2.mkdirSync(dir, { recursive: true });
1105
+ }
1106
+ if (fs2.existsSync(filePath)) {
1107
+ const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);
1108
+ if (!overwrite) {
1109
+ print.info(`Skipped: ${file.filename}`);
1110
+ continue;
1111
+ }
1104
1112
  }
1113
+ fs2.writeFileSync(filePath, file.content);
1114
+ print.success(`Created: ${file.filename}`);
1115
+ } catch (error) {
1116
+ const message = error instanceof Error ? error.message : String(error);
1117
+ print.error(`Failed to create ${file.filename}: ${message}`);
1105
1118
  }
1106
- fs2.writeFileSync(filePath, file.content);
1107
- print.success(`Created: ${file.filename}`);
1108
1119
  }
1109
1120
  } else {
1110
1121
  print.info("Files not created. Copy the code above manually.");
package/dist/index.cjs CHANGED
@@ -167,7 +167,10 @@ var detectFramework = (dir = process.cwd()) => {
167
167
  reason: "Found Vue plugin in vite.config"
168
168
  };
169
169
  }
170
- } catch (e) {
170
+ } catch (error) {
171
+ if (process.env.DEBUG) {
172
+ console.debug(`[gtm-kit] Could not read ${viteConfig}:`, error);
173
+ }
171
174
  }
172
175
  }
173
176
  if (pkg && getDependencyVersion(pkg, "react")) {
@@ -208,7 +211,10 @@ var detectFramework = (dir = process.cwd()) => {
208
211
  reason: "Found .jsx or .tsx files in src/"
209
212
  };
210
213
  }
211
- } catch (e) {
214
+ } catch (error) {
215
+ if (process.env.DEBUG) {
216
+ console.debug(`[gtm-kit] Could not read ${srcDir}:`, error);
217
+ }
212
218
  }
213
219
  }
214
220
  return {
@@ -1308,18 +1314,23 @@ var runInit = async (quickId, options = {}) => {
1308
1314
  for (const file of files) {
1309
1315
  const filePath = path2.join(process.cwd(), file.filename);
1310
1316
  const dir = path2.dirname(filePath);
1311
- if (!fs2.existsSync(dir)) {
1312
- fs2.mkdirSync(dir, { recursive: true });
1313
- }
1314
- if (fs2.existsSync(filePath)) {
1315
- const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);
1316
- if (!overwrite) {
1317
- print.info(`Skipped: ${file.filename}`);
1318
- continue;
1317
+ try {
1318
+ if (!fs2.existsSync(dir)) {
1319
+ fs2.mkdirSync(dir, { recursive: true });
1320
+ }
1321
+ if (fs2.existsSync(filePath)) {
1322
+ const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);
1323
+ if (!overwrite) {
1324
+ print.info(`Skipped: ${file.filename}`);
1325
+ continue;
1326
+ }
1319
1327
  }
1328
+ fs2.writeFileSync(filePath, file.content);
1329
+ print.success(`Created: ${file.filename}`);
1330
+ } catch (error) {
1331
+ const message = error instanceof Error ? error.message : String(error);
1332
+ print.error(`Failed to create ${file.filename}: ${message}`);
1320
1333
  }
1321
- fs2.writeFileSync(filePath, file.content);
1322
- print.success(`Created: ${file.filename}`);
1323
1334
  }
1324
1335
  } else {
1325
1336
  print.info("Files not created. Copy the code above manually.");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/detect.ts","../src/validate.ts","../src/codegen.ts","../src/cli.ts"],"sourcesContent":["/**\n * GTM Kit CLI - Zero-config installation for Google Tag Manager\n *\n * Features:\n * - Auto-detects your framework (React, Next.js, Vue, Nuxt, Vanilla)\n * - Installs the right packages automatically\n * - Generates starter code for your setup\n * - Validates your GTM container ID format\n */\n\nexport { detectFramework, type FrameworkInfo } from './detect';\nexport { validateGtmId, validateConfig, type ValidationResult } from './validate';\nexport { generateSetupCode, type SetupCodeOptions } from './codegen';\nexport { run } from './cli';\n","/**\n * Framework detection for GTM Kit CLI\n *\n * Auto-detects the framework being used by checking:\n * 1. package.json dependencies\n * 2. Config files (nuxt.config.ts, next.config.js, vite.config.ts)\n * 3. Directory structure\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport type Framework = 'next' | 'nuxt' | 'react' | 'vue' | 'vanilla';\n\nexport interface FrameworkInfo {\n /** Detected framework */\n framework: Framework;\n /** Framework version (if detectable) */\n version?: string;\n /** Package manager detected */\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun';\n /** Packages to install */\n packages: string[];\n /** Human-readable framework name */\n displayName: string;\n /** Confidence score 0-100 */\n confidence: number;\n /** Reason for detection */\n reason: string;\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n packageManager?: string;\n}\n\n/**\n * Reads and parses package.json from the given directory\n */\nconst readPackageJson = (dir: string): PackageJson | null => {\n const pkgPath = path.join(dir, 'package.json');\n try {\n if (!fs.existsSync(pkgPath)) {\n return null;\n }\n const content = fs.readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n};\n\n/**\n * Checks if a file exists in the given directory\n */\nconst fileExists = (dir: string, filename: string): boolean => {\n return fs.existsSync(path.join(dir, filename));\n};\n\n/**\n * Gets the version of a dependency from package.json\n */\nconst getDependencyVersion = (pkg: PackageJson, name: string): string | undefined => {\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\n};\n\n/**\n * Detects which package manager is being used\n */\nconst detectPackageManager = (dir: string, pkg: PackageJson | null): FrameworkInfo['packageManager'] => {\n // Check lockfiles first (most reliable)\n if (fileExists(dir, 'pnpm-lock.yaml')) return 'pnpm';\n if (fileExists(dir, 'yarn.lock')) return 'yarn';\n if (fileExists(dir, 'bun.lockb')) return 'bun';\n if (fileExists(dir, 'package-lock.json')) return 'npm';\n\n // Check packageManager field in package.json\n if (pkg?.packageManager) {\n if (pkg.packageManager.startsWith('pnpm')) return 'pnpm';\n if (pkg.packageManager.startsWith('yarn')) return 'yarn';\n if (pkg.packageManager.startsWith('bun')) return 'bun';\n }\n\n // Default to npm\n return 'npm';\n};\n\n/**\n * Get install command for package manager\n */\nexport const getInstallCommand = (packageManager: FrameworkInfo['packageManager'], packages: string[]): string => {\n const pkgList = packages.join(' ');\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add ${pkgList}`;\n case 'yarn':\n return `yarn add ${pkgList}`;\n case 'bun':\n return `bun add ${pkgList}`;\n case 'npm':\n default:\n return `npm install ${pkgList}`;\n }\n};\n\n/**\n * Detects the framework being used in the given directory\n */\nexport const detectFramework = (dir: string = process.cwd()): FrameworkInfo => {\n const pkg = readPackageJson(dir);\n const packageManager = detectPackageManager(dir, pkg);\n\n // Check for Nuxt (highest priority - it's built on Vue)\n if (pkg && getDependencyVersion(pkg, 'nuxt')) {\n const version = getDependencyVersion(pkg, 'nuxt');\n return {\n framework: 'nuxt',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 100,\n reason: 'Found \"nuxt\" in dependencies'\n };\n }\n\n // Check for Nuxt config files\n if (fileExists(dir, 'nuxt.config.ts') || fileExists(dir, 'nuxt.config.js')) {\n return {\n framework: 'nuxt',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 95,\n reason: 'Found nuxt.config file'\n };\n }\n\n // Check for Next.js (higher priority than React - it's built on React)\n if (pkg && getDependencyVersion(pkg, 'next')) {\n const version = getDependencyVersion(pkg, 'next');\n return {\n framework: 'next',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 100,\n reason: 'Found \"next\" in dependencies'\n };\n }\n\n // Check for Next.js config files\n if (fileExists(dir, 'next.config.js') || fileExists(dir, 'next.config.mjs') || fileExists(dir, 'next.config.ts')) {\n return {\n framework: 'next',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 90,\n reason: 'Found next.config file'\n };\n }\n\n // Check for Vue (but not Nuxt)\n if (pkg && getDependencyVersion(pkg, 'vue')) {\n const version = getDependencyVersion(pkg, 'vue');\n return {\n framework: 'vue',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3',\n confidence: 100,\n reason: 'Found \"vue\" in dependencies'\n };\n }\n\n // Check for Vite with Vue\n if (fileExists(dir, 'vite.config.ts') || fileExists(dir, 'vite.config.js')) {\n const viteConfig = path.join(dir, fileExists(dir, 'vite.config.ts') ? 'vite.config.ts' : 'vite.config.js');\n try {\n const content = fs.readFileSync(viteConfig, 'utf-8');\n if (content.includes('@vitejs/plugin-vue') || content.includes('vue()')) {\n return {\n framework: 'vue',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3 (Vite)',\n confidence: 85,\n reason: 'Found Vue plugin in vite.config'\n };\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Check for React\n if (pkg && getDependencyVersion(pkg, 'react')) {\n const version = getDependencyVersion(pkg, 'react');\n const majorVersion = parseInt(version?.replace(/^\\^|~/, '').split('.')[0] ?? '18', 10);\n\n // React 16.8+ supports hooks, recommend modern package\n if (majorVersion >= 16) {\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: majorVersion >= 18 ? 'React 18+' : 'React 16.8+',\n confidence: 100,\n reason: 'Found \"react\" in dependencies'\n };\n }\n\n // Older React - use legacy package\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react-legacy'],\n displayName: 'React (Legacy)',\n confidence: 100,\n reason: 'Found older \"react\" version in dependencies'\n };\n }\n\n // Check for .jsx/.tsx files suggesting React\n const srcDir = path.join(dir, 'src');\n if (fs.existsSync(srcDir)) {\n try {\n const files = fs.readdirSync(srcDir);\n if (files.some((f) => f.endsWith('.jsx') || f.endsWith('.tsx'))) {\n return {\n framework: 'react',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: 'React (detected from .jsx/.tsx files)',\n confidence: 70,\n reason: 'Found .jsx or .tsx files in src/'\n };\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Default to vanilla JS\n return {\n framework: 'vanilla',\n packageManager,\n packages: ['@jwiedeman/gtm-kit'],\n displayName: 'Vanilla JavaScript',\n confidence: 50,\n reason: 'No framework detected, using core package only'\n };\n};\n\n/**\n * Human-readable summary of detected framework\n */\nexport const getDetectionSummary = (info: FrameworkInfo): string => {\n const lines = [\n `Framework: ${info.displayName}`,\n `Package Manager: ${info.packageManager}`,\n `Confidence: ${info.confidence}%`,\n `Reason: ${info.reason}`,\n '',\n 'Packages to install:',\n ...info.packages.map((p) => ` - ${p}`)\n ];\n\n if (info.version) {\n lines.splice(1, 0, `Version: ${info.version}`);\n }\n\n return lines.join('\\n');\n};\n","/**\n * Validation utilities for GTM Kit CLI\n *\n * Validates:\n * - GTM container IDs (GTM-XXXXXX format)\n * - Configuration options\n * - Data layer names\n */\n\nexport interface ValidationResult {\n /** Whether the validation passed */\n valid: boolean;\n /** Error message if invalid */\n error?: string;\n /** Warning message (validation passed but with concerns) */\n warning?: string;\n /** Suggested fix if invalid */\n suggestion?: string;\n}\n\n/**\n * Valid GTM container ID pattern\n * Format: GTM-XXXXXX where X is alphanumeric (typically uppercase)\n * Length: GTM- prefix + 6-8 characters\n */\nconst GTM_ID_PATTERN = /^GTM-[A-Z0-9]{6,8}$/;\n\n/**\n * Common mistakes in GTM IDs\n */\nconst COMMON_MISTAKES: { pattern: RegExp; message: string; suggestion: string }[] = [\n {\n pattern: /^gtm-[A-Za-z0-9]/,\n message: 'GTM ID should use uppercase \"GTM-\" prefix',\n suggestion: 'Use uppercase: GTM-XXXXXX'\n },\n {\n pattern: /^G-/,\n message: 'This looks like a GA4 Measurement ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", GA4 IDs start with \"G-\"'\n },\n {\n pattern: /^UA-/,\n message: 'This is a Universal Analytics ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", UA IDs start with \"UA-\"'\n },\n {\n pattern: /^AW-/,\n message: 'This looks like a Google Ads conversion ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", Google Ads IDs start with \"AW-\"'\n },\n {\n pattern: /^DC-/,\n message: 'This looks like a DoubleClick ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\"'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{1,5}$/,\n message: 'GTM container ID appears too short',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{9,}$/,\n message: 'GTM container ID appears too long',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /\\s/,\n message: 'GTM container ID should not contain spaces',\n suggestion: 'Remove any spaces from the ID'\n }\n];\n\n/**\n * Validates a GTM container ID\n *\n * @example\n * validateGtmId('GTM-ABC1234') // { valid: true }\n * validateGtmId('G-ABC123') // { valid: false, error: '...' }\n */\nexport const validateGtmId = (id: string): ValidationResult => {\n if (!id || typeof id !== 'string') {\n return {\n valid: false,\n error: 'GTM container ID is required',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n const trimmedId = id.trim();\n\n if (trimmedId.length === 0) {\n return {\n valid: false,\n error: 'GTM container ID cannot be empty',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n // Check for common mistakes first (better error messages)\n for (const mistake of COMMON_MISTAKES) {\n if (mistake.pattern.test(trimmedId)) {\n return {\n valid: false,\n error: mistake.message,\n suggestion: mistake.suggestion\n };\n }\n }\n\n // Check against valid pattern\n if (!GTM_ID_PATTERN.test(trimmedId)) {\n // Try to give a specific error\n if (!trimmedId.startsWith('GTM-')) {\n return {\n valid: false,\n error: 'GTM container ID must start with \"GTM-\"',\n suggestion: `Did you mean: GTM-${trimmedId.replace(/^[A-Za-z]+-?/, '')}?`\n };\n }\n\n const afterPrefix = trimmedId.slice(4);\n if (/[a-z]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should use uppercase letters',\n suggestion: `Did you mean: GTM-${afterPrefix.toUpperCase()}?`\n };\n }\n\n if (/[^A-Z0-9]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should only contain letters and numbers after GTM-',\n suggestion: 'Remove any special characters from the ID'\n };\n }\n\n return {\n valid: false,\n error: 'Invalid GTM container ID format',\n suggestion: 'GTM container IDs follow the format: GTM-XXXXXX (6-8 alphanumeric characters)'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Validates multiple GTM container IDs\n */\nexport const validateGtmIds = (ids: string[]): ValidationResult => {\n if (!Array.isArray(ids) || ids.length === 0) {\n return {\n valid: false,\n error: 'At least one GTM container ID is required',\n suggestion: 'Provide at least one valid GTM container ID'\n };\n }\n\n const results = ids.map((id, index) => ({\n index,\n id,\n result: validateGtmId(id)\n }));\n\n const invalid = results.filter((r) => !r.result.valid);\n\n if (invalid.length > 0) {\n const errors = invalid.map((r) => ` [${r.index}] ${r.id}: ${r.result.error}`).join('\\n');\n return {\n valid: false,\n error: `Invalid GTM container ID(s):\\n${errors}`,\n suggestion: invalid[0].result.suggestion\n };\n }\n\n // Warn about duplicates\n const uniqueIds = new Set(ids);\n if (uniqueIds.size < ids.length) {\n return {\n valid: true,\n warning: 'Duplicate GTM container IDs detected. Each container should only be listed once.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Valid data layer name pattern (JavaScript variable name)\n */\nconst DATA_LAYER_NAME_PATTERN = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\n/**\n * Reserved JavaScript keywords that can't be used as data layer names\n */\nconst RESERVED_KEYWORDS = new Set([\n 'break',\n 'case',\n 'catch',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'class',\n 'const',\n 'enum',\n 'export',\n 'extends',\n 'import',\n 'super',\n 'implements',\n 'interface',\n 'let',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'static',\n 'yield',\n 'null',\n 'true',\n 'false',\n 'undefined',\n 'NaN',\n 'Infinity'\n]);\n\n/**\n * Validates a data layer name\n */\nexport const validateDataLayerName = (name: string): ValidationResult => {\n if (!name || typeof name !== 'string') {\n return {\n valid: false,\n error: 'Data layer name is required',\n suggestion: 'Use the default \"dataLayer\" or provide a valid JavaScript variable name'\n };\n }\n\n const trimmedName = name.trim();\n\n if (trimmedName.length === 0) {\n return {\n valid: false,\n error: 'Data layer name cannot be empty',\n suggestion: 'Use the default \"dataLayer\"'\n };\n }\n\n if (RESERVED_KEYWORDS.has(trimmedName)) {\n return {\n valid: false,\n error: `\"${trimmedName}\" is a reserved JavaScript keyword`,\n suggestion: 'Use a different name like \"dataLayer\" or \"customDataLayer\"'\n };\n }\n\n if (!DATA_LAYER_NAME_PATTERN.test(trimmedName)) {\n if (/^\\d/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot start with a number',\n suggestion: `Did you mean: _${trimmedName} or dataLayer${trimmedName}?`\n };\n }\n\n if (/\\s/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain spaces',\n suggestion: `Did you mean: ${trimmedName.replace(/\\s+/g, '_')}?`\n };\n }\n\n if (/-/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain hyphens',\n suggestion: `Did you mean: ${trimmedName.replace(/-/g, '_')}?`\n };\n }\n\n return {\n valid: false,\n error: 'Invalid data layer name - must be a valid JavaScript variable name',\n suggestion: 'Use only letters, numbers, underscores, and dollar signs (cannot start with a number)'\n };\n }\n\n // Warn about non-standard names\n if (trimmedName !== 'dataLayer') {\n return {\n valid: true,\n warning:\n 'Using a custom data layer name. Make sure your GTM container is configured to use the same name.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Configuration validation options\n */\nexport interface ValidateConfigOptions {\n containers: string | string[];\n dataLayerName?: string;\n host?: string;\n}\n\n/**\n * Validates the full GTM Kit configuration\n */\nexport const validateConfig = (config: ValidateConfigOptions): ValidationResult => {\n // Validate containers\n const containerIds = Array.isArray(config.containers) ? config.containers : [config.containers];\n const containerResult = validateGtmIds(containerIds);\n if (!containerResult.valid) {\n return containerResult;\n }\n\n // Validate data layer name if provided\n if (config.dataLayerName !== undefined) {\n const dataLayerResult = validateDataLayerName(config.dataLayerName);\n if (!dataLayerResult.valid) {\n return dataLayerResult;\n }\n if (dataLayerResult.warning) {\n return dataLayerResult;\n }\n }\n\n // Validate host if provided\n if (config.host !== undefined) {\n if (typeof config.host !== 'string') {\n return {\n valid: false,\n error: 'Host must be a string',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n\n try {\n const url = new URL(config.host);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return {\n valid: false,\n error: 'Host must use HTTP or HTTPS protocol',\n suggestion: 'Use a URL starting with http:// or https://'\n };\n }\n } catch {\n return {\n valid: false,\n error: 'Invalid host URL',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n }\n\n // Return container warning if present\n if (containerResult.warning) {\n return containerResult;\n }\n\n return { valid: true };\n};\n","/**\n * Code generation utilities for GTM Kit CLI\n *\n * Generates framework-specific setup code that users can copy/paste\n */\n\nimport type { Framework } from './detect';\n\nexport interface SetupCodeOptions {\n /** Target framework */\n framework: Framework;\n /** GTM container ID(s) */\n containers: string | string[];\n /** Custom data layer name */\n dataLayerName?: string;\n /** Include consent mode setup */\n includeConsent?: boolean;\n /** Use TypeScript */\n typescript?: boolean;\n}\n\ninterface GeneratedCode {\n /** Filename to create */\n filename: string;\n /** File contents */\n content: string;\n /** Description of what this file does */\n description: string;\n}\n\n/**\n * Generates setup code for the specified framework\n */\nexport const generateSetupCode = (options: SetupCodeOptions): GeneratedCode[] => {\n const { framework, containers, dataLayerName, includeConsent = false, typescript = true } = options;\n\n const ext = typescript ? 'ts' : 'js';\n const containerValue = Array.isArray(containers)\n ? `[${containers.map((c) => `'${c}'`).join(', ')}]`\n : `'${containers}'`;\n\n switch (framework) {\n case 'next':\n return generateNextSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'nuxt':\n return generateNuxtSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'react':\n return generateReactSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vue':\n return generateVueSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vanilla':\n default:\n return generateVanillaSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n }\n};\n\ninterface CodeGenContext {\n containerValue: string;\n dataLayerName?: string;\n includeConsent: boolean;\n ext: string;\n}\n\n/**\n * Generate Next.js App Router setup code\n */\nconst generateNextSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const providerCode = `// app/providers/gtm-provider.${ext}x\n'use client';\n\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n${ctx.ext === 'ts' ? `interface GtmProviderWrapperProps {\\n children: ReactNode;\\n}\\n` : ''}\nexport function GtmProviderWrapper({ children }${ctx.ext === 'ts' ? ': GtmProviderWrapperProps' : ''}) {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <PageViewTracker />\n {children}\n </GtmProvider>\n );\n}\n\nfunction PageViewTracker() {\n useTrackPageViews();\n return null;\n}\n`;\n\n const layoutCode = `// app/layout.${ext}x\nimport { GtmProviderWrapper } from './providers/gtm-provider';\nimport { GtmNoScript } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\nexport default function RootLayout({ children }${ctx.ext === 'ts' ? ': { children: ReactNode }' : ''}) {\n return (\n <html lang=\"en\">\n <body>\n <GtmNoScript containerId=\"${Array.isArray(containerValue) ? containerValue[0] : containerValue.replace(/'/g, '')}\" />\n <GtmProviderWrapper>\n {children}\n </GtmProviderWrapper>\n </body>\n </html>\n );\n}\n`;\n\n const exampleUsage = `// Example: Track a button click\n'use client';\n\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function MyButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n`;\n\n return [\n {\n filename: `app/providers/gtm-provider.${ext}x`,\n content: providerCode,\n description: 'GTM Provider wrapper with page view tracking'\n },\n {\n filename: `app/layout.${ext}x`,\n content: layoutCode,\n description: 'Root layout with GTM noscript tag'\n },\n {\n filename: `components/example-button.${ext}x`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Nuxt 3 setup code\n */\nconst generateNuxtSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const pluginCode = `// plugins/gtm.client.${ext}\nimport { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nexport default defineNuxtPlugin((nuxtApp) => {\n createNuxtGtmPlugin(nuxtApp.vueApp, {\n containers: ${containerValue},${dataLayerOption}\n trackPageViews: true${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n });\n});\n`;\n\n const pageTrackingCode = `// composables/usePageTracking.${ext}\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n\n/**\n * Call this composable in your app.vue or layouts to enable automatic page tracking\n */\nexport function usePageTracking() {\n const route = useRoute();\n\n useTrackPageViews({\n route,\n eventName: 'page_view',\n includeQueryParams: true\n });\n}\n`;\n\n const appVueCode = `<!-- app.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from '~/composables/usePageTracking';\n\n// Enable automatic page view tracking\nusePageTracking();\n</script>\n\n<template>\n <NuxtLayout>\n <NuxtPage />\n </NuxtLayout>\n</template>\n`;\n\n const exampleUsage = `<!-- Example: Track a button click -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useNuxtGtmPush } from '@jwiedeman/gtm-kit-nuxt';\n\nconst push = useNuxtGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n</script>\n\n<template>\n <button @click=\"handleClick\">Sign Up</button>\n</template>\n`;\n\n return [\n {\n filename: `plugins/gtm.client.${ext}`,\n content: pluginCode,\n description: 'Nuxt plugin for GTM (client-side only)'\n },\n {\n filename: `composables/usePageTracking.${ext}`,\n content: pageTrackingCode,\n description: 'Composable for automatic page view tracking'\n },\n {\n filename: 'app.vue',\n content: appVueCode,\n description: 'App root with page tracking enabled'\n },\n {\n filename: `components/ExampleButton.vue`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate React (Vite/CRA) setup code\n */\nconst generateReactSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const appCode = `// src/App.${ext}x\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n {/* Your app content */}\n <main>\n <h1>Hello GTM Kit!</h1>\n </main>\n </GtmProvider>\n );\n}\n\nexport default App;\n`;\n\n const routerCode = `// src/AppWithRouter.${ext}x\n// Use this if you have react-router-dom\nimport { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom';\nimport { GtmProvider, useGtmPush } from '@jwiedeman/gtm-kit-react';\nimport { useEffect } from 'react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n// Automatic page view tracking\nfunction PageViewTracker() {\n const location = useLocation();\n const push = useGtmPush();\n\n useEffect(() => {\n push({\n event: 'page_view',\n page_path: location.pathname + location.search\n });\n }, [location, push]);\n\n return null;\n}\n\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <BrowserRouter>\n <PageViewTracker />\n <Routes>\n <Route path=\"/\" element={<Home />} />\n {/* Add your routes */}\n </Routes>\n </BrowserRouter>\n </GtmProvider>\n );\n}\n\nfunction Home() {\n return <h1>Home Page</h1>;\n}\n\nexport default App;\n`;\n\n const exampleUsage = `// src/components/TrackingExample.${ext}x\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function SignupButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n\n// Track form submission\nexport function ContactForm() {\n const push = useGtmPush();\n\n const handleSubmit = (e${ctx.ext === 'ts' ? ': React.FormEvent' : ''}) => {\n e.preventDefault();\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n );\n}\n`;\n\n return [\n {\n filename: `src/App.${ext}x`,\n content: appCode,\n description: 'Basic App setup with GTM Provider'\n },\n {\n filename: `src/AppWithRouter.${ext}x`,\n content: routerCode,\n description: 'App setup with React Router and page tracking'\n },\n {\n filename: `src/components/TrackingExample.${ext}x`,\n content: exampleUsage,\n description: 'Example components showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vue 3 setup code\n */\nconst generateVueSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const mainCode = `// src/main.${ext}\nimport { createApp } from 'vue';\nimport { GtmPlugin } from '@jwiedeman/gtm-kit-vue';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}import App from './App.vue';\n\nconst app = createApp(App);\n\napp.use(GtmPlugin, {\n containers: ${containerValue}${dataLayerOption}${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n});\n\napp.mount('#app');\n`;\n\n const routerCode = `// src/router-tracking.${ext}\n// Add this to your router setup for automatic page tracking\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\nimport { watch } from 'vue';\nimport { useRoute } from 'vue-router';\n\nexport function usePageTracking() {\n const route = useRoute();\n const push = useGtmPush();\n\n watch(\n () => route.fullPath,\n (path) => {\n push({\n event: 'page_view',\n page_path: path,\n page_title: document.title\n });\n },\n { immediate: true }\n );\n}\n`;\n\n const appVueCode = `<!-- src/App.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from './router-tracking';\n\n// Enable page view tracking if using vue-router\n// usePageTracking();\n</script>\n\n<template>\n <main>\n <h1>Hello GTM Kit!</h1>\n <RouterView v-if=\"$router\" />\n </main>\n</template>\n`;\n\n const exampleUsage = `<!-- src/components/TrackingExample.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\n\nconst push = useGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n\nconst handleSubmit = () => {\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n};\n</script>\n\n<template>\n <div>\n <!-- Track button click -->\n <button @click=\"handleClick\">Sign Up</button>\n\n <!-- Track form submission -->\n <form @submit.prevent=\"handleSubmit\">\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n </div>\n</template>\n`;\n\n return [\n {\n filename: `src/main.${ext}`,\n content: mainCode,\n description: 'Main entry point with GTM Plugin'\n },\n {\n filename: `src/router-tracking.${ext}`,\n content: routerCode,\n description: 'Page tracking composable for Vue Router'\n },\n {\n filename: 'src/App.vue',\n content: appVueCode,\n description: 'App component with tracking setup'\n },\n {\n filename: 'src/components/TrackingExample.vue',\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vanilla JavaScript setup code\n */\nconst generateVanillaSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const esmCode = `// gtm-setup.${ext}\nimport { createGtmClient${includeConsent ? ', eeaDefault' : ''} } from '@jwiedeman/gtm-kit';\n\n// Create the GTM client\nconst gtm = createGtmClient({\n containers: ${containerValue}${dataLayerOption}\n});\n${includeConsent ? '\\n// Set consent defaults BEFORE init (for GDPR compliance)\\ngtm.setConsentDefaults(eeaDefault);\\n' : ''}\n// Initialize GTM\ngtm.init();\n\n// Track events\nexport function trackEvent(event${ctx.ext === 'ts' ? ': string' : ''}, data${ctx.ext === 'ts' ? '?: Record<string, unknown>' : ''} = {}) {\n gtm.push({\n event,\n ...data\n });\n}\n\n// Track page views\nexport function trackPageView(path${ctx.ext === 'ts' ? '?: string' : ''}) {\n gtm.push({\n event: 'page_view',\n page_path: path || window.location.pathname + window.location.search,\n page_title: document.title\n });\n}\n\n// Update consent (call this when user accepts/rejects)\nexport function updateConsent(analytics${ctx.ext === 'ts' ? ': boolean' : ''}, marketing${ctx.ext === 'ts' ? ': boolean' : ''}) {\n gtm.updateConsent({\n analytics_storage: analytics ? 'granted' : 'denied',\n ad_storage: marketing ? 'granted' : 'denied',\n ad_user_data: marketing ? 'granted' : 'denied',\n ad_personalization: marketing ? 'granted' : 'denied'\n });\n}\n\n// Example usage\ntrackPageView();\n\n// Export client for advanced usage\nexport { gtm };\n`;\n\n const htmlCode = `<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>GTM Kit - Vanilla JS</title>\n</head>\n<body>\n <!-- GTM noscript fallback (optional but recommended) -->\n <noscript>\n <iframe\n src=\"https://www.googletagmanager.com/ns.html?id=${Array.isArray(containerValue) ? 'YOUR-GTM-ID' : containerValue.replace(/'/g, '')}\"\n height=\"0\"\n width=\"0\"\n style=\"display:none;visibility:hidden\"\n ></iframe>\n </noscript>\n\n <main>\n <h1>Hello GTM Kit!</h1>\n <button id=\"signup-btn\">Sign Up</button>\n <button id=\"consent-btn\">Accept Cookies</button>\n </main>\n\n <script type=\"module\">\n import { trackEvent, updateConsent } from './gtm-setup.${ext}';\n\n // Track button click\n document.getElementById('signup-btn').addEventListener('click', () => {\n trackEvent('button_click', { button_name: 'signup_cta' });\n });\n\n // Handle consent\n document.getElementById('consent-btn').addEventListener('click', () => {\n updateConsent(true, true);\n });\n </script>\n</body>\n</html>\n`;\n\n const umdCode = `<!-- Alternative: UMD/Script Tag Setup -->\n<!-- Add this in your HTML head -->\n<script src=\"https://unpkg.com/@jwiedeman/gtm-kit/dist/index.umd.js\"></script>\n<script>\n // GTM Kit is available as window.GtmKit\n var gtm = GtmKit.createGtmClient({\n containers: ${containerValue}${dataLayerOption ? dataLayerOption.replace(/\\n/g, ' ') : ''}\n });\n${includeConsent ? '\\n // Set consent defaults\\n gtm.setConsentDefaults(GtmKit.eeaDefault);\\n' : ''}\n // Initialize\n gtm.init();\n\n // Track page view\n gtm.push({\n event: 'page_view',\n page_path: window.location.pathname\n });\n\n // Make gtm available globally for other scripts\n window.gtm = gtm;\n</script>\n`;\n\n return [\n {\n filename: `gtm-setup.${ext}`,\n content: esmCode,\n description: 'ESM setup with helper functions'\n },\n {\n filename: 'index.html',\n content: htmlCode,\n description: 'Example HTML with tracking'\n },\n {\n filename: 'umd-setup.html',\n content: umdCode,\n description: 'Alternative UMD/script tag setup'\n }\n ];\n};\n\n/**\n * Format generated code for display\n */\nexport const formatGeneratedCode = (files: GeneratedCode[]): string => {\n return files\n .map((file) => {\n const separator = '─'.repeat(60);\n return `${separator}\\nšŸ“„ ${file.filename}\\n${file.description}\\n${separator}\\n${file.content}`;\n })\n .join('\\n\\n');\n};\n","#!/usr/bin/env node\n/* eslint-disable no-console */\n/**\n * GTM Kit CLI - Zero-config setup for Google Tag Manager\n *\n * Usage:\n * npx @jwiedeman/gtm-kit-cli init # Interactive setup\n * npx @jwiedeman/gtm-kit-cli init GTM-XXX # Quick setup with container ID\n * npx @jwiedeman/gtm-kit-cli detect # Just detect framework\n * npx @jwiedeman/gtm-kit-cli validate # Validate existing setup\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as readline from 'readline';\nimport { detectFramework, getDetectionSummary, getInstallCommand } from './detect';\nimport { validateGtmId } from './validate';\nimport { generateSetupCode, formatGeneratedCode } from './codegen';\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m'\n};\n\nconst c = (color: keyof typeof colors, text: string): string => `${colors[color]}${text}${colors.reset}`;\n\n/**\n * Print styled output\n */\nconst print = {\n header: (text: string) => console.log(`\\n${c('bold', c('cyan', text))}\\n`),\n success: (text: string) => console.log(`${c('green', 'āœ“')} ${text}`),\n error: (text: string) => console.log(`${c('red', 'āœ—')} ${text}`),\n warning: (text: string) => console.log(`${c('yellow', '⚠')} ${text}`),\n info: (text: string) => console.log(`${c('blue', 'ℹ')} ${text}`),\n step: (n: number, text: string) => console.log(`\\n${c('bold', `Step ${n}:`)} ${text}`),\n code: (text: string) => console.log(` ${c('dim', '$')} ${c('cyan', text)}`),\n box: (lines: string[]) => {\n const maxLen = Math.max(...lines.map((l) => l.length));\n const border = '─'.repeat(maxLen + 2);\n console.log(`ā”Œ${border}┐`);\n lines.forEach((line) => console.log(`│ ${line.padEnd(maxLen)} │`));\n console.log(`ā””${border}ā”˜`);\n }\n};\n\n/**\n * Simple readline prompt\n */\nconst prompt = (question: string): Promise<string> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n};\n\n/**\n * Yes/No prompt with default\n */\nconst confirm = async (question: string, defaultYes = true): Promise<boolean> => {\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n const answer = await prompt(`${question} ${suffix} `);\n\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n};\n\n/**\n * Show banner\n */\nconst showBanner = () => {\n console.log(`\n${c('cyan', '╔═══════════════════════════════════════════╗')}\n${c('cyan', 'ā•‘')} ${c('bold', 'GTM Kit')} - Easy Google Tag Manager Setup ${c('cyan', 'ā•‘')}\n${c('cyan', 'ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•')}\n`);\n};\n\n/**\n * Show help\n */\nconst showHelp = () => {\n showBanner();\n console.log(`${c('bold', 'Usage:')}\n npx @jwiedeman/gtm-kit-cli <command> [options]\n\n${c('bold', 'Commands:')}\n ${c('cyan', 'init')} [GTM-ID] Interactive setup (or quick setup with ID)\n ${c('cyan', 'detect')} Detect framework and show install command\n ${c('cyan', 'validate')} <ID> Validate a GTM container ID\n ${c('cyan', 'generate')} <ID> Generate setup code for your framework\n ${c('cyan', 'help')} Show this help message\n\n${c('bold', 'Examples:')}\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init GTM-ABC1234\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli detect\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\n\n${c('bold', 'Options:')}\n --typescript, -ts Generate TypeScript code (default)\n --javascript, -js Generate JavaScript code\n --consent Include consent mode setup\n --dry-run Show what would be done without doing it\n\n${c('bold', 'More info:')} https://github.com/jwiedeman/GTM-Kit\n`);\n};\n\n/**\n * Detect command - show framework detection\n */\nconst runDetect = (dir: string = process.cwd()) => {\n showBanner();\n print.header('Framework Detection');\n\n const info = detectFramework(dir);\n console.log(getDetectionSummary(info));\n\n console.log('\\n' + c('bold', 'Install command:'));\n print.code(getInstallCommand(info.packageManager, info.packages));\n\n return info;\n};\n\n/**\n * Validate command - validate GTM ID\n */\nconst runValidate = (id: string) => {\n showBanner();\n print.header('GTM ID Validation');\n\n const result = validateGtmId(id);\n\n console.log(`ID: ${c('cyan', id)}`);\n\n if (result.valid) {\n print.success('Valid GTM container ID');\n if (result.warning) {\n print.warning(result.warning);\n }\n } else {\n print.error(result.error ?? 'Invalid');\n if (result.suggestion) {\n print.info(`Suggestion: ${result.suggestion}`);\n }\n }\n\n return result;\n};\n\n/**\n * Generate command - generate setup code\n */\nconst runGenerate = (containerId: string, options: { typescript?: boolean; consent?: boolean } = {}) => {\n showBanner();\n print.header('Generating Setup Code');\n\n const info = detectFramework();\n const validation = validateGtmId(containerId);\n\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(`Suggestion: ${validation.suggestion}`);\n }\n return null;\n }\n\n print.success(`Framework: ${info.displayName}`);\n print.success(`Container: ${containerId}`);\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: options.typescript ?? true,\n includeConsent: options.consent ?? false\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n return files;\n};\n\n/**\n * Init command - interactive setup\n */\nconst runInit = async (\n quickId?: string,\n options: { typescript?: boolean; consent?: boolean; dryRun?: boolean } = {}\n) => {\n showBanner();\n print.header('GTM Kit Setup');\n\n const info = detectFramework();\n\n // Step 1: Show detection\n print.step(1, 'Detecting your project...');\n console.log(`\\n Framework: ${c('green', info.displayName)}`);\n console.log(` Package Manager: ${c('green', info.packageManager)}`);\n console.log(` Confidence: ${info.confidence}%`);\n\n // Step 2: Get GTM ID\n print.step(2, 'GTM Container ID');\n\n let containerId = quickId ?? '';\n\n if (!containerId) {\n containerId = await prompt(`\\n Enter your GTM container ID (e.g., GTM-ABC1234): `);\n }\n\n if (!containerId) {\n print.error('GTM container ID is required');\n console.log(`\\n ${c('dim', 'Tip: Get your GTM ID from https://tagmanager.google.com')}\\n`);\n process.exit(1);\n }\n\n const validation = validateGtmId(containerId);\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(validation.suggestion);\n }\n process.exit(1);\n }\n\n print.success(`Valid container ID: ${containerId}`);\n\n // Step 3: Options\n print.step(3, 'Configuration');\n\n const useConsent = options.consent ?? (await confirm('\\n Include Consent Mode v2 setup (GDPR)?', true));\n const useTypescript = options.typescript ?? (await confirm(' Use TypeScript?', true));\n\n // Step 4: Install packages\n print.step(4, 'Installing packages...');\n\n const installCmd = getInstallCommand(info.packageManager, info.packages);\n console.log(`\\n Command: ${c('cyan', installCmd)}`);\n\n if (options.dryRun) {\n print.warning('Dry run - skipping installation');\n } else {\n const shouldInstall = await confirm('\\n Run installation now?', true);\n\n if (shouldInstall) {\n const { execSync } = await import('child_process');\n try {\n console.log('');\n execSync(installCmd, { stdio: 'inherit' });\n print.success('Packages installed successfully');\n } catch (error) {\n print.error('Installation failed');\n console.log(`\\n ${c('dim', 'Try running manually:')} ${c('cyan', installCmd)}\\n`);\n }\n } else {\n print.info('Skipped installation. Run manually:');\n print.code(installCmd);\n }\n }\n\n // Step 5: Generate code\n print.step(5, 'Generating setup code...');\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: useTypescript,\n includeConsent: useConsent\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n // Step 6: Write files\n print.step(6, 'Creating files...');\n\n if (options.dryRun) {\n print.warning('Dry run - skipping file creation');\n files.forEach((file) => {\n console.log(` Would create: ${c('cyan', file.filename)}`);\n });\n } else {\n const shouldWrite = await confirm('\\n Create these files in your project?', false);\n\n if (shouldWrite) {\n for (const file of files) {\n const filePath = path.join(process.cwd(), file.filename);\n const dir = path.dirname(filePath);\n\n // Create directory if needed\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Check if file exists\n if (fs.existsSync(filePath)) {\n const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);\n if (!overwrite) {\n print.info(`Skipped: ${file.filename}`);\n continue;\n }\n }\n\n fs.writeFileSync(filePath, file.content);\n print.success(`Created: ${file.filename}`);\n }\n } else {\n print.info('Files not created. Copy the code above manually.');\n }\n }\n\n // Done!\n print.header('Setup Complete!');\n\n print.box([\n `GTM Kit is ready to use with ${info.displayName}!`,\n '',\n `Container: ${containerId}`,\n useConsent ? 'Consent Mode: Enabled' : 'Consent Mode: Disabled',\n '',\n 'Next steps:',\n '1. Review the generated code',\n '2. Add your routes/pages',\n '3. Test with GTM Preview mode',\n '',\n 'Docs: https://github.com/jwiedeman/GTM-Kit'\n ]);\n\n return { info, containerId, files };\n};\n\n/**\n * Parse CLI arguments\n */\nconst parseArgs = (args: string[]): { command: string; positional: string[]; flags: Record<string, boolean> } => {\n const command = args[0] ?? 'help';\n const positional: string[] = [];\n const flags: Record<string, boolean> = {};\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n flags[arg.slice(2)] = true;\n } else if (arg.startsWith('-')) {\n flags[arg.slice(1)] = true;\n } else {\n positional.push(arg);\n }\n }\n\n return { command, positional, flags };\n};\n\n/**\n * Main entry point\n */\nexport const run = async (args: string[] = process.argv.slice(2)): Promise<void> => {\n const { command, positional, flags } = parseArgs(args);\n\n const options = {\n typescript: flags.typescript || flags.ts ? true : flags.javascript || flags.js ? false : undefined,\n consent: flags.consent ?? undefined,\n dryRun: flags['dry-run'] ?? false\n };\n\n try {\n switch (command) {\n case 'init':\n await runInit(positional[0], options);\n break;\n\n case 'detect':\n runDetect(positional[0]);\n break;\n\n case 'validate':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID to validate');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runValidate(positional[0]);\n break;\n\n case 'generate':\n case 'gen':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli generate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runGenerate(positional[0], options);\n break;\n\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n }\n } catch (error) {\n if (error instanceof Error) {\n print.error(error.message);\n } else {\n print.error('An unexpected error occurred');\n }\n process.exit(1);\n }\n};\n\n// Run if executed directly\nif (typeof require !== 'undefined' && require.main === module) {\n run();\n}\n"],"mappings":"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","names":["c","fs","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/detect.ts","../src/validate.ts","../src/codegen.ts","../src/cli.ts"],"sourcesContent":["/**\n * GTM Kit CLI - Zero-config installation for Google Tag Manager\n *\n * Features:\n * - Auto-detects your framework (React, Next.js, Vue, Nuxt, Vanilla)\n * - Installs the right packages automatically\n * - Generates starter code for your setup\n * - Validates your GTM container ID format\n */\n\nexport { detectFramework, type FrameworkInfo } from './detect';\nexport { validateGtmId, validateConfig, type ValidationResult } from './validate';\nexport { generateSetupCode, type SetupCodeOptions } from './codegen';\nexport { run } from './cli';\n","/**\n * Framework detection for GTM Kit CLI\n *\n * Auto-detects the framework being used by checking:\n * 1. package.json dependencies\n * 2. Config files (nuxt.config.ts, next.config.js, vite.config.ts)\n * 3. Directory structure\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport type Framework = 'next' | 'nuxt' | 'react' | 'vue' | 'vanilla';\n\nexport interface FrameworkInfo {\n /** Detected framework */\n framework: Framework;\n /** Framework version (if detectable) */\n version?: string;\n /** Package manager detected */\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun';\n /** Packages to install */\n packages: string[];\n /** Human-readable framework name */\n displayName: string;\n /** Confidence score 0-100 */\n confidence: number;\n /** Reason for detection */\n reason: string;\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n packageManager?: string;\n}\n\n/**\n * Reads and parses package.json from the given directory\n */\nconst readPackageJson = (dir: string): PackageJson | null => {\n const pkgPath = path.join(dir, 'package.json');\n try {\n if (!fs.existsSync(pkgPath)) {\n return null;\n }\n const content = fs.readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n};\n\n/**\n * Checks if a file exists in the given directory\n */\nconst fileExists = (dir: string, filename: string): boolean => {\n return fs.existsSync(path.join(dir, filename));\n};\n\n/**\n * Gets the version of a dependency from package.json\n */\nconst getDependencyVersion = (pkg: PackageJson, name: string): string | undefined => {\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\n};\n\n/**\n * Detects which package manager is being used\n */\nconst detectPackageManager = (dir: string, pkg: PackageJson | null): FrameworkInfo['packageManager'] => {\n // Check lockfiles first (most reliable)\n if (fileExists(dir, 'pnpm-lock.yaml')) return 'pnpm';\n if (fileExists(dir, 'yarn.lock')) return 'yarn';\n if (fileExists(dir, 'bun.lockb')) return 'bun';\n if (fileExists(dir, 'package-lock.json')) return 'npm';\n\n // Check packageManager field in package.json\n if (pkg?.packageManager) {\n if (pkg.packageManager.startsWith('pnpm')) return 'pnpm';\n if (pkg.packageManager.startsWith('yarn')) return 'yarn';\n if (pkg.packageManager.startsWith('bun')) return 'bun';\n }\n\n // Default to npm\n return 'npm';\n};\n\n/**\n * Get install command for package manager\n */\nexport const getInstallCommand = (packageManager: FrameworkInfo['packageManager'], packages: string[]): string => {\n const pkgList = packages.join(' ');\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add ${pkgList}`;\n case 'yarn':\n return `yarn add ${pkgList}`;\n case 'bun':\n return `bun add ${pkgList}`;\n case 'npm':\n default:\n return `npm install ${pkgList}`;\n }\n};\n\n/**\n * Detects the framework being used in the given directory\n */\nexport const detectFramework = (dir: string = process.cwd()): FrameworkInfo => {\n const pkg = readPackageJson(dir);\n const packageManager = detectPackageManager(dir, pkg);\n\n // Check for Nuxt (highest priority - it's built on Vue)\n if (pkg && getDependencyVersion(pkg, 'nuxt')) {\n const version = getDependencyVersion(pkg, 'nuxt');\n return {\n framework: 'nuxt',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 100,\n reason: 'Found \"nuxt\" in dependencies'\n };\n }\n\n // Check for Nuxt config files\n if (fileExists(dir, 'nuxt.config.ts') || fileExists(dir, 'nuxt.config.js')) {\n return {\n framework: 'nuxt',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 95,\n reason: 'Found nuxt.config file'\n };\n }\n\n // Check for Next.js (higher priority than React - it's built on React)\n if (pkg && getDependencyVersion(pkg, 'next')) {\n const version = getDependencyVersion(pkg, 'next');\n return {\n framework: 'next',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 100,\n reason: 'Found \"next\" in dependencies'\n };\n }\n\n // Check for Next.js config files\n if (fileExists(dir, 'next.config.js') || fileExists(dir, 'next.config.mjs') || fileExists(dir, 'next.config.ts')) {\n return {\n framework: 'next',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 90,\n reason: 'Found next.config file'\n };\n }\n\n // Check for Vue (but not Nuxt)\n if (pkg && getDependencyVersion(pkg, 'vue')) {\n const version = getDependencyVersion(pkg, 'vue');\n return {\n framework: 'vue',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3',\n confidence: 100,\n reason: 'Found \"vue\" in dependencies'\n };\n }\n\n // Check for Vite with Vue\n if (fileExists(dir, 'vite.config.ts') || fileExists(dir, 'vite.config.js')) {\n const viteConfig = path.join(dir, fileExists(dir, 'vite.config.ts') ? 'vite.config.ts' : 'vite.config.js');\n try {\n const content = fs.readFileSync(viteConfig, 'utf-8');\n if (content.includes('@vitejs/plugin-vue') || content.includes('vue()')) {\n return {\n framework: 'vue',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3 (Vite)',\n confidence: 85,\n reason: 'Found Vue plugin in vite.config'\n };\n }\n } catch (error) {\n // Debug: Log read errors for vite config (non-critical)\n if (process.env.DEBUG) {\n console.debug(`[gtm-kit] Could not read ${viteConfig}:`, error);\n }\n }\n }\n\n // Check for React\n if (pkg && getDependencyVersion(pkg, 'react')) {\n const version = getDependencyVersion(pkg, 'react');\n const majorVersion = parseInt(version?.replace(/^\\^|~/, '').split('.')[0] ?? '18', 10);\n\n // React 16.8+ supports hooks, recommend modern package\n if (majorVersion >= 16) {\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: majorVersion >= 18 ? 'React 18+' : 'React 16.8+',\n confidence: 100,\n reason: 'Found \"react\" in dependencies'\n };\n }\n\n // Older React - use legacy package\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react-legacy'],\n displayName: 'React (Legacy)',\n confidence: 100,\n reason: 'Found older \"react\" version in dependencies'\n };\n }\n\n // Check for .jsx/.tsx files suggesting React\n const srcDir = path.join(dir, 'src');\n if (fs.existsSync(srcDir)) {\n try {\n const files = fs.readdirSync(srcDir);\n if (files.some((f) => f.endsWith('.jsx') || f.endsWith('.tsx'))) {\n return {\n framework: 'react',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: 'React (detected from .jsx/.tsx files)',\n confidence: 70,\n reason: 'Found .jsx or .tsx files in src/'\n };\n }\n } catch (error) {\n // Debug: Log read errors for src directory (non-critical)\n if (process.env.DEBUG) {\n console.debug(`[gtm-kit] Could not read ${srcDir}:`, error);\n }\n }\n }\n\n // Default to vanilla JS\n return {\n framework: 'vanilla',\n packageManager,\n packages: ['@jwiedeman/gtm-kit'],\n displayName: 'Vanilla JavaScript',\n confidence: 50,\n reason: 'No framework detected, using core package only'\n };\n};\n\n/**\n * Human-readable summary of detected framework\n */\nexport const getDetectionSummary = (info: FrameworkInfo): string => {\n const lines = [\n `Framework: ${info.displayName}`,\n `Package Manager: ${info.packageManager}`,\n `Confidence: ${info.confidence}%`,\n `Reason: ${info.reason}`,\n '',\n 'Packages to install:',\n ...info.packages.map((p) => ` - ${p}`)\n ];\n\n if (info.version) {\n lines.splice(1, 0, `Version: ${info.version}`);\n }\n\n return lines.join('\\n');\n};\n","/**\n * Validation utilities for GTM Kit CLI\n *\n * Validates:\n * - GTM container IDs (GTM-XXXXXX format)\n * - Configuration options\n * - Data layer names\n */\n\nexport interface ValidationResult {\n /** Whether the validation passed */\n valid: boolean;\n /** Error message if invalid */\n error?: string;\n /** Warning message (validation passed but with concerns) */\n warning?: string;\n /** Suggested fix if invalid */\n suggestion?: string;\n}\n\n/**\n * Valid GTM container ID pattern\n * Format: GTM-XXXXXX where X is alphanumeric (typically uppercase)\n * Length: GTM- prefix + 6-8 characters\n */\nconst GTM_ID_PATTERN = /^GTM-[A-Z0-9]{6,8}$/;\n\n/**\n * Common mistakes in GTM IDs\n */\nconst COMMON_MISTAKES: { pattern: RegExp; message: string; suggestion: string }[] = [\n {\n pattern: /^gtm-[A-Za-z0-9]/,\n message: 'GTM ID should use uppercase \"GTM-\" prefix',\n suggestion: 'Use uppercase: GTM-XXXXXX'\n },\n {\n pattern: /^G-/,\n message: 'This looks like a GA4 Measurement ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", GA4 IDs start with \"G-\"'\n },\n {\n pattern: /^UA-/,\n message: 'This is a Universal Analytics ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", UA IDs start with \"UA-\"'\n },\n {\n pattern: /^AW-/,\n message: 'This looks like a Google Ads conversion ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", Google Ads IDs start with \"AW-\"'\n },\n {\n pattern: /^DC-/,\n message: 'This looks like a DoubleClick ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\"'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{1,5}$/,\n message: 'GTM container ID appears too short',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{9,}$/,\n message: 'GTM container ID appears too long',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /\\s/,\n message: 'GTM container ID should not contain spaces',\n suggestion: 'Remove any spaces from the ID'\n }\n];\n\n/**\n * Validates a GTM container ID\n *\n * @example\n * validateGtmId('GTM-ABC1234') // { valid: true }\n * validateGtmId('G-ABC123') // { valid: false, error: '...' }\n */\nexport const validateGtmId = (id: string): ValidationResult => {\n if (!id || typeof id !== 'string') {\n return {\n valid: false,\n error: 'GTM container ID is required',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n const trimmedId = id.trim();\n\n if (trimmedId.length === 0) {\n return {\n valid: false,\n error: 'GTM container ID cannot be empty',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n // Check for common mistakes first (better error messages)\n for (const mistake of COMMON_MISTAKES) {\n if (mistake.pattern.test(trimmedId)) {\n return {\n valid: false,\n error: mistake.message,\n suggestion: mistake.suggestion\n };\n }\n }\n\n // Check against valid pattern\n if (!GTM_ID_PATTERN.test(trimmedId)) {\n // Try to give a specific error\n if (!trimmedId.startsWith('GTM-')) {\n return {\n valid: false,\n error: 'GTM container ID must start with \"GTM-\"',\n suggestion: `Did you mean: GTM-${trimmedId.replace(/^[A-Za-z]+-?/, '')}?`\n };\n }\n\n const afterPrefix = trimmedId.slice(4);\n if (/[a-z]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should use uppercase letters',\n suggestion: `Did you mean: GTM-${afterPrefix.toUpperCase()}?`\n };\n }\n\n if (/[^A-Z0-9]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should only contain letters and numbers after GTM-',\n suggestion: 'Remove any special characters from the ID'\n };\n }\n\n return {\n valid: false,\n error: 'Invalid GTM container ID format',\n suggestion: 'GTM container IDs follow the format: GTM-XXXXXX (6-8 alphanumeric characters)'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Validates multiple GTM container IDs\n */\nexport const validateGtmIds = (ids: string[]): ValidationResult => {\n if (!Array.isArray(ids) || ids.length === 0) {\n return {\n valid: false,\n error: 'At least one GTM container ID is required',\n suggestion: 'Provide at least one valid GTM container ID'\n };\n }\n\n const results = ids.map((id, index) => ({\n index,\n id,\n result: validateGtmId(id)\n }));\n\n const invalid = results.filter((r) => !r.result.valid);\n\n if (invalid.length > 0) {\n const errors = invalid.map((r) => ` [${r.index}] ${r.id}: ${r.result.error}`).join('\\n');\n return {\n valid: false,\n error: `Invalid GTM container ID(s):\\n${errors}`,\n suggestion: invalid[0].result.suggestion\n };\n }\n\n // Warn about duplicates\n const uniqueIds = new Set(ids);\n if (uniqueIds.size < ids.length) {\n return {\n valid: true,\n warning: 'Duplicate GTM container IDs detected. Each container should only be listed once.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Valid data layer name pattern (JavaScript variable name)\n */\nconst DATA_LAYER_NAME_PATTERN = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\n/**\n * Reserved JavaScript keywords that can't be used as data layer names\n */\nconst RESERVED_KEYWORDS = new Set([\n 'break',\n 'case',\n 'catch',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'class',\n 'const',\n 'enum',\n 'export',\n 'extends',\n 'import',\n 'super',\n 'implements',\n 'interface',\n 'let',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'static',\n 'yield',\n 'null',\n 'true',\n 'false',\n 'undefined',\n 'NaN',\n 'Infinity'\n]);\n\n/**\n * Validates a data layer name\n */\nexport const validateDataLayerName = (name: string): ValidationResult => {\n if (!name || typeof name !== 'string') {\n return {\n valid: false,\n error: 'Data layer name is required',\n suggestion: 'Use the default \"dataLayer\" or provide a valid JavaScript variable name'\n };\n }\n\n const trimmedName = name.trim();\n\n if (trimmedName.length === 0) {\n return {\n valid: false,\n error: 'Data layer name cannot be empty',\n suggestion: 'Use the default \"dataLayer\"'\n };\n }\n\n if (RESERVED_KEYWORDS.has(trimmedName)) {\n return {\n valid: false,\n error: `\"${trimmedName}\" is a reserved JavaScript keyword`,\n suggestion: 'Use a different name like \"dataLayer\" or \"customDataLayer\"'\n };\n }\n\n if (!DATA_LAYER_NAME_PATTERN.test(trimmedName)) {\n if (/^\\d/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot start with a number',\n suggestion: `Did you mean: _${trimmedName} or dataLayer${trimmedName}?`\n };\n }\n\n if (/\\s/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain spaces',\n suggestion: `Did you mean: ${trimmedName.replace(/\\s+/g, '_')}?`\n };\n }\n\n if (/-/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain hyphens',\n suggestion: `Did you mean: ${trimmedName.replace(/-/g, '_')}?`\n };\n }\n\n return {\n valid: false,\n error: 'Invalid data layer name - must be a valid JavaScript variable name',\n suggestion: 'Use only letters, numbers, underscores, and dollar signs (cannot start with a number)'\n };\n }\n\n // Warn about non-standard names\n if (trimmedName !== 'dataLayer') {\n return {\n valid: true,\n warning:\n 'Using a custom data layer name. Make sure your GTM container is configured to use the same name.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Configuration validation options\n */\nexport interface ValidateConfigOptions {\n containers: string | string[];\n dataLayerName?: string;\n host?: string;\n}\n\n/**\n * Validates the full GTM Kit configuration\n */\nexport const validateConfig = (config: ValidateConfigOptions): ValidationResult => {\n // Validate containers\n const containerIds = Array.isArray(config.containers) ? config.containers : [config.containers];\n const containerResult = validateGtmIds(containerIds);\n if (!containerResult.valid) {\n return containerResult;\n }\n\n // Validate data layer name if provided\n if (config.dataLayerName !== undefined) {\n const dataLayerResult = validateDataLayerName(config.dataLayerName);\n if (!dataLayerResult.valid) {\n return dataLayerResult;\n }\n if (dataLayerResult.warning) {\n return dataLayerResult;\n }\n }\n\n // Validate host if provided\n if (config.host !== undefined) {\n if (typeof config.host !== 'string') {\n return {\n valid: false,\n error: 'Host must be a string',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n\n try {\n const url = new URL(config.host);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return {\n valid: false,\n error: 'Host must use HTTP or HTTPS protocol',\n suggestion: 'Use a URL starting with http:// or https://'\n };\n }\n } catch {\n return {\n valid: false,\n error: 'Invalid host URL',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n }\n\n // Return container warning if present\n if (containerResult.warning) {\n return containerResult;\n }\n\n return { valid: true };\n};\n","/**\n * Code generation utilities for GTM Kit CLI\n *\n * Generates framework-specific setup code that users can copy/paste\n */\n\nimport type { Framework } from './detect';\n\nexport interface SetupCodeOptions {\n /** Target framework */\n framework: Framework;\n /** GTM container ID(s) */\n containers: string | string[];\n /** Custom data layer name */\n dataLayerName?: string;\n /** Include consent mode setup */\n includeConsent?: boolean;\n /** Use TypeScript */\n typescript?: boolean;\n}\n\ninterface GeneratedCode {\n /** Filename to create */\n filename: string;\n /** File contents */\n content: string;\n /** Description of what this file does */\n description: string;\n}\n\n/**\n * Generates setup code for the specified framework\n */\nexport const generateSetupCode = (options: SetupCodeOptions): GeneratedCode[] => {\n const { framework, containers, dataLayerName, includeConsent = false, typescript = true } = options;\n\n const ext = typescript ? 'ts' : 'js';\n const containerValue = Array.isArray(containers)\n ? `[${containers.map((c) => `'${c}'`).join(', ')}]`\n : `'${containers}'`;\n\n switch (framework) {\n case 'next':\n return generateNextSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'nuxt':\n return generateNuxtSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'react':\n return generateReactSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vue':\n return generateVueSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vanilla':\n default:\n return generateVanillaSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n }\n};\n\ninterface CodeGenContext {\n containerValue: string;\n dataLayerName?: string;\n includeConsent: boolean;\n ext: string;\n}\n\n/**\n * Generate Next.js App Router setup code\n */\nconst generateNextSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const providerCode = `// app/providers/gtm-provider.${ext}x\n'use client';\n\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n${ctx.ext === 'ts' ? `interface GtmProviderWrapperProps {\\n children: ReactNode;\\n}\\n` : ''}\nexport function GtmProviderWrapper({ children }${ctx.ext === 'ts' ? ': GtmProviderWrapperProps' : ''}) {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <PageViewTracker />\n {children}\n </GtmProvider>\n );\n}\n\nfunction PageViewTracker() {\n useTrackPageViews();\n return null;\n}\n`;\n\n const layoutCode = `// app/layout.${ext}x\nimport { GtmProviderWrapper } from './providers/gtm-provider';\nimport { GtmNoScript } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\nexport default function RootLayout({ children }${ctx.ext === 'ts' ? ': { children: ReactNode }' : ''}) {\n return (\n <html lang=\"en\">\n <body>\n <GtmNoScript containerId=\"${Array.isArray(containerValue) ? containerValue[0] : containerValue.replace(/'/g, '')}\" />\n <GtmProviderWrapper>\n {children}\n </GtmProviderWrapper>\n </body>\n </html>\n );\n}\n`;\n\n const exampleUsage = `// Example: Track a button click\n'use client';\n\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function MyButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n`;\n\n return [\n {\n filename: `app/providers/gtm-provider.${ext}x`,\n content: providerCode,\n description: 'GTM Provider wrapper with page view tracking'\n },\n {\n filename: `app/layout.${ext}x`,\n content: layoutCode,\n description: 'Root layout with GTM noscript tag'\n },\n {\n filename: `components/example-button.${ext}x`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Nuxt 3 setup code\n */\nconst generateNuxtSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const pluginCode = `// plugins/gtm.client.${ext}\nimport { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nexport default defineNuxtPlugin((nuxtApp) => {\n createNuxtGtmPlugin(nuxtApp.vueApp, {\n containers: ${containerValue},${dataLayerOption}\n trackPageViews: true${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n });\n});\n`;\n\n const pageTrackingCode = `// composables/usePageTracking.${ext}\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n\n/**\n * Call this composable in your app.vue or layouts to enable automatic page tracking\n */\nexport function usePageTracking() {\n const route = useRoute();\n\n useTrackPageViews({\n route,\n eventName: 'page_view',\n includeQueryParams: true\n });\n}\n`;\n\n const appVueCode = `<!-- app.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from '~/composables/usePageTracking';\n\n// Enable automatic page view tracking\nusePageTracking();\n</script>\n\n<template>\n <NuxtLayout>\n <NuxtPage />\n </NuxtLayout>\n</template>\n`;\n\n const exampleUsage = `<!-- Example: Track a button click -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useNuxtGtmPush } from '@jwiedeman/gtm-kit-nuxt';\n\nconst push = useNuxtGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n</script>\n\n<template>\n <button @click=\"handleClick\">Sign Up</button>\n</template>\n`;\n\n return [\n {\n filename: `plugins/gtm.client.${ext}`,\n content: pluginCode,\n description: 'Nuxt plugin for GTM (client-side only)'\n },\n {\n filename: `composables/usePageTracking.${ext}`,\n content: pageTrackingCode,\n description: 'Composable for automatic page view tracking'\n },\n {\n filename: 'app.vue',\n content: appVueCode,\n description: 'App root with page tracking enabled'\n },\n {\n filename: `components/ExampleButton.vue`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate React (Vite/CRA) setup code\n */\nconst generateReactSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const appCode = `// src/App.${ext}x\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n {/* Your app content */}\n <main>\n <h1>Hello GTM Kit!</h1>\n </main>\n </GtmProvider>\n );\n}\n\nexport default App;\n`;\n\n const routerCode = `// src/AppWithRouter.${ext}x\n// Use this if you have react-router-dom\nimport { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom';\nimport { GtmProvider, useGtmPush } from '@jwiedeman/gtm-kit-react';\nimport { useEffect } from 'react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n// Automatic page view tracking\nfunction PageViewTracker() {\n const location = useLocation();\n const push = useGtmPush();\n\n useEffect(() => {\n push({\n event: 'page_view',\n page_path: location.pathname + location.search\n });\n }, [location, push]);\n\n return null;\n}\n\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <BrowserRouter>\n <PageViewTracker />\n <Routes>\n <Route path=\"/\" element={<Home />} />\n {/* Add your routes */}\n </Routes>\n </BrowserRouter>\n </GtmProvider>\n );\n}\n\nfunction Home() {\n return <h1>Home Page</h1>;\n}\n\nexport default App;\n`;\n\n const exampleUsage = `// src/components/TrackingExample.${ext}x\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function SignupButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n\n// Track form submission\nexport function ContactForm() {\n const push = useGtmPush();\n\n const handleSubmit = (e${ctx.ext === 'ts' ? ': React.FormEvent' : ''}) => {\n e.preventDefault();\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n );\n}\n`;\n\n return [\n {\n filename: `src/App.${ext}x`,\n content: appCode,\n description: 'Basic App setup with GTM Provider'\n },\n {\n filename: `src/AppWithRouter.${ext}x`,\n content: routerCode,\n description: 'App setup with React Router and page tracking'\n },\n {\n filename: `src/components/TrackingExample.${ext}x`,\n content: exampleUsage,\n description: 'Example components showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vue 3 setup code\n */\nconst generateVueSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const mainCode = `// src/main.${ext}\nimport { createApp } from 'vue';\nimport { GtmPlugin } from '@jwiedeman/gtm-kit-vue';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}import App from './App.vue';\n\nconst app = createApp(App);\n\napp.use(GtmPlugin, {\n containers: ${containerValue}${dataLayerOption}${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n});\n\napp.mount('#app');\n`;\n\n const routerCode = `// src/router-tracking.${ext}\n// Add this to your router setup for automatic page tracking\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\nimport { watch } from 'vue';\nimport { useRoute } from 'vue-router';\n\nexport function usePageTracking() {\n const route = useRoute();\n const push = useGtmPush();\n\n watch(\n () => route.fullPath,\n (path) => {\n push({\n event: 'page_view',\n page_path: path,\n page_title: document.title\n });\n },\n { immediate: true }\n );\n}\n`;\n\n const appVueCode = `<!-- src/App.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from './router-tracking';\n\n// Enable page view tracking if using vue-router\n// usePageTracking();\n</script>\n\n<template>\n <main>\n <h1>Hello GTM Kit!</h1>\n <RouterView v-if=\"$router\" />\n </main>\n</template>\n`;\n\n const exampleUsage = `<!-- src/components/TrackingExample.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\n\nconst push = useGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n\nconst handleSubmit = () => {\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n};\n</script>\n\n<template>\n <div>\n <!-- Track button click -->\n <button @click=\"handleClick\">Sign Up</button>\n\n <!-- Track form submission -->\n <form @submit.prevent=\"handleSubmit\">\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n </div>\n</template>\n`;\n\n return [\n {\n filename: `src/main.${ext}`,\n content: mainCode,\n description: 'Main entry point with GTM Plugin'\n },\n {\n filename: `src/router-tracking.${ext}`,\n content: routerCode,\n description: 'Page tracking composable for Vue Router'\n },\n {\n filename: 'src/App.vue',\n content: appVueCode,\n description: 'App component with tracking setup'\n },\n {\n filename: 'src/components/TrackingExample.vue',\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vanilla JavaScript setup code\n */\nconst generateVanillaSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const esmCode = `// gtm-setup.${ext}\nimport { createGtmClient${includeConsent ? ', eeaDefault' : ''} } from '@jwiedeman/gtm-kit';\n\n// Create the GTM client\nconst gtm = createGtmClient({\n containers: ${containerValue}${dataLayerOption}\n});\n${includeConsent ? '\\n// Set consent defaults BEFORE init (for GDPR compliance)\\ngtm.setConsentDefaults(eeaDefault);\\n' : ''}\n// Initialize GTM\ngtm.init();\n\n// Track events\nexport function trackEvent(event${ctx.ext === 'ts' ? ': string' : ''}, data${ctx.ext === 'ts' ? '?: Record<string, unknown>' : ''} = {}) {\n gtm.push({\n event,\n ...data\n });\n}\n\n// Track page views\nexport function trackPageView(path${ctx.ext === 'ts' ? '?: string' : ''}) {\n gtm.push({\n event: 'page_view',\n page_path: path || window.location.pathname + window.location.search,\n page_title: document.title\n });\n}\n\n// Update consent (call this when user accepts/rejects)\nexport function updateConsent(analytics${ctx.ext === 'ts' ? ': boolean' : ''}, marketing${ctx.ext === 'ts' ? ': boolean' : ''}) {\n gtm.updateConsent({\n analytics_storage: analytics ? 'granted' : 'denied',\n ad_storage: marketing ? 'granted' : 'denied',\n ad_user_data: marketing ? 'granted' : 'denied',\n ad_personalization: marketing ? 'granted' : 'denied'\n });\n}\n\n// Example usage\ntrackPageView();\n\n// Export client for advanced usage\nexport { gtm };\n`;\n\n const htmlCode = `<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>GTM Kit - Vanilla JS</title>\n</head>\n<body>\n <!-- GTM noscript fallback (optional but recommended) -->\n <noscript>\n <iframe\n src=\"https://www.googletagmanager.com/ns.html?id=${Array.isArray(containerValue) ? 'YOUR-GTM-ID' : containerValue.replace(/'/g, '')}\"\n height=\"0\"\n width=\"0\"\n style=\"display:none;visibility:hidden\"\n ></iframe>\n </noscript>\n\n <main>\n <h1>Hello GTM Kit!</h1>\n <button id=\"signup-btn\">Sign Up</button>\n <button id=\"consent-btn\">Accept Cookies</button>\n </main>\n\n <script type=\"module\">\n import { trackEvent, updateConsent } from './gtm-setup.${ext}';\n\n // Track button click\n document.getElementById('signup-btn').addEventListener('click', () => {\n trackEvent('button_click', { button_name: 'signup_cta' });\n });\n\n // Handle consent\n document.getElementById('consent-btn').addEventListener('click', () => {\n updateConsent(true, true);\n });\n </script>\n</body>\n</html>\n`;\n\n const umdCode = `<!-- Alternative: UMD/Script Tag Setup -->\n<!-- Add this in your HTML head -->\n<script src=\"https://unpkg.com/@jwiedeman/gtm-kit/dist/index.umd.js\"></script>\n<script>\n // GTM Kit is available as window.GtmKit\n var gtm = GtmKit.createGtmClient({\n containers: ${containerValue}${dataLayerOption ? dataLayerOption.replace(/\\n/g, ' ') : ''}\n });\n${includeConsent ? '\\n // Set consent defaults\\n gtm.setConsentDefaults(GtmKit.eeaDefault);\\n' : ''}\n // Initialize\n gtm.init();\n\n // Track page view\n gtm.push({\n event: 'page_view',\n page_path: window.location.pathname\n });\n\n // Make gtm available globally for other scripts\n window.gtm = gtm;\n</script>\n`;\n\n return [\n {\n filename: `gtm-setup.${ext}`,\n content: esmCode,\n description: 'ESM setup with helper functions'\n },\n {\n filename: 'index.html',\n content: htmlCode,\n description: 'Example HTML with tracking'\n },\n {\n filename: 'umd-setup.html',\n content: umdCode,\n description: 'Alternative UMD/script tag setup'\n }\n ];\n};\n\n/**\n * Format generated code for display\n */\nexport const formatGeneratedCode = (files: GeneratedCode[]): string => {\n return files\n .map((file) => {\n const separator = '─'.repeat(60);\n return `${separator}\\nšŸ“„ ${file.filename}\\n${file.description}\\n${separator}\\n${file.content}`;\n })\n .join('\\n\\n');\n};\n","#!/usr/bin/env node\n/* eslint-disable no-console */\n/**\n * GTM Kit CLI - Zero-config setup for Google Tag Manager\n *\n * Usage:\n * npx @jwiedeman/gtm-kit-cli init # Interactive setup\n * npx @jwiedeman/gtm-kit-cli init GTM-XXX # Quick setup with container ID\n * npx @jwiedeman/gtm-kit-cli detect # Just detect framework\n * npx @jwiedeman/gtm-kit-cli validate # Validate existing setup\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as readline from 'readline';\nimport { detectFramework, getDetectionSummary, getInstallCommand } from './detect';\nimport { validateGtmId } from './validate';\nimport { generateSetupCode, formatGeneratedCode } from './codegen';\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m'\n};\n\nconst c = (color: keyof typeof colors, text: string): string => `${colors[color]}${text}${colors.reset}`;\n\n/**\n * Print styled output\n */\nconst print = {\n header: (text: string) => console.log(`\\n${c('bold', c('cyan', text))}\\n`),\n success: (text: string) => console.log(`${c('green', 'āœ“')} ${text}`),\n error: (text: string) => console.log(`${c('red', 'āœ—')} ${text}`),\n warning: (text: string) => console.log(`${c('yellow', '⚠')} ${text}`),\n info: (text: string) => console.log(`${c('blue', 'ℹ')} ${text}`),\n step: (n: number, text: string) => console.log(`\\n${c('bold', `Step ${n}:`)} ${text}`),\n code: (text: string) => console.log(` ${c('dim', '$')} ${c('cyan', text)}`),\n box: (lines: string[]) => {\n const maxLen = Math.max(...lines.map((l) => l.length));\n const border = '─'.repeat(maxLen + 2);\n console.log(`ā”Œ${border}┐`);\n lines.forEach((line) => console.log(`│ ${line.padEnd(maxLen)} │`));\n console.log(`ā””${border}ā”˜`);\n }\n};\n\n/**\n * Simple readline prompt\n */\nconst prompt = (question: string): Promise<string> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n};\n\n/**\n * Yes/No prompt with default\n */\nconst confirm = async (question: string, defaultYes = true): Promise<boolean> => {\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n const answer = await prompt(`${question} ${suffix} `);\n\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n};\n\n/**\n * Show banner\n */\nconst showBanner = () => {\n console.log(`\n${c('cyan', '╔═══════════════════════════════════════════╗')}\n${c('cyan', 'ā•‘')} ${c('bold', 'GTM Kit')} - Easy Google Tag Manager Setup ${c('cyan', 'ā•‘')}\n${c('cyan', 'ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•')}\n`);\n};\n\n/**\n * Show help\n */\nconst showHelp = () => {\n showBanner();\n console.log(`${c('bold', 'Usage:')}\n npx @jwiedeman/gtm-kit-cli <command> [options]\n\n${c('bold', 'Commands:')}\n ${c('cyan', 'init')} [GTM-ID] Interactive setup (or quick setup with ID)\n ${c('cyan', 'detect')} Detect framework and show install command\n ${c('cyan', 'validate')} <ID> Validate a GTM container ID\n ${c('cyan', 'generate')} <ID> Generate setup code for your framework\n ${c('cyan', 'help')} Show this help message\n\n${c('bold', 'Examples:')}\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init GTM-ABC1234\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli detect\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\n\n${c('bold', 'Options:')}\n --typescript, -ts Generate TypeScript code (default)\n --javascript, -js Generate JavaScript code\n --consent Include consent mode setup\n --dry-run Show what would be done without doing it\n\n${c('bold', 'More info:')} https://github.com/jwiedeman/GTM-Kit\n`);\n};\n\n/**\n * Detect command - show framework detection\n */\nconst runDetect = (dir: string = process.cwd()) => {\n showBanner();\n print.header('Framework Detection');\n\n const info = detectFramework(dir);\n console.log(getDetectionSummary(info));\n\n console.log('\\n' + c('bold', 'Install command:'));\n print.code(getInstallCommand(info.packageManager, info.packages));\n\n return info;\n};\n\n/**\n * Validate command - validate GTM ID\n */\nconst runValidate = (id: string) => {\n showBanner();\n print.header('GTM ID Validation');\n\n const result = validateGtmId(id);\n\n console.log(`ID: ${c('cyan', id)}`);\n\n if (result.valid) {\n print.success('Valid GTM container ID');\n if (result.warning) {\n print.warning(result.warning);\n }\n } else {\n print.error(result.error ?? 'Invalid');\n if (result.suggestion) {\n print.info(`Suggestion: ${result.suggestion}`);\n }\n }\n\n return result;\n};\n\n/**\n * Generate command - generate setup code\n */\nconst runGenerate = (containerId: string, options: { typescript?: boolean; consent?: boolean } = {}) => {\n showBanner();\n print.header('Generating Setup Code');\n\n const info = detectFramework();\n const validation = validateGtmId(containerId);\n\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(`Suggestion: ${validation.suggestion}`);\n }\n return null;\n }\n\n print.success(`Framework: ${info.displayName}`);\n print.success(`Container: ${containerId}`);\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: options.typescript ?? true,\n includeConsent: options.consent ?? false\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n return files;\n};\n\n/**\n * Init command - interactive setup\n */\nconst runInit = async (\n quickId?: string,\n options: { typescript?: boolean; consent?: boolean; dryRun?: boolean } = {}\n) => {\n showBanner();\n print.header('GTM Kit Setup');\n\n const info = detectFramework();\n\n // Step 1: Show detection\n print.step(1, 'Detecting your project...');\n console.log(`\\n Framework: ${c('green', info.displayName)}`);\n console.log(` Package Manager: ${c('green', info.packageManager)}`);\n console.log(` Confidence: ${info.confidence}%`);\n\n // Step 2: Get GTM ID\n print.step(2, 'GTM Container ID');\n\n let containerId = quickId ?? '';\n\n if (!containerId) {\n containerId = await prompt(`\\n Enter your GTM container ID (e.g., GTM-ABC1234): `);\n }\n\n if (!containerId) {\n print.error('GTM container ID is required');\n console.log(`\\n ${c('dim', 'Tip: Get your GTM ID from https://tagmanager.google.com')}\\n`);\n process.exit(1);\n }\n\n const validation = validateGtmId(containerId);\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(validation.suggestion);\n }\n process.exit(1);\n }\n\n print.success(`Valid container ID: ${containerId}`);\n\n // Step 3: Options\n print.step(3, 'Configuration');\n\n const useConsent = options.consent ?? (await confirm('\\n Include Consent Mode v2 setup (GDPR)?', true));\n const useTypescript = options.typescript ?? (await confirm(' Use TypeScript?', true));\n\n // Step 4: Install packages\n print.step(4, 'Installing packages...');\n\n const installCmd = getInstallCommand(info.packageManager, info.packages);\n console.log(`\\n Command: ${c('cyan', installCmd)}`);\n\n if (options.dryRun) {\n print.warning('Dry run - skipping installation');\n } else {\n const shouldInstall = await confirm('\\n Run installation now?', true);\n\n if (shouldInstall) {\n const { execSync } = await import('child_process');\n try {\n console.log('');\n execSync(installCmd, { stdio: 'inherit' });\n print.success('Packages installed successfully');\n } catch (error) {\n print.error('Installation failed');\n console.log(`\\n ${c('dim', 'Try running manually:')} ${c('cyan', installCmd)}\\n`);\n }\n } else {\n print.info('Skipped installation. Run manually:');\n print.code(installCmd);\n }\n }\n\n // Step 5: Generate code\n print.step(5, 'Generating setup code...');\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: useTypescript,\n includeConsent: useConsent\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n // Step 6: Write files\n print.step(6, 'Creating files...');\n\n if (options.dryRun) {\n print.warning('Dry run - skipping file creation');\n files.forEach((file) => {\n console.log(` Would create: ${c('cyan', file.filename)}`);\n });\n } else {\n const shouldWrite = await confirm('\\n Create these files in your project?', false);\n\n if (shouldWrite) {\n for (const file of files) {\n const filePath = path.join(process.cwd(), file.filename);\n const dir = path.dirname(filePath);\n\n try {\n // Create directory if needed\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Check if file exists\n if (fs.existsSync(filePath)) {\n const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);\n if (!overwrite) {\n print.info(`Skipped: ${file.filename}`);\n continue;\n }\n }\n\n fs.writeFileSync(filePath, file.content);\n print.success(`Created: ${file.filename}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n print.error(`Failed to create ${file.filename}: ${message}`);\n }\n }\n } else {\n print.info('Files not created. Copy the code above manually.');\n }\n }\n\n // Done!\n print.header('Setup Complete!');\n\n print.box([\n `GTM Kit is ready to use with ${info.displayName}!`,\n '',\n `Container: ${containerId}`,\n useConsent ? 'Consent Mode: Enabled' : 'Consent Mode: Disabled',\n '',\n 'Next steps:',\n '1. Review the generated code',\n '2. Add your routes/pages',\n '3. Test with GTM Preview mode',\n '',\n 'Docs: https://github.com/jwiedeman/GTM-Kit'\n ]);\n\n return { info, containerId, files };\n};\n\n/**\n * Parse CLI arguments\n */\nconst parseArgs = (args: string[]): { command: string; positional: string[]; flags: Record<string, boolean> } => {\n const command = args[0] ?? 'help';\n const positional: string[] = [];\n const flags: Record<string, boolean> = {};\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n flags[arg.slice(2)] = true;\n } else if (arg.startsWith('-')) {\n flags[arg.slice(1)] = true;\n } else {\n positional.push(arg);\n }\n }\n\n return { command, positional, flags };\n};\n\n/**\n * Main entry point\n */\nexport const run = async (args: string[] = process.argv.slice(2)): Promise<void> => {\n const { command, positional, flags } = parseArgs(args);\n\n const options = {\n typescript: flags.typescript || flags.ts ? true : flags.javascript || flags.js ? false : undefined,\n consent: flags.consent ?? undefined,\n dryRun: flags['dry-run'] ?? false\n };\n\n try {\n switch (command) {\n case 'init':\n await runInit(positional[0], options);\n break;\n\n case 'detect':\n runDetect(positional[0]);\n break;\n\n case 'validate':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID to validate');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runValidate(positional[0]);\n break;\n\n case 'generate':\n case 'gen':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli generate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runGenerate(positional[0], options);\n break;\n\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n }\n } catch (error) {\n if (error instanceof Error) {\n print.error(error.message);\n } else {\n print.error('An unexpected error occurred');\n }\n process.exit(1);\n }\n};\n\n// Run if executed directly\nif (typeof require !== 'undefined' && require.main === module) {\n run();\n}\n"],"mappings":"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","names":["c","fs","path"]}
package/dist/index.js CHANGED
@@ -135,7 +135,10 @@ var detectFramework = (dir = process.cwd()) => {
135
135
  reason: "Found Vue plugin in vite.config"
136
136
  };
137
137
  }
138
- } catch (e) {
138
+ } catch (error) {
139
+ if (process.env.DEBUG) {
140
+ console.debug(`[gtm-kit] Could not read ${viteConfig}:`, error);
141
+ }
139
142
  }
140
143
  }
141
144
  if (pkg && getDependencyVersion(pkg, "react")) {
@@ -176,7 +179,10 @@ var detectFramework = (dir = process.cwd()) => {
176
179
  reason: "Found .jsx or .tsx files in src/"
177
180
  };
178
181
  }
179
- } catch (e) {
182
+ } catch (error) {
183
+ if (process.env.DEBUG) {
184
+ console.debug(`[gtm-kit] Could not read ${srcDir}:`, error);
185
+ }
180
186
  }
181
187
  }
182
188
  return {
@@ -1276,18 +1282,23 @@ var runInit = async (quickId, options = {}) => {
1276
1282
  for (const file of files) {
1277
1283
  const filePath = path2.join(process.cwd(), file.filename);
1278
1284
  const dir = path2.dirname(filePath);
1279
- if (!fs2.existsSync(dir)) {
1280
- fs2.mkdirSync(dir, { recursive: true });
1281
- }
1282
- if (fs2.existsSync(filePath)) {
1283
- const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);
1284
- if (!overwrite) {
1285
- print.info(`Skipped: ${file.filename}`);
1286
- continue;
1285
+ try {
1286
+ if (!fs2.existsSync(dir)) {
1287
+ fs2.mkdirSync(dir, { recursive: true });
1288
+ }
1289
+ if (fs2.existsSync(filePath)) {
1290
+ const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);
1291
+ if (!overwrite) {
1292
+ print.info(`Skipped: ${file.filename}`);
1293
+ continue;
1294
+ }
1287
1295
  }
1296
+ fs2.writeFileSync(filePath, file.content);
1297
+ print.success(`Created: ${file.filename}`);
1298
+ } catch (error) {
1299
+ const message = error instanceof Error ? error.message : String(error);
1300
+ print.error(`Failed to create ${file.filename}: ${message}`);
1288
1301
  }
1289
- fs2.writeFileSync(filePath, file.content);
1290
- print.success(`Created: ${file.filename}`);
1291
1302
  }
1292
1303
  } else {
1293
1304
  print.info("Files not created. Copy the code above manually.");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/detect.ts","../src/validate.ts","../src/codegen.ts","../src/cli.ts"],"sourcesContent":["/**\n * Framework detection for GTM Kit CLI\n *\n * Auto-detects the framework being used by checking:\n * 1. package.json dependencies\n * 2. Config files (nuxt.config.ts, next.config.js, vite.config.ts)\n * 3. Directory structure\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport type Framework = 'next' | 'nuxt' | 'react' | 'vue' | 'vanilla';\n\nexport interface FrameworkInfo {\n /** Detected framework */\n framework: Framework;\n /** Framework version (if detectable) */\n version?: string;\n /** Package manager detected */\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun';\n /** Packages to install */\n packages: string[];\n /** Human-readable framework name */\n displayName: string;\n /** Confidence score 0-100 */\n confidence: number;\n /** Reason for detection */\n reason: string;\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n packageManager?: string;\n}\n\n/**\n * Reads and parses package.json from the given directory\n */\nconst readPackageJson = (dir: string): PackageJson | null => {\n const pkgPath = path.join(dir, 'package.json');\n try {\n if (!fs.existsSync(pkgPath)) {\n return null;\n }\n const content = fs.readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n};\n\n/**\n * Checks if a file exists in the given directory\n */\nconst fileExists = (dir: string, filename: string): boolean => {\n return fs.existsSync(path.join(dir, filename));\n};\n\n/**\n * Gets the version of a dependency from package.json\n */\nconst getDependencyVersion = (pkg: PackageJson, name: string): string | undefined => {\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\n};\n\n/**\n * Detects which package manager is being used\n */\nconst detectPackageManager = (dir: string, pkg: PackageJson | null): FrameworkInfo['packageManager'] => {\n // Check lockfiles first (most reliable)\n if (fileExists(dir, 'pnpm-lock.yaml')) return 'pnpm';\n if (fileExists(dir, 'yarn.lock')) return 'yarn';\n if (fileExists(dir, 'bun.lockb')) return 'bun';\n if (fileExists(dir, 'package-lock.json')) return 'npm';\n\n // Check packageManager field in package.json\n if (pkg?.packageManager) {\n if (pkg.packageManager.startsWith('pnpm')) return 'pnpm';\n if (pkg.packageManager.startsWith('yarn')) return 'yarn';\n if (pkg.packageManager.startsWith('bun')) return 'bun';\n }\n\n // Default to npm\n return 'npm';\n};\n\n/**\n * Get install command for package manager\n */\nexport const getInstallCommand = (packageManager: FrameworkInfo['packageManager'], packages: string[]): string => {\n const pkgList = packages.join(' ');\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add ${pkgList}`;\n case 'yarn':\n return `yarn add ${pkgList}`;\n case 'bun':\n return `bun add ${pkgList}`;\n case 'npm':\n default:\n return `npm install ${pkgList}`;\n }\n};\n\n/**\n * Detects the framework being used in the given directory\n */\nexport const detectFramework = (dir: string = process.cwd()): FrameworkInfo => {\n const pkg = readPackageJson(dir);\n const packageManager = detectPackageManager(dir, pkg);\n\n // Check for Nuxt (highest priority - it's built on Vue)\n if (pkg && getDependencyVersion(pkg, 'nuxt')) {\n const version = getDependencyVersion(pkg, 'nuxt');\n return {\n framework: 'nuxt',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 100,\n reason: 'Found \"nuxt\" in dependencies'\n };\n }\n\n // Check for Nuxt config files\n if (fileExists(dir, 'nuxt.config.ts') || fileExists(dir, 'nuxt.config.js')) {\n return {\n framework: 'nuxt',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 95,\n reason: 'Found nuxt.config file'\n };\n }\n\n // Check for Next.js (higher priority than React - it's built on React)\n if (pkg && getDependencyVersion(pkg, 'next')) {\n const version = getDependencyVersion(pkg, 'next');\n return {\n framework: 'next',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 100,\n reason: 'Found \"next\" in dependencies'\n };\n }\n\n // Check for Next.js config files\n if (fileExists(dir, 'next.config.js') || fileExists(dir, 'next.config.mjs') || fileExists(dir, 'next.config.ts')) {\n return {\n framework: 'next',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 90,\n reason: 'Found next.config file'\n };\n }\n\n // Check for Vue (but not Nuxt)\n if (pkg && getDependencyVersion(pkg, 'vue')) {\n const version = getDependencyVersion(pkg, 'vue');\n return {\n framework: 'vue',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3',\n confidence: 100,\n reason: 'Found \"vue\" in dependencies'\n };\n }\n\n // Check for Vite with Vue\n if (fileExists(dir, 'vite.config.ts') || fileExists(dir, 'vite.config.js')) {\n const viteConfig = path.join(dir, fileExists(dir, 'vite.config.ts') ? 'vite.config.ts' : 'vite.config.js');\n try {\n const content = fs.readFileSync(viteConfig, 'utf-8');\n if (content.includes('@vitejs/plugin-vue') || content.includes('vue()')) {\n return {\n framework: 'vue',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3 (Vite)',\n confidence: 85,\n reason: 'Found Vue plugin in vite.config'\n };\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Check for React\n if (pkg && getDependencyVersion(pkg, 'react')) {\n const version = getDependencyVersion(pkg, 'react');\n const majorVersion = parseInt(version?.replace(/^\\^|~/, '').split('.')[0] ?? '18', 10);\n\n // React 16.8+ supports hooks, recommend modern package\n if (majorVersion >= 16) {\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: majorVersion >= 18 ? 'React 18+' : 'React 16.8+',\n confidence: 100,\n reason: 'Found \"react\" in dependencies'\n };\n }\n\n // Older React - use legacy package\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react-legacy'],\n displayName: 'React (Legacy)',\n confidence: 100,\n reason: 'Found older \"react\" version in dependencies'\n };\n }\n\n // Check for .jsx/.tsx files suggesting React\n const srcDir = path.join(dir, 'src');\n if (fs.existsSync(srcDir)) {\n try {\n const files = fs.readdirSync(srcDir);\n if (files.some((f) => f.endsWith('.jsx') || f.endsWith('.tsx'))) {\n return {\n framework: 'react',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: 'React (detected from .jsx/.tsx files)',\n confidence: 70,\n reason: 'Found .jsx or .tsx files in src/'\n };\n }\n } catch {\n // Ignore read errors\n }\n }\n\n // Default to vanilla JS\n return {\n framework: 'vanilla',\n packageManager,\n packages: ['@jwiedeman/gtm-kit'],\n displayName: 'Vanilla JavaScript',\n confidence: 50,\n reason: 'No framework detected, using core package only'\n };\n};\n\n/**\n * Human-readable summary of detected framework\n */\nexport const getDetectionSummary = (info: FrameworkInfo): string => {\n const lines = [\n `Framework: ${info.displayName}`,\n `Package Manager: ${info.packageManager}`,\n `Confidence: ${info.confidence}%`,\n `Reason: ${info.reason}`,\n '',\n 'Packages to install:',\n ...info.packages.map((p) => ` - ${p}`)\n ];\n\n if (info.version) {\n lines.splice(1, 0, `Version: ${info.version}`);\n }\n\n return lines.join('\\n');\n};\n","/**\n * Validation utilities for GTM Kit CLI\n *\n * Validates:\n * - GTM container IDs (GTM-XXXXXX format)\n * - Configuration options\n * - Data layer names\n */\n\nexport interface ValidationResult {\n /** Whether the validation passed */\n valid: boolean;\n /** Error message if invalid */\n error?: string;\n /** Warning message (validation passed but with concerns) */\n warning?: string;\n /** Suggested fix if invalid */\n suggestion?: string;\n}\n\n/**\n * Valid GTM container ID pattern\n * Format: GTM-XXXXXX where X is alphanumeric (typically uppercase)\n * Length: GTM- prefix + 6-8 characters\n */\nconst GTM_ID_PATTERN = /^GTM-[A-Z0-9]{6,8}$/;\n\n/**\n * Common mistakes in GTM IDs\n */\nconst COMMON_MISTAKES: { pattern: RegExp; message: string; suggestion: string }[] = [\n {\n pattern: /^gtm-[A-Za-z0-9]/,\n message: 'GTM ID should use uppercase \"GTM-\" prefix',\n suggestion: 'Use uppercase: GTM-XXXXXX'\n },\n {\n pattern: /^G-/,\n message: 'This looks like a GA4 Measurement ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", GA4 IDs start with \"G-\"'\n },\n {\n pattern: /^UA-/,\n message: 'This is a Universal Analytics ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", UA IDs start with \"UA-\"'\n },\n {\n pattern: /^AW-/,\n message: 'This looks like a Google Ads conversion ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", Google Ads IDs start with \"AW-\"'\n },\n {\n pattern: /^DC-/,\n message: 'This looks like a DoubleClick ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\"'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{1,5}$/,\n message: 'GTM container ID appears too short',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{9,}$/,\n message: 'GTM container ID appears too long',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /\\s/,\n message: 'GTM container ID should not contain spaces',\n suggestion: 'Remove any spaces from the ID'\n }\n];\n\n/**\n * Validates a GTM container ID\n *\n * @example\n * validateGtmId('GTM-ABC1234') // { valid: true }\n * validateGtmId('G-ABC123') // { valid: false, error: '...' }\n */\nexport const validateGtmId = (id: string): ValidationResult => {\n if (!id || typeof id !== 'string') {\n return {\n valid: false,\n error: 'GTM container ID is required',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n const trimmedId = id.trim();\n\n if (trimmedId.length === 0) {\n return {\n valid: false,\n error: 'GTM container ID cannot be empty',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n // Check for common mistakes first (better error messages)\n for (const mistake of COMMON_MISTAKES) {\n if (mistake.pattern.test(trimmedId)) {\n return {\n valid: false,\n error: mistake.message,\n suggestion: mistake.suggestion\n };\n }\n }\n\n // Check against valid pattern\n if (!GTM_ID_PATTERN.test(trimmedId)) {\n // Try to give a specific error\n if (!trimmedId.startsWith('GTM-')) {\n return {\n valid: false,\n error: 'GTM container ID must start with \"GTM-\"',\n suggestion: `Did you mean: GTM-${trimmedId.replace(/^[A-Za-z]+-?/, '')}?`\n };\n }\n\n const afterPrefix = trimmedId.slice(4);\n if (/[a-z]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should use uppercase letters',\n suggestion: `Did you mean: GTM-${afterPrefix.toUpperCase()}?`\n };\n }\n\n if (/[^A-Z0-9]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should only contain letters and numbers after GTM-',\n suggestion: 'Remove any special characters from the ID'\n };\n }\n\n return {\n valid: false,\n error: 'Invalid GTM container ID format',\n suggestion: 'GTM container IDs follow the format: GTM-XXXXXX (6-8 alphanumeric characters)'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Validates multiple GTM container IDs\n */\nexport const validateGtmIds = (ids: string[]): ValidationResult => {\n if (!Array.isArray(ids) || ids.length === 0) {\n return {\n valid: false,\n error: 'At least one GTM container ID is required',\n suggestion: 'Provide at least one valid GTM container ID'\n };\n }\n\n const results = ids.map((id, index) => ({\n index,\n id,\n result: validateGtmId(id)\n }));\n\n const invalid = results.filter((r) => !r.result.valid);\n\n if (invalid.length > 0) {\n const errors = invalid.map((r) => ` [${r.index}] ${r.id}: ${r.result.error}`).join('\\n');\n return {\n valid: false,\n error: `Invalid GTM container ID(s):\\n${errors}`,\n suggestion: invalid[0].result.suggestion\n };\n }\n\n // Warn about duplicates\n const uniqueIds = new Set(ids);\n if (uniqueIds.size < ids.length) {\n return {\n valid: true,\n warning: 'Duplicate GTM container IDs detected. Each container should only be listed once.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Valid data layer name pattern (JavaScript variable name)\n */\nconst DATA_LAYER_NAME_PATTERN = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\n/**\n * Reserved JavaScript keywords that can't be used as data layer names\n */\nconst RESERVED_KEYWORDS = new Set([\n 'break',\n 'case',\n 'catch',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'class',\n 'const',\n 'enum',\n 'export',\n 'extends',\n 'import',\n 'super',\n 'implements',\n 'interface',\n 'let',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'static',\n 'yield',\n 'null',\n 'true',\n 'false',\n 'undefined',\n 'NaN',\n 'Infinity'\n]);\n\n/**\n * Validates a data layer name\n */\nexport const validateDataLayerName = (name: string): ValidationResult => {\n if (!name || typeof name !== 'string') {\n return {\n valid: false,\n error: 'Data layer name is required',\n suggestion: 'Use the default \"dataLayer\" or provide a valid JavaScript variable name'\n };\n }\n\n const trimmedName = name.trim();\n\n if (trimmedName.length === 0) {\n return {\n valid: false,\n error: 'Data layer name cannot be empty',\n suggestion: 'Use the default \"dataLayer\"'\n };\n }\n\n if (RESERVED_KEYWORDS.has(trimmedName)) {\n return {\n valid: false,\n error: `\"${trimmedName}\" is a reserved JavaScript keyword`,\n suggestion: 'Use a different name like \"dataLayer\" or \"customDataLayer\"'\n };\n }\n\n if (!DATA_LAYER_NAME_PATTERN.test(trimmedName)) {\n if (/^\\d/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot start with a number',\n suggestion: `Did you mean: _${trimmedName} or dataLayer${trimmedName}?`\n };\n }\n\n if (/\\s/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain spaces',\n suggestion: `Did you mean: ${trimmedName.replace(/\\s+/g, '_')}?`\n };\n }\n\n if (/-/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain hyphens',\n suggestion: `Did you mean: ${trimmedName.replace(/-/g, '_')}?`\n };\n }\n\n return {\n valid: false,\n error: 'Invalid data layer name - must be a valid JavaScript variable name',\n suggestion: 'Use only letters, numbers, underscores, and dollar signs (cannot start with a number)'\n };\n }\n\n // Warn about non-standard names\n if (trimmedName !== 'dataLayer') {\n return {\n valid: true,\n warning:\n 'Using a custom data layer name. Make sure your GTM container is configured to use the same name.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Configuration validation options\n */\nexport interface ValidateConfigOptions {\n containers: string | string[];\n dataLayerName?: string;\n host?: string;\n}\n\n/**\n * Validates the full GTM Kit configuration\n */\nexport const validateConfig = (config: ValidateConfigOptions): ValidationResult => {\n // Validate containers\n const containerIds = Array.isArray(config.containers) ? config.containers : [config.containers];\n const containerResult = validateGtmIds(containerIds);\n if (!containerResult.valid) {\n return containerResult;\n }\n\n // Validate data layer name if provided\n if (config.dataLayerName !== undefined) {\n const dataLayerResult = validateDataLayerName(config.dataLayerName);\n if (!dataLayerResult.valid) {\n return dataLayerResult;\n }\n if (dataLayerResult.warning) {\n return dataLayerResult;\n }\n }\n\n // Validate host if provided\n if (config.host !== undefined) {\n if (typeof config.host !== 'string') {\n return {\n valid: false,\n error: 'Host must be a string',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n\n try {\n const url = new URL(config.host);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return {\n valid: false,\n error: 'Host must use HTTP or HTTPS protocol',\n suggestion: 'Use a URL starting with http:// or https://'\n };\n }\n } catch {\n return {\n valid: false,\n error: 'Invalid host URL',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n }\n\n // Return container warning if present\n if (containerResult.warning) {\n return containerResult;\n }\n\n return { valid: true };\n};\n","/**\n * Code generation utilities for GTM Kit CLI\n *\n * Generates framework-specific setup code that users can copy/paste\n */\n\nimport type { Framework } from './detect';\n\nexport interface SetupCodeOptions {\n /** Target framework */\n framework: Framework;\n /** GTM container ID(s) */\n containers: string | string[];\n /** Custom data layer name */\n dataLayerName?: string;\n /** Include consent mode setup */\n includeConsent?: boolean;\n /** Use TypeScript */\n typescript?: boolean;\n}\n\ninterface GeneratedCode {\n /** Filename to create */\n filename: string;\n /** File contents */\n content: string;\n /** Description of what this file does */\n description: string;\n}\n\n/**\n * Generates setup code for the specified framework\n */\nexport const generateSetupCode = (options: SetupCodeOptions): GeneratedCode[] => {\n const { framework, containers, dataLayerName, includeConsent = false, typescript = true } = options;\n\n const ext = typescript ? 'ts' : 'js';\n const containerValue = Array.isArray(containers)\n ? `[${containers.map((c) => `'${c}'`).join(', ')}]`\n : `'${containers}'`;\n\n switch (framework) {\n case 'next':\n return generateNextSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'nuxt':\n return generateNuxtSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'react':\n return generateReactSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vue':\n return generateVueSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vanilla':\n default:\n return generateVanillaSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n }\n};\n\ninterface CodeGenContext {\n containerValue: string;\n dataLayerName?: string;\n includeConsent: boolean;\n ext: string;\n}\n\n/**\n * Generate Next.js App Router setup code\n */\nconst generateNextSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const providerCode = `// app/providers/gtm-provider.${ext}x\n'use client';\n\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n${ctx.ext === 'ts' ? `interface GtmProviderWrapperProps {\\n children: ReactNode;\\n}\\n` : ''}\nexport function GtmProviderWrapper({ children }${ctx.ext === 'ts' ? ': GtmProviderWrapperProps' : ''}) {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <PageViewTracker />\n {children}\n </GtmProvider>\n );\n}\n\nfunction PageViewTracker() {\n useTrackPageViews();\n return null;\n}\n`;\n\n const layoutCode = `// app/layout.${ext}x\nimport { GtmProviderWrapper } from './providers/gtm-provider';\nimport { GtmNoScript } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\nexport default function RootLayout({ children }${ctx.ext === 'ts' ? ': { children: ReactNode }' : ''}) {\n return (\n <html lang=\"en\">\n <body>\n <GtmNoScript containerId=\"${Array.isArray(containerValue) ? containerValue[0] : containerValue.replace(/'/g, '')}\" />\n <GtmProviderWrapper>\n {children}\n </GtmProviderWrapper>\n </body>\n </html>\n );\n}\n`;\n\n const exampleUsage = `// Example: Track a button click\n'use client';\n\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function MyButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n`;\n\n return [\n {\n filename: `app/providers/gtm-provider.${ext}x`,\n content: providerCode,\n description: 'GTM Provider wrapper with page view tracking'\n },\n {\n filename: `app/layout.${ext}x`,\n content: layoutCode,\n description: 'Root layout with GTM noscript tag'\n },\n {\n filename: `components/example-button.${ext}x`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Nuxt 3 setup code\n */\nconst generateNuxtSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const pluginCode = `// plugins/gtm.client.${ext}\nimport { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nexport default defineNuxtPlugin((nuxtApp) => {\n createNuxtGtmPlugin(nuxtApp.vueApp, {\n containers: ${containerValue},${dataLayerOption}\n trackPageViews: true${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n });\n});\n`;\n\n const pageTrackingCode = `// composables/usePageTracking.${ext}\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n\n/**\n * Call this composable in your app.vue or layouts to enable automatic page tracking\n */\nexport function usePageTracking() {\n const route = useRoute();\n\n useTrackPageViews({\n route,\n eventName: 'page_view',\n includeQueryParams: true\n });\n}\n`;\n\n const appVueCode = `<!-- app.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from '~/composables/usePageTracking';\n\n// Enable automatic page view tracking\nusePageTracking();\n</script>\n\n<template>\n <NuxtLayout>\n <NuxtPage />\n </NuxtLayout>\n</template>\n`;\n\n const exampleUsage = `<!-- Example: Track a button click -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useNuxtGtmPush } from '@jwiedeman/gtm-kit-nuxt';\n\nconst push = useNuxtGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n</script>\n\n<template>\n <button @click=\"handleClick\">Sign Up</button>\n</template>\n`;\n\n return [\n {\n filename: `plugins/gtm.client.${ext}`,\n content: pluginCode,\n description: 'Nuxt plugin for GTM (client-side only)'\n },\n {\n filename: `composables/usePageTracking.${ext}`,\n content: pageTrackingCode,\n description: 'Composable for automatic page view tracking'\n },\n {\n filename: 'app.vue',\n content: appVueCode,\n description: 'App root with page tracking enabled'\n },\n {\n filename: `components/ExampleButton.vue`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate React (Vite/CRA) setup code\n */\nconst generateReactSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const appCode = `// src/App.${ext}x\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n {/* Your app content */}\n <main>\n <h1>Hello GTM Kit!</h1>\n </main>\n </GtmProvider>\n );\n}\n\nexport default App;\n`;\n\n const routerCode = `// src/AppWithRouter.${ext}x\n// Use this if you have react-router-dom\nimport { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom';\nimport { GtmProvider, useGtmPush } from '@jwiedeman/gtm-kit-react';\nimport { useEffect } from 'react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n// Automatic page view tracking\nfunction PageViewTracker() {\n const location = useLocation();\n const push = useGtmPush();\n\n useEffect(() => {\n push({\n event: 'page_view',\n page_path: location.pathname + location.search\n });\n }, [location, push]);\n\n return null;\n}\n\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <BrowserRouter>\n <PageViewTracker />\n <Routes>\n <Route path=\"/\" element={<Home />} />\n {/* Add your routes */}\n </Routes>\n </BrowserRouter>\n </GtmProvider>\n );\n}\n\nfunction Home() {\n return <h1>Home Page</h1>;\n}\n\nexport default App;\n`;\n\n const exampleUsage = `// src/components/TrackingExample.${ext}x\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function SignupButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n\n// Track form submission\nexport function ContactForm() {\n const push = useGtmPush();\n\n const handleSubmit = (e${ctx.ext === 'ts' ? ': React.FormEvent' : ''}) => {\n e.preventDefault();\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n );\n}\n`;\n\n return [\n {\n filename: `src/App.${ext}x`,\n content: appCode,\n description: 'Basic App setup with GTM Provider'\n },\n {\n filename: `src/AppWithRouter.${ext}x`,\n content: routerCode,\n description: 'App setup with React Router and page tracking'\n },\n {\n filename: `src/components/TrackingExample.${ext}x`,\n content: exampleUsage,\n description: 'Example components showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vue 3 setup code\n */\nconst generateVueSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const mainCode = `// src/main.${ext}\nimport { createApp } from 'vue';\nimport { GtmPlugin } from '@jwiedeman/gtm-kit-vue';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}import App from './App.vue';\n\nconst app = createApp(App);\n\napp.use(GtmPlugin, {\n containers: ${containerValue}${dataLayerOption}${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n});\n\napp.mount('#app');\n`;\n\n const routerCode = `// src/router-tracking.${ext}\n// Add this to your router setup for automatic page tracking\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\nimport { watch } from 'vue';\nimport { useRoute } from 'vue-router';\n\nexport function usePageTracking() {\n const route = useRoute();\n const push = useGtmPush();\n\n watch(\n () => route.fullPath,\n (path) => {\n push({\n event: 'page_view',\n page_path: path,\n page_title: document.title\n });\n },\n { immediate: true }\n );\n}\n`;\n\n const appVueCode = `<!-- src/App.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from './router-tracking';\n\n// Enable page view tracking if using vue-router\n// usePageTracking();\n</script>\n\n<template>\n <main>\n <h1>Hello GTM Kit!</h1>\n <RouterView v-if=\"$router\" />\n </main>\n</template>\n`;\n\n const exampleUsage = `<!-- src/components/TrackingExample.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\n\nconst push = useGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n\nconst handleSubmit = () => {\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n};\n</script>\n\n<template>\n <div>\n <!-- Track button click -->\n <button @click=\"handleClick\">Sign Up</button>\n\n <!-- Track form submission -->\n <form @submit.prevent=\"handleSubmit\">\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n </div>\n</template>\n`;\n\n return [\n {\n filename: `src/main.${ext}`,\n content: mainCode,\n description: 'Main entry point with GTM Plugin'\n },\n {\n filename: `src/router-tracking.${ext}`,\n content: routerCode,\n description: 'Page tracking composable for Vue Router'\n },\n {\n filename: 'src/App.vue',\n content: appVueCode,\n description: 'App component with tracking setup'\n },\n {\n filename: 'src/components/TrackingExample.vue',\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vanilla JavaScript setup code\n */\nconst generateVanillaSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const esmCode = `// gtm-setup.${ext}\nimport { createGtmClient${includeConsent ? ', eeaDefault' : ''} } from '@jwiedeman/gtm-kit';\n\n// Create the GTM client\nconst gtm = createGtmClient({\n containers: ${containerValue}${dataLayerOption}\n});\n${includeConsent ? '\\n// Set consent defaults BEFORE init (for GDPR compliance)\\ngtm.setConsentDefaults(eeaDefault);\\n' : ''}\n// Initialize GTM\ngtm.init();\n\n// Track events\nexport function trackEvent(event${ctx.ext === 'ts' ? ': string' : ''}, data${ctx.ext === 'ts' ? '?: Record<string, unknown>' : ''} = {}) {\n gtm.push({\n event,\n ...data\n });\n}\n\n// Track page views\nexport function trackPageView(path${ctx.ext === 'ts' ? '?: string' : ''}) {\n gtm.push({\n event: 'page_view',\n page_path: path || window.location.pathname + window.location.search,\n page_title: document.title\n });\n}\n\n// Update consent (call this when user accepts/rejects)\nexport function updateConsent(analytics${ctx.ext === 'ts' ? ': boolean' : ''}, marketing${ctx.ext === 'ts' ? ': boolean' : ''}) {\n gtm.updateConsent({\n analytics_storage: analytics ? 'granted' : 'denied',\n ad_storage: marketing ? 'granted' : 'denied',\n ad_user_data: marketing ? 'granted' : 'denied',\n ad_personalization: marketing ? 'granted' : 'denied'\n });\n}\n\n// Example usage\ntrackPageView();\n\n// Export client for advanced usage\nexport { gtm };\n`;\n\n const htmlCode = `<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>GTM Kit - Vanilla JS</title>\n</head>\n<body>\n <!-- GTM noscript fallback (optional but recommended) -->\n <noscript>\n <iframe\n src=\"https://www.googletagmanager.com/ns.html?id=${Array.isArray(containerValue) ? 'YOUR-GTM-ID' : containerValue.replace(/'/g, '')}\"\n height=\"0\"\n width=\"0\"\n style=\"display:none;visibility:hidden\"\n ></iframe>\n </noscript>\n\n <main>\n <h1>Hello GTM Kit!</h1>\n <button id=\"signup-btn\">Sign Up</button>\n <button id=\"consent-btn\">Accept Cookies</button>\n </main>\n\n <script type=\"module\">\n import { trackEvent, updateConsent } from './gtm-setup.${ext}';\n\n // Track button click\n document.getElementById('signup-btn').addEventListener('click', () => {\n trackEvent('button_click', { button_name: 'signup_cta' });\n });\n\n // Handle consent\n document.getElementById('consent-btn').addEventListener('click', () => {\n updateConsent(true, true);\n });\n </script>\n</body>\n</html>\n`;\n\n const umdCode = `<!-- Alternative: UMD/Script Tag Setup -->\n<!-- Add this in your HTML head -->\n<script src=\"https://unpkg.com/@jwiedeman/gtm-kit/dist/index.umd.js\"></script>\n<script>\n // GTM Kit is available as window.GtmKit\n var gtm = GtmKit.createGtmClient({\n containers: ${containerValue}${dataLayerOption ? dataLayerOption.replace(/\\n/g, ' ') : ''}\n });\n${includeConsent ? '\\n // Set consent defaults\\n gtm.setConsentDefaults(GtmKit.eeaDefault);\\n' : ''}\n // Initialize\n gtm.init();\n\n // Track page view\n gtm.push({\n event: 'page_view',\n page_path: window.location.pathname\n });\n\n // Make gtm available globally for other scripts\n window.gtm = gtm;\n</script>\n`;\n\n return [\n {\n filename: `gtm-setup.${ext}`,\n content: esmCode,\n description: 'ESM setup with helper functions'\n },\n {\n filename: 'index.html',\n content: htmlCode,\n description: 'Example HTML with tracking'\n },\n {\n filename: 'umd-setup.html',\n content: umdCode,\n description: 'Alternative UMD/script tag setup'\n }\n ];\n};\n\n/**\n * Format generated code for display\n */\nexport const formatGeneratedCode = (files: GeneratedCode[]): string => {\n return files\n .map((file) => {\n const separator = '─'.repeat(60);\n return `${separator}\\nšŸ“„ ${file.filename}\\n${file.description}\\n${separator}\\n${file.content}`;\n })\n .join('\\n\\n');\n};\n","#!/usr/bin/env node\n/* eslint-disable no-console */\n/**\n * GTM Kit CLI - Zero-config setup for Google Tag Manager\n *\n * Usage:\n * npx @jwiedeman/gtm-kit-cli init # Interactive setup\n * npx @jwiedeman/gtm-kit-cli init GTM-XXX # Quick setup with container ID\n * npx @jwiedeman/gtm-kit-cli detect # Just detect framework\n * npx @jwiedeman/gtm-kit-cli validate # Validate existing setup\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as readline from 'readline';\nimport { detectFramework, getDetectionSummary, getInstallCommand } from './detect';\nimport { validateGtmId } from './validate';\nimport { generateSetupCode, formatGeneratedCode } from './codegen';\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m'\n};\n\nconst c = (color: keyof typeof colors, text: string): string => `${colors[color]}${text}${colors.reset}`;\n\n/**\n * Print styled output\n */\nconst print = {\n header: (text: string) => console.log(`\\n${c('bold', c('cyan', text))}\\n`),\n success: (text: string) => console.log(`${c('green', 'āœ“')} ${text}`),\n error: (text: string) => console.log(`${c('red', 'āœ—')} ${text}`),\n warning: (text: string) => console.log(`${c('yellow', '⚠')} ${text}`),\n info: (text: string) => console.log(`${c('blue', 'ℹ')} ${text}`),\n step: (n: number, text: string) => console.log(`\\n${c('bold', `Step ${n}:`)} ${text}`),\n code: (text: string) => console.log(` ${c('dim', '$')} ${c('cyan', text)}`),\n box: (lines: string[]) => {\n const maxLen = Math.max(...lines.map((l) => l.length));\n const border = '─'.repeat(maxLen + 2);\n console.log(`ā”Œ${border}┐`);\n lines.forEach((line) => console.log(`│ ${line.padEnd(maxLen)} │`));\n console.log(`ā””${border}ā”˜`);\n }\n};\n\n/**\n * Simple readline prompt\n */\nconst prompt = (question: string): Promise<string> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n};\n\n/**\n * Yes/No prompt with default\n */\nconst confirm = async (question: string, defaultYes = true): Promise<boolean> => {\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n const answer = await prompt(`${question} ${suffix} `);\n\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n};\n\n/**\n * Show banner\n */\nconst showBanner = () => {\n console.log(`\n${c('cyan', '╔═══════════════════════════════════════════╗')}\n${c('cyan', 'ā•‘')} ${c('bold', 'GTM Kit')} - Easy Google Tag Manager Setup ${c('cyan', 'ā•‘')}\n${c('cyan', 'ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•')}\n`);\n};\n\n/**\n * Show help\n */\nconst showHelp = () => {\n showBanner();\n console.log(`${c('bold', 'Usage:')}\n npx @jwiedeman/gtm-kit-cli <command> [options]\n\n${c('bold', 'Commands:')}\n ${c('cyan', 'init')} [GTM-ID] Interactive setup (or quick setup with ID)\n ${c('cyan', 'detect')} Detect framework and show install command\n ${c('cyan', 'validate')} <ID> Validate a GTM container ID\n ${c('cyan', 'generate')} <ID> Generate setup code for your framework\n ${c('cyan', 'help')} Show this help message\n\n${c('bold', 'Examples:')}\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init GTM-ABC1234\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli detect\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\n\n${c('bold', 'Options:')}\n --typescript, -ts Generate TypeScript code (default)\n --javascript, -js Generate JavaScript code\n --consent Include consent mode setup\n --dry-run Show what would be done without doing it\n\n${c('bold', 'More info:')} https://github.com/jwiedeman/GTM-Kit\n`);\n};\n\n/**\n * Detect command - show framework detection\n */\nconst runDetect = (dir: string = process.cwd()) => {\n showBanner();\n print.header('Framework Detection');\n\n const info = detectFramework(dir);\n console.log(getDetectionSummary(info));\n\n console.log('\\n' + c('bold', 'Install command:'));\n print.code(getInstallCommand(info.packageManager, info.packages));\n\n return info;\n};\n\n/**\n * Validate command - validate GTM ID\n */\nconst runValidate = (id: string) => {\n showBanner();\n print.header('GTM ID Validation');\n\n const result = validateGtmId(id);\n\n console.log(`ID: ${c('cyan', id)}`);\n\n if (result.valid) {\n print.success('Valid GTM container ID');\n if (result.warning) {\n print.warning(result.warning);\n }\n } else {\n print.error(result.error ?? 'Invalid');\n if (result.suggestion) {\n print.info(`Suggestion: ${result.suggestion}`);\n }\n }\n\n return result;\n};\n\n/**\n * Generate command - generate setup code\n */\nconst runGenerate = (containerId: string, options: { typescript?: boolean; consent?: boolean } = {}) => {\n showBanner();\n print.header('Generating Setup Code');\n\n const info = detectFramework();\n const validation = validateGtmId(containerId);\n\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(`Suggestion: ${validation.suggestion}`);\n }\n return null;\n }\n\n print.success(`Framework: ${info.displayName}`);\n print.success(`Container: ${containerId}`);\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: options.typescript ?? true,\n includeConsent: options.consent ?? false\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n return files;\n};\n\n/**\n * Init command - interactive setup\n */\nconst runInit = async (\n quickId?: string,\n options: { typescript?: boolean; consent?: boolean; dryRun?: boolean } = {}\n) => {\n showBanner();\n print.header('GTM Kit Setup');\n\n const info = detectFramework();\n\n // Step 1: Show detection\n print.step(1, 'Detecting your project...');\n console.log(`\\n Framework: ${c('green', info.displayName)}`);\n console.log(` Package Manager: ${c('green', info.packageManager)}`);\n console.log(` Confidence: ${info.confidence}%`);\n\n // Step 2: Get GTM ID\n print.step(2, 'GTM Container ID');\n\n let containerId = quickId ?? '';\n\n if (!containerId) {\n containerId = await prompt(`\\n Enter your GTM container ID (e.g., GTM-ABC1234): `);\n }\n\n if (!containerId) {\n print.error('GTM container ID is required');\n console.log(`\\n ${c('dim', 'Tip: Get your GTM ID from https://tagmanager.google.com')}\\n`);\n process.exit(1);\n }\n\n const validation = validateGtmId(containerId);\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(validation.suggestion);\n }\n process.exit(1);\n }\n\n print.success(`Valid container ID: ${containerId}`);\n\n // Step 3: Options\n print.step(3, 'Configuration');\n\n const useConsent = options.consent ?? (await confirm('\\n Include Consent Mode v2 setup (GDPR)?', true));\n const useTypescript = options.typescript ?? (await confirm(' Use TypeScript?', true));\n\n // Step 4: Install packages\n print.step(4, 'Installing packages...');\n\n const installCmd = getInstallCommand(info.packageManager, info.packages);\n console.log(`\\n Command: ${c('cyan', installCmd)}`);\n\n if (options.dryRun) {\n print.warning('Dry run - skipping installation');\n } else {\n const shouldInstall = await confirm('\\n Run installation now?', true);\n\n if (shouldInstall) {\n const { execSync } = await import('child_process');\n try {\n console.log('');\n execSync(installCmd, { stdio: 'inherit' });\n print.success('Packages installed successfully');\n } catch (error) {\n print.error('Installation failed');\n console.log(`\\n ${c('dim', 'Try running manually:')} ${c('cyan', installCmd)}\\n`);\n }\n } else {\n print.info('Skipped installation. Run manually:');\n print.code(installCmd);\n }\n }\n\n // Step 5: Generate code\n print.step(5, 'Generating setup code...');\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: useTypescript,\n includeConsent: useConsent\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n // Step 6: Write files\n print.step(6, 'Creating files...');\n\n if (options.dryRun) {\n print.warning('Dry run - skipping file creation');\n files.forEach((file) => {\n console.log(` Would create: ${c('cyan', file.filename)}`);\n });\n } else {\n const shouldWrite = await confirm('\\n Create these files in your project?', false);\n\n if (shouldWrite) {\n for (const file of files) {\n const filePath = path.join(process.cwd(), file.filename);\n const dir = path.dirname(filePath);\n\n // Create directory if needed\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Check if file exists\n if (fs.existsSync(filePath)) {\n const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);\n if (!overwrite) {\n print.info(`Skipped: ${file.filename}`);\n continue;\n }\n }\n\n fs.writeFileSync(filePath, file.content);\n print.success(`Created: ${file.filename}`);\n }\n } else {\n print.info('Files not created. Copy the code above manually.');\n }\n }\n\n // Done!\n print.header('Setup Complete!');\n\n print.box([\n `GTM Kit is ready to use with ${info.displayName}!`,\n '',\n `Container: ${containerId}`,\n useConsent ? 'Consent Mode: Enabled' : 'Consent Mode: Disabled',\n '',\n 'Next steps:',\n '1. Review the generated code',\n '2. Add your routes/pages',\n '3. Test with GTM Preview mode',\n '',\n 'Docs: https://github.com/jwiedeman/GTM-Kit'\n ]);\n\n return { info, containerId, files };\n};\n\n/**\n * Parse CLI arguments\n */\nconst parseArgs = (args: string[]): { command: string; positional: string[]; flags: Record<string, boolean> } => {\n const command = args[0] ?? 'help';\n const positional: string[] = [];\n const flags: Record<string, boolean> = {};\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n flags[arg.slice(2)] = true;\n } else if (arg.startsWith('-')) {\n flags[arg.slice(1)] = true;\n } else {\n positional.push(arg);\n }\n }\n\n return { command, positional, flags };\n};\n\n/**\n * Main entry point\n */\nexport const run = async (args: string[] = process.argv.slice(2)): Promise<void> => {\n const { command, positional, flags } = parseArgs(args);\n\n const options = {\n typescript: flags.typescript || flags.ts ? true : flags.javascript || flags.js ? false : undefined,\n consent: flags.consent ?? undefined,\n dryRun: flags['dry-run'] ?? false\n };\n\n try {\n switch (command) {\n case 'init':\n await runInit(positional[0], options);\n break;\n\n case 'detect':\n runDetect(positional[0]);\n break;\n\n case 'validate':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID to validate');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runValidate(positional[0]);\n break;\n\n case 'generate':\n case 'gen':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli generate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runGenerate(positional[0], options);\n break;\n\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n }\n } catch (error) {\n if (error instanceof Error) {\n print.error(error.message);\n } else {\n print.error('An unexpected error occurred');\n }\n process.exit(1);\n }\n};\n\n// Run if executed directly\nif (typeof require !== 'undefined' && require.main === module) {\n run();\n}\n"],"mappings":"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","names":["c","fs","path"]}
1
+ {"version":3,"sources":["../src/detect.ts","../src/validate.ts","../src/codegen.ts","../src/cli.ts"],"sourcesContent":["/**\n * Framework detection for GTM Kit CLI\n *\n * Auto-detects the framework being used by checking:\n * 1. package.json dependencies\n * 2. Config files (nuxt.config.ts, next.config.js, vite.config.ts)\n * 3. Directory structure\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport type Framework = 'next' | 'nuxt' | 'react' | 'vue' | 'vanilla';\n\nexport interface FrameworkInfo {\n /** Detected framework */\n framework: Framework;\n /** Framework version (if detectable) */\n version?: string;\n /** Package manager detected */\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun';\n /** Packages to install */\n packages: string[];\n /** Human-readable framework name */\n displayName: string;\n /** Confidence score 0-100 */\n confidence: number;\n /** Reason for detection */\n reason: string;\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n packageManager?: string;\n}\n\n/**\n * Reads and parses package.json from the given directory\n */\nconst readPackageJson = (dir: string): PackageJson | null => {\n const pkgPath = path.join(dir, 'package.json');\n try {\n if (!fs.existsSync(pkgPath)) {\n return null;\n }\n const content = fs.readFileSync(pkgPath, 'utf-8');\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n};\n\n/**\n * Checks if a file exists in the given directory\n */\nconst fileExists = (dir: string, filename: string): boolean => {\n return fs.existsSync(path.join(dir, filename));\n};\n\n/**\n * Gets the version of a dependency from package.json\n */\nconst getDependencyVersion = (pkg: PackageJson, name: string): string | undefined => {\n return pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\n};\n\n/**\n * Detects which package manager is being used\n */\nconst detectPackageManager = (dir: string, pkg: PackageJson | null): FrameworkInfo['packageManager'] => {\n // Check lockfiles first (most reliable)\n if (fileExists(dir, 'pnpm-lock.yaml')) return 'pnpm';\n if (fileExists(dir, 'yarn.lock')) return 'yarn';\n if (fileExists(dir, 'bun.lockb')) return 'bun';\n if (fileExists(dir, 'package-lock.json')) return 'npm';\n\n // Check packageManager field in package.json\n if (pkg?.packageManager) {\n if (pkg.packageManager.startsWith('pnpm')) return 'pnpm';\n if (pkg.packageManager.startsWith('yarn')) return 'yarn';\n if (pkg.packageManager.startsWith('bun')) return 'bun';\n }\n\n // Default to npm\n return 'npm';\n};\n\n/**\n * Get install command for package manager\n */\nexport const getInstallCommand = (packageManager: FrameworkInfo['packageManager'], packages: string[]): string => {\n const pkgList = packages.join(' ');\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add ${pkgList}`;\n case 'yarn':\n return `yarn add ${pkgList}`;\n case 'bun':\n return `bun add ${pkgList}`;\n case 'npm':\n default:\n return `npm install ${pkgList}`;\n }\n};\n\n/**\n * Detects the framework being used in the given directory\n */\nexport const detectFramework = (dir: string = process.cwd()): FrameworkInfo => {\n const pkg = readPackageJson(dir);\n const packageManager = detectPackageManager(dir, pkg);\n\n // Check for Nuxt (highest priority - it's built on Vue)\n if (pkg && getDependencyVersion(pkg, 'nuxt')) {\n const version = getDependencyVersion(pkg, 'nuxt');\n return {\n framework: 'nuxt',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 100,\n reason: 'Found \"nuxt\" in dependencies'\n };\n }\n\n // Check for Nuxt config files\n if (fileExists(dir, 'nuxt.config.ts') || fileExists(dir, 'nuxt.config.js')) {\n return {\n framework: 'nuxt',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-nuxt'],\n displayName: 'Nuxt 3',\n confidence: 95,\n reason: 'Found nuxt.config file'\n };\n }\n\n // Check for Next.js (higher priority than React - it's built on React)\n if (pkg && getDependencyVersion(pkg, 'next')) {\n const version = getDependencyVersion(pkg, 'next');\n return {\n framework: 'next',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 100,\n reason: 'Found \"next\" in dependencies'\n };\n }\n\n // Check for Next.js config files\n if (fileExists(dir, 'next.config.js') || fileExists(dir, 'next.config.mjs') || fileExists(dir, 'next.config.ts')) {\n return {\n framework: 'next',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-next'],\n displayName: 'Next.js',\n confidence: 90,\n reason: 'Found next.config file'\n };\n }\n\n // Check for Vue (but not Nuxt)\n if (pkg && getDependencyVersion(pkg, 'vue')) {\n const version = getDependencyVersion(pkg, 'vue');\n return {\n framework: 'vue',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3',\n confidence: 100,\n reason: 'Found \"vue\" in dependencies'\n };\n }\n\n // Check for Vite with Vue\n if (fileExists(dir, 'vite.config.ts') || fileExists(dir, 'vite.config.js')) {\n const viteConfig = path.join(dir, fileExists(dir, 'vite.config.ts') ? 'vite.config.ts' : 'vite.config.js');\n try {\n const content = fs.readFileSync(viteConfig, 'utf-8');\n if (content.includes('@vitejs/plugin-vue') || content.includes('vue()')) {\n return {\n framework: 'vue',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-vue'],\n displayName: 'Vue 3 (Vite)',\n confidence: 85,\n reason: 'Found Vue plugin in vite.config'\n };\n }\n } catch (error) {\n // Debug: Log read errors for vite config (non-critical)\n if (process.env.DEBUG) {\n console.debug(`[gtm-kit] Could not read ${viteConfig}:`, error);\n }\n }\n }\n\n // Check for React\n if (pkg && getDependencyVersion(pkg, 'react')) {\n const version = getDependencyVersion(pkg, 'react');\n const majorVersion = parseInt(version?.replace(/^\\^|~/, '').split('.')[0] ?? '18', 10);\n\n // React 16.8+ supports hooks, recommend modern package\n if (majorVersion >= 16) {\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: majorVersion >= 18 ? 'React 18+' : 'React 16.8+',\n confidence: 100,\n reason: 'Found \"react\" in dependencies'\n };\n }\n\n // Older React - use legacy package\n return {\n framework: 'react',\n version: version?.replace(/^\\^|~/, ''),\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react-legacy'],\n displayName: 'React (Legacy)',\n confidence: 100,\n reason: 'Found older \"react\" version in dependencies'\n };\n }\n\n // Check for .jsx/.tsx files suggesting React\n const srcDir = path.join(dir, 'src');\n if (fs.existsSync(srcDir)) {\n try {\n const files = fs.readdirSync(srcDir);\n if (files.some((f) => f.endsWith('.jsx') || f.endsWith('.tsx'))) {\n return {\n framework: 'react',\n packageManager,\n packages: ['@jwiedeman/gtm-kit', '@jwiedeman/gtm-kit-react'],\n displayName: 'React (detected from .jsx/.tsx files)',\n confidence: 70,\n reason: 'Found .jsx or .tsx files in src/'\n };\n }\n } catch (error) {\n // Debug: Log read errors for src directory (non-critical)\n if (process.env.DEBUG) {\n console.debug(`[gtm-kit] Could not read ${srcDir}:`, error);\n }\n }\n }\n\n // Default to vanilla JS\n return {\n framework: 'vanilla',\n packageManager,\n packages: ['@jwiedeman/gtm-kit'],\n displayName: 'Vanilla JavaScript',\n confidence: 50,\n reason: 'No framework detected, using core package only'\n };\n};\n\n/**\n * Human-readable summary of detected framework\n */\nexport const getDetectionSummary = (info: FrameworkInfo): string => {\n const lines = [\n `Framework: ${info.displayName}`,\n `Package Manager: ${info.packageManager}`,\n `Confidence: ${info.confidence}%`,\n `Reason: ${info.reason}`,\n '',\n 'Packages to install:',\n ...info.packages.map((p) => ` - ${p}`)\n ];\n\n if (info.version) {\n lines.splice(1, 0, `Version: ${info.version}`);\n }\n\n return lines.join('\\n');\n};\n","/**\n * Validation utilities for GTM Kit CLI\n *\n * Validates:\n * - GTM container IDs (GTM-XXXXXX format)\n * - Configuration options\n * - Data layer names\n */\n\nexport interface ValidationResult {\n /** Whether the validation passed */\n valid: boolean;\n /** Error message if invalid */\n error?: string;\n /** Warning message (validation passed but with concerns) */\n warning?: string;\n /** Suggested fix if invalid */\n suggestion?: string;\n}\n\n/**\n * Valid GTM container ID pattern\n * Format: GTM-XXXXXX where X is alphanumeric (typically uppercase)\n * Length: GTM- prefix + 6-8 characters\n */\nconst GTM_ID_PATTERN = /^GTM-[A-Z0-9]{6,8}$/;\n\n/**\n * Common mistakes in GTM IDs\n */\nconst COMMON_MISTAKES: { pattern: RegExp; message: string; suggestion: string }[] = [\n {\n pattern: /^gtm-[A-Za-z0-9]/,\n message: 'GTM ID should use uppercase \"GTM-\" prefix',\n suggestion: 'Use uppercase: GTM-XXXXXX'\n },\n {\n pattern: /^G-/,\n message: 'This looks like a GA4 Measurement ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", GA4 IDs start with \"G-\"'\n },\n {\n pattern: /^UA-/,\n message: 'This is a Universal Analytics ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", UA IDs start with \"UA-\"'\n },\n {\n pattern: /^AW-/,\n message: 'This looks like a Google Ads conversion ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\", Google Ads IDs start with \"AW-\"'\n },\n {\n pattern: /^DC-/,\n message: 'This looks like a DoubleClick ID, not a GTM container ID',\n suggestion: 'GTM IDs start with \"GTM-\"'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{1,5}$/,\n message: 'GTM container ID appears too short',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /^GTM-[A-Za-z0-9]{9,}$/,\n message: 'GTM container ID appears too long',\n suggestion: 'GTM IDs are typically 6-8 characters after the prefix (e.g., GTM-ABCD123)'\n },\n {\n pattern: /\\s/,\n message: 'GTM container ID should not contain spaces',\n suggestion: 'Remove any spaces from the ID'\n }\n];\n\n/**\n * Validates a GTM container ID\n *\n * @example\n * validateGtmId('GTM-ABC1234') // { valid: true }\n * validateGtmId('G-ABC123') // { valid: false, error: '...' }\n */\nexport const validateGtmId = (id: string): ValidationResult => {\n if (!id || typeof id !== 'string') {\n return {\n valid: false,\n error: 'GTM container ID is required',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n const trimmedId = id.trim();\n\n if (trimmedId.length === 0) {\n return {\n valid: false,\n error: 'GTM container ID cannot be empty',\n suggestion: 'Provide a valid GTM container ID (e.g., GTM-XXXXXX)'\n };\n }\n\n // Check for common mistakes first (better error messages)\n for (const mistake of COMMON_MISTAKES) {\n if (mistake.pattern.test(trimmedId)) {\n return {\n valid: false,\n error: mistake.message,\n suggestion: mistake.suggestion\n };\n }\n }\n\n // Check against valid pattern\n if (!GTM_ID_PATTERN.test(trimmedId)) {\n // Try to give a specific error\n if (!trimmedId.startsWith('GTM-')) {\n return {\n valid: false,\n error: 'GTM container ID must start with \"GTM-\"',\n suggestion: `Did you mean: GTM-${trimmedId.replace(/^[A-Za-z]+-?/, '')}?`\n };\n }\n\n const afterPrefix = trimmedId.slice(4);\n if (/[a-z]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should use uppercase letters',\n suggestion: `Did you mean: GTM-${afterPrefix.toUpperCase()}?`\n };\n }\n\n if (/[^A-Z0-9]/.test(afterPrefix)) {\n return {\n valid: false,\n error: 'GTM container ID should only contain letters and numbers after GTM-',\n suggestion: 'Remove any special characters from the ID'\n };\n }\n\n return {\n valid: false,\n error: 'Invalid GTM container ID format',\n suggestion: 'GTM container IDs follow the format: GTM-XXXXXX (6-8 alphanumeric characters)'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Validates multiple GTM container IDs\n */\nexport const validateGtmIds = (ids: string[]): ValidationResult => {\n if (!Array.isArray(ids) || ids.length === 0) {\n return {\n valid: false,\n error: 'At least one GTM container ID is required',\n suggestion: 'Provide at least one valid GTM container ID'\n };\n }\n\n const results = ids.map((id, index) => ({\n index,\n id,\n result: validateGtmId(id)\n }));\n\n const invalid = results.filter((r) => !r.result.valid);\n\n if (invalid.length > 0) {\n const errors = invalid.map((r) => ` [${r.index}] ${r.id}: ${r.result.error}`).join('\\n');\n return {\n valid: false,\n error: `Invalid GTM container ID(s):\\n${errors}`,\n suggestion: invalid[0].result.suggestion\n };\n }\n\n // Warn about duplicates\n const uniqueIds = new Set(ids);\n if (uniqueIds.size < ids.length) {\n return {\n valid: true,\n warning: 'Duplicate GTM container IDs detected. Each container should only be listed once.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Valid data layer name pattern (JavaScript variable name)\n */\nconst DATA_LAYER_NAME_PATTERN = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\n/**\n * Reserved JavaScript keywords that can't be used as data layer names\n */\nconst RESERVED_KEYWORDS = new Set([\n 'break',\n 'case',\n 'catch',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'in',\n 'instanceof',\n 'new',\n 'return',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'class',\n 'const',\n 'enum',\n 'export',\n 'extends',\n 'import',\n 'super',\n 'implements',\n 'interface',\n 'let',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'static',\n 'yield',\n 'null',\n 'true',\n 'false',\n 'undefined',\n 'NaN',\n 'Infinity'\n]);\n\n/**\n * Validates a data layer name\n */\nexport const validateDataLayerName = (name: string): ValidationResult => {\n if (!name || typeof name !== 'string') {\n return {\n valid: false,\n error: 'Data layer name is required',\n suggestion: 'Use the default \"dataLayer\" or provide a valid JavaScript variable name'\n };\n }\n\n const trimmedName = name.trim();\n\n if (trimmedName.length === 0) {\n return {\n valid: false,\n error: 'Data layer name cannot be empty',\n suggestion: 'Use the default \"dataLayer\"'\n };\n }\n\n if (RESERVED_KEYWORDS.has(trimmedName)) {\n return {\n valid: false,\n error: `\"${trimmedName}\" is a reserved JavaScript keyword`,\n suggestion: 'Use a different name like \"dataLayer\" or \"customDataLayer\"'\n };\n }\n\n if (!DATA_LAYER_NAME_PATTERN.test(trimmedName)) {\n if (/^\\d/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot start with a number',\n suggestion: `Did you mean: _${trimmedName} or dataLayer${trimmedName}?`\n };\n }\n\n if (/\\s/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain spaces',\n suggestion: `Did you mean: ${trimmedName.replace(/\\s+/g, '_')}?`\n };\n }\n\n if (/-/.test(trimmedName)) {\n return {\n valid: false,\n error: 'Data layer name cannot contain hyphens',\n suggestion: `Did you mean: ${trimmedName.replace(/-/g, '_')}?`\n };\n }\n\n return {\n valid: false,\n error: 'Invalid data layer name - must be a valid JavaScript variable name',\n suggestion: 'Use only letters, numbers, underscores, and dollar signs (cannot start with a number)'\n };\n }\n\n // Warn about non-standard names\n if (trimmedName !== 'dataLayer') {\n return {\n valid: true,\n warning:\n 'Using a custom data layer name. Make sure your GTM container is configured to use the same name.'\n };\n }\n\n return { valid: true };\n};\n\n/**\n * Configuration validation options\n */\nexport interface ValidateConfigOptions {\n containers: string | string[];\n dataLayerName?: string;\n host?: string;\n}\n\n/**\n * Validates the full GTM Kit configuration\n */\nexport const validateConfig = (config: ValidateConfigOptions): ValidationResult => {\n // Validate containers\n const containerIds = Array.isArray(config.containers) ? config.containers : [config.containers];\n const containerResult = validateGtmIds(containerIds);\n if (!containerResult.valid) {\n return containerResult;\n }\n\n // Validate data layer name if provided\n if (config.dataLayerName !== undefined) {\n const dataLayerResult = validateDataLayerName(config.dataLayerName);\n if (!dataLayerResult.valid) {\n return dataLayerResult;\n }\n if (dataLayerResult.warning) {\n return dataLayerResult;\n }\n }\n\n // Validate host if provided\n if (config.host !== undefined) {\n if (typeof config.host !== 'string') {\n return {\n valid: false,\n error: 'Host must be a string',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n\n try {\n const url = new URL(config.host);\n if (!['http:', 'https:'].includes(url.protocol)) {\n return {\n valid: false,\n error: 'Host must use HTTP or HTTPS protocol',\n suggestion: 'Use a URL starting with http:// or https://'\n };\n }\n } catch {\n return {\n valid: false,\n error: 'Invalid host URL',\n suggestion: 'Provide a valid URL like \"https://www.googletagmanager.com\"'\n };\n }\n }\n\n // Return container warning if present\n if (containerResult.warning) {\n return containerResult;\n }\n\n return { valid: true };\n};\n","/**\n * Code generation utilities for GTM Kit CLI\n *\n * Generates framework-specific setup code that users can copy/paste\n */\n\nimport type { Framework } from './detect';\n\nexport interface SetupCodeOptions {\n /** Target framework */\n framework: Framework;\n /** GTM container ID(s) */\n containers: string | string[];\n /** Custom data layer name */\n dataLayerName?: string;\n /** Include consent mode setup */\n includeConsent?: boolean;\n /** Use TypeScript */\n typescript?: boolean;\n}\n\ninterface GeneratedCode {\n /** Filename to create */\n filename: string;\n /** File contents */\n content: string;\n /** Description of what this file does */\n description: string;\n}\n\n/**\n * Generates setup code for the specified framework\n */\nexport const generateSetupCode = (options: SetupCodeOptions): GeneratedCode[] => {\n const { framework, containers, dataLayerName, includeConsent = false, typescript = true } = options;\n\n const ext = typescript ? 'ts' : 'js';\n const containerValue = Array.isArray(containers)\n ? `[${containers.map((c) => `'${c}'`).join(', ')}]`\n : `'${containers}'`;\n\n switch (framework) {\n case 'next':\n return generateNextSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'nuxt':\n return generateNuxtSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'react':\n return generateReactSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vue':\n return generateVueSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n case 'vanilla':\n default:\n return generateVanillaSetupCode({ containerValue, dataLayerName, includeConsent, ext });\n }\n};\n\ninterface CodeGenContext {\n containerValue: string;\n dataLayerName?: string;\n includeConsent: boolean;\n ext: string;\n}\n\n/**\n * Generate Next.js App Router setup code\n */\nconst generateNextSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const providerCode = `// app/providers/gtm-provider.${ext}x\n'use client';\n\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n${ctx.ext === 'ts' ? `interface GtmProviderWrapperProps {\\n children: ReactNode;\\n}\\n` : ''}\nexport function GtmProviderWrapper({ children }${ctx.ext === 'ts' ? ': GtmProviderWrapperProps' : ''}) {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <PageViewTracker />\n {children}\n </GtmProvider>\n );\n}\n\nfunction PageViewTracker() {\n useTrackPageViews();\n return null;\n}\n`;\n\n const layoutCode = `// app/layout.${ext}x\nimport { GtmProviderWrapper } from './providers/gtm-provider';\nimport { GtmNoScript } from '@jwiedeman/gtm-kit-next';\n${ctx.ext === 'ts' ? \"import type { ReactNode } from 'react';\\n\" : ''}\nexport default function RootLayout({ children }${ctx.ext === 'ts' ? ': { children: ReactNode }' : ''}) {\n return (\n <html lang=\"en\">\n <body>\n <GtmNoScript containerId=\"${Array.isArray(containerValue) ? containerValue[0] : containerValue.replace(/'/g, '')}\" />\n <GtmProviderWrapper>\n {children}\n </GtmProviderWrapper>\n </body>\n </html>\n );\n}\n`;\n\n const exampleUsage = `// Example: Track a button click\n'use client';\n\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function MyButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n`;\n\n return [\n {\n filename: `app/providers/gtm-provider.${ext}x`,\n content: providerCode,\n description: 'GTM Provider wrapper with page view tracking'\n },\n {\n filename: `app/layout.${ext}x`,\n content: layoutCode,\n description: 'Root layout with GTM noscript tag'\n },\n {\n filename: `components/example-button.${ext}x`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Nuxt 3 setup code\n */\nconst generateNuxtSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const pluginCode = `// plugins/gtm.client.${ext}\nimport { createNuxtGtmPlugin } from '@jwiedeman/gtm-kit-nuxt';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nexport default defineNuxtPlugin((nuxtApp) => {\n createNuxtGtmPlugin(nuxtApp.vueApp, {\n containers: ${containerValue},${dataLayerOption}\n trackPageViews: true${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n });\n});\n`;\n\n const pageTrackingCode = `// composables/usePageTracking.${ext}\nimport { useTrackPageViews } from '@jwiedeman/gtm-kit-nuxt';\n\n/**\n * Call this composable in your app.vue or layouts to enable automatic page tracking\n */\nexport function usePageTracking() {\n const route = useRoute();\n\n useTrackPageViews({\n route,\n eventName: 'page_view',\n includeQueryParams: true\n });\n}\n`;\n\n const appVueCode = `<!-- app.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from '~/composables/usePageTracking';\n\n// Enable automatic page view tracking\nusePageTracking();\n</script>\n\n<template>\n <NuxtLayout>\n <NuxtPage />\n </NuxtLayout>\n</template>\n`;\n\n const exampleUsage = `<!-- Example: Track a button click -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useNuxtGtmPush } from '@jwiedeman/gtm-kit-nuxt';\n\nconst push = useNuxtGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n</script>\n\n<template>\n <button @click=\"handleClick\">Sign Up</button>\n</template>\n`;\n\n return [\n {\n filename: `plugins/gtm.client.${ext}`,\n content: pluginCode,\n description: 'Nuxt plugin for GTM (client-side only)'\n },\n {\n filename: `composables/usePageTracking.${ext}`,\n content: pageTrackingCode,\n description: 'Composable for automatic page view tracking'\n },\n {\n filename: 'app.vue',\n content: appVueCode,\n description: 'App root with page tracking enabled'\n },\n {\n filename: `components/ExampleButton.vue`,\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate React (Vite/CRA) setup code\n */\nconst generateReactSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const appCode = `// src/App.${ext}x\nimport { GtmProvider } from '@jwiedeman/gtm-kit-react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n {/* Your app content */}\n <main>\n <h1>Hello GTM Kit!</h1>\n </main>\n </GtmProvider>\n );\n}\n\nexport default App;\n`;\n\n const routerCode = `// src/AppWithRouter.${ext}x\n// Use this if you have react-router-dom\nimport { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom';\nimport { GtmProvider, useGtmPush } from '@jwiedeman/gtm-kit-react';\nimport { useEffect } from 'react';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}\n// Automatic page view tracking\nfunction PageViewTracker() {\n const location = useLocation();\n const push = useGtmPush();\n\n useEffect(() => {\n push({\n event: 'page_view',\n page_path: location.pathname + location.search\n });\n }, [location, push]);\n\n return null;\n}\n\nfunction App() {\n return (\n <GtmProvider\n containers={${containerValue}}${dataLayerOption}${includeConsent ? '\\n consentDefaults={eeaDefault}' : ''}\n >\n <BrowserRouter>\n <PageViewTracker />\n <Routes>\n <Route path=\"/\" element={<Home />} />\n {/* Add your routes */}\n </Routes>\n </BrowserRouter>\n </GtmProvider>\n );\n}\n\nfunction Home() {\n return <h1>Home Page</h1>;\n}\n\nexport default App;\n`;\n\n const exampleUsage = `// src/components/TrackingExample.${ext}x\nimport { useGtmPush } from '@jwiedeman/gtm-kit-react';\n\nexport function SignupButton() {\n const push = useGtmPush();\n\n const handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n };\n\n return <button onClick={handleClick}>Sign Up</button>;\n}\n\n// Track form submission\nexport function ContactForm() {\n const push = useGtmPush();\n\n const handleSubmit = (e${ctx.ext === 'ts' ? ': React.FormEvent' : ''}) => {\n e.preventDefault();\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n );\n}\n`;\n\n return [\n {\n filename: `src/App.${ext}x`,\n content: appCode,\n description: 'Basic App setup with GTM Provider'\n },\n {\n filename: `src/AppWithRouter.${ext}x`,\n content: routerCode,\n description: 'App setup with React Router and page tracking'\n },\n {\n filename: `src/components/TrackingExample.${ext}x`,\n content: exampleUsage,\n description: 'Example components showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vue 3 setup code\n */\nconst generateVueSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const mainCode = `// src/main.${ext}\nimport { createApp } from 'vue';\nimport { GtmPlugin } from '@jwiedeman/gtm-kit-vue';\n${includeConsent ? `import { eeaDefault } from '@jwiedeman/gtm-kit';\\n` : ''}import App from './App.vue';\n\nconst app = createApp(App);\n\napp.use(GtmPlugin, {\n containers: ${containerValue}${dataLayerOption}${includeConsent ? ',\\n consentDefaults: eeaDefault' : ''}\n});\n\napp.mount('#app');\n`;\n\n const routerCode = `// src/router-tracking.${ext}\n// Add this to your router setup for automatic page tracking\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\nimport { watch } from 'vue';\nimport { useRoute } from 'vue-router';\n\nexport function usePageTracking() {\n const route = useRoute();\n const push = useGtmPush();\n\n watch(\n () => route.fullPath,\n (path) => {\n push({\n event: 'page_view',\n page_path: path,\n page_title: document.title\n });\n },\n { immediate: true }\n );\n}\n`;\n\n const appVueCode = `<!-- src/App.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { usePageTracking } from './router-tracking';\n\n// Enable page view tracking if using vue-router\n// usePageTracking();\n</script>\n\n<template>\n <main>\n <h1>Hello GTM Kit!</h1>\n <RouterView v-if=\"$router\" />\n </main>\n</template>\n`;\n\n const exampleUsage = `<!-- src/components/TrackingExample.vue -->\n<script setup${ext === 'ts' ? ' lang=\"ts\"' : ''}>\nimport { useGtmPush } from '@jwiedeman/gtm-kit-vue';\n\nconst push = useGtmPush();\n\nconst handleClick = () => {\n push({\n event: 'button_click',\n button_name: 'signup_cta'\n });\n};\n\nconst handleSubmit = () => {\n push({\n event: 'form_submit',\n form_name: 'contact'\n });\n};\n</script>\n\n<template>\n <div>\n <!-- Track button click -->\n <button @click=\"handleClick\">Sign Up</button>\n\n <!-- Track form submission -->\n <form @submit.prevent=\"handleSubmit\">\n <input type=\"email\" placeholder=\"Email\" />\n <button type=\"submit\">Submit</button>\n </form>\n </div>\n</template>\n`;\n\n return [\n {\n filename: `src/main.${ext}`,\n content: mainCode,\n description: 'Main entry point with GTM Plugin'\n },\n {\n filename: `src/router-tracking.${ext}`,\n content: routerCode,\n description: 'Page tracking composable for Vue Router'\n },\n {\n filename: 'src/App.vue',\n content: appVueCode,\n description: 'App component with tracking setup'\n },\n {\n filename: 'src/components/TrackingExample.vue',\n content: exampleUsage,\n description: 'Example component showing how to track events'\n }\n ];\n};\n\n/**\n * Generate Vanilla JavaScript setup code\n */\nconst generateVanillaSetupCode = (ctx: CodeGenContext): GeneratedCode[] => {\n const { containerValue, dataLayerName, includeConsent, ext } = ctx;\n const dataLayerOption = dataLayerName ? `\\n dataLayerName: '${dataLayerName}',` : '';\n\n const esmCode = `// gtm-setup.${ext}\nimport { createGtmClient${includeConsent ? ', eeaDefault' : ''} } from '@jwiedeman/gtm-kit';\n\n// Create the GTM client\nconst gtm = createGtmClient({\n containers: ${containerValue}${dataLayerOption}\n});\n${includeConsent ? '\\n// Set consent defaults BEFORE init (for GDPR compliance)\\ngtm.setConsentDefaults(eeaDefault);\\n' : ''}\n// Initialize GTM\ngtm.init();\n\n// Track events\nexport function trackEvent(event${ctx.ext === 'ts' ? ': string' : ''}, data${ctx.ext === 'ts' ? '?: Record<string, unknown>' : ''} = {}) {\n gtm.push({\n event,\n ...data\n });\n}\n\n// Track page views\nexport function trackPageView(path${ctx.ext === 'ts' ? '?: string' : ''}) {\n gtm.push({\n event: 'page_view',\n page_path: path || window.location.pathname + window.location.search,\n page_title: document.title\n });\n}\n\n// Update consent (call this when user accepts/rejects)\nexport function updateConsent(analytics${ctx.ext === 'ts' ? ': boolean' : ''}, marketing${ctx.ext === 'ts' ? ': boolean' : ''}) {\n gtm.updateConsent({\n analytics_storage: analytics ? 'granted' : 'denied',\n ad_storage: marketing ? 'granted' : 'denied',\n ad_user_data: marketing ? 'granted' : 'denied',\n ad_personalization: marketing ? 'granted' : 'denied'\n });\n}\n\n// Example usage\ntrackPageView();\n\n// Export client for advanced usage\nexport { gtm };\n`;\n\n const htmlCode = `<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>GTM Kit - Vanilla JS</title>\n</head>\n<body>\n <!-- GTM noscript fallback (optional but recommended) -->\n <noscript>\n <iframe\n src=\"https://www.googletagmanager.com/ns.html?id=${Array.isArray(containerValue) ? 'YOUR-GTM-ID' : containerValue.replace(/'/g, '')}\"\n height=\"0\"\n width=\"0\"\n style=\"display:none;visibility:hidden\"\n ></iframe>\n </noscript>\n\n <main>\n <h1>Hello GTM Kit!</h1>\n <button id=\"signup-btn\">Sign Up</button>\n <button id=\"consent-btn\">Accept Cookies</button>\n </main>\n\n <script type=\"module\">\n import { trackEvent, updateConsent } from './gtm-setup.${ext}';\n\n // Track button click\n document.getElementById('signup-btn').addEventListener('click', () => {\n trackEvent('button_click', { button_name: 'signup_cta' });\n });\n\n // Handle consent\n document.getElementById('consent-btn').addEventListener('click', () => {\n updateConsent(true, true);\n });\n </script>\n</body>\n</html>\n`;\n\n const umdCode = `<!-- Alternative: UMD/Script Tag Setup -->\n<!-- Add this in your HTML head -->\n<script src=\"https://unpkg.com/@jwiedeman/gtm-kit/dist/index.umd.js\"></script>\n<script>\n // GTM Kit is available as window.GtmKit\n var gtm = GtmKit.createGtmClient({\n containers: ${containerValue}${dataLayerOption ? dataLayerOption.replace(/\\n/g, ' ') : ''}\n });\n${includeConsent ? '\\n // Set consent defaults\\n gtm.setConsentDefaults(GtmKit.eeaDefault);\\n' : ''}\n // Initialize\n gtm.init();\n\n // Track page view\n gtm.push({\n event: 'page_view',\n page_path: window.location.pathname\n });\n\n // Make gtm available globally for other scripts\n window.gtm = gtm;\n</script>\n`;\n\n return [\n {\n filename: `gtm-setup.${ext}`,\n content: esmCode,\n description: 'ESM setup with helper functions'\n },\n {\n filename: 'index.html',\n content: htmlCode,\n description: 'Example HTML with tracking'\n },\n {\n filename: 'umd-setup.html',\n content: umdCode,\n description: 'Alternative UMD/script tag setup'\n }\n ];\n};\n\n/**\n * Format generated code for display\n */\nexport const formatGeneratedCode = (files: GeneratedCode[]): string => {\n return files\n .map((file) => {\n const separator = '─'.repeat(60);\n return `${separator}\\nšŸ“„ ${file.filename}\\n${file.description}\\n${separator}\\n${file.content}`;\n })\n .join('\\n\\n');\n};\n","#!/usr/bin/env node\n/* eslint-disable no-console */\n/**\n * GTM Kit CLI - Zero-config setup for Google Tag Manager\n *\n * Usage:\n * npx @jwiedeman/gtm-kit-cli init # Interactive setup\n * npx @jwiedeman/gtm-kit-cli init GTM-XXX # Quick setup with container ID\n * npx @jwiedeman/gtm-kit-cli detect # Just detect framework\n * npx @jwiedeman/gtm-kit-cli validate # Validate existing setup\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as readline from 'readline';\nimport { detectFramework, getDetectionSummary, getInstallCommand } from './detect';\nimport { validateGtmId } from './validate';\nimport { generateSetupCode, formatGeneratedCode } from './codegen';\n\n// ANSI color codes\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m'\n};\n\nconst c = (color: keyof typeof colors, text: string): string => `${colors[color]}${text}${colors.reset}`;\n\n/**\n * Print styled output\n */\nconst print = {\n header: (text: string) => console.log(`\\n${c('bold', c('cyan', text))}\\n`),\n success: (text: string) => console.log(`${c('green', 'āœ“')} ${text}`),\n error: (text: string) => console.log(`${c('red', 'āœ—')} ${text}`),\n warning: (text: string) => console.log(`${c('yellow', '⚠')} ${text}`),\n info: (text: string) => console.log(`${c('blue', 'ℹ')} ${text}`),\n step: (n: number, text: string) => console.log(`\\n${c('bold', `Step ${n}:`)} ${text}`),\n code: (text: string) => console.log(` ${c('dim', '$')} ${c('cyan', text)}`),\n box: (lines: string[]) => {\n const maxLen = Math.max(...lines.map((l) => l.length));\n const border = '─'.repeat(maxLen + 2);\n console.log(`ā”Œ${border}┐`);\n lines.forEach((line) => console.log(`│ ${line.padEnd(maxLen)} │`));\n console.log(`ā””${border}ā”˜`);\n }\n};\n\n/**\n * Simple readline prompt\n */\nconst prompt = (question: string): Promise<string> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n};\n\n/**\n * Yes/No prompt with default\n */\nconst confirm = async (question: string, defaultYes = true): Promise<boolean> => {\n const suffix = defaultYes ? '[Y/n]' : '[y/N]';\n const answer = await prompt(`${question} ${suffix} `);\n\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n};\n\n/**\n * Show banner\n */\nconst showBanner = () => {\n console.log(`\n${c('cyan', '╔═══════════════════════════════════════════╗')}\n${c('cyan', 'ā•‘')} ${c('bold', 'GTM Kit')} - Easy Google Tag Manager Setup ${c('cyan', 'ā•‘')}\n${c('cyan', 'ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•')}\n`);\n};\n\n/**\n * Show help\n */\nconst showHelp = () => {\n showBanner();\n console.log(`${c('bold', 'Usage:')}\n npx @jwiedeman/gtm-kit-cli <command> [options]\n\n${c('bold', 'Commands:')}\n ${c('cyan', 'init')} [GTM-ID] Interactive setup (or quick setup with ID)\n ${c('cyan', 'detect')} Detect framework and show install command\n ${c('cyan', 'validate')} <ID> Validate a GTM container ID\n ${c('cyan', 'generate')} <ID> Generate setup code for your framework\n ${c('cyan', 'help')} Show this help message\n\n${c('bold', 'Examples:')}\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli init GTM-ABC1234\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli detect\n ${c('dim', '$')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\n\n${c('bold', 'Options:')}\n --typescript, -ts Generate TypeScript code (default)\n --javascript, -js Generate JavaScript code\n --consent Include consent mode setup\n --dry-run Show what would be done without doing it\n\n${c('bold', 'More info:')} https://github.com/jwiedeman/GTM-Kit\n`);\n};\n\n/**\n * Detect command - show framework detection\n */\nconst runDetect = (dir: string = process.cwd()) => {\n showBanner();\n print.header('Framework Detection');\n\n const info = detectFramework(dir);\n console.log(getDetectionSummary(info));\n\n console.log('\\n' + c('bold', 'Install command:'));\n print.code(getInstallCommand(info.packageManager, info.packages));\n\n return info;\n};\n\n/**\n * Validate command - validate GTM ID\n */\nconst runValidate = (id: string) => {\n showBanner();\n print.header('GTM ID Validation');\n\n const result = validateGtmId(id);\n\n console.log(`ID: ${c('cyan', id)}`);\n\n if (result.valid) {\n print.success('Valid GTM container ID');\n if (result.warning) {\n print.warning(result.warning);\n }\n } else {\n print.error(result.error ?? 'Invalid');\n if (result.suggestion) {\n print.info(`Suggestion: ${result.suggestion}`);\n }\n }\n\n return result;\n};\n\n/**\n * Generate command - generate setup code\n */\nconst runGenerate = (containerId: string, options: { typescript?: boolean; consent?: boolean } = {}) => {\n showBanner();\n print.header('Generating Setup Code');\n\n const info = detectFramework();\n const validation = validateGtmId(containerId);\n\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(`Suggestion: ${validation.suggestion}`);\n }\n return null;\n }\n\n print.success(`Framework: ${info.displayName}`);\n print.success(`Container: ${containerId}`);\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: options.typescript ?? true,\n includeConsent: options.consent ?? false\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n return files;\n};\n\n/**\n * Init command - interactive setup\n */\nconst runInit = async (\n quickId?: string,\n options: { typescript?: boolean; consent?: boolean; dryRun?: boolean } = {}\n) => {\n showBanner();\n print.header('GTM Kit Setup');\n\n const info = detectFramework();\n\n // Step 1: Show detection\n print.step(1, 'Detecting your project...');\n console.log(`\\n Framework: ${c('green', info.displayName)}`);\n console.log(` Package Manager: ${c('green', info.packageManager)}`);\n console.log(` Confidence: ${info.confidence}%`);\n\n // Step 2: Get GTM ID\n print.step(2, 'GTM Container ID');\n\n let containerId = quickId ?? '';\n\n if (!containerId) {\n containerId = await prompt(`\\n Enter your GTM container ID (e.g., GTM-ABC1234): `);\n }\n\n if (!containerId) {\n print.error('GTM container ID is required');\n console.log(`\\n ${c('dim', 'Tip: Get your GTM ID from https://tagmanager.google.com')}\\n`);\n process.exit(1);\n }\n\n const validation = validateGtmId(containerId);\n if (!validation.valid) {\n print.error(validation.error ?? 'Invalid GTM ID');\n if (validation.suggestion) {\n print.info(validation.suggestion);\n }\n process.exit(1);\n }\n\n print.success(`Valid container ID: ${containerId}`);\n\n // Step 3: Options\n print.step(3, 'Configuration');\n\n const useConsent = options.consent ?? (await confirm('\\n Include Consent Mode v2 setup (GDPR)?', true));\n const useTypescript = options.typescript ?? (await confirm(' Use TypeScript?', true));\n\n // Step 4: Install packages\n print.step(4, 'Installing packages...');\n\n const installCmd = getInstallCommand(info.packageManager, info.packages);\n console.log(`\\n Command: ${c('cyan', installCmd)}`);\n\n if (options.dryRun) {\n print.warning('Dry run - skipping installation');\n } else {\n const shouldInstall = await confirm('\\n Run installation now?', true);\n\n if (shouldInstall) {\n const { execSync } = await import('child_process');\n try {\n console.log('');\n execSync(installCmd, { stdio: 'inherit' });\n print.success('Packages installed successfully');\n } catch (error) {\n print.error('Installation failed');\n console.log(`\\n ${c('dim', 'Try running manually:')} ${c('cyan', installCmd)}\\n`);\n }\n } else {\n print.info('Skipped installation. Run manually:');\n print.code(installCmd);\n }\n }\n\n // Step 5: Generate code\n print.step(5, 'Generating setup code...');\n\n const files = generateSetupCode({\n framework: info.framework,\n containers: containerId,\n typescript: useTypescript,\n includeConsent: useConsent\n });\n\n console.log('\\n' + formatGeneratedCode(files));\n\n // Step 6: Write files\n print.step(6, 'Creating files...');\n\n if (options.dryRun) {\n print.warning('Dry run - skipping file creation');\n files.forEach((file) => {\n console.log(` Would create: ${c('cyan', file.filename)}`);\n });\n } else {\n const shouldWrite = await confirm('\\n Create these files in your project?', false);\n\n if (shouldWrite) {\n for (const file of files) {\n const filePath = path.join(process.cwd(), file.filename);\n const dir = path.dirname(filePath);\n\n try {\n // Create directory if needed\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Check if file exists\n if (fs.existsSync(filePath)) {\n const overwrite = await confirm(` ${file.filename} exists. Overwrite?`, false);\n if (!overwrite) {\n print.info(`Skipped: ${file.filename}`);\n continue;\n }\n }\n\n fs.writeFileSync(filePath, file.content);\n print.success(`Created: ${file.filename}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n print.error(`Failed to create ${file.filename}: ${message}`);\n }\n }\n } else {\n print.info('Files not created. Copy the code above manually.');\n }\n }\n\n // Done!\n print.header('Setup Complete!');\n\n print.box([\n `GTM Kit is ready to use with ${info.displayName}!`,\n '',\n `Container: ${containerId}`,\n useConsent ? 'Consent Mode: Enabled' : 'Consent Mode: Disabled',\n '',\n 'Next steps:',\n '1. Review the generated code',\n '2. Add your routes/pages',\n '3. Test with GTM Preview mode',\n '',\n 'Docs: https://github.com/jwiedeman/GTM-Kit'\n ]);\n\n return { info, containerId, files };\n};\n\n/**\n * Parse CLI arguments\n */\nconst parseArgs = (args: string[]): { command: string; positional: string[]; flags: Record<string, boolean> } => {\n const command = args[0] ?? 'help';\n const positional: string[] = [];\n const flags: Record<string, boolean> = {};\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n flags[arg.slice(2)] = true;\n } else if (arg.startsWith('-')) {\n flags[arg.slice(1)] = true;\n } else {\n positional.push(arg);\n }\n }\n\n return { command, positional, flags };\n};\n\n/**\n * Main entry point\n */\nexport const run = async (args: string[] = process.argv.slice(2)): Promise<void> => {\n const { command, positional, flags } = parseArgs(args);\n\n const options = {\n typescript: flags.typescript || flags.ts ? true : flags.javascript || flags.js ? false : undefined,\n consent: flags.consent ?? undefined,\n dryRun: flags['dry-run'] ?? false\n };\n\n try {\n switch (command) {\n case 'init':\n await runInit(positional[0], options);\n break;\n\n case 'detect':\n runDetect(positional[0]);\n break;\n\n case 'validate':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID to validate');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli validate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runValidate(positional[0]);\n break;\n\n case 'generate':\n case 'gen':\n if (!positional[0]) {\n print.error('Please provide a GTM container ID');\n console.log(`\\n ${c('dim', 'Usage:')} npx @jwiedeman/gtm-kit-cli generate GTM-ABC1234\\n`);\n process.exit(1);\n }\n runGenerate(positional[0], options);\n break;\n\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n }\n } catch (error) {\n if (error instanceof Error) {\n print.error(error.message);\n } else {\n print.error('An unexpected error occurred');\n }\n process.exit(1);\n }\n};\n\n// Run if executed directly\nif (typeof require !== 'undefined' && require.main === module) {\n run();\n}\n"],"mappings":"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","names":["c","fs","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jwiedeman/gtm-kit-cli",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "CLI tool for easy GTM Kit setup - auto-detects your framework and installs everything you need.",
5
5
  "repository": {
6
6
  "type": "git",