@jwiedeman/gtm-kit-cli 1.0.1 ā 1.1.0
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/dist/cli.js +2 -2
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -958,7 +958,7 @@ ${c("bold", "Options:")}
|
|
|
958
958
|
--consent Include consent mode setup
|
|
959
959
|
--dry-run Show what would be done without doing it
|
|
960
960
|
|
|
961
|
-
${c("bold", "More info:")} https://github.com/
|
|
961
|
+
${c("bold", "More info:")} https://github.com/jwiedeman/GTM-Kit
|
|
962
962
|
`);
|
|
963
963
|
};
|
|
964
964
|
var runDetect = (dir = process.cwd()) => {
|
|
@@ -1122,7 +1122,7 @@ var runInit = async (quickId, options = {}) => {
|
|
|
1122
1122
|
"2. Add your routes/pages",
|
|
1123
1123
|
"3. Test with GTM Preview mode",
|
|
1124
1124
|
"",
|
|
1125
|
-
"Docs: https://github.com/
|
|
1125
|
+
"Docs: https://github.com/jwiedeman/GTM-Kit"
|
|
1126
1126
|
]);
|
|
1127
1127
|
return { info, containerId, files };
|
|
1128
1128
|
};
|
package/dist/index.cjs
CHANGED
|
@@ -1173,7 +1173,7 @@ ${c("bold", "Options:")}
|
|
|
1173
1173
|
--consent Include consent mode setup
|
|
1174
1174
|
--dry-run Show what would be done without doing it
|
|
1175
1175
|
|
|
1176
|
-
${c("bold", "More info:")} https://github.com/
|
|
1176
|
+
${c("bold", "More info:")} https://github.com/jwiedeman/GTM-Kit
|
|
1177
1177
|
`);
|
|
1178
1178
|
};
|
|
1179
1179
|
var runDetect = (dir = process.cwd()) => {
|
|
@@ -1337,7 +1337,7 @@ var runInit = async (quickId, options = {}) => {
|
|
|
1337
1337
|
"2. Add your routes/pages",
|
|
1338
1338
|
"3. Test with GTM Preview mode",
|
|
1339
1339
|
"",
|
|
1340
|
-
"Docs: https://github.com/
|
|
1340
|
+
"Docs: https://github.com/jwiedeman/GTM-Kit"
|
|
1341
1341
|
]);
|
|
1342
1342
|
return { info, containerId, files };
|
|
1343
1343
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -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/react-gtm-kit/react-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/react-gtm-kit/react-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 {\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACSA,SAAoB;AACpB,WAAsB;AA8BtB,IAAM,kBAAkB,CAAC,QAAoC;AAC3D,QAAM,UAAe,UAAK,KAAK,cAAc;AAC7C,MAAI;AACF,QAAI,CAAI,cAAW,OAAO,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,UAAa,gBAAa,SAAS,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,IAAM,aAAa,CAAC,KAAa,aAA8B;AAC7D,SAAU,cAAgB,UAAK,KAAK,QAAQ,CAAC;AAC/C;AAKA,IAAM,uBAAuB,CAAC,KAAkB,SAAqC;AA/DrF;AAgEE,UAAO,eAAI,iBAAJ,mBAAmB,UAAnB,aAA4B,SAAI,oBAAJ,mBAAsB;AAC3D;AAKA,IAAM,uBAAuB,CAAC,KAAa,QAA6D;AAEtG,MAAI,WAAW,KAAK,gBAAgB;AAAG,WAAO;AAC9C,MAAI,WAAW,KAAK,WAAW;AAAG,WAAO;AACzC,MAAI,WAAW,KAAK,WAAW;AAAG,WAAO;AACzC,MAAI,WAAW,KAAK,mBAAmB;AAAG,WAAO;AAGjD,MAAI,2BAAK,gBAAgB;AACvB,QAAI,IAAI,eAAe,WAAW,MAAM;AAAG,aAAO;AAClD,QAAI,IAAI,eAAe,WAAW,MAAM;AAAG,aAAO;AAClD,QAAI,IAAI,eAAe,WAAW,KAAK;AAAG,aAAO;AAAA,EACnD;AAGA,SAAO;AACT;AAKO,IAAM,oBAAoB,CAAC,gBAAiD,aAA+B;AAChH,QAAM,UAAU,SAAS,KAAK,GAAG;AACjC,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,YAAY,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,YAAY,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,WAAW,OAAO;AAAA,IAC3B,KAAK;AAAA,IACL;AACE,aAAO,eAAe,OAAO;AAAA,EACjC;AACF;AAKO,IAAM,kBAAkB,CAAC,MAAc,QAAQ,IAAI,MAAqB;AA7G/E;AA8GE,QAAM,MAAM,gBAAgB,GAAG;AAC/B,QAAM,iBAAiB,qBAAqB,KAAK,GAAG;AAGpD,MAAI,OAAO,qBAAqB,KAAK,MAAM,GAAG;AAC5C,UAAM,UAAU,qBAAqB,KAAK,MAAM;AAChD,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS,mCAAS,QAAQ,SAAS;AAAA,MACnC;AAAA,MACA,UAAU,CAAC,sBAAsB,yBAAyB;AAAA,MAC1D,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,MAAI,WAAW,KAAK,gBAAgB,KAAK,WAAW,KAAK,gBAAgB,GAAG;AAC1E,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,UAAU,CAAC,sBAAsB,yBAAyB;AAAA,MAC1D,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,MAAI,OAAO,qBAAqB,KAAK,MAAM,GAAG;AAC5C,UAAM,UAAU,qBAAqB,KAAK,MAAM;AAChD,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS,mCAAS,QAAQ,SAAS;AAAA,MACnC;AAAA,MACA,UAAU,CAAC,sBAAsB,yBAAyB;AAAA,MAC1D,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,MAAI,WAAW,KAAK,gBAAgB,KAAK,WAAW,KAAK,iBAAiB,KAAK,WAAW,KAAK,gBAAgB,GAAG;AAChH,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,UAAU,CAAC,sBAAsB,yBAAyB;AAAA,MAC1D,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,MAAI,OAAO,qBAAqB,KAAK,KAAK,GAAG;AAC3C,UAAM,UAAU,qBAAqB,KAAK,KAAK;AAC/C,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS,mCAAS,QAAQ,SAAS;AAAA,MACnC;AAAA,MACA,UAAU,CAAC,sBAAsB,wBAAwB;AAAA,MACzD,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,MAAI,WAAW,KAAK,gBAAgB,KAAK,WAAW,KAAK,gBAAgB,GAAG;AAC1E,UAAM,aAAkB,UAAK,KAAK,WAAW,KAAK,gBAAgB,IAAI,mBAAmB,gBAAgB;AACzG,QAAI;AACF,YAAM,UAAa,gBAAa,YAAY,OAAO;AACnD,UAAI,QAAQ,SAAS,oBAAoB,KAAK,QAAQ,SAAS,OAAO,GAAG;AACvE,eAAO;AAAA,UACL,WAAW;AAAA,UACX;AAAA,UACA,UAAU,CAAC,sBAAsB,wBAAwB;AAAA,UACzD,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,SAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,OAAO,qBAAqB,KAAK,OAAO,GAAG;AAC7C,UAAM,UAAU,qBAAqB,KAAK,OAAO;AACjD,UAAM,eAAe,UAAS,wCAAS,QAAQ,SAAS,IAAI,MAAM,KAAK,OAAzC,YAA+C,MAAM,EAAE;AAGrF,QAAI,gBAAgB,IAAI;AACtB,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,mCAAS,QAAQ,SAAS;AAAA,QACnC;AAAA,QACA,UAAU,CAAC,sBAAsB,0BAA0B;AAAA,QAC3D,aAAa,gBAAgB,KAAK,cAAc;AAAA,QAChD,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS,mCAAS,QAAQ,SAAS;AAAA,MACnC;AAAA,MACA,UAAU,CAAC,sBAAsB,iCAAiC;AAAA,MAClE,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,QAAM,SAAc,UAAK,KAAK,KAAK;AACnC,MAAO,cAAW,MAAM,GAAG;AACzB,QAAI;AACF,YAAM,QAAW,eAAY,MAAM;AACnC,UAAI,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,CAAC,GAAG;AAC/D,eAAO;AAAA,UACL,WAAW;AAAA,UACX;AAAA,UACA,UAAU,CAAC,sBAAsB,0BAA0B;AAAA,UAC3D,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,SAAQ;AAAA,IAER;AAAA,EACF;AAGA,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA,UAAU,CAAC,oBAAoB;AAAA,IAC/B,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACF;AAKO,IAAM,sBAAsB,CAAC,SAAgC;AAClE,QAAM,QAAQ;AAAA,IACZ,cAAc,KAAK,WAAW;AAAA,IAC9B,oBAAoB,KAAK,cAAc;AAAA,IACvC,eAAe,KAAK,UAAU;AAAA,IAC9B,WAAW,KAAK,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAG,KAAK,SAAS,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE;AAAA,EACxC;AAEA,MAAI,KAAK,SAAS;AAChB,UAAM,OAAO,GAAG,GAAG,YAAY,KAAK,OAAO,EAAE;AAAA,EAC/C;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC9PA,IAAM,iBAAiB;AAKvB,IAAM,kBAA8E;AAAA,EAClF;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;AASO,IAAM,gBAAgB,CAAC,OAAiC;AAC7D,MAAI,CAAC,MAAM,OAAO,OAAO,UAAU;AACjC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,KAAK;AAE1B,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF;AAGA,aAAW,WAAW,iBAAiB;AACrC,QAAI,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACnC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,QAAQ;AAAA,QACf,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,eAAe,KAAK,SAAS,GAAG;AAEnC,QAAI,CAAC,UAAU,WAAW,MAAM,GAAG;AACjC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,qBAAqB,UAAU,QAAQ,gBAAgB,EAAE,CAAC;AAAA,MACxE;AAAA,IACF;AAEA,UAAM,cAAc,UAAU,MAAM,CAAC;AACrC,QAAI,QAAQ,KAAK,WAAW,GAAG;AAC7B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,qBAAqB,YAAY,YAAY,CAAC;AAAA,MAC5D;AAAA,IACF;AAEA,QAAI,YAAY,KAAK,WAAW,GAAG;AACjC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKO,IAAM,iBAAiB,CAAC,QAAoC;AACjE,MAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,GAAG;AAC3C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,IAAI,CAAC,IAAI,WAAW;AAAA,IACtC;AAAA,IACA;AAAA,IACA,QAAQ,cAAc,EAAE;AAAA,EAC1B,EAAE;AAEF,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK;AAErD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,MAAM,EAAE,KAAK,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,KAAK,EAAE,EAAE,KAAK,IAAI;AACxF,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,EAAiC,MAAM;AAAA,MAC9C,YAAY,QAAQ,CAAC,EAAE,OAAO;AAAA,IAChC;AAAA,EACF;AAGA,QAAM,YAAY,IAAI,IAAI,GAAG;AAC7B,MAAI,UAAU,OAAO,IAAI,QAAQ;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKA,IAAM,0BAA0B;AAKhC,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,wBAAwB,CAAC,SAAmC;AACvE,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,KAAK;AAE9B,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,kBAAkB,IAAI,WAAW,GAAG;AACtC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,IAAI,WAAW;AAAA,MACtB,YAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,CAAC,wBAAwB,KAAK,WAAW,GAAG;AAC9C,QAAI,MAAM,KAAK,WAAW,GAAG;AAC3B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,kBAAkB,WAAW,gBAAgB,WAAW;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,iBAAiB,YAAY,QAAQ,QAAQ,GAAG,CAAC;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI,IAAI,KAAK,WAAW,GAAG;AACzB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,iBAAiB,YAAY,QAAQ,MAAM,GAAG,CAAC;AAAA,MAC7D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,EACF;AAGA,MAAI,gBAAgB,aAAa;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SACE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAcO,IAAM,iBAAiB,CAAC,WAAoD;AAEjF,QAAM,eAAe,MAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC,OAAO,UAAU;AAC9F,QAAM,kBAAkB,eAAe,YAAY;AACnD,MAAI,CAAC,gBAAgB,OAAO;AAC1B,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,kBAAkB,QAAW;AACtC,UAAM,kBAAkB,sBAAsB,OAAO,aAAa;AAClE,QAAI,CAAC,gBAAgB,OAAO;AAC1B,aAAO;AAAA,IACT;AACA,QAAI,gBAAgB,SAAS;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,QAAW;AAC7B,QAAI,OAAO,OAAO,SAAS,UAAU;AACnC,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,OAAO,IAAI;AAC/B,UAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,GAAG;AAC/C,eAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF,SAAQ;AACN,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAGA,MAAI,gBAAgB,SAAS;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;;;AClWO,IAAM,oBAAoB,CAAC,YAA+C;AAC/E,QAAM,EAAE,WAAW,YAAY,eAAe,iBAAiB,OAAO,aAAa,KAAK,IAAI;AAE5F,QAAM,MAAM,aAAa,OAAO;AAChC,QAAM,iBAAiB,MAAM,QAAQ,UAAU,IAC3C,IAAI,WAAW,IAAI,CAACA,OAAM,IAAIA,EAAC,GAAG,EAAE,KAAK,IAAI,CAAC,MAC9C,IAAI,UAAU;AAElB,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,sBAAsB,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,CAAC;AAAA,IACrF,KAAK;AACH,aAAO,sBAAsB,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,CAAC;AAAA,IACrF,KAAK;AACH,aAAO,uBAAuB,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,CAAC;AAAA,IACtF,KAAK;AACH,aAAO,qBAAqB,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,CAAC;AAAA,IACpF,KAAK;AAAA,IACL;AACE,aAAO,yBAAyB,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,CAAC;AAAA,EAC1F;AACF;AAYA,IAAM,wBAAwB,CAAC,QAAyC;AACtE,QAAM,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,IAAI;AAC/D,QAAM,kBAAkB,gBAAgB;AAAA,sBAAyB,aAAa,OAAO;AAErF,QAAM,eAAe,iCAAiC,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzD,IAAI,QAAQ,OAAO,8CAA8C,EAAE;AAAA,EACnE,iBAAiB;AAAA,IAAuD,EAAE;AAAA,EAC1E,IAAI,QAAQ,OAAO;AAAA;AAAA;AAAA,IAAqE,EAAE;AAAA,iDAC3C,IAAI,QAAQ,OAAO,8BAA8B,EAAE;AAAA;AAAA;AAAA,oBAGhF,cAAc,IAAI,eAAe,GAAG,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAclH,QAAM,aAAa,iBAAiB,GAAG;AAAA;AAAA;AAAA,EAGvC,IAAI,QAAQ,OAAO,8CAA8C,EAAE;AAAA,iDACpB,IAAI,QAAQ,OAAO,8BAA8B,EAAE;AAAA;AAAA;AAAA;AAAA,oCAIhE,MAAM,QAAQ,cAAc,IAAI,eAAe,CAAC,IAAI,eAAe,QAAQ,MAAM,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUtH,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBrB,SAAO;AAAA,IACL;AAAA,MACE,UAAU,8BAA8B,GAAG;AAAA,MAC3C,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU,cAAc,GAAG;AAAA,MAC3B,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU,6BAA6B,GAAG;AAAA,MAC1C,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAKA,IAAM,wBAAwB,CAAC,QAAyC;AACtE,QAAM,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,IAAI;AAC/D,QAAM,kBAAkB,gBAAgB;AAAA,sBAAyB,aAAa,OAAO;AAErF,QAAM,aAAa,yBAAyB,GAAG;AAAA;AAAA,EAE/C,iBAAiB;AAAA,IAAuD,EAAE;AAAA;AAAA;AAAA,kBAG1D,cAAc,IAAI,eAAe;AAAA,0BACzB,iBAAiB,uCAAuC,EAAE;AAAA;AAAA;AAAA;AAKlF,QAAM,mBAAmB,kCAAkC,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB9D,QAAM,aAAa;AAAA,eACN,QAAQ,OAAO,eAAe,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc7C,QAAM,eAAe;AAAA,eACR,QAAQ,OAAO,eAAe,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB7C,SAAO;AAAA,IACL;AAAA,MACE,UAAU,sBAAsB,GAAG;AAAA,MACnC,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU,+BAA+B,GAAG;AAAA,MAC5C,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAKA,IAAM,yBAAyB,CAAC,QAAyC;AACvE,QAAM,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,IAAI;AAC/D,QAAM,kBAAkB,gBAAgB;AAAA,wBAA2B,aAAa,OAAO;AAEvF,QAAM,UAAU,cAAc,GAAG;AAAA;AAAA,EAEjC,iBAAiB;AAAA,IAAuD,EAAE;AAAA;AAAA;AAAA;AAAA,oBAIxD,cAAc,IAAI,eAAe,GAAG,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAalH,QAAM,aAAa,wBAAwB,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9C,iBAAiB;AAAA,IAAuD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAmBxD,cAAc,IAAI,eAAe,GAAG,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBlH,QAAM,eAAe,qCAAqC,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAoBpC,IAAI,QAAQ,OAAO,sBAAsB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBpE,SAAO;AAAA,IACL;AAAA,MACE,UAAU,WAAW,GAAG;AAAA,MACxB,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU,qBAAqB,GAAG;AAAA,MAClC,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU,kCAAkC,GAAG;AAAA,MAC/C,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAKA,IAAM,uBAAuB,CAAC,QAAyC;AACrE,QAAM,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,IAAI;AAC/D,QAAM,kBAAkB,gBAAgB;AAAA,sBAAyB,aAAa,OAAO;AAErF,QAAM,WAAW,eAAe,GAAG;AAAA;AAAA;AAAA,EAGnC,iBAAiB;AAAA,IAAuD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,gBAK5D,cAAc,GAAG,eAAe,GAAG,iBAAiB,qCAAqC,EAAE;AAAA;AAAA;AAAA;AAAA;AAMzG,QAAM,aAAa,0BAA0B,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBhD,QAAM,aAAa;AAAA,eACN,QAAQ,OAAO,eAAe,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe7C,QAAM,eAAe;AAAA,eACR,QAAQ,OAAO,eAAe,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkC7C,SAAO;AAAA,IACL;AAAA,MACE,UAAU,YAAY,GAAG;AAAA,MACzB,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU,uBAAuB,GAAG;AAAA,MACpC,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAKA,IAAM,2BAA2B,CAAC,QAAyC;AACzE,QAAM,EAAE,gBAAgB,eAAe,gBAAgB,IAAI,IAAI;AAC/D,QAAM,kBAAkB,gBAAgB;AAAA,oBAAuB,aAAa,OAAO;AAEnF,QAAM,UAAU,gBAAgB,GAAG;AAAA,0BACX,iBAAiB,iBAAiB,EAAE;AAAA;AAAA;AAAA;AAAA,gBAI9C,cAAc,GAAG,eAAe;AAAA;AAAA,EAE9C,iBAAiB,uGAAuG,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,kCAK1F,IAAI,QAAQ,OAAO,aAAa,EAAE,SAAS,IAAI,QAAQ,OAAO,+BAA+B,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAQ7F,IAAI,QAAQ,OAAO,cAAc,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAS9B,IAAI,QAAQ,OAAO,cAAc,EAAE,cAAc,IAAI,QAAQ,OAAO,cAAc,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB3H,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yDAYsC,MAAM,QAAQ,cAAc,IAAI,gBAAgB,eAAe,QAAQ,MAAM,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6DAc5E,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB9D,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAMA,cAAc,GAAG,kBAAkB,gBAAgB,QAAQ,OAAO,GAAG,IAAI,EAAE;AAAA;AAAA,EAE3F,iBAAiB,gFAAgF,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAenG,SAAO;AAAA,IACL;AAAA,MACE,UAAU,aAAa,GAAG;AAAA,MAC1B,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAKO,IAAM,sBAAsB,CAAC,UAAmC;AACrE,SAAO,MACJ,IAAI,CAAC,SAAS;AACb,UAAM,YAAY,SAAI,OAAO,EAAE;AAC/B,WAAO,GAAG,SAAS;AAAA,YAAQ,KAAK,QAAQ;AAAA,EAAK,KAAK,WAAW;AAAA,EAAK,SAAS;AAAA,EAAK,KAAK,OAAO;AAAA,EAC9F,CAAC,EACA,KAAK,MAAM;AAChB;;;AChnBA,IAAAC,MAAoB;AACpB,IAAAC,QAAsB;AACtB,eAA0B;AAM1B,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AACR;AAEA,IAAM,IAAI,CAAC,OAA4B,SAAyB,GAAG,OAAO,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,KAAK;AAKtG,IAAM,QAAQ;AAAA,EACZ,QAAQ,CAAC,SAAiB,QAAQ,IAAI;AAAA,EAAK,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC;AAAA,CAAI;AAAA,EACzE,SAAS,CAAC,SAAiB,QAAQ,IAAI,GAAG,EAAE,SAAS,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EACnE,OAAO,CAAC,SAAiB,QAAQ,IAAI,GAAG,EAAE,OAAO,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EAC/D,SAAS,CAAC,SAAiB,QAAQ,IAAI,GAAG,EAAE,UAAU,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EACpE,MAAM,CAAC,SAAiB,QAAQ,IAAI,GAAG,EAAE,QAAQ,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EAC/D,MAAM,CAAC,GAAW,SAAiB,QAAQ,IAAI;AAAA,EAAK,EAAE,QAAQ,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EACrF,MAAM,CAAC,SAAiB,QAAQ,IAAI,KAAK,EAAE,OAAO,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,EAAE;AAAA,EAC3E,KAAK,CAAC,UAAoB;AACxB,UAAM,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACrD,UAAM,SAAS,SAAI,OAAO,SAAS,CAAC;AACpC,YAAQ,IAAI,SAAI,MAAM,QAAG;AACzB,UAAM,QAAQ,CAAC,SAAS,QAAQ,IAAI,UAAK,KAAK,OAAO,MAAM,CAAC,SAAI,CAAC;AACjE,YAAQ,IAAI,SAAI,MAAM,QAAG;AAAA,EAC3B;AACF;AAKA,IAAM,SAAS,CAAC,aAAsC;AACpD,QAAM,KAAc,yBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,SAAG,MAAM;AACT,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAKA,IAAM,UAAU,OAAO,UAAkB,aAAa,SAA2B;AAC/E,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,SAAS,MAAM,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAG;AAEpD,MAAI,CAAC;AAAQ,WAAO;AACpB,SAAO,OAAO,YAAY,EAAE,WAAW,GAAG;AAC5C;AAKA,IAAM,aAAa,MAAM;AACvB,UAAQ,IAAI;AAAA,EACZ,EAAE,QAAQ,gRAA+C,CAAC;AAAA,EAC1D,EAAE,QAAQ,QAAG,CAAC,KAAK,EAAE,QAAQ,SAAS,CAAC,qCAAqC,EAAE,QAAQ,QAAG,CAAC;AAAA,EAC1F,EAAE,QAAQ,gRAA+C,CAAC;AAAA,CAC3D;AACD;AAKA,IAAM,WAAW,MAAM;AACrB,aAAW;AACX,UAAQ,IAAI,GAAG,EAAE,QAAQ,QAAQ,CAAC;AAAA;AAAA;AAAA,EAGlC,EAAE,QAAQ,WAAW,CAAC;AAAA,IACpB,EAAE,QAAQ,MAAM,CAAC;AAAA,IACjB,EAAE,QAAQ,QAAQ,CAAC;AAAA,IACnB,EAAE,QAAQ,UAAU,CAAC;AAAA,IACrB,EAAE,QAAQ,UAAU,CAAC;AAAA,IACrB,EAAE,QAAQ,MAAM,CAAC;AAAA;AAAA,EAEnB,EAAE,QAAQ,WAAW,CAAC;AAAA,IACpB,EAAE,OAAO,GAAG,CAAC;AAAA,IACb,EAAE,OAAO,GAAG,CAAC;AAAA,IACb,EAAE,OAAO,GAAG,CAAC;AAAA,IACb,EAAE,OAAO,GAAG,CAAC;AAAA;AAAA,EAEf,EAAE,QAAQ,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,EAAE,QAAQ,YAAY,CAAC;AAAA,CACxB;AACD;AAKA,IAAM,YAAY,CAAC,MAAc,QAAQ,IAAI,MAAM;AACjD,aAAW;AACX,QAAM,OAAO,qBAAqB;AAElC,QAAM,OAAO,gBAAgB,GAAG;AAChC,UAAQ,IAAI,oBAAoB,IAAI,CAAC;AAErC,UAAQ,IAAI,OAAO,EAAE,QAAQ,kBAAkB,CAAC;AAChD,QAAM,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AAEhE,SAAO;AACT;AAKA,IAAM,cAAc,CAAC,OAAe;AA/IpC;AAgJE,aAAW;AACX,QAAM,OAAO,mBAAmB;AAEhC,QAAM,SAAS,cAAc,EAAE;AAE/B,UAAQ,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;AAElC,MAAI,OAAO,OAAO;AAChB,UAAM,QAAQ,wBAAwB;AACtC,QAAI,OAAO,SAAS;AAClB,YAAM,QAAQ,OAAO,OAAO;AAAA,IAC9B;AAAA,EACF,OAAO;AACL,UAAM,OAAM,YAAO,UAAP,YAAgB,SAAS;AACrC,QAAI,OAAO,YAAY;AACrB,YAAM,KAAK,eAAe,OAAO,UAAU,EAAE;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AACT;AAKA,IAAM,cAAc,CAAC,aAAqB,UAAuD,CAAC,MAAM;AAzKxG;AA0KE,aAAW;AACX,QAAM,OAAO,uBAAuB;AAEpC,QAAM,OAAO,gBAAgB;AAC7B,QAAM,aAAa,cAAc,WAAW;AAE5C,MAAI,CAAC,WAAW,OAAO;AACrB,UAAM,OAAM,gBAAW,UAAX,YAAoB,gBAAgB;AAChD,QAAI,WAAW,YAAY;AACzB,YAAM,KAAK,eAAe,WAAW,UAAU,EAAE;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,cAAc,KAAK,WAAW,EAAE;AAC9C,QAAM,QAAQ,cAAc,WAAW,EAAE;AAEzC,QAAM,QAAQ,kBAAkB;AAAA,IAC9B,WAAW,KAAK;AAAA,IAChB,YAAY;AAAA,IACZ,aAAY,aAAQ,eAAR,YAAsB;AAAA,IAClC,iBAAgB,aAAQ,YAAR,YAAmB;AAAA,EACrC,CAAC;AAED,UAAQ,IAAI,OAAO,oBAAoB,KAAK,CAAC;AAE7C,SAAO;AACT;AAKA,IAAM,UAAU,OACd,SACA,UAAyE,CAAC,MACvE;AA7ML;AA8ME,aAAW;AACX,QAAM,OAAO,eAAe;AAE5B,QAAM,OAAO,gBAAgB;AAG7B,QAAM,KAAK,GAAG,2BAA2B;AACzC,UAAQ,IAAI;AAAA,eAAkB,EAAE,SAAS,KAAK,WAAW,CAAC,EAAE;AAC5D,UAAQ,IAAI,sBAAsB,EAAE,SAAS,KAAK,cAAc,CAAC,EAAE;AACnE,UAAQ,IAAI,iBAAiB,KAAK,UAAU,GAAG;AAG/C,QAAM,KAAK,GAAG,kBAAkB;AAEhC,MAAI,cAAc,4BAAW;AAE7B,MAAI,CAAC,aAAa;AAChB,kBAAc,MAAM,OAAO;AAAA,oDAAuD;AAAA,EACpF;AAEA,MAAI,CAAC,aAAa;AAChB,UAAM,MAAM,8BAA8B;AAC1C,YAAQ,IAAI;AAAA,IAAO,EAAE,OAAO,yDAAyD,CAAC;AAAA,CAAI;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,cAAc,WAAW;AAC5C,MAAI,CAAC,WAAW,OAAO;AACrB,UAAM,OAAM,gBAAW,UAAX,YAAoB,gBAAgB;AAChD,QAAI,WAAW,YAAY;AACzB,YAAM,KAAK,WAAW,UAAU;AAAA,IAClC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,uBAAuB,WAAW,EAAE;AAGlD,QAAM,KAAK,GAAG,eAAe;AAE7B,QAAM,cAAa,aAAQ,YAAR,YAAoB,MAAM,QAAQ,6CAA6C,IAAI;AACtG,QAAM,iBAAgB,aAAQ,eAAR,YAAuB,MAAM,QAAQ,qBAAqB,IAAI;AAGpF,QAAM,KAAK,GAAG,wBAAwB;AAEtC,QAAM,aAAa,kBAAkB,KAAK,gBAAgB,KAAK,QAAQ;AACvE,UAAQ,IAAI;AAAA,aAAgB,EAAE,QAAQ,UAAU,CAAC,EAAE;AAEnD,MAAI,QAAQ,QAAQ;AAClB,UAAM,QAAQ,iCAAiC;AAAA,EACjD,OAAO;AACL,UAAM,gBAAgB,MAAM,QAAQ,6BAA6B,IAAI;AAErE,QAAI,eAAe;AACjB,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAe;AACjD,UAAI;AACF,gBAAQ,IAAI,EAAE;AACd,iBAAS,YAAY,EAAE,OAAO,UAAU,CAAC;AACzC,cAAM,QAAQ,iCAAiC;AAAA,MACjD,SAAS,OAAO;AACd,cAAM,MAAM,qBAAqB;AACjC,gBAAQ,IAAI;AAAA,IAAO,EAAE,OAAO,uBAAuB,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC;AAAA,CAAI;AAAA,MACnF;AAAA,IACF,OAAO;AACL,YAAM,KAAK,qCAAqC;AAChD,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA,EACF;AAGA,QAAM,KAAK,GAAG,0BAA0B;AAExC,QAAM,QAAQ,kBAAkB;AAAA,IAC9B,WAAW,KAAK;AAAA,IAChB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB,CAAC;AAED,UAAQ,IAAI,OAAO,oBAAoB,KAAK,CAAC;AAG7C,QAAM,KAAK,GAAG,mBAAmB;AAEjC,MAAI,QAAQ,QAAQ;AAClB,UAAM,QAAQ,kCAAkC;AAChD,UAAM,QAAQ,CAAC,SAAS;AACtB,cAAQ,IAAI,mBAAmB,EAAE,QAAQ,KAAK,QAAQ,CAAC,EAAE;AAAA,IAC3D,CAAC;AAAA,EACH,OAAO;AACL,UAAM,cAAc,MAAM,QAAQ,2CAA2C,KAAK;AAElF,QAAI,aAAa;AACf,iBAAW,QAAQ,OAAO;AACxB,cAAM,WAAgB,WAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ;AACvD,cAAM,MAAW,cAAQ,QAAQ;AAGjC,YAAI,CAAI,eAAW,GAAG,GAAG;AACvB,UAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,QACvC;AAGA,YAAO,eAAW,QAAQ,GAAG;AAC3B,gBAAM,YAAY,MAAM,QAAQ,KAAK,KAAK,QAAQ,uBAAuB,KAAK;AAC9E,cAAI,CAAC,WAAW;AACd,kBAAM,KAAK,YAAY,KAAK,QAAQ,EAAE;AACtC;AAAA,UACF;AAAA,QACF;AAEA,QAAG,kBAAc,UAAU,KAAK,OAAO;AACvC,cAAM,QAAQ,YAAY,KAAK,QAAQ,EAAE;AAAA,MAC3C;AAAA,IACF,OAAO;AACL,YAAM,KAAK,kDAAkD;AAAA,IAC/D;AAAA,EACF;AAGA,QAAM,OAAO,iBAAiB;AAE9B,QAAM,IAAI;AAAA,IACR,gCAAgC,KAAK,WAAW;AAAA,IAChD;AAAA,IACA,cAAc,WAAW;AAAA,IACzB,aAAa,0BAA0B;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,EAAE,MAAM,aAAa,MAAM;AACpC;AAKA,IAAM,YAAY,CAAC,SAA8F;AA7VjH;AA8VE,QAAM,WAAU,UAAK,CAAC,MAAN,YAAW;AAC3B,QAAM,aAAuB,CAAC;AAC9B,QAAM,QAAiC,CAAC;AAExC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI,MAAM,CAAC,CAAC,IAAI;AAAA,IACxB,WAAW,IAAI,WAAW,GAAG,GAAG;AAC9B,YAAM,IAAI,MAAM,CAAC,CAAC,IAAI;AAAA,IACxB,OAAO;AACL,iBAAW,KAAK,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY,MAAM;AACtC;AAKO,IAAM,MAAM,OAAO,OAAiB,QAAQ,KAAK,MAAM,CAAC,MAAqB;AAnXpF;AAoXE,QAAM,EAAE,SAAS,YAAY,MAAM,IAAI,UAAU,IAAI;AAErD,QAAM,UAAU;AAAA,IACd,YAAY,MAAM,cAAc,MAAM,KAAK,OAAO,MAAM,cAAc,MAAM,KAAK,QAAQ;AAAA,IACzF,UAAS,WAAM,YAAN,YAAiB;AAAA,IAC1B,SAAQ,WAAM,SAAS,MAAf,YAAoB;AAAA,EAC9B;AAEA,MAAI;AACF,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,cAAM,QAAQ,WAAW,CAAC,GAAG,OAAO;AACpC;AAAA,MAEF,KAAK;AACH,kBAAU,WAAW,CAAC,CAAC;AACvB;AAAA,MAEF,KAAK;AACH,YAAI,CAAC,WAAW,CAAC,GAAG;AAClB,gBAAM,MAAM,+CAA+C;AAC3D,kBAAQ,IAAI;AAAA,IAAO,EAAE,OAAO,QAAQ,CAAC;AAAA,CAAoD;AACzF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,oBAAY,WAAW,CAAC,CAAC;AACzB;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,CAAC,WAAW,CAAC,GAAG;AAClB,gBAAM,MAAM,mCAAmC;AAC/C,kBAAQ,IAAI;AAAA,IAAO,EAAE,OAAO,QAAQ,CAAC;AAAA,CAAoD;AACzF,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,oBAAY,WAAW,CAAC,GAAG,OAAO;AAClC;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AACE,iBAAS;AACT;AAAA,IACJ;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,MAAM,MAAM,OAAO;AAAA,IAC3B,OAAO;AACL,YAAM,MAAM,8BAA8B;AAAA,IAC5C;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,IAAI,OAAO,YAAY,eAAe,QAAQ,SAAS,QAAQ;AAC7D,MAAI;AACN;","names":["c","fs","path"]}
|
package/dist/index.js
CHANGED
|
@@ -1141,7 +1141,7 @@ ${c("bold", "Options:")}
|
|
|
1141
1141
|
--consent Include consent mode setup
|
|
1142
1142
|
--dry-run Show what would be done without doing it
|
|
1143
1143
|
|
|
1144
|
-
${c("bold", "More info:")} https://github.com/
|
|
1144
|
+
${c("bold", "More info:")} https://github.com/jwiedeman/GTM-Kit
|
|
1145
1145
|
`);
|
|
1146
1146
|
};
|
|
1147
1147
|
var runDetect = (dir = process.cwd()) => {
|
|
@@ -1305,7 +1305,7 @@ var runInit = async (quickId, options = {}) => {
|
|
|
1305
1305
|
"2. Add your routes/pages",
|
|
1306
1306
|
"3. Test with GTM Preview mode",
|
|
1307
1307
|
"",
|
|
1308
|
-
"Docs: https://github.com/
|
|
1308
|
+
"Docs: https://github.com/jwiedeman/GTM-Kit"
|
|
1309
1309
|
]);
|
|
1310
1310
|
return { info, containerId, files };
|
|
1311
1311
|
};
|
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/react-gtm-kit/react-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/react-gtm-kit/react-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 {\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"]}
|