@posthog/wizard 1.31.1 → 1.32.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.
Files changed (183) hide show
  1. package/README.md +2 -1
  2. package/dist/bin.js +14 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/__tests__/run.test.js +5 -5
  5. package/dist/src/__tests__/run.test.js.map +1 -1
  6. package/dist/src/android/android-wizard-agent.d.ts +6 -0
  7. package/dist/src/android/android-wizard-agent.js +140 -0
  8. package/dist/src/android/android-wizard-agent.js.map +1 -0
  9. package/dist/src/android/utils.d.ts +11 -0
  10. package/dist/src/android/utils.js +97 -0
  11. package/dist/src/android/utils.js.map +1 -0
  12. package/dist/src/angular/angular-wizard-agent.d.ts +4 -0
  13. package/dist/src/angular/angular-wizard-agent.js +67 -0
  14. package/dist/src/angular/angular-wizard-agent.js.map +1 -0
  15. package/dist/src/angular/utils.d.ts +4 -0
  16. package/dist/src/angular/utils.js +9 -0
  17. package/dist/src/angular/utils.js.map +1 -0
  18. package/dist/src/astro/astro-wizard-agent.d.ts +7 -0
  19. package/dist/src/astro/astro-wizard-agent.js +102 -0
  20. package/dist/src/astro/astro-wizard-agent.js.map +1 -0
  21. package/dist/src/astro/utils.d.ts +17 -0
  22. package/dist/src/astro/utils.js +163 -0
  23. package/dist/src/astro/utils.js.map +1 -0
  24. package/dist/src/django/django-wizard-agent.d.ts +8 -5
  25. package/dist/src/django/django-wizard-agent.js +62 -51
  26. package/dist/src/django/django-wizard-agent.js.map +1 -1
  27. package/dist/src/django/utils.d.ts +1 -1
  28. package/dist/src/django/utils.js +3 -22
  29. package/dist/src/django/utils.js.map +1 -1
  30. package/dist/src/fastapi/fastapi-wizard-agent.d.ts +7 -0
  31. package/dist/src/fastapi/fastapi-wizard-agent.js +217 -0
  32. package/dist/src/fastapi/fastapi-wizard-agent.js.map +1 -0
  33. package/dist/src/fastapi/utils.d.ts +26 -0
  34. package/dist/src/fastapi/utils.js +258 -0
  35. package/dist/src/fastapi/utils.js.map +1 -0
  36. package/dist/src/flask/flask-wizard-agent.d.ts +8 -5
  37. package/dist/src/flask/flask-wizard-agent.js +67 -51
  38. package/dist/src/flask/flask-wizard-agent.js.map +1 -1
  39. package/dist/src/flask/utils.d.ts +1 -1
  40. package/dist/src/flask/utils.js +3 -22
  41. package/dist/src/flask/utils.js.map +1 -1
  42. package/dist/src/laravel/laravel-wizard-agent.d.ts +10 -5
  43. package/dist/src/laravel/laravel-wizard-agent.js +50 -53
  44. package/dist/src/laravel/laravel-wizard-agent.js.map +1 -1
  45. package/dist/src/laravel/utils.d.ts +1 -1
  46. package/dist/src/laravel/utils.js +3 -22
  47. package/dist/src/laravel/utils.js.map +1 -1
  48. package/dist/src/lib/__tests__/agent-interface.test.js +1 -0
  49. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  50. package/dist/src/lib/agent-interface.d.ts +4 -1
  51. package/dist/src/lib/agent-interface.js +36 -3
  52. package/dist/src/lib/agent-interface.js.map +1 -1
  53. package/dist/src/lib/agent-runner.js +69 -6
  54. package/dist/src/lib/agent-runner.js.map +1 -1
  55. package/dist/src/lib/api.d.ts +4 -4
  56. package/dist/src/lib/constants.d.ts +15 -14
  57. package/dist/src/lib/constants.js +17 -40
  58. package/dist/src/lib/constants.js.map +1 -1
  59. package/dist/src/lib/env-file-tools.d.ts +11 -0
  60. package/dist/src/lib/env-file-tools.js +154 -0
  61. package/dist/src/lib/env-file-tools.js.map +1 -0
  62. package/dist/src/lib/framework-config.d.ts +34 -16
  63. package/dist/src/lib/framework-config.js.map +1 -1
  64. package/dist/src/lib/registry.d.ts +3 -0
  65. package/dist/src/lib/registry.js +41 -0
  66. package/dist/src/lib/registry.js.map +1 -0
  67. package/dist/src/nextjs/nextjs-wizard-agent.d.ts +7 -5
  68. package/dist/src/nextjs/nextjs-wizard-agent.js +16 -79
  69. package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -1
  70. package/dist/src/nextjs/utils.d.ts +1 -1
  71. package/dist/src/nextjs/utils.js +3 -22
  72. package/dist/src/nextjs/utils.js.map +1 -1
  73. package/dist/src/nuxt/nuxt-wizard-agent.d.ts +6 -0
  74. package/dist/src/nuxt/nuxt-wizard-agent.js +77 -0
  75. package/dist/src/nuxt/nuxt-wizard-agent.js.map +1 -0
  76. package/dist/src/python/python-wizard-agent.d.ts +7 -0
  77. package/dist/src/python/python-wizard-agent.js +269 -0
  78. package/dist/src/python/python-wizard-agent.js.map +1 -0
  79. package/dist/src/python/utils.d.ts +28 -0
  80. package/dist/src/python/utils.js +147 -0
  81. package/dist/src/python/utils.js.map +1 -0
  82. package/dist/src/react-native/react-native-wizard-agent.d.ts +7 -0
  83. package/dist/src/react-native/react-native-wizard-agent.js +91 -0
  84. package/dist/src/react-native/react-native-wizard-agent.js.map +1 -0
  85. package/dist/src/react-native/utils.d.ts +8 -0
  86. package/dist/src/react-native/utils.js +31 -0
  87. package/dist/src/react-native/utils.js.map +1 -0
  88. package/dist/src/react-router/react-router-wizard-agent.d.ts +7 -5
  89. package/dist/src/react-router/react-router-wizard-agent.js +18 -80
  90. package/dist/src/react-router/react-router-wizard-agent.js.map +1 -1
  91. package/dist/src/react-router/utils.d.ts +1 -1
  92. package/dist/src/react-router/utils.js +3 -21
  93. package/dist/src/react-router/utils.js.map +1 -1
  94. package/dist/src/run.d.ts +1 -0
  95. package/dist/src/run.js +28 -76
  96. package/dist/src/run.js.map +1 -1
  97. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +6 -6
  98. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
  99. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +6 -6
  100. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +6 -6
  101. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +6 -6
  102. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +6 -6
  103. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +6 -6
  104. package/dist/src/svelte/svelte-wizard-agent.d.ts +4 -0
  105. package/dist/src/svelte/svelte-wizard-agent.js +60 -0
  106. package/dist/src/svelte/svelte-wizard-agent.js.map +1 -0
  107. package/dist/src/swift/swift-wizard-agent.d.ts +7 -0
  108. package/dist/src/swift/swift-wizard-agent.js +141 -0
  109. package/dist/src/swift/swift-wizard-agent.js.map +1 -0
  110. package/dist/src/swift/utils.d.ts +8 -0
  111. package/dist/src/swift/utils.js +105 -0
  112. package/dist/src/swift/utils.js.map +1 -0
  113. package/dist/src/tanstack-router/tanstack-router-wizard-agent.d.ts +7 -0
  114. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js +93 -0
  115. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +1 -0
  116. package/dist/src/tanstack-router/utils.d.ts +17 -0
  117. package/dist/src/tanstack-router/utils.js +192 -0
  118. package/dist/src/tanstack-router/utils.js.map +1 -0
  119. package/dist/src/tanstack-start/tanstack-start-wizard-agent.d.ts +4 -0
  120. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js +66 -0
  121. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
  122. package/dist/src/tanstack-start/utils.d.ts +4 -0
  123. package/dist/src/tanstack-start/utils.js +9 -0
  124. package/dist/src/tanstack-start/utils.js.map +1 -0
  125. package/dist/src/utils/__tests__/semver.test.d.ts +1 -0
  126. package/dist/src/utils/__tests__/semver.test.js +117 -0
  127. package/dist/src/utils/__tests__/semver.test.js.map +1 -0
  128. package/dist/src/utils/clack-utils.js +3 -5
  129. package/dist/src/utils/clack-utils.js.map +1 -1
  130. package/dist/src/utils/debug.d.ts +2 -0
  131. package/dist/src/utils/debug.js +17 -5
  132. package/dist/src/utils/debug.js.map +1 -1
  133. package/dist/src/utils/file-utils.d.ts +1 -31
  134. package/dist/src/utils/file-utils.js +0 -163
  135. package/dist/src/utils/file-utils.js.map +1 -1
  136. package/dist/src/utils/semver.d.ts +16 -0
  137. package/dist/src/utils/semver.js +37 -0
  138. package/dist/src/utils/semver.js.map +1 -1
  139. package/dist/src/utils/types.d.ts +4 -0
  140. package/dist/src/utils/types.js.map +1 -1
  141. package/dist/src/vue/vue-wizard-agent.d.ts +4 -0
  142. package/dist/src/vue/vue-wizard-agent.js +64 -0
  143. package/dist/src/vue/vue-wizard-agent.js.map +1 -0
  144. package/package.json +1 -1
  145. package/dist/src/astro/astro-wizard.d.ts +0 -2
  146. package/dist/src/astro/astro-wizard.js +0 -89
  147. package/dist/src/astro/astro-wizard.js.map +0 -1
  148. package/dist/src/astro/docs.d.ts +0 -4
  149. package/dist/src/astro/docs.js +0 -101
  150. package/dist/src/astro/docs.js.map +0 -1
  151. package/dist/src/lib/config.d.ts +0 -104
  152. package/dist/src/lib/config.js +0 -368
  153. package/dist/src/lib/config.js.map +0 -1
  154. package/dist/src/lib/messages.d.ts +0 -16
  155. package/dist/src/lib/messages.js +0 -66
  156. package/dist/src/lib/messages.js.map +0 -1
  157. package/dist/src/lib/prompts.d.ts +0 -16
  158. package/dist/src/lib/prompts.js +0 -83
  159. package/dist/src/lib/prompts.js.map +0 -1
  160. package/dist/src/react/docs.d.ts +0 -4
  161. package/dist/src/react/docs.js +0 -49
  162. package/dist/src/react/docs.js.map +0 -1
  163. package/dist/src/react/react-wizard.d.ts +0 -2
  164. package/dist/src/react/react-wizard.js +0 -121
  165. package/dist/src/react/react-wizard.js.map +0 -1
  166. package/dist/src/react-native/docs.d.ts +0 -5
  167. package/dist/src/react-native/docs.js +0 -31
  168. package/dist/src/react-native/docs.js.map +0 -1
  169. package/dist/src/react-native/react-native-wizard.d.ts +0 -2
  170. package/dist/src/react-native/react-native-wizard.js +0 -128
  171. package/dist/src/react-native/react-native-wizard.js.map +0 -1
  172. package/dist/src/svelte/docs.d.ts +0 -3
  173. package/dist/src/svelte/docs.js +0 -111
  174. package/dist/src/svelte/docs.js.map +0 -1
  175. package/dist/src/svelte/svelte-wizard.d.ts +0 -2
  176. package/dist/src/svelte/svelte-wizard.js +0 -121
  177. package/dist/src/svelte/svelte-wizard.js.map +0 -1
  178. package/dist/src/utils/errors.d.ts +0 -3
  179. package/dist/src/utils/errors.js +0 -11
  180. package/dist/src/utils/errors.js.map +0 -1
  181. package/dist/src/utils/query.d.ts +0 -11
  182. package/dist/src/utils/query.js +0 -115
  183. package/dist/src/utils/query.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { basename, isAbsolute, join, relative } from 'node:path';\n\nimport chalk from 'chalk';\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport { type PackageDotJson, hasPackageInstalled } from './package-json';\nimport {\n type PackageManager,\n detectAllPackageManagers,\n packageManagers,\n NPM as npm,\n} from './package-manager';\nimport { fulfillsVersionRange } from './semver';\nimport type { CloudRegion, Feature, WizardOptions } from './types';\nimport { getPackageVersion } from './package-json';\nimport {\n DEFAULT_HOST_URL,\n DUMMY_PROJECT_API_KEY,\n ISSUES_URL,\n type Integration,\n} from '../lib/constants';\nimport { analytics } from './analytics';\nimport clack from './clack';\nimport { getCloudUrlFromRegion, getHostFromRegion } from './urls';\nimport { INTEGRATION_CONFIG } from '../lib/config';\nimport { performOAuthFlow } from './oauth';\nimport { fetchUserData, fetchProjectData } from '../lib/api';\n\ninterface ProjectData {\n projectApiKey: string;\n accessToken: string;\n host: string;\n distinctId: string;\n projectId: number;\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n await analytics.shutdown('cancelled');\n\n clack.outro(message ?? 'Wizard setup cancelled.');\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n integration?: Integration,\n): Promise<Exclude<T, symbol>> {\n await analytics.shutdown('cancelled');\n const resolvedInput = await input;\n\n if (\n clack.isCancel(resolvedInput) ||\n (typeof resolvedInput === 'symbol' &&\n resolvedInput.description === 'clack:cancel')\n ) {\n const docsUrl = integration\n ? INTEGRATION_CONFIG[integration].docsUrl\n : 'https://posthog.com/docs';\n\n clack.cancel(\n `Wizard setup cancelled. You can read the documentation for ${\n integration ?? 'PostHog'\n } at ${chalk.cyan(docsUrl)} to continue with the setup manually.`,\n );\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n message?: string;\n}): void {\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n\n const welcomeText =\n options.message ||\n `The ${options.wizardName} will help you set up PostHog for your application.\\nThank you for using PostHog :)`;\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(\n options: Pick<WizardOptions, 'default' | 'ci'>,\n): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n // CI mode: auto-continue without git\n const continueWithoutGit =\n options.default || options.ci\n ? true\n : await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n analytics.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n // return early to avoid checking for uncommitted files\n return;\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n // CI mode: auto-continue with dirty repo\n if (options.ci) {\n clack.log.info(\n `CI mode: continuing with uncommitted/untracked files in repo`,\n );\n analytics.setTag('continue-with-dirty-repo', true);\n return;\n }\n\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n analytics.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n note,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n note?: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n analytics.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n analytics.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n note ??\n `Please upgrade to ${acceptableVersions} if you wish to use the PostHog wizard.`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n analytics.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\nexport async function isReact19Installed({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n try {\n const packageJson = await getPackageDotJson({ installDir });\n const reactVersion = getPackageVersion('react', packageJson);\n\n if (!reactVersion) {\n return false;\n }\n\n return fulfillsVersionRange({\n version: reactVersion,\n acceptableVersions: '>=19.0.0',\n canBeLatest: true,\n });\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n integration,\n installDir,\n}: {\n /** The string that is passed to the package manager CLI as identifier to install (e.g. `posthog-js`, or `posthog-js@^1.100.0`) */\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n /** Overrides what is shown in the installation logs in place of the `packageName` option. Useful if the `packageName` is ugly */\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n /** Add force install flag to command to skip install precondition fails */\n forceInstall?: boolean;\n /** The integration that is being used */\n integration?: string;\n /** The directory to install the package in */\n installDir: string;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return {};\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const pkgManager =\n packageManager || (await getPackageManager({ installDir }));\n\n // Most packages aren't compatible with React 19 yet, skip strict peer dependency checks if needed.\n const isReact19 = await isReact19Installed({ installDir });\n const legacyPeerDepsFlag =\n isReact19 && pkgManager.name === 'npm' ? '--legacy-peer-deps' : '';\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${\n forceInstall ? pkgManager.forceInstallFlag : ''\n } ${legacyPeerDepsFlag}`.trim(),\n { cwd: installDir },\n (err, stdout, stderr) => {\n if (err) {\n // Write a log file so we can better troubleshoot issues\n fs.writeFileSync(\n join(\n process.cwd(),\n `posthog-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n `The wizard has created a \\`posthog-wizard-installation-error-*.log\\` file. If you think this issue is caused by the PostHog wizard, create an issue on GitHub and include the log file's content:\\n${ISSUES_URL}`,\n )}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n analytics.capture('wizard interaction', {\n action: 'package installed',\n package_name: packageName,\n package_manager: pkgManager.name,\n integration,\n });\n\n return { packageManager: pkgManager };\n });\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n analytics.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(installDir, 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\n/**\n * Try to get package.json, returning null if it doesn't exist.\n * Use this for detection purposes where missing package.json is expected (e.g., Python projects).\n */\nexport async function tryGetPackageJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson | null> {\n try {\n const packageJsonFileContents = await fs.promises.readFile(\n join(installDir, 'package.json'),\n 'utf8',\n );\n return JSON.parse(packageJsonFileContents) as PackageDotJson;\n } catch {\n return null;\n }\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(installDir, 'package.json'),\n // TODO: maybe figure out the original indentation\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n clack.log.error(`Unable to update your ${chalk.cyan('package.json')}.`);\n\n await abort();\n }\n}\n\nexport async function getPackageManager(\n options: Pick<WizardOptions, 'installDir'> & { ci?: boolean },\n): Promise<PackageManager> {\n const detectedPackageManagers = detectAllPackageManagers({\n installDir: options.installDir,\n });\n\n // If exactly one package manager detected, use it automatically\n if (detectedPackageManagers.length === 1) {\n const detectedPackageManager = detectedPackageManagers[0];\n analytics.setTag('package-manager', detectedPackageManager.name);\n return detectedPackageManager;\n }\n\n // CI mode: auto-select first detected or npm\n if (options.ci) {\n const selectedPackageManager =\n detectedPackageManagers.length > 0 ? detectedPackageManagers[0] : npm;\n clack.log.info(\n `CI mode: auto-selected package manager: ${selectedPackageManager.label}`,\n );\n analytics.setTag('package-manager', selectedPackageManager.name);\n return selectedPackageManager;\n }\n\n // If multiple or no package managers detected, prompt user to select\n const pkgOptions =\n detectedPackageManagers.length > 0\n ? detectedPackageManagers\n : packageManagers;\n\n const message =\n detectedPackageManagers.length > 1\n ? 'Multiple package managers detected. Please select one:'\n : 'Please select your package manager.';\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message,\n options: pkgOptions.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n analytics.setTag('package-manager', selectedPackageManager.name);\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n try {\n return fs.existsSync(join(installDir, 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @returns project data (token, url)\n */\nexport async function getOrAskForProjectData(\n _options: Pick<WizardOptions, 'signup' | 'ci' | 'apiKey'> & {\n cloudRegion: CloudRegion;\n },\n): Promise<{\n host: string;\n projectApiKey: string;\n accessToken: string;\n projectId: number;\n}> {\n const cloudUrl = getCloudUrlFromRegion(_options.cloudRegion);\n\n // CI mode: bypass OAuth, use personal API key for LLM gateway\n if (_options.ci && _options.apiKey) {\n const host = getHostFromRegion(_options.cloudRegion);\n clack.log.info('Using provided API key (CI mode - OAuth bypassed)');\n\n const projectData = await fetchProjectDataWithApiKey(\n _options.apiKey,\n _options.cloudRegion,\n );\n\n return {\n host,\n projectApiKey: projectData.api_token, // Project API key for SDK config\n accessToken: _options.apiKey, // Personal API key for LLM gateway\n projectId: projectData.id,\n };\n }\n\n const { host, projectApiKey, accessToken, projectId } = await traceStep(\n 'login',\n () =>\n askForWizardLogin({\n cloudRegion: _options.cloudRegion,\n signup: _options.signup,\n }),\n );\n\n if (!projectApiKey) {\n clack.log.error(`Didn't receive a project API key. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${chalk.cyan(ISSUES_URL)}`);\n\n clack.log\n .info(`In the meantime, we'll add a dummy project API key (${chalk.cyan(\n `\"${DUMMY_PROJECT_API_KEY}\"`,\n )}) for you to replace later.\nYou can find your Project API key here:\n${chalk.cyan(`${cloudUrl}/settings/project#variables`)}`);\n }\n\n return {\n accessToken,\n host: host || DEFAULT_HOST_URL,\n projectApiKey: projectApiKey || DUMMY_PROJECT_API_KEY,\n projectId,\n };\n}\n\n/**\n * Fetch project data using a personal API key (for CI mode)\n */\nasync function fetchProjectDataWithApiKey(\n apiKey: string,\n region: CloudRegion,\n): Promise<{ api_token: string; id: number }> {\n const cloudUrl = getCloudUrlFromRegion(region);\n const userData = await fetchUserData(apiKey, cloudUrl);\n const projectId = userData.team?.id;\n\n if (!projectId) {\n throw new Error(\n 'Could not determine project ID from API key. Please ensure your API key has access to a project in this cloud region.',\n );\n }\n\n const projectData = await fetchProjectData(apiKey, projectId, cloudUrl);\n return {\n api_token: projectData.api_token,\n id: projectId,\n };\n}\n\nasync function askForWizardLogin(options: {\n cloudRegion: CloudRegion;\n signup: boolean;\n}): Promise<ProjectData> {\n const tokenResponse = await performOAuthFlow({\n cloudRegion: options.cloudRegion,\n scopes: [\n 'user:read',\n 'project:read',\n 'introspection',\n 'llm_gateway:read',\n 'dashboard:write',\n 'insight:write',\n ],\n signup: options.signup,\n });\n\n const projectId = tokenResponse.scoped_teams?.[0];\n\n if (projectId === undefined) {\n const error = new Error(\n 'No project access granted. Please authorize with project-level access.',\n );\n analytics.captureException(error, {\n step: 'wizard_login',\n has_scoped_teams: !!tokenResponse.scoped_teams,\n });\n clack.log.error(error.message);\n await abort();\n }\n\n const cloudUrl = getCloudUrlFromRegion(options.cloudRegion);\n const host = getHostFromRegion(options.cloudRegion);\n\n const projectData = await fetchProjectData(\n tokenResponse.access_token,\n projectId!,\n cloudUrl,\n );\n const userData = await fetchUserData(tokenResponse.access_token, cloudUrl);\n\n const data: ProjectData = {\n accessToken: tokenResponse.access_token,\n projectApiKey: projectData.api_token,\n host,\n distinctId: userData.distinct_id,\n projectId: projectId!,\n };\n\n clack.log.success(\n `Login complete. ${options.signup ? 'Welcome to PostHog! 🎉' : ''}`,\n );\n analytics.setTag('opened-wizard-link', true);\n analytics.setDistinctId(data.distinctId);\n\n return data;\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(basename(filename))} file:${\n hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''\n }`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(relative(installDir, filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function featureSelectionPrompt<F extends ReadonlyArray<Feature>>(\n features: F,\n): Promise<{ [key in F[number]['id']]: boolean }> {\n return traceStep('feature-selection', async () => {\n const selectedFeatures: Record<string, boolean> = {};\n\n for (const feature of features) {\n const selected = await abortIfCancelled(\n clack.select({\n message: feature.prompt,\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: feature.enabledHint,\n },\n {\n value: false,\n label: 'No',\n hint: feature.disabledHint,\n },\n ],\n }),\n );\n\n selectedFeatures[feature.id] = selected;\n }\n\n return selectedFeatures as { [key in F[number]['id']]: boolean };\n });\n}\n\nexport async function askShouldInstallPackage(\n pkgName: string,\n): Promise<boolean> {\n return traceStep(`ask-install-package`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to install ${chalk.cyan(pkgName)}?`,\n }),\n ),\n );\n}\n\nexport async function askShouldAddPackageOverride(\n pkgName: string,\n pkgVersion: string,\n): Promise<boolean> {\n return traceStep(`ask-add-package-override`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to add an override for ${chalk.cyan(\n pkgName,\n )} version ${chalk.cyan(pkgVersion)}?`,\n }),\n ),\n );\n}\n\nexport async function askForAIConsent(\n options: Pick<WizardOptions, 'default' | 'ci'>,\n) {\n return await traceStep('ask-for-ai-consent', async () => {\n // CI mode: auto-consent to AI\n const aiConsent =\n options.default || options.ci\n ? true\n : await abortIfCancelled(\n clack.select({\n message:\n 'This setup wizard uses AI, are you happy to continue? ✨',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'We will use AI to help you setup PostHog quickly',\n },\n {\n label: 'No',\n value: false,\n hint: \"I don't like AI\",\n },\n ],\n initialValue: true,\n }),\n );\n\n return aiConsent;\n });\n}\n\nexport async function askForCloudRegion(): Promise<CloudRegion> {\n return await traceStep('ask-for-cloud-region', async () => {\n const cloudRegion: CloudRegion = await abortIfCancelled(\n clack.select({\n message: 'Select your PostHog Cloud region',\n options: [\n {\n label: 'US 🇺🇸',\n value: 'us',\n hint: 'Your data will be stored in the US',\n },\n {\n label: 'EU 🇪🇺',\n value: 'eu',\n hint: 'Your data will be stored in the EU',\n },\n ],\n }),\n );\n\n return cloudRegion;\n });\n}\n"]}
1
+ {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { basename, isAbsolute, join, relative } from 'node:path';\n\nimport chalk from 'chalk';\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport { type PackageDotJson, hasPackageInstalled } from './package-json';\nimport {\n type PackageManager,\n detectAllPackageManagers,\n packageManagers,\n NPM as npm,\n} from './package-manager';\nimport { fulfillsVersionRange } from './semver';\nimport type { CloudRegion, Feature, WizardOptions } from './types';\nimport { getPackageVersion } from './package-json';\nimport {\n DEFAULT_HOST_URL,\n DUMMY_PROJECT_API_KEY,\n ISSUES_URL,\n type Integration,\n} from '../lib/constants';\nimport { analytics } from './analytics';\nimport clack from './clack';\nimport { getCloudUrlFromRegion, getHostFromRegion } from './urls';\nimport { FRAMEWORK_REGISTRY } from '../lib/registry';\nimport { performOAuthFlow } from './oauth';\nimport { fetchUserData, fetchProjectData } from '../lib/api';\n\ninterface ProjectData {\n projectApiKey: string;\n accessToken: string;\n host: string;\n distinctId: string;\n projectId: number;\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n await analytics.shutdown('cancelled');\n\n clack.outro(message ?? 'Wizard setup cancelled.');\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n integration?: Integration,\n): Promise<Exclude<T, symbol>> {\n await analytics.shutdown('cancelled');\n const resolvedInput = await input;\n\n if (\n clack.isCancel(resolvedInput) ||\n (typeof resolvedInput === 'symbol' &&\n resolvedInput.description === 'clack:cancel')\n ) {\n const docsUrl = integration\n ? FRAMEWORK_REGISTRY[integration].metadata.docsUrl\n : 'https://posthog.com/docs';\n\n clack.cancel(\n `Wizard setup cancelled. You can read the documentation for ${\n integration ?? 'PostHog'\n } at ${chalk.cyan(docsUrl)} to continue with the setup manually.`,\n );\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n message?: string;\n}): void {\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(\n options: Pick<WizardOptions, 'default' | 'ci'>,\n): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n // CI mode: auto-continue without git\n const continueWithoutGit =\n options.default || options.ci\n ? true\n : await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n analytics.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n // return early to avoid checking for uncommitted files\n return;\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n // CI mode: auto-continue with dirty repo\n if (options.ci) {\n clack.log.info(\n `CI mode: continuing with uncommitted/untracked files in repo`,\n );\n analytics.setTag('continue-with-dirty-repo', true);\n return;\n }\n\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n analytics.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n note,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n note?: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n analytics.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n analytics.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n note ??\n `Please upgrade to ${acceptableVersions} if you wish to use the PostHog wizard.`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n analytics.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\nexport async function isReact19Installed({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n try {\n const packageJson = await getPackageDotJson({ installDir });\n const reactVersion = getPackageVersion('react', packageJson);\n\n if (!reactVersion) {\n return false;\n }\n\n return fulfillsVersionRange({\n version: reactVersion,\n acceptableVersions: '>=19.0.0',\n canBeLatest: true,\n });\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n integration,\n installDir,\n}: {\n /** The string that is passed to the package manager CLI as identifier to install (e.g. `posthog-js`, or `posthog-js@^1.100.0`) */\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n /** Overrides what is shown in the installation logs in place of the `packageName` option. Useful if the `packageName` is ugly */\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n /** Add force install flag to command to skip install precondition fails */\n forceInstall?: boolean;\n /** The integration that is being used */\n integration?: string;\n /** The directory to install the package in */\n installDir: string;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return {};\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const pkgManager =\n packageManager || (await getPackageManager({ installDir }));\n\n // Most packages aren't compatible with React 19 yet, skip strict peer dependency checks if needed.\n const isReact19 = await isReact19Installed({ installDir });\n const legacyPeerDepsFlag =\n isReact19 && pkgManager.name === 'npm' ? '--legacy-peer-deps' : '';\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${\n forceInstall ? pkgManager.forceInstallFlag : ''\n } ${legacyPeerDepsFlag}`.trim(),\n { cwd: installDir },\n (err, stdout, stderr) => {\n if (err) {\n // Write a log file so we can better troubleshoot issues\n fs.writeFileSync(\n join(\n process.cwd(),\n `posthog-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n `The wizard has created a \\`posthog-wizard-installation-error-*.log\\` file. If you think this issue is caused by the PostHog wizard, create an issue on GitHub and include the log file's content:\\n${ISSUES_URL}`,\n )}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n analytics.capture('wizard interaction', {\n action: 'package installed',\n package_name: packageName,\n package_manager: pkgManager.name,\n integration,\n });\n\n return { packageManager: pkgManager };\n });\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n analytics.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(installDir, 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\n/**\n * Try to get package.json, returning null if it doesn't exist.\n * Use this for detection purposes where missing package.json is expected (e.g., Python projects).\n */\nexport async function tryGetPackageJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson | null> {\n try {\n const packageJsonFileContents = await fs.promises.readFile(\n join(installDir, 'package.json'),\n 'utf8',\n );\n return JSON.parse(packageJsonFileContents) as PackageDotJson;\n } catch {\n return null;\n }\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(installDir, 'package.json'),\n // TODO: maybe figure out the original indentation\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n clack.log.error(`Unable to update your ${chalk.cyan('package.json')}.`);\n\n await abort();\n }\n}\n\nexport async function getPackageManager(\n options: Pick<WizardOptions, 'installDir'> & { ci?: boolean },\n): Promise<PackageManager> {\n const detectedPackageManagers = detectAllPackageManagers({\n installDir: options.installDir,\n });\n\n // If exactly one package manager detected, use it automatically\n if (detectedPackageManagers.length === 1) {\n const detectedPackageManager = detectedPackageManagers[0];\n analytics.setTag('package-manager', detectedPackageManager.name);\n return detectedPackageManager;\n }\n\n // CI mode: auto-select first detected or npm\n if (options.ci) {\n const selectedPackageManager =\n detectedPackageManagers.length > 0 ? detectedPackageManagers[0] : npm;\n clack.log.info(\n `CI mode: auto-selected package manager: ${selectedPackageManager.label}`,\n );\n analytics.setTag('package-manager', selectedPackageManager.name);\n return selectedPackageManager;\n }\n\n // If multiple or no package managers detected, prompt user to select\n const pkgOptions =\n detectedPackageManagers.length > 0\n ? detectedPackageManagers\n : packageManagers;\n\n const message =\n detectedPackageManagers.length > 1\n ? 'Multiple package managers detected. Please select one:'\n : 'Please select your package manager.';\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message,\n options: pkgOptions.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n analytics.setTag('package-manager', selectedPackageManager.name);\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n try {\n return fs.existsSync(join(installDir, 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @returns project data (token, url)\n */\nexport async function getOrAskForProjectData(\n _options: Pick<WizardOptions, 'signup' | 'ci' | 'apiKey'> & {\n cloudRegion: CloudRegion;\n },\n): Promise<{\n host: string;\n projectApiKey: string;\n accessToken: string;\n projectId: number;\n}> {\n const cloudUrl = getCloudUrlFromRegion(_options.cloudRegion);\n\n // CI mode: bypass OAuth, use personal API key for LLM gateway\n if (_options.ci && _options.apiKey) {\n const host = getHostFromRegion(_options.cloudRegion);\n clack.log.info('Using provided API key (CI mode - OAuth bypassed)');\n\n const projectData = await fetchProjectDataWithApiKey(\n _options.apiKey,\n _options.cloudRegion,\n );\n\n return {\n host,\n projectApiKey: projectData.api_token, // Project API key for SDK config\n accessToken: _options.apiKey, // Personal API key for LLM gateway\n projectId: projectData.id,\n };\n }\n\n const { host, projectApiKey, accessToken, projectId } = await traceStep(\n 'login',\n () =>\n askForWizardLogin({\n cloudRegion: _options.cloudRegion,\n signup: _options.signup,\n }),\n );\n\n if (!projectApiKey) {\n clack.log.error(`Didn't receive a project API key. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${chalk.cyan(ISSUES_URL)}`);\n\n clack.log\n .info(`In the meantime, we'll add a dummy project API key (${chalk.cyan(\n `\"${DUMMY_PROJECT_API_KEY}\"`,\n )}) for you to replace later.\nYou can find your Project API key here:\n${chalk.cyan(`${cloudUrl}/settings/project#variables`)}`);\n }\n\n return {\n accessToken,\n host: host || DEFAULT_HOST_URL,\n projectApiKey: projectApiKey || DUMMY_PROJECT_API_KEY,\n projectId,\n };\n}\n\n/**\n * Fetch project data using a personal API key (for CI mode)\n */\nasync function fetchProjectDataWithApiKey(\n apiKey: string,\n region: CloudRegion,\n): Promise<{ api_token: string; id: number }> {\n const cloudUrl = getCloudUrlFromRegion(region);\n const userData = await fetchUserData(apiKey, cloudUrl);\n const projectId = userData.team?.id;\n\n if (!projectId) {\n throw new Error(\n 'Could not determine project ID from API key. Please ensure your API key has access to a project in this cloud region.',\n );\n }\n\n const projectData = await fetchProjectData(apiKey, projectId, cloudUrl);\n return {\n api_token: projectData.api_token,\n id: projectId,\n };\n}\n\nasync function askForWizardLogin(options: {\n cloudRegion: CloudRegion;\n signup: boolean;\n}): Promise<ProjectData> {\n const tokenResponse = await performOAuthFlow({\n cloudRegion: options.cloudRegion,\n scopes: [\n 'user:read',\n 'project:read',\n 'introspection',\n 'llm_gateway:read',\n 'dashboard:write',\n 'insight:write',\n 'query:read',\n ],\n signup: options.signup,\n });\n\n const projectId = tokenResponse.scoped_teams?.[0];\n\n if (projectId === undefined) {\n const error = new Error(\n 'No project access granted. Please authorize with project-level access.',\n );\n analytics.captureException(error, {\n step: 'wizard_login',\n has_scoped_teams: !!tokenResponse.scoped_teams,\n });\n clack.log.error(error.message);\n await abort();\n }\n\n const cloudUrl = getCloudUrlFromRegion(options.cloudRegion);\n const host = getHostFromRegion(options.cloudRegion);\n\n const projectData = await fetchProjectData(\n tokenResponse.access_token,\n projectId!,\n cloudUrl,\n );\n const userData = await fetchUserData(tokenResponse.access_token, cloudUrl);\n\n const data: ProjectData = {\n accessToken: tokenResponse.access_token,\n projectApiKey: projectData.api_token,\n host,\n distinctId: userData.distinct_id,\n projectId: projectId!,\n };\n\n clack.log.success(\n `Login complete. ${options.signup ? 'Welcome to PostHog! 🎉' : ''}`,\n );\n analytics.setTag('opened-wizard-link', true);\n analytics.setDistinctId(data.distinctId);\n\n return data;\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(basename(filename))} file:${\n hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''\n }`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(relative(installDir, filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function featureSelectionPrompt<F extends ReadonlyArray<Feature>>(\n features: F,\n): Promise<{ [key in F[number]['id']]: boolean }> {\n return traceStep('feature-selection', async () => {\n const selectedFeatures: Record<string, boolean> = {};\n\n for (const feature of features) {\n const selected = await abortIfCancelled(\n clack.select({\n message: feature.prompt,\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: feature.enabledHint,\n },\n {\n value: false,\n label: 'No',\n hint: feature.disabledHint,\n },\n ],\n }),\n );\n\n selectedFeatures[feature.id] = selected;\n }\n\n return selectedFeatures as { [key in F[number]['id']]: boolean };\n });\n}\n\nexport async function askShouldInstallPackage(\n pkgName: string,\n): Promise<boolean> {\n return traceStep(`ask-install-package`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to install ${chalk.cyan(pkgName)}?`,\n }),\n ),\n );\n}\n\nexport async function askShouldAddPackageOverride(\n pkgName: string,\n pkgVersion: string,\n): Promise<boolean> {\n return traceStep(`ask-add-package-override`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to add an override for ${chalk.cyan(\n pkgName,\n )} version ${chalk.cyan(pkgVersion)}?`,\n }),\n ),\n );\n}\n\nexport async function askForAIConsent(\n options: Pick<WizardOptions, 'default' | 'ci'>,\n) {\n return await traceStep('ask-for-ai-consent', async () => {\n // CI mode: auto-consent to AI\n const aiConsent =\n options.default || options.ci\n ? true\n : await abortIfCancelled(\n clack.select({\n message:\n 'This setup wizard uses AI, are you happy to continue? ✨',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'We will use AI to help you setup PostHog quickly',\n },\n {\n label: 'No',\n value: false,\n hint: \"I don't like AI\",\n },\n ],\n initialValue: true,\n }),\n );\n\n return aiConsent;\n });\n}\n\nexport async function askForCloudRegion(): Promise<CloudRegion> {\n return await traceStep('ask-for-cloud-region', async () => {\n const cloudRegion: CloudRegion = await abortIfCancelled(\n clack.select({\n message: 'Select your PostHog Cloud region',\n options: [\n {\n label: 'US 🇺🇸',\n value: 'us',\n hint: 'Your data will be stored in the US',\n },\n {\n label: 'EU 🇪🇺',\n value: 'eu',\n hint: 'Your data will be stored in the EU',\n },\n ],\n }),\n );\n\n return cloudRegion;\n });\n}\n"]}
@@ -2,11 +2,13 @@ export declare const LOG_FILE_PATH = "/tmp/posthog-wizard.log";
2
2
  /**
3
3
  * Initialize the log file with a run header.
4
4
  * Call this at the start of each wizard run.
5
+ * Fails silently to avoid crashing the wizard.
5
6
  */
6
7
  export declare function initLogFile(): void;
7
8
  /**
8
9
  * Log a message to the file at /tmp/posthog-wizard.log.
9
10
  * Always writes regardless of debug flag.
11
+ * Fails silently to avoid masking errors in catch blocks.
10
12
  */
11
13
  export declare function logToFile(...args: unknown[]): void;
12
14
  export declare function debug(...args: unknown[]): void;
@@ -17,19 +17,31 @@ exports.LOG_FILE_PATH = '/tmp/posthog-wizard.log';
17
17
  /**
18
18
  * Initialize the log file with a run header.
19
19
  * Call this at the start of each wizard run.
20
+ * Fails silently to avoid crashing the wizard.
20
21
  */
21
22
  function initLogFile() {
22
- const header = `\n${'='.repeat(60)}\nPostHog Wizard Run: ${new Date().toISOString()}\n${'='.repeat(60)}\n`;
23
- (0, fs_1.appendFileSync)(exports.LOG_FILE_PATH, header);
23
+ try {
24
+ const header = `\n${'='.repeat(60)}\nPostHog Wizard Run: ${new Date().toISOString()}\n${'='.repeat(60)}\n`;
25
+ (0, fs_1.appendFileSync)(exports.LOG_FILE_PATH, header);
26
+ }
27
+ catch {
28
+ // Silently ignore - logging is non-critical
29
+ }
24
30
  }
25
31
  /**
26
32
  * Log a message to the file at /tmp/posthog-wizard.log.
27
33
  * Always writes regardless of debug flag.
34
+ * Fails silently to avoid masking errors in catch blocks.
28
35
  */
29
36
  function logToFile(...args) {
30
- const timestamp = new Date().toISOString();
31
- const msg = args.map((a) => (0, logging_1.prepareMessage)(a)).join(' ');
32
- (0, fs_1.appendFileSync)(exports.LOG_FILE_PATH, `[${timestamp}] ${msg}\n`);
37
+ try {
38
+ const timestamp = new Date().toISOString();
39
+ const msg = args.map((a) => (0, logging_1.prepareMessage)(a)).join(' ');
40
+ (0, fs_1.appendFileSync)(exports.LOG_FILE_PATH, `[${timestamp}] ${msg}\n`);
41
+ }
42
+ catch {
43
+ // Silently ignore logging failures to avoid masking original errors
44
+ }
33
45
  }
34
46
  function debug(...args) {
35
47
  if (!debugEnabled) {
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/utils/debug.ts"],"names":[],"mappings":";;;;;;AAaA,kCAKC;AAMD,8BAIC;AAED,sBAQC;AAED,0CAEC;AA1CD,kDAA0B;AAC1B,2BAAoC;AACpC,uCAA2C;AAC3C,oDAA4B;AAE5B,IAAI,YAAY,GAAG,KAAK,CAAC;AAEZ,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD;;;GAGG;AACH,SAAgB,WAAW;IACzB,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,MAAM,CAC5B,EAAE,CACH,yBAAyB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;IAC1E,IAAA,mBAAc,EAAC,qBAAa,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS,CAAC,GAAG,IAAe;IAC1C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,IAAA,mBAAc,EAAC,qBAAa,EAAE,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,KAAK,CAAC,GAAG,IAAe;IACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzD,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,eAAe;IAC7B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC","sourcesContent":["import chalk from 'chalk';\nimport { appendFileSync } from 'fs';\nimport { prepareMessage } from './logging';\nimport clack from './clack';\n\nlet debugEnabled = false;\n\nexport const LOG_FILE_PATH = '/tmp/posthog-wizard.log';\n\n/**\n * Initialize the log file with a run header.\n * Call this at the start of each wizard run.\n */\nexport function initLogFile() {\n const header = `\\n${'='.repeat(\n 60,\n )}\\nPostHog Wizard Run: ${new Date().toISOString()}\\n${'='.repeat(60)}\\n`;\n appendFileSync(LOG_FILE_PATH, header);\n}\n\n/**\n * Log a message to the file at /tmp/posthog-wizard.log.\n * Always writes regardless of debug flag.\n */\nexport function logToFile(...args: unknown[]) {\n const timestamp = new Date().toISOString();\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n appendFileSync(LOG_FILE_PATH, `[${timestamp}] ${msg}\\n`);\n}\n\nexport function debug(...args: unknown[]) {\n if (!debugEnabled) {\n return;\n }\n\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n\n clack.log.info(chalk.dim(msg));\n}\n\nexport function enableDebugLogs() {\n debugEnabled = true;\n}\n"]}
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/utils/debug.ts"],"names":[],"mappings":";;;;;;AAcA,kCASC;AAOD,8BAQC;AAED,sBAQC;AAED,0CAEC;AApDD,kDAA0B;AAC1B,2BAAoC;AACpC,uCAA2C;AAC3C,oDAA4B;AAE5B,IAAI,YAAY,GAAG,KAAK,CAAC;AAEZ,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD;;;;GAIG;AACH,SAAgB,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,MAAM,CAC5B,EAAE,CACH,yBAAyB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;QAC1E,IAAA,mBAAc,EAAC,qBAAa,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,SAAS,CAAC,GAAG,IAAe;IAC1C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,IAAA,mBAAc,EAAC,qBAAa,EAAE,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,GAAG,IAAe;IACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzD,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,eAAe;IAC7B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC","sourcesContent":["import chalk from 'chalk';\nimport { appendFileSync } from 'fs';\nimport { prepareMessage } from './logging';\nimport clack from './clack';\n\nlet debugEnabled = false;\n\nexport const LOG_FILE_PATH = '/tmp/posthog-wizard.log';\n\n/**\n * Initialize the log file with a run header.\n * Call this at the start of each wizard run.\n * Fails silently to avoid crashing the wizard.\n */\nexport function initLogFile() {\n try {\n const header = `\\n${'='.repeat(\n 60,\n )}\\nPostHog Wizard Run: ${new Date().toISOString()}\\n${'='.repeat(60)}\\n`;\n appendFileSync(LOG_FILE_PATH, header);\n } catch {\n // Silently ignore - logging is non-critical\n }\n}\n\n/**\n * Log a message to the file at /tmp/posthog-wizard.log.\n * Always writes regardless of debug flag.\n * Fails silently to avoid masking errors in catch blocks.\n */\nexport function logToFile(...args: unknown[]) {\n try {\n const timestamp = new Date().toISOString();\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n appendFileSync(LOG_FILE_PATH, `[${timestamp}] ${msg}\\n`);\n } catch {\n // Silently ignore logging failures to avoid masking original errors\n }\n}\n\nexport function debug(...args: unknown[]) {\n if (!debugEnabled) {\n return;\n }\n\n const msg = args.map((a) => prepareMessage(a)).join(' ');\n\n clack.log.info(chalk.dim(msg));\n}\n\nexport function enableDebugLogs() {\n debugEnabled = true;\n}\n"]}
@@ -1,32 +1,2 @@
1
- import type { CloudRegion, FileChange, WizardOptions } from './types';
2
- import { Integration } from '../lib/constants';
3
- export declare const GLOBAL_IGNORE_PATTERN: string[];
4
- export declare function getAllFilesInProject(dir: string): Promise<string[]>;
1
+ import type { WizardOptions } from './types';
5
2
  export declare function getDotGitignore({ installDir, }: Pick<WizardOptions, 'installDir'>): string | undefined;
6
- export declare function updateFile(change: FileChange, { installDir }: Pick<WizardOptions, 'installDir'>): Promise<void>;
7
- export declare function getFilesToChange({ integration, relevantFiles, documentation, accessToken, cloudRegion, projectId, }: {
8
- integration: Integration;
9
- relevantFiles: string[];
10
- documentation: string;
11
- accessToken: string;
12
- cloudRegion: CloudRegion;
13
- projectId: number;
14
- }): Promise<string[]>;
15
- export declare function generateFileContent({ prompt, accessToken, cloudRegion, projectId, }: {
16
- prompt: string;
17
- accessToken: string;
18
- cloudRegion: CloudRegion;
19
- projectId: number;
20
- }): Promise<string>;
21
- export declare function generateFileChangesForIntegration({ integration, filesToChange, accessToken, documentation, installDir, cloudRegion, projectId, }: {
22
- integration: Integration;
23
- filesToChange: string[];
24
- accessToken: string;
25
- documentation: string;
26
- installDir: string;
27
- cloudRegion: CloudRegion;
28
- projectId: number;
29
- }): Promise<FileChange[]>;
30
- export declare function getRelevantFilesForIntegration({ installDir, integration, }: Pick<WizardOptions, 'installDir'> & {
31
- integration: Integration;
32
- }): Promise<string[]>;
@@ -3,52 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.GLOBAL_IGNORE_PATTERN = void 0;
7
- exports.getAllFilesInProject = getAllFilesInProject;
8
6
  exports.getDotGitignore = getDotGitignore;
9
- exports.updateFile = updateFile;
10
- exports.getFilesToChange = getFilesToChange;
11
- exports.generateFileContent = generateFileContent;
12
- exports.generateFileChangesForIntegration = generateFileChangesForIntegration;
13
- exports.getRelevantFilesForIntegration = getRelevantFilesForIntegration;
14
7
  const path_1 = __importDefault(require("path"));
15
8
  const fs_1 = __importDefault(require("fs"));
16
- const clack_1 = __importDefault(require("./clack"));
17
- const zod_1 = __importDefault(require("zod"));
18
- const query_1 = require("./query");
19
- const fast_glob_1 = __importDefault(require("fast-glob"));
20
- const analytics_1 = require("./analytics");
21
- const clack_utils_1 = require("./clack-utils");
22
- const config_1 = require("../lib/config");
23
- const prompts_1 = require("../lib/prompts");
24
- exports.GLOBAL_IGNORE_PATTERN = [
25
- 'node_modules',
26
- 'dist',
27
- 'build',
28
- 'public',
29
- 'static',
30
- '.git',
31
- '.next',
32
- ];
33
- async function getAllFilesInProject(dir) {
34
- let results = [];
35
- const entries = await fs_1.default.promises.readdir(dir, { withFileTypes: true });
36
- for (const entry of entries) {
37
- const fullPath = path_1.default.join(dir, entry.name);
38
- if (exports.GLOBAL_IGNORE_PATTERN.some((pattern) => fullPath.includes(pattern))) {
39
- continue;
40
- }
41
- if (entry.isDirectory()) {
42
- // Recursively get files from subdirectories
43
- const subDirFiles = await getAllFilesInProject(fullPath);
44
- results = results.concat(subDirFiles);
45
- }
46
- else {
47
- results.push(fullPath);
48
- }
49
- }
50
- return results;
51
- }
52
9
  function getDotGitignore({ installDir, }) {
53
10
  const gitignorePath = path_1.default.join(installDir, '.gitignore');
54
11
  const gitignoreExists = fs_1.default.existsSync(gitignorePath);
@@ -57,124 +14,4 @@ function getDotGitignore({ installDir, }) {
57
14
  }
58
15
  return undefined;
59
16
  }
60
- async function updateFile(change, { installDir }) {
61
- const dir = path_1.default.dirname(path_1.default.join(installDir, change.filePath));
62
- await fs_1.default.promises.mkdir(dir, { recursive: true });
63
- await fs_1.default.promises.writeFile(path_1.default.join(installDir, change.filePath), change.newContent);
64
- }
65
- async function getFilesToChange({ integration, relevantFiles, documentation, accessToken, cloudRegion, projectId, }) {
66
- const filterFilesSpinner = clack_1.default.spinner();
67
- filterFilesSpinner.start('Selecting files to change...');
68
- const filterFilesResponseSchmea = zod_1.default.object({
69
- files: zod_1.default.array(zod_1.default.string()),
70
- });
71
- const prompt = await prompts_1.baseFilterFilesPromptTemplate.format({
72
- documentation,
73
- file_list: relevantFiles.join('\n'),
74
- integration_name: integration,
75
- integration_rules: config_1.INTEGRATION_CONFIG[integration].filterFilesRules,
76
- });
77
- const filterFilesResponse = await (0, query_1.query)({
78
- message: prompt,
79
- schema: filterFilesResponseSchmea,
80
- accessToken,
81
- region: cloudRegion,
82
- projectId,
83
- });
84
- const filesToChange = filterFilesResponse.files;
85
- filterFilesSpinner.stop(`Found ${filesToChange.length} files to change`);
86
- analytics_1.analytics.capture('wizard interaction', {
87
- action: 'detected files to change',
88
- integration,
89
- files: filesToChange,
90
- });
91
- return filesToChange;
92
- }
93
- async function generateFileContent({ prompt, accessToken, cloudRegion, projectId, }) {
94
- const response = await (0, query_1.query)({
95
- message: prompt,
96
- schema: zod_1.default.object({
97
- newContent: zod_1.default.string(),
98
- }),
99
- accessToken: accessToken,
100
- region: cloudRegion,
101
- projectId,
102
- });
103
- return response.newContent;
104
- }
105
- async function generateFileChangesForIntegration({ integration, filesToChange, accessToken, documentation, installDir, cloudRegion, projectId, }) {
106
- const changes = [];
107
- for (const filePath of filesToChange) {
108
- const fileChangeSpinner = clack_1.default.spinner();
109
- analytics_1.analytics.capture('wizard interaction', {
110
- action: 'processing file',
111
- integration,
112
- file: filePath,
113
- });
114
- try {
115
- let oldContent = undefined;
116
- try {
117
- oldContent = await fs_1.default.promises.readFile(path_1.default.join(installDir, filePath), 'utf8');
118
- }
119
- catch (readError) {
120
- if (readError.code !== 'ENOENT') {
121
- await (0, clack_utils_1.abort)(`Error reading file ${filePath}`);
122
- continue;
123
- }
124
- }
125
- fileChangeSpinner.start(`${oldContent ? 'Updating' : 'Creating'} file ${filePath}`);
126
- const unchangedFiles = filesToChange.filter((filePath) => !changes.some((change) => change.filePath === filePath));
127
- const prompt = await prompts_1.baseGenerateFileChangesPromptTemplate.format({
128
- file_content: oldContent,
129
- file_path: filePath,
130
- documentation,
131
- integration_name: config_1.INTEGRATION_CONFIG[integration].name,
132
- integration_rules: config_1.INTEGRATION_CONFIG[integration].generateFilesRules,
133
- changed_files: changes
134
- .map((change) => `${change.filePath}\n${change.newContent}`)
135
- .join('\n'),
136
- unchanged_files: unchangedFiles,
137
- });
138
- const newContent = await generateFileContent({
139
- prompt,
140
- accessToken,
141
- cloudRegion,
142
- projectId,
143
- });
144
- if (newContent !== oldContent) {
145
- await updateFile({ filePath, oldContent, newContent }, { installDir });
146
- changes.push({ filePath, oldContent, newContent });
147
- }
148
- fileChangeSpinner.stop(`${oldContent ? 'Updated' : 'Created'} file ${filePath}`);
149
- analytics_1.analytics.capture('wizard interaction', {
150
- action: 'processed file',
151
- integration,
152
- file: filePath,
153
- });
154
- }
155
- catch (error) {
156
- await (0, clack_utils_1.abort)(`Error processing file ${filePath}`);
157
- }
158
- }
159
- analytics_1.analytics.capture('wizard interaction', {
160
- action: 'completed file changes',
161
- integration,
162
- files: filesToChange,
163
- });
164
- return changes;
165
- }
166
- async function getRelevantFilesForIntegration({ installDir, integration, }) {
167
- const filterPatterns = config_1.INTEGRATION_CONFIG[integration].filterPatterns;
168
- const ignorePatterns = config_1.INTEGRATION_CONFIG[integration].ignorePatterns;
169
- const filteredFiles = await (0, fast_glob_1.default)(filterPatterns, {
170
- cwd: installDir,
171
- ignore: ignorePatterns,
172
- });
173
- analytics_1.analytics.capture('wizard interaction', {
174
- action: 'detected relevant files',
175
- integration,
176
- number_of_files: filteredFiles.length,
177
- });
178
- return filteredFiles;
179
- }
180
17
  //# sourceMappingURL=file-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../src/utils/file-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type { CloudRegion, FileChange, WizardOptions } from './types';\nimport clack from './clack';\nimport z from 'zod';\nimport { query } from './query';\nimport fg from 'fast-glob';\nimport { analytics } from './analytics';\nimport { Integration } from '../lib/constants';\nimport { abort } from './clack-utils';\nimport { INTEGRATION_CONFIG } from '../lib/config';\nimport {\n baseFilterFilesPromptTemplate,\n baseGenerateFileChangesPromptTemplate,\n} from '../lib/prompts';\n\nexport const GLOBAL_IGNORE_PATTERN = [\n 'node_modules',\n 'dist',\n 'build',\n 'public',\n 'static',\n '.git',\n '.next',\n];\nexport async function getAllFilesInProject(dir: string): Promise<string[]> {\n let results: string[] = [];\n\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (GLOBAL_IGNORE_PATTERN.some((pattern) => fullPath.includes(pattern))) {\n continue;\n }\n\n if (entry.isDirectory()) {\n // Recursively get files from subdirectories\n const subDirFiles = await getAllFilesInProject(fullPath);\n results = results.concat(subDirFiles);\n } else {\n results.push(fullPath);\n }\n }\n\n return results;\n}\n\nexport function getDotGitignore({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n const gitignorePath = path.join(installDir, '.gitignore');\n const gitignoreExists = fs.existsSync(gitignorePath);\n\n if (gitignoreExists) {\n return gitignorePath;\n }\n\n return undefined;\n}\n\nexport async function updateFile(\n change: FileChange,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n) {\n const dir = path.dirname(path.join(installDir, change.filePath));\n await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(\n path.join(installDir, change.filePath),\n change.newContent,\n );\n}\n\nexport async function getFilesToChange({\n integration,\n relevantFiles,\n documentation,\n accessToken,\n cloudRegion,\n projectId,\n}: {\n integration: Integration;\n relevantFiles: string[];\n documentation: string;\n accessToken: string;\n cloudRegion: CloudRegion;\n projectId: number;\n}) {\n const filterFilesSpinner = clack.spinner();\n\n filterFilesSpinner.start('Selecting files to change...');\n\n const filterFilesResponseSchmea = z.object({\n files: z.array(z.string()),\n });\n\n const prompt = await baseFilterFilesPromptTemplate.format({\n documentation,\n file_list: relevantFiles.join('\\n'),\n integration_name: integration,\n integration_rules: INTEGRATION_CONFIG[integration].filterFilesRules,\n });\n\n const filterFilesResponse = await query({\n message: prompt,\n schema: filterFilesResponseSchmea,\n accessToken,\n region: cloudRegion,\n projectId,\n });\n\n const filesToChange = filterFilesResponse.files;\n\n filterFilesSpinner.stop(`Found ${filesToChange.length} files to change`);\n\n analytics.capture('wizard interaction', {\n action: 'detected files to change',\n integration,\n files: filesToChange,\n });\n\n return filesToChange;\n}\n\nexport async function generateFileContent({\n prompt,\n accessToken,\n cloudRegion,\n projectId,\n}: {\n prompt: string;\n accessToken: string;\n cloudRegion: CloudRegion;\n projectId: number;\n}) {\n const response = await query({\n message: prompt,\n schema: z.object({\n newContent: z.string(),\n }),\n accessToken: accessToken,\n region: cloudRegion,\n projectId,\n });\n\n return response.newContent;\n}\n\nexport async function generateFileChangesForIntegration({\n integration,\n filesToChange,\n accessToken,\n documentation,\n installDir,\n cloudRegion,\n projectId,\n}: {\n integration: Integration;\n filesToChange: string[];\n accessToken: string;\n documentation: string;\n installDir: string;\n cloudRegion: CloudRegion;\n projectId: number;\n}) {\n const changes: FileChange[] = [];\n\n for (const filePath of filesToChange) {\n const fileChangeSpinner = clack.spinner();\n\n analytics.capture('wizard interaction', {\n action: 'processing file',\n integration,\n file: filePath,\n });\n\n try {\n let oldContent = undefined;\n try {\n oldContent = await fs.promises.readFile(\n path.join(installDir, filePath),\n 'utf8',\n );\n } catch (readError) {\n if (readError.code !== 'ENOENT') {\n await abort(`Error reading file ${filePath}`);\n continue;\n }\n }\n\n fileChangeSpinner.start(\n `${oldContent ? 'Updating' : 'Creating'} file ${filePath}`,\n );\n\n const unchangedFiles = filesToChange.filter(\n (filePath) => !changes.some((change) => change.filePath === filePath),\n );\n\n const prompt = await baseGenerateFileChangesPromptTemplate.format({\n file_content: oldContent,\n file_path: filePath,\n documentation,\n integration_name: INTEGRATION_CONFIG[integration].name,\n integration_rules: INTEGRATION_CONFIG[integration].generateFilesRules,\n changed_files: changes\n .map((change) => `${change.filePath}\\n${change.newContent}`)\n .join('\\n'),\n unchanged_files: unchangedFiles,\n });\n\n const newContent = await generateFileContent({\n prompt,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n if (newContent !== oldContent) {\n await updateFile({ filePath, oldContent, newContent }, { installDir });\n changes.push({ filePath, oldContent, newContent });\n }\n\n fileChangeSpinner.stop(\n `${oldContent ? 'Updated' : 'Created'} file ${filePath}`,\n );\n\n analytics.capture('wizard interaction', {\n action: 'processed file',\n integration,\n file: filePath,\n });\n } catch (error) {\n await abort(`Error processing file ${filePath}`);\n }\n }\n\n analytics.capture('wizard interaction', {\n action: 'completed file changes',\n integration,\n files: filesToChange,\n });\n\n return changes;\n}\n\nexport async function getRelevantFilesForIntegration({\n installDir,\n integration,\n}: Pick<WizardOptions, 'installDir'> & {\n integration: Integration;\n}) {\n const filterPatterns = INTEGRATION_CONFIG[integration].filterPatterns;\n const ignorePatterns = INTEGRATION_CONFIG[integration].ignorePatterns;\n\n const filteredFiles = await fg(filterPatterns, {\n cwd: installDir,\n ignore: ignorePatterns,\n });\n\n analytics.capture('wizard interaction', {\n action: 'detected relevant files',\n integration,\n number_of_files: filteredFiles.length,\n });\n\n return filteredFiles;\n}\n"]}
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../src/utils/file-utils.ts"],"names":[],"mappings":";;;;;AAIA,0CAWC;AAfD,gDAAwB;AACxB,4CAAoB;AAGpB,SAAgB,eAAe,CAAC,EAC9B,UAAU,GACwB;IAClC,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAErD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type { WizardOptions } from './types';\n\nexport function getDotGitignore({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n const gitignorePath = path.join(installDir, '.gitignore');\n const gitignoreExists = fs.existsSync(gitignorePath);\n\n if (gitignoreExists) {\n return gitignorePath;\n }\n\n return undefined;\n}\n"]}
@@ -3,3 +3,19 @@ export declare function fulfillsVersionRange({ version, acceptableVersions, canB
3
3
  acceptableVersions: string;
4
4
  canBeLatest: boolean;
5
5
  }): boolean;
6
+ /**
7
+ * Creates a version bucket function for analytics.
8
+ * Converts versions like "1.2.3" to "1.x" for grouping in analytics.
9
+ *
10
+ * @param minMajorVersion - Optional minimum major version threshold.
11
+ * Versions below this will be bucketed as "<{min}.0.0"
12
+ *
13
+ * @example
14
+ * const getVersionBucket = createVersionBucket(); // no minimum
15
+ * getVersionBucket("1.2.3") // "1.x"
16
+ *
17
+ * const getVersionBucket = createVersionBucket(11);
18
+ * getVersionBucket("15.3.0") // "15.x"
19
+ * getVersionBucket("10.0.0") // "<11.0.0"
20
+ */
21
+ export declare function createVersionBucket(minMajorVersion?: number): (version: string | undefined) => string;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fulfillsVersionRange = fulfillsVersionRange;
4
+ exports.createVersionBucket = createVersionBucket;
4
5
  const semver_1 = require("semver");
5
6
  function fulfillsVersionRange({ version, acceptableVersions, canBeLatest, }) {
6
7
  if (version === 'latest') {
@@ -22,4 +23,40 @@ function fulfillsVersionRange({ version, acceptableVersions, canBeLatest, }) {
22
23
  ? (0, semver_1.subset)(cleanedUserVersion, acceptableVersions)
23
24
  : (0, semver_1.satisfies)(cleanedUserVersion, acceptableVersions)));
24
25
  }
26
+ /**
27
+ * Creates a version bucket function for analytics.
28
+ * Converts versions like "1.2.3" to "1.x" for grouping in analytics.
29
+ *
30
+ * @param minMajorVersion - Optional minimum major version threshold.
31
+ * Versions below this will be bucketed as "<{min}.0.0"
32
+ *
33
+ * @example
34
+ * const getVersionBucket = createVersionBucket(); // no minimum
35
+ * getVersionBucket("1.2.3") // "1.x"
36
+ *
37
+ * const getVersionBucket = createVersionBucket(11);
38
+ * getVersionBucket("15.3.0") // "15.x"
39
+ * getVersionBucket("10.0.0") // "<11.0.0"
40
+ */
41
+ function createVersionBucket(minMajorVersion) {
42
+ return (version) => {
43
+ if (!version) {
44
+ return 'none';
45
+ }
46
+ try {
47
+ const minVer = (0, semver_1.minVersion)(version);
48
+ if (!minVer) {
49
+ return 'invalid';
50
+ }
51
+ const majorVersion = (0, semver_1.major)(minVer);
52
+ if (minMajorVersion !== undefined && majorVersion < minMajorVersion) {
53
+ return `<${minMajorVersion}.0.0`;
54
+ }
55
+ return `${majorVersion}.x`;
56
+ }
57
+ catch {
58
+ return 'unknown';
59
+ }
60
+ };
61
+ }
25
62
  //# sourceMappingURL=semver.js.map