@posthog/wizard 0.7.1 → 0.8.1

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 (38) hide show
  1. package/dist/src/lib/config.d.ts +7 -7
  2. package/dist/src/lib/config.js +7 -7
  3. package/dist/src/lib/config.js.map +1 -1
  4. package/dist/src/lib/messages.d.ts +2 -1
  5. package/dist/src/lib/messages.js +22 -6
  6. package/dist/src/lib/messages.js.map +1 -1
  7. package/dist/src/nextjs/nextjs-wizard.js +12 -3
  8. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  9. package/dist/src/nextjs/utils.js +2 -1
  10. package/dist/src/nextjs/utils.js.map +1 -1
  11. package/dist/src/react/react-wizard.js +9 -0
  12. package/dist/src/react/react-wizard.js.map +1 -1
  13. package/dist/src/react-native/react-native-wizard.js +1 -0
  14. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  15. package/dist/src/run.js +22 -15
  16. package/dist/src/run.js.map +1 -1
  17. package/dist/src/steps/add-editor-rules.js +3 -1
  18. package/dist/src/steps/add-editor-rules.js.map +1 -1
  19. package/dist/src/steps/create-pr.js +1 -1
  20. package/dist/src/steps/create-pr.js.map +1 -1
  21. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +8 -0
  22. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +12 -0
  23. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -0
  24. package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
  25. package/dist/src/steps/upload-environment-variables/index.js +66 -0
  26. package/dist/src/steps/upload-environment-variables/index.js.map +1 -0
  27. package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.d.ts +1 -0
  28. package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.js +117 -0
  29. package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.js.map +1 -0
  30. package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +14 -0
  31. package/dist/src/steps/upload-environment-variables/providers/vercel.js +146 -0
  32. package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -0
  33. package/dist/src/svelte/svelte-wizard.js +1 -0
  34. package/dist/src/svelte/svelte-wizard.js.map +1 -1
  35. package/dist/src/utils/clack-utils.d.ts +2 -1
  36. package/dist/src/utils/clack-utils.js +6 -2
  37. package/dist/src/utils/clack-utils.js.map +1 -1
  38. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"add-editor-rules.js","sourceRoot":"","sources":["../../../src/steps/add-editor-rules.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,kDAA0B;AAC1B,gDAAwB;AAExB,kDAA+C;AAC/C,2DAAmC;AACnC,4CAAyC;AACzC,sDAAwD;AASjD,MAAM,kBAAkB,GAAG,KAAK,EAAE,EACvC,UAAU,EACV,SAAS,EACT,WAAW,EACX,OAAO,EAAE,qBAAqB,GACJ,EAAoB,EAAE;IAChD,0CAA0C;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,cAAc,GAAY,qBAAqB;YACnD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,IAAA,8BAAgB,EACpB,eAAK,CAAC,MAAM,CAAC;gBACX,OAAO,EACL,4DAA4D;gBAC9D,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE,cAAc;wBACrB,KAAK,EAAE,IAAI;qBACZ;oBACD;wBACE,KAAK,EAAE,YAAY;wBACnB,KAAK,EAAE,KAAK;qBACb;iBACF;aACF,CAAC,CACH,CAAC;QAEN,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAA,qBAAS,EAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtD,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAC/C,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EACvD,MAAM,CACP,CAAC;YACF,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAClC,SAAS,EACT,IAAI,EACJ,OAAO,EACP,OAAO,EACP,cAAc,CACf,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAC/C,kBAAkB,EAClB,MAAM,CACP,CAAC;YAEF,+DAA+D;YAC/D,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAC1C,aAAa,EACb,cAAc,CACf,CAAC;YACF,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;YAEjE,2BAA2B;YAC3B,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YAE/D,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;gBACtC,MAAM,EAAE,oBAAoB;gBAC5B,WAAW;aACZ,CAAC,CAAC;YAEH,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,yBAAyB,eAAK,CAAC,IAAI,CAAC,IAAI,CACtC,uCAAuC,CACxC,EAAE,CACJ,CAAC;YAEF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AA/EW,QAAA,kBAAkB,sBA+E7B","sourcesContent":["import * as fs from 'fs';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { Integration } from '../lib/constants';\nimport { analytics } from '../utils/analytics';\nimport clack from '../utils/clack';\nimport { traceStep } from '../telemetry';\nimport { abortIfCancelled } from '../utils/clack-utils';\n\ntype AddEditorRulesStepOptions = {\n installDir: string;\n rulesName: string;\n integration: Integration;\n default?: boolean;\n};\n\nexport const addEditorRulesStep = async ({\n installDir,\n rulesName,\n integration,\n default: defaultAddEditorRules,\n}: AddEditorRulesStepOptions): Promise<boolean> => {\n // Add rules file if in Cursor environment\n if (process.env.CURSOR_TRACE_ID) {\n const addEditorRules: boolean = defaultAddEditorRules\n ? true\n : await abortIfCancelled(\n clack.select({\n message:\n 'Would you like to have PostHog added to your Cursor rules?',\n options: [\n {\n label: 'Yes, please!',\n value: true,\n },\n {\n label: 'No, thanks',\n value: false,\n },\n ],\n }),\n );\n\n if (!addEditorRules) {\n return false;\n }\n\n return traceStep('add-editor-rules', async () => {\n const docsDir = path.join(installDir, '.cursor', 'rules');\n\n await fs.promises.mkdir(docsDir, { recursive: true });\n\n const frameworkRules = await fs.promises.readFile(\n path.join(__dirname, '..', 'utils', 'rules', rulesName),\n 'utf8',\n );\n const universalRulesPath = path.join(\n __dirname,\n '..',\n 'utils',\n 'rules',\n 'universal.md',\n );\n\n const universalRules = await fs.promises.readFile(\n universalRulesPath,\n 'utf8',\n );\n\n // Replace {universal} placeholder with universal rules content\n const combinedRules = frameworkRules.replace(\n '{universal}',\n universalRules,\n );\n const targetPath = path.join(docsDir, 'posthog-integration.mdc');\n\n // Write the combined rules\n await fs.promises.writeFile(targetPath, combinedRules, 'utf8');\n\n analytics.capture('wizard interaction', {\n action: 'added editor rules',\n integration,\n });\n\n clack.log.info(\n `Added Cursor rules to ${chalk.bold.cyan(\n `.cursor/rules/posthog-integration.mdc`,\n )}`,\n );\n\n return true;\n });\n }\n\n return false;\n};\n"]}
1
+ {"version":3,"file":"add-editor-rules.js","sourceRoot":"","sources":["../../../src/steps/add-editor-rules.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,kDAA0B;AAC1B,gDAAwB;AAExB,kDAA+C;AAC/C,2DAAmC;AACnC,4CAAyC;AACzC,sDAAwD;AASjD,MAAM,kBAAkB,GAAG,KAAK,EAAE,EACvC,UAAU,EACV,SAAS,EACT,WAAW,EACX,OAAO,EAAE,qBAAqB,GACJ,EAAoB,EAAE;IAChD,0CAA0C;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,cAAc,GAAY,qBAAqB;YACnD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,IAAA,8BAAgB,EACpB,eAAK,CAAC,MAAM,CAAC;gBACX,OAAO,EACL,4DAA4D;gBAC9D,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE,cAAc;wBACrB,KAAK,EAAE,IAAI;wBACX,IAAI,EAAE,kCAAkC;qBACzC;oBACD;wBACE,KAAK,EAAE,YAAY;wBACnB,KAAK,EAAE,KAAK;wBACZ,IAAI,EAAE,0CAA0C;qBACjD;iBACF;aACF,CAAC,EACF,WAAW,CACZ,CAAC;QAEN,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAA,qBAAS,EAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtD,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAC/C,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EACvD,MAAM,CACP,CAAC;YACF,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAClC,SAAS,EACT,IAAI,EACJ,OAAO,EACP,OAAO,EACP,cAAc,CACf,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAC/C,kBAAkB,EAClB,MAAM,CACP,CAAC;YAEF,+DAA+D;YAC/D,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAC1C,aAAa,EACb,cAAc,CACf,CAAC;YACF,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;YAEjE,2BAA2B;YAC3B,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YAE/D,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;gBACtC,MAAM,EAAE,oBAAoB;gBAC5B,WAAW;aACZ,CAAC,CAAC;YAEH,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,yBAAyB,eAAK,CAAC,IAAI,CAAC,IAAI,CACtC,uCAAuC,CACxC,EAAE,CACJ,CAAC;YAEF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAlFW,QAAA,kBAAkB,sBAkF7B","sourcesContent":["import * as fs from 'fs';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { Integration } from '../lib/constants';\nimport { analytics } from '../utils/analytics';\nimport clack from '../utils/clack';\nimport { traceStep } from '../telemetry';\nimport { abortIfCancelled } from '../utils/clack-utils';\n\ntype AddEditorRulesStepOptions = {\n installDir: string;\n rulesName: string;\n integration: Integration;\n default?: boolean;\n};\n\nexport const addEditorRulesStep = async ({\n installDir,\n rulesName,\n integration,\n default: defaultAddEditorRules,\n}: AddEditorRulesStepOptions): Promise<boolean> => {\n // Add rules file if in Cursor environment\n if (process.env.CURSOR_TRACE_ID) {\n const addEditorRules: boolean = defaultAddEditorRules\n ? true\n : await abortIfCancelled(\n clack.select({\n message:\n 'Would you like to have PostHog added to your Cursor rules?',\n options: [\n {\n label: 'Yes, please!',\n value: true,\n hint: 'Add PostHog to your Cursor rules',\n },\n {\n label: 'No, thanks',\n value: false,\n hint: 'Skip adding PostHog to your Cursor rules',\n },\n ],\n }),\n integration,\n );\n\n if (!addEditorRules) {\n return false;\n }\n\n return traceStep('add-editor-rules', async () => {\n const docsDir = path.join(installDir, '.cursor', 'rules');\n\n await fs.promises.mkdir(docsDir, { recursive: true });\n\n const frameworkRules = await fs.promises.readFile(\n path.join(__dirname, '..', 'utils', 'rules', rulesName),\n 'utf8',\n );\n const universalRulesPath = path.join(\n __dirname,\n '..',\n 'utils',\n 'rules',\n 'universal.md',\n );\n\n const universalRules = await fs.promises.readFile(\n universalRulesPath,\n 'utf8',\n );\n\n // Replace {universal} placeholder with universal rules content\n const combinedRules = frameworkRules.replace(\n '{universal}',\n universalRules,\n );\n const targetPath = path.join(docsDir, 'posthog-integration.mdc');\n\n // Write the combined rules\n await fs.promises.writeFile(targetPath, combinedRules, 'utf8');\n\n analytics.capture('wizard interaction', {\n action: 'added editor rules',\n integration,\n });\n\n clack.log.info(\n `Added Cursor rules to ${chalk.bold.cyan(\n `.cursor/rules/posthog-integration.mdc`,\n )}`,\n );\n\n return true;\n });\n }\n\n return false;\n};\n"]}
@@ -197,7 +197,7 @@ async function createPRStep({ installDir, integration, addedEditorRules, }) {
197
197
  hint: 'You can create a PR manually later',
198
198
  },
199
199
  ],
200
- }));
200
+ }), integration);
201
201
  if (!createPR) {
202
202
  clack_1.default.log.info('Skipping PR creation');
203
203
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"create-pr.js","sourceRoot":"","sources":["../../../src/steps/create-pr.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { DEBUG, type Integration } from '../lib/constants';\nimport { traceStep } from '../telemetry';\nimport { analytics } from '../utils/analytics';\nimport clack from '../utils/clack';\nimport { abortIfCancelled, isInGitRepo } from '../utils/clack-utils';\nimport * as childProcess from 'node:child_process';\nimport { getPRDescription } from '../lib/messages';\n\nexport const PR_CONFIG = {\n defaultBranchName: 'posthog-integration',\n defaultTitle: 'feat: add PostHog integration',\n} as const;\n\ninterface GitCommandResult<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nexport async function execGitCommand(\n command: string,\n cwd: string,\n): Promise<GitCommandResult<string>> {\n return new Promise((resolve) => {\n childProcess.exec(command, { cwd }, (err, stdout, stderr) => {\n if (err) {\n resolve({ success: false, error: stderr || err.message });\n } else {\n resolve({ success: true, data: stdout.trim() });\n }\n });\n });\n}\n\nexport async function getCurrentBranch(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('git rev-parse --abbrev-ref HEAD', installDir);\n}\n\nexport async function checkGitHubAuth(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('gh auth status', installDir);\n}\n\nexport async function checkBranchExists(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<boolean>> {\n const result = await execGitCommand(\n `git rev-parse --verify ${branch}`,\n installDir,\n );\n // If the command fails, the branch does not exist\n if (!result.success) {\n return { success: true, data: true };\n }\n // If the command succeeds, the branch exists\n return { success: false, data: false };\n}\n\nexport async function createBranch(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git checkout -b ${branch}`, installDir);\n}\n\nexport async function stageChanges(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('git add .', installDir);\n}\n\nexport async function checkForEnvFiles(\n installDir: string,\n): Promise<GitCommandResult<boolean>> {\n const result = await execGitCommand(\n 'git diff --cached --name-only',\n installDir,\n );\n if (!result.success) {\n return { success: false, error: result.error };\n }\n const files = result.data\n ? result.data\n .split('\\n')\n .map((f) => f.trim())\n .filter(Boolean)\n : [];\n const hasEnv = files.some((f) => f.startsWith('.env'));\n return { success: true, data: hasEnv };\n}\n\nexport async function commitChanges(\n message: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git commit -m \"${message}\"`, installDir);\n}\n\nexport async function pushBranch(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git push -u origin ${branch}`, installDir);\n}\n\nexport async function createGitHubPR(\n baseBranch: string,\n newBranch: string,\n title: string,\n body: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(\n `gh pr create --base ${baseBranch} --head ${newBranch} --title \"${title}\" --body \"${body}\"`,\n installDir,\n );\n}\n\ninterface CreatePRStepOptions {\n installDir: string;\n integration: Integration;\n addedEditorRules: boolean;\n}\n\nexport async function createPRStep({\n installDir,\n integration,\n addedEditorRules,\n}: CreatePRStepOptions): Promise<string | undefined> {\n return traceStep('create-pr', async () => {\n if (!isInGitRepo()) {\n clack.log.warn('Not in a git repository. Cannot create a pull request.');\n return;\n }\n\n // Get current branch\n const currentBranchResult = await getCurrentBranch(installDir);\n if (!currentBranchResult.success || !currentBranchResult.data) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'failed to get current branch',\n error: currentBranchResult.error,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(\n currentBranchResult.error ?? 'Failed to get current branch',\n );\n }\n\n return;\n }\n const baseBranch = currentBranchResult.data;\n\n if (!['main', 'master'].includes(baseBranch)) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'not on main or master',\n base_branch: baseBranch,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(`Not on main or master. Skipping PR creation.`);\n }\n return;\n }\n\n // Check GitHub auth\n const authResult = await checkGitHubAuth(installDir);\n if (!authResult.success) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'not logged into github',\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(authResult.error ?? 'Failed to check github auth');\n }\n\n return;\n }\n\n const newBranch = PR_CONFIG.defaultBranchName;\n\n // Check if branch exists\n const branchExistsResult = await checkBranchExists(newBranch, installDir);\n if (!branchExistsResult.success) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'branch already exists',\n error: branchExistsResult.error,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(\n branchExistsResult.error ?? 'Failed to check branch exists',\n );\n }\n\n return;\n }\n\n const prTitle = PR_CONFIG.defaultTitle;\n const prDescription = getPRDescription({\n integration,\n addedEditorRules,\n });\n\n const createPR = await abortIfCancelled(\n clack.select({\n message: 'Would you like to create a PR automatically?',\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'We will create a PR for you',\n },\n {\n value: false,\n label: 'No',\n hint: 'You can create a PR manually later',\n },\n ],\n }),\n );\n\n if (!createPR) {\n clack.log.info('Skipping PR creation');\n return;\n }\n\n // Create branch\n const createBranchResult = await createBranch(newBranch, installDir);\n if (!createBranchResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to create branch',\n error: createBranchResult.error,\n integration,\n });\n clack.log.warn('Failed to create branch. Aborting PR creation 🚶‍➡️');\n return;\n }\n\n // Stage changes\n const stageResult = await stageChanges(installDir);\n if (!stageResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to stage changes',\n error: stageResult.error,\n integration,\n });\n clack.log.warn('Failed to stage changes. Aborting PR creation 🚶‍➡️');\n return;\n }\n\n // Check for env files\n const envCheckResult = await checkForEnvFiles(installDir);\n if (!envCheckResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to check for env files in staged changes',\n error: envCheckResult.error,\n integration,\n });\n clack.log.warn(\n 'Failed to check for .env files. Aborting PR creation 🚶‍➡️',\n );\n return;\n }\n\n if (envCheckResult.data) {\n clack.log.warn(\n 'Found .env files in staged changes. Aborting PR creation to prevent exposing sensitive data 🔐',\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'env files detected in staged changes',\n integration,\n });\n return;\n }\n\n // Commit changes\n const commitSpinner = clack.spinner();\n commitSpinner.start('Committing changes...');\n const commitResult = await commitChanges(prTitle, installDir);\n if (!commitResult.success) {\n commitSpinner.stop(\n 'Failed to commit changes. Aborting PR creation 🚶‍➡️',\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to commit changes',\n error: commitResult.error,\n integration,\n });\n return;\n }\n commitSpinner.stop('Changes committed successfully.');\n\n // Push branch\n const pushSpinner = clack.spinner();\n pushSpinner.start('Pushing branch to remote...');\n const pushResult = await pushBranch(newBranch, installDir);\n if (!pushResult.success) {\n pushSpinner.stop('Failed to push branch. Aborting PR creation 🚶‍➡️');\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to push branch',\n error: pushResult.error,\n integration,\n });\n return;\n }\n pushSpinner.stop('Branch pushed successfully.');\n\n // Create PR\n const prSpinner = clack.spinner();\n prSpinner.start(\n `Creating a PR on branch '${newBranch}' with base '${baseBranch}'...`,\n );\n const prResult = await createGitHubPR(\n baseBranch,\n newBranch,\n prTitle,\n prDescription,\n installDir,\n );\n if (!prResult.success || !prResult.data) {\n prSpinner.stop(\n `Failed to create PR on branch '${newBranch}'. Aborting PR creation 🚶‍➡️`,\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to create pr',\n error: prResult.error,\n integration,\n });\n return;\n }\n\n const prUrl = prResult.data;\n prSpinner.stop(\n `Successfully created PR! 🎉 You can review it here: ${chalk.cyan(\n prUrl,\n )}`,\n );\n\n analytics.capture('wizard interaction', {\n action: 'pr created',\n branch: newBranch,\n base_branch: baseBranch,\n integration,\n });\n\n return prUrl;\n });\n}\n"]}
1
+ {"version":3,"file":"create-pr.js","sourceRoot":"","sources":["../../../src/steps/create-pr.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { DEBUG, type Integration } from '../lib/constants';\nimport { traceStep } from '../telemetry';\nimport { analytics } from '../utils/analytics';\nimport clack from '../utils/clack';\nimport { abortIfCancelled, isInGitRepo } from '../utils/clack-utils';\nimport * as childProcess from 'node:child_process';\nimport { getPRDescription } from '../lib/messages';\n\nexport const PR_CONFIG = {\n defaultBranchName: 'posthog-integration',\n defaultTitle: 'feat: add PostHog integration',\n} as const;\n\ninterface GitCommandResult<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nexport async function execGitCommand(\n command: string,\n cwd: string,\n): Promise<GitCommandResult<string>> {\n return new Promise((resolve) => {\n childProcess.exec(command, { cwd }, (err, stdout, stderr) => {\n if (err) {\n resolve({ success: false, error: stderr || err.message });\n } else {\n resolve({ success: true, data: stdout.trim() });\n }\n });\n });\n}\n\nexport async function getCurrentBranch(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('git rev-parse --abbrev-ref HEAD', installDir);\n}\n\nexport async function checkGitHubAuth(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('gh auth status', installDir);\n}\n\nexport async function checkBranchExists(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<boolean>> {\n const result = await execGitCommand(\n `git rev-parse --verify ${branch}`,\n installDir,\n );\n // If the command fails, the branch does not exist\n if (!result.success) {\n return { success: true, data: true };\n }\n // If the command succeeds, the branch exists\n return { success: false, data: false };\n}\n\nexport async function createBranch(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git checkout -b ${branch}`, installDir);\n}\n\nexport async function stageChanges(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('git add .', installDir);\n}\n\nexport async function checkForEnvFiles(\n installDir: string,\n): Promise<GitCommandResult<boolean>> {\n const result = await execGitCommand(\n 'git diff --cached --name-only',\n installDir,\n );\n if (!result.success) {\n return { success: false, error: result.error };\n }\n const files = result.data\n ? result.data\n .split('\\n')\n .map((f) => f.trim())\n .filter(Boolean)\n : [];\n const hasEnv = files.some((f) => f.startsWith('.env'));\n return { success: true, data: hasEnv };\n}\n\nexport async function commitChanges(\n message: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git commit -m \"${message}\"`, installDir);\n}\n\nexport async function pushBranch(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git push -u origin ${branch}`, installDir);\n}\n\nexport async function createGitHubPR(\n baseBranch: string,\n newBranch: string,\n title: string,\n body: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(\n `gh pr create --base ${baseBranch} --head ${newBranch} --title \"${title}\" --body \"${body}\"`,\n installDir,\n );\n}\n\ninterface CreatePRStepOptions {\n installDir: string;\n integration: Integration;\n addedEditorRules: boolean;\n}\n\nexport async function createPRStep({\n installDir,\n integration,\n addedEditorRules,\n}: CreatePRStepOptions): Promise<string | undefined> {\n return traceStep('create-pr', async () => {\n if (!isInGitRepo()) {\n clack.log.warn('Not in a git repository. Cannot create a pull request.');\n return;\n }\n\n // Get current branch\n const currentBranchResult = await getCurrentBranch(installDir);\n if (!currentBranchResult.success || !currentBranchResult.data) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'failed to get current branch',\n error: currentBranchResult.error,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(\n currentBranchResult.error ?? 'Failed to get current branch',\n );\n }\n\n return;\n }\n const baseBranch = currentBranchResult.data;\n\n if (!['main', 'master'].includes(baseBranch)) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'not on main or master',\n base_branch: baseBranch,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(`Not on main or master. Skipping PR creation.`);\n }\n return;\n }\n\n // Check GitHub auth\n const authResult = await checkGitHubAuth(installDir);\n if (!authResult.success) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'not logged into github',\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(authResult.error ?? 'Failed to check github auth');\n }\n\n return;\n }\n\n const newBranch = PR_CONFIG.defaultBranchName;\n\n // Check if branch exists\n const branchExistsResult = await checkBranchExists(newBranch, installDir);\n if (!branchExistsResult.success) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'branch already exists',\n error: branchExistsResult.error,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(\n branchExistsResult.error ?? 'Failed to check branch exists',\n );\n }\n\n return;\n }\n\n const prTitle = PR_CONFIG.defaultTitle;\n const prDescription = getPRDescription({\n integration,\n addedEditorRules,\n });\n\n const createPR = await abortIfCancelled(\n clack.select({\n message: 'Would you like to create a PR automatically?',\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'We will create a PR for you',\n },\n {\n value: false,\n label: 'No',\n hint: 'You can create a PR manually later',\n },\n ],\n }),\n integration,\n );\n\n if (!createPR) {\n clack.log.info('Skipping PR creation');\n return;\n }\n\n // Create branch\n const createBranchResult = await createBranch(newBranch, installDir);\n if (!createBranchResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to create branch',\n error: createBranchResult.error,\n integration,\n });\n clack.log.warn('Failed to create branch. Aborting PR creation 🚶‍➡️');\n return;\n }\n\n // Stage changes\n const stageResult = await stageChanges(installDir);\n if (!stageResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to stage changes',\n error: stageResult.error,\n integration,\n });\n clack.log.warn('Failed to stage changes. Aborting PR creation 🚶‍➡️');\n return;\n }\n\n // Check for env files\n const envCheckResult = await checkForEnvFiles(installDir);\n if (!envCheckResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to check for env files in staged changes',\n error: envCheckResult.error,\n integration,\n });\n clack.log.warn(\n 'Failed to check for .env files. Aborting PR creation 🚶‍➡️',\n );\n return;\n }\n\n if (envCheckResult.data) {\n clack.log.warn(\n 'Found .env files in staged changes. Aborting PR creation to prevent exposing sensitive data 🔐',\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'env files detected in staged changes',\n integration,\n });\n return;\n }\n\n // Commit changes\n const commitSpinner = clack.spinner();\n commitSpinner.start('Committing changes...');\n const commitResult = await commitChanges(prTitle, installDir);\n if (!commitResult.success) {\n commitSpinner.stop(\n 'Failed to commit changes. Aborting PR creation 🚶‍➡️',\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to commit changes',\n error: commitResult.error,\n integration,\n });\n return;\n }\n commitSpinner.stop('Changes committed successfully.');\n\n // Push branch\n const pushSpinner = clack.spinner();\n pushSpinner.start('Pushing branch to remote...');\n const pushResult = await pushBranch(newBranch, installDir);\n if (!pushResult.success) {\n pushSpinner.stop('Failed to push branch. Aborting PR creation 🚶‍➡️');\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to push branch',\n error: pushResult.error,\n integration,\n });\n return;\n }\n pushSpinner.stop('Branch pushed successfully.');\n\n // Create PR\n const prSpinner = clack.spinner();\n prSpinner.start(\n `Creating a PR on branch '${newBranch}' with base '${baseBranch}'...`,\n );\n const prResult = await createGitHubPR(\n baseBranch,\n newBranch,\n prTitle,\n prDescription,\n installDir,\n );\n if (!prResult.success || !prResult.data) {\n prSpinner.stop(\n `Failed to create PR on branch '${newBranch}'. Aborting PR creation 🚶‍➡️`,\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to create pr',\n error: prResult.error,\n integration,\n });\n return;\n }\n\n const prUrl = prResult.data;\n prSpinner.stop(\n `Successfully created PR! 🎉 You can review it here: ${chalk.cyan(\n prUrl,\n )}`,\n );\n\n analytics.capture('wizard interaction', {\n action: 'pr created',\n branch: newBranch,\n base_branch: baseBranch,\n integration,\n });\n\n return prUrl;\n });\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { WizardOptions } from '../../utils/types';
2
+ export declare abstract class EnvironmentProvider {
3
+ protected options: WizardOptions;
4
+ name: string;
5
+ constructor(options: WizardOptions);
6
+ abstract detect(): Promise<boolean>;
7
+ abstract uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>>;
8
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvironmentProvider = void 0;
4
+ class EnvironmentProvider {
5
+ options;
6
+ name;
7
+ constructor(options) {
8
+ this.options = options;
9
+ }
10
+ }
11
+ exports.EnvironmentProvider = EnvironmentProvider;
12
+ //# sourceMappingURL=EnvironmentProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnvironmentProvider.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/EnvironmentProvider.ts"],"names":[],"mappings":";;;AAEA,MAAsB,mBAAmB;IAC7B,OAAO,CAAgB;IAEjC,IAAI,CAAS;IAEb,YAAY,OAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CAOF;AAdD,kDAcC","sourcesContent":["import type { WizardOptions } from '../../utils/types';\n\nexport abstract class EnvironmentProvider {\n protected options: WizardOptions;\n\n name: string;\n\n constructor(options: WizardOptions) {\n this.options = options;\n }\n\n abstract detect(): Promise<boolean>;\n\n abstract uploadEnvVars(\n vars: Record<string, string>,\n ): Promise<Record<string, boolean>>;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { Integration } from '../../lib/constants';
2
+ import type { WizardOptions } from '../../utils/types';
3
+ export declare const uploadEnvironmentVariablesStep: (envVars: Record<string, string>, { integration, options, }: {
4
+ integration: Integration;
5
+ options: WizardOptions;
6
+ }) => Promise<string[]>;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.uploadEnvironmentVariablesStep = void 0;
7
+ const telemetry_1 = require("../../telemetry");
8
+ const analytics_1 = require("../../utils/analytics");
9
+ const clack_1 = __importDefault(require("../../utils/clack"));
10
+ const clack_utils_1 = require("../../utils/clack-utils");
11
+ const vercel_1 = require("./providers/vercel");
12
+ const uploadEnvironmentVariablesStep = async (envVars, { integration, options, }) => {
13
+ const providers = [
14
+ new vercel_1.VercelEnvironmentProvider(options),
15
+ ];
16
+ let provider = null;
17
+ for (const p of providers) {
18
+ if (await p.detect()) {
19
+ provider = p;
20
+ break;
21
+ }
22
+ }
23
+ if (!provider) {
24
+ analytics_1.analytics.capture('wizard interaction', {
25
+ action: 'not uploading environment variables',
26
+ reason: 'no environment provider found',
27
+ integration,
28
+ });
29
+ return [];
30
+ }
31
+ const upload = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
32
+ message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,
33
+ options: [
34
+ {
35
+ value: true,
36
+ label: 'Yes',
37
+ hint: `Upload the environment variables to ${provider.name}`,
38
+ },
39
+ {
40
+ value: false,
41
+ label: 'No',
42
+ hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,
43
+ },
44
+ ],
45
+ }), integration);
46
+ if (!upload) {
47
+ analytics_1.analytics.capture('wizard interaction', {
48
+ action: 'not uploading environment variables',
49
+ reason: 'user declined to upload',
50
+ provider: provider.name,
51
+ integration,
52
+ });
53
+ return [];
54
+ }
55
+ const results = await (0, telemetry_1.traceStep)('uploading environment variables', async () => {
56
+ return await provider.uploadEnvVars(envVars);
57
+ });
58
+ analytics_1.analytics.capture('wizard interaction', {
59
+ action: 'uploaded environment variables',
60
+ provider: provider.name,
61
+ integration,
62
+ });
63
+ return Object.keys(results).filter((key) => results[key]);
64
+ };
65
+ exports.uploadEnvironmentVariablesStep = uploadEnvironmentVariablesStep;
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/index.ts"],"names":[],"mappings":";;;;;;AACA,+CAA4C;AAC5C,qDAAkD;AAClD,8DAAsC;AACtC,yDAA2D;AAG3D,+CAA+D;AAExD,MAAM,8BAA8B,GAAG,KAAK,EACjD,OAA+B,EAC/B,EACE,WAAW,EACX,OAAO,GAIR,EACkB,EAAE;IACrB,MAAM,SAAS,GAA0B;QACvC,IAAI,kCAAyB,CAAC,OAAO,CAAC;KACvC,CAAC;IAEF,IAAI,QAAQ,GAA+B,IAAI,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,+BAA+B;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAY,MAAM,IAAA,8BAAgB,EAC5C,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,+BAA+B,QAAQ,CAAC,IAAI,uDAAuD;QAC5G,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,uCAAuC,QAAQ,CAAC,IAAI,EAAE;aAC7D;YACD;gBACE,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,2CAA2C,QAAQ,CAAC,IAAI,0BAA0B;aACzF;SACF;KACF,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAS,EAC7B,iCAAiC,EACjC,KAAK,IAAI,EAAE;QACT,OAAO,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;IAEF,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;QACtC,MAAM,EAAE,gCAAgC;QACxC,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC;AA3EW,QAAA,8BAA8B,kCA2EzC","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport { abortIfCancelled } from '../../utils/clack-utils';\nimport type { WizardOptions } from '../../utils/types';\nimport { EnvironmentProvider } from './EnvironmentProvider';\nimport { VercelEnvironmentProvider } from './providers/vercel';\n\nexport const uploadEnvironmentVariablesStep = async (\n envVars: Record<string, string>,\n {\n integration,\n options,\n }: {\n integration: Integration;\n options: WizardOptions;\n },\n): Promise<string[]> => {\n const providers: EnvironmentProvider[] = [\n new VercelEnvironmentProvider(options),\n ];\n\n let provider: EnvironmentProvider | null = null;\n\n for (const p of providers) {\n if (await p.detect()) {\n provider = p;\n break;\n }\n }\n\n if (!provider) {\n analytics.capture('wizard interaction', {\n action: 'not uploading environment variables',\n reason: 'no environment provider found',\n integration,\n });\n return [];\n }\n\n const upload: boolean = await abortIfCancelled(\n clack.select({\n message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Upload the environment variables to ${provider.name}`,\n },\n {\n value: false,\n label: 'No',\n hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,\n },\n ],\n }),\n integration,\n );\n\n if (!upload) {\n analytics.capture('wizard interaction', {\n action: 'not uploading environment variables',\n reason: 'user declined to upload',\n provider: provider.name,\n integration,\n });\n return [];\n }\n\n const results = await traceStep(\n 'uploading environment variables',\n async () => {\n return await provider.uploadEnvVars(envVars);\n },\n );\n\n analytics.capture('wizard interaction', {\n action: 'uploaded environment variables',\n provider: provider.name,\n integration,\n });\n\n return Object.keys(results).filter((key) => results[key]);\n};\n"]}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vercel_1 = require("../vercel");
37
+ const fs = __importStar(require("fs"));
38
+ const child_process = __importStar(require("child_process"));
39
+ jest.mock('fs');
40
+ jest.mock('child_process');
41
+ const mockOptions = { installDir: '/tmp/project' };
42
+ describe('VercelEnvironmentProvider', () => {
43
+ let provider;
44
+ beforeEach(() => {
45
+ provider = new vercel_1.VercelEnvironmentProvider(mockOptions);
46
+ jest.clearAllMocks();
47
+ });
48
+ it('should detect Vercel CLI, project link, and authentication', async () => {
49
+ child_process.execSync.mockReturnValue(undefined);
50
+ fs.existsSync.mockImplementation((p) => {
51
+ if (p.endsWith('.vercel'))
52
+ return true;
53
+ if (p.endsWith('project.json'))
54
+ return true;
55
+ return false;
56
+ });
57
+ child_process.spawnSync.mockReturnValue({
58
+ stdout: 'testuser',
59
+ stderr: '',
60
+ status: 0,
61
+ });
62
+ await expect(provider.detect()).resolves.toBe(true);
63
+ });
64
+ it('should return false if Vercel CLI is missing', async () => {
65
+ child_process.execSync.mockImplementation(() => {
66
+ throw new Error();
67
+ });
68
+ await expect(provider.detect()).resolves.toBe(false);
69
+ });
70
+ it('should return false if project is not linked', async () => {
71
+ child_process.execSync.mockReturnValue(undefined);
72
+ fs.existsSync.mockReturnValue(false);
73
+ await expect(provider.detect()).resolves.toBe(false);
74
+ });
75
+ it('should return false if not authenticated', async () => {
76
+ child_process.execSync.mockReturnValue(undefined);
77
+ fs.existsSync.mockReturnValue(true);
78
+ child_process.spawnSync.mockReturnValue({
79
+ stdout: 'Log in to Vercel',
80
+ stderr: '',
81
+ status: 0,
82
+ });
83
+ await expect(provider.detect()).resolves.toBe(false);
84
+ });
85
+ it('should return false if env var already exists', async () => {
86
+ const stdinMock = { write: jest.fn(), end: jest.fn() };
87
+ let closeCallback;
88
+ const onMock = jest.fn((event, cb) => {
89
+ if (event === 'close')
90
+ closeCallback = cb;
91
+ });
92
+ // Simulate a process with a writable stderr stream
93
+ let stderrListener;
94
+ const stderr = {
95
+ on: jest.fn((event, cb) => {
96
+ if (event === 'data')
97
+ stderrListener = cb;
98
+ }),
99
+ };
100
+ child_process.spawn.mockReturnValue({
101
+ stdin: stdinMock,
102
+ on: onMock,
103
+ stderr,
104
+ });
105
+ const uploadPromise = provider.uploadEnvVars({ FOO: 'bar' });
106
+ // Simulate "already exists" error on stderr, then process close
107
+ stderrListener && stderrListener('already exists');
108
+ closeCallback && closeCallback(1);
109
+ await expect(uploadPromise).resolves.toEqual({ FOO: false });
110
+ });
111
+ it('should attempt to upload environment variables', async () => {
112
+ child_process.spawn.mockReturnValue({});
113
+ await provider.uploadEnvVars({ FOO: 'bar' });
114
+ expect(child_process.spawn).toHaveBeenCalledWith('vercel', ['env', 'add', 'FOO', 'production'], expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }));
115
+ });
116
+ });
117
+ //# sourceMappingURL=vercel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.test.js","sourceRoot":"","sources":["../../../../../../src/steps/upload-environment-variables/providers/__tests__/vercel.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAAsD;AACtD,uCAAyB;AACzB,6DAA+C;AAE/C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAE3B,MAAM,WAAW,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AAEnD,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,QAAmC,CAAC;IAExC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,kCAAyB,CAAC,WAAkB,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QACzE,aAAa,CAAC,QAAsB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAChE,EAAE,CAAC,UAAwB,CAAC,kBAAkB,CAAC,CAAC,CAAS,EAAE,EAAE;YAC5D,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;YACvC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACF,aAAa,CAAC,SAAuB,CAAC,eAAe,CAAC;YACrD,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC3D,aAAa,CAAC,QAAsB,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC5D,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC3D,aAAa,CAAC,QAAsB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAChE,EAAE,CAAC,UAAwB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACvD,aAAa,CAAC,QAAsB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAChE,EAAE,CAAC,UAAwB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClD,aAAa,CAAC,SAAuB,CAAC,eAAe,CAAC;YACrD,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;QACvD,IAAI,aAAmD,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACnC,IAAI,KAAK,KAAK,OAAO;gBAAE,aAAa,GAAG,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,mDAAmD;QACnD,IAAI,cAA6D,CAAC;QAClE,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBACxB,IAAI,KAAK,KAAK,MAAM;oBAAE,cAAc,GAAG,EAAE,CAAC;YAC5C,CAAC,CAAC;SACH,CAAC;QAED,aAAa,CAAC,KAAmB,CAAC,eAAe,CAAC;YACjD,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,MAAM;YACV,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7D,gEAAgE;QAChE,cAAc,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC;QACnD,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QAElC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC7D,aAAa,CAAC,KAAmB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAEvD,MAAM,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7C,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAC9C,QAAQ,EACR,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,EACnC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { VercelEnvironmentProvider } from '../vercel';\nimport * as fs from 'fs';\nimport * as child_process from 'child_process';\n\njest.mock('fs');\njest.mock('child_process');\n\nconst mockOptions = { installDir: '/tmp/project' };\n\ndescribe('VercelEnvironmentProvider', () => {\n let provider: VercelEnvironmentProvider;\n\n beforeEach(() => {\n provider = new VercelEnvironmentProvider(mockOptions as any);\n jest.clearAllMocks();\n });\n\n it('should detect Vercel CLI, project link, and authentication', async () => {\n (child_process.execSync as jest.Mock).mockReturnValue(undefined);\n (fs.existsSync as jest.Mock).mockImplementation((p: string) => {\n if (p.endsWith('.vercel')) return true;\n if (p.endsWith('project.json')) return true;\n return false;\n });\n (child_process.spawnSync as jest.Mock).mockReturnValue({\n stdout: 'testuser',\n stderr: '',\n status: 0,\n });\n\n await expect(provider.detect()).resolves.toBe(true);\n });\n\n it('should return false if Vercel CLI is missing', async () => {\n (child_process.execSync as jest.Mock).mockImplementation(() => {\n throw new Error();\n });\n await expect(provider.detect()).resolves.toBe(false);\n });\n\n it('should return false if project is not linked', async () => {\n (child_process.execSync as jest.Mock).mockReturnValue(undefined);\n (fs.existsSync as jest.Mock).mockReturnValue(false);\n await expect(provider.detect()).resolves.toBe(false);\n });\n\n it('should return false if not authenticated', async () => {\n (child_process.execSync as jest.Mock).mockReturnValue(undefined);\n (fs.existsSync as jest.Mock).mockReturnValue(true);\n (child_process.spawnSync as jest.Mock).mockReturnValue({\n stdout: 'Log in to Vercel',\n stderr: '',\n status: 0,\n });\n await expect(provider.detect()).resolves.toBe(false);\n });\n\n it('should return false if env var already exists', async () => {\n const stdinMock = { write: jest.fn(), end: jest.fn() };\n let closeCallback: ((code: number) => void) | undefined;\n const onMock = jest.fn((event, cb) => {\n if (event === 'close') closeCallback = cb;\n });\n\n // Simulate a process with a writable stderr stream\n let stderrListener: ((data: Buffer | string) => void) | undefined;\n const stderr = {\n on: jest.fn((event, cb) => {\n if (event === 'data') stderrListener = cb;\n }),\n };\n\n (child_process.spawn as jest.Mock).mockReturnValue({\n stdin: stdinMock,\n on: onMock,\n stderr,\n });\n\n const uploadPromise = provider.uploadEnvVars({ FOO: 'bar' });\n\n // Simulate \"already exists\" error on stderr, then process close\n stderrListener && stderrListener('already exists');\n closeCallback && closeCallback(1);\n\n await expect(uploadPromise).resolves.toEqual({ FOO: false });\n });\n\n it('should attempt to upload environment variables', async () => {\n (child_process.spawn as jest.Mock).mockReturnValue({});\n\n await provider.uploadEnvVars({ FOO: 'bar' });\n\n expect(child_process.spawn).toHaveBeenCalledWith(\n 'vercel',\n ['env', 'add', 'FOO', 'production'],\n expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }),\n );\n });\n});\n"]}
@@ -0,0 +1,14 @@
1
+ import { EnvironmentProvider } from '../EnvironmentProvider';
2
+ import type { WizardOptions } from '../../../utils/types';
3
+ export declare class VercelEnvironmentProvider extends EnvironmentProvider {
4
+ name: string;
5
+ environments: string[];
6
+ constructor(options: WizardOptions);
7
+ detect(): Promise<boolean>;
8
+ hasDotVercelDir(): boolean;
9
+ hasVercelCli(): boolean;
10
+ isProjectLinked(): boolean;
11
+ isAuthenticated(): boolean;
12
+ uploadEnvironmentVariable(key: string, value: string, environment: string): Promise<void>;
13
+ uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>>;
14
+ }
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.VercelEnvironmentProvider = void 0;
40
+ const child_process_1 = require("child_process");
41
+ const EnvironmentProvider_1 = require("../EnvironmentProvider");
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const clack_1 = __importDefault(require("../../../utils/clack"));
45
+ const chalk_1 = __importDefault(require("chalk"));
46
+ const analytics_1 = require("../../../utils/analytics");
47
+ class VercelEnvironmentProvider extends EnvironmentProvider_1.EnvironmentProvider {
48
+ name = 'Vercel';
49
+ environments = ['production', 'preview', 'development'];
50
+ constructor(options) {
51
+ super(options);
52
+ }
53
+ // eslint-disable-next-line @typescript-eslint/require-await
54
+ async detect() {
55
+ const vercelDetected = this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();
56
+ analytics_1.analytics.setTag('vercel-detected', vercelDetected);
57
+ return vercelDetected;
58
+ }
59
+ hasDotVercelDir() {
60
+ const dotVercelDir = path.join(this.options.installDir, '.vercel');
61
+ return fs.existsSync(dotVercelDir);
62
+ }
63
+ hasVercelCli() {
64
+ try {
65
+ (0, child_process_1.execSync)('vercel --version', { stdio: 'ignore' });
66
+ analytics_1.analytics.setTag('vercel-cli-installed', true);
67
+ return true;
68
+ }
69
+ catch {
70
+ analytics_1.analytics.setTag('vercel-cli-installed', false);
71
+ return false;
72
+ }
73
+ }
74
+ isProjectLinked() {
75
+ const isProjectLinked = fs.existsSync(path.join(this.options.installDir, '.vercel', 'project.json'));
76
+ analytics_1.analytics.setTag('vercel-project-linked', isProjectLinked);
77
+ return isProjectLinked;
78
+ }
79
+ isAuthenticated() {
80
+ const result = (0, child_process_1.spawnSync)('vercel', ['whoami'], {
81
+ encoding: 'utf-8',
82
+ stdio: ['pipe', 'pipe', 'pipe'], // suppress prompts
83
+ env: {
84
+ ...process.env,
85
+ FORCE_COLOR: '0', // avoid ANSI formatting
86
+ CI: '1', // hint to CLI that it's a non-interactive env
87
+ },
88
+ });
89
+ const output = (result.stdout + result.stderr).toLowerCase();
90
+ if (output.includes('log in to vercel') ||
91
+ output.includes('vercel login') ||
92
+ result.status !== 0) {
93
+ analytics_1.analytics.setTag('vercel-authenticated', false);
94
+ return false;
95
+ }
96
+ analytics_1.analytics.setTag('vercel-authenticated', true);
97
+ return true;
98
+ }
99
+ async uploadEnvironmentVariable(key, value, environment) {
100
+ await new Promise((resolve, reject) => {
101
+ const proc = (0, child_process_1.spawn)('vercel', ['env', 'add', key, environment], {
102
+ stdio: ['pipe', 'pipe', 'pipe'],
103
+ });
104
+ let stderr = '';
105
+ proc.stderr.on('data', (data) => {
106
+ stderr += data.toString();
107
+ });
108
+ proc.stdin.write(value + '\n');
109
+ proc.stdin.end();
110
+ proc.on('close', (code) => {
111
+ if (stderr.includes('already exists') ||
112
+ stderr.includes('already been added') ||
113
+ stderr.includes('vercel env rm')) {
114
+ reject(new Error(`❌ Environment variable ${chalk_1.default.cyan(key)} already exists in ${this.name}. Please upload it manually.`));
115
+ }
116
+ else if (code === 0) {
117
+ resolve();
118
+ }
119
+ else {
120
+ reject(new Error(`❌ Failed to upload environment variable ${chalk_1.default.cyan(key)} to ${this.name}. Please upload it manually.`));
121
+ }
122
+ });
123
+ });
124
+ }
125
+ async uploadEnvVars(vars) {
126
+ const results = {};
127
+ for (const [key, value] of Object.entries(vars)) {
128
+ const spinner = clack_1.default.spinner();
129
+ spinner.start(`Uploading ${chalk_1.default.cyan(key)} to ${this.name}...`);
130
+ await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))
131
+ .then(() => {
132
+ spinner.stop(`✅ Uploaded ${chalk_1.default.cyan(key)} to ${this.name}`);
133
+ results[key] = true;
134
+ })
135
+ .catch((err) => {
136
+ spinner.stop(err instanceof Error
137
+ ? err.message
138
+ : `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`);
139
+ results[key] = false;
140
+ });
141
+ }
142
+ return results;
143
+ }
144
+ }
145
+ exports.VercelEnvironmentProvider = VercelEnvironmentProvider;
146
+ //# sourceMappingURL=vercel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../../../../src/steps/upload-environment-variables/providers/vercel.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync, spawn, spawnSync } from 'child_process';\nimport { EnvironmentProvider } from '../EnvironmentProvider';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { WizardOptions } from '../../../utils/types';\nimport clack from '../../../utils/clack';\nimport chalk from 'chalk';\nimport { analytics } from '../../../utils/analytics';\n\nexport class VercelEnvironmentProvider extends EnvironmentProvider {\n name = 'Vercel';\n environments = ['production', 'preview', 'development'];\n\n constructor(options: WizardOptions) {\n super(options);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async detect(): Promise<boolean> {\n const vercelDetected =\n this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();\n\n analytics.setTag('vercel-detected', vercelDetected);\n\n return vercelDetected;\n }\n\n hasDotVercelDir(): boolean {\n const dotVercelDir = path.join(this.options.installDir, '.vercel');\n return fs.existsSync(dotVercelDir);\n }\n\n hasVercelCli(): boolean {\n try {\n execSync('vercel --version', { stdio: 'ignore' });\n analytics.setTag('vercel-cli-installed', true);\n return true;\n } catch {\n analytics.setTag('vercel-cli-installed', false);\n return false;\n }\n }\n\n isProjectLinked(): boolean {\n const isProjectLinked = fs.existsSync(\n path.join(this.options.installDir, '.vercel', 'project.json'),\n );\n\n analytics.setTag('vercel-project-linked', isProjectLinked);\n\n return isProjectLinked;\n }\n\n isAuthenticated(): boolean {\n const result = spawnSync('vercel', ['whoami'], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'], // suppress prompts\n env: {\n ...process.env,\n FORCE_COLOR: '0', // avoid ANSI formatting\n CI: '1', // hint to CLI that it's a non-interactive env\n },\n });\n\n const output = (result.stdout + result.stderr).toLowerCase();\n\n if (\n output.includes('log in to vercel') ||\n output.includes('vercel login') ||\n result.status !== 0\n ) {\n analytics.setTag('vercel-authenticated', false);\n return false;\n }\n\n analytics.setTag('vercel-authenticated', true);\n\n return true;\n }\n\n async uploadEnvironmentVariable(\n key: string,\n value: string,\n environment: string,\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('vercel', ['env', 'add', key, environment], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stderr = '';\n proc.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.stdin.write(value + '\\n');\n proc.stdin.end();\n\n proc.on('close', (code) => {\n if (\n stderr.includes('already exists') ||\n stderr.includes('already been added') ||\n stderr.includes('vercel env rm')\n ) {\n reject(\n new Error(\n `❌ Environment variable ${chalk.cyan(key)} already exists in ${\n this.name\n }. Please upload it manually.`,\n ),\n );\n } else if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `❌ Failed to upload environment variable ${chalk.cyan(key)} to ${\n this.name\n }. Please upload it manually.`,\n ),\n );\n }\n });\n });\n }\n\n async uploadEnvVars(\n vars: Record<string, string>,\n ): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n\n for (const [key, value] of Object.entries(vars)) {\n const spinner = clack.spinner();\n\n spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);\n await Promise.all(\n this.environments.map((environment) =>\n this.uploadEnvironmentVariable(key, value, environment),\n ),\n )\n .then(() => {\n spinner.stop(`✅ Uploaded ${chalk.cyan(key)} to ${this.name}`);\n results[key] = true;\n })\n .catch((err) => {\n spinner.stop(\n err instanceof Error\n ? err.message\n : `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`,\n );\n results[key] = false;\n });\n }\n\n return results;\n }\n}\n"]}
@@ -107,6 +107,7 @@ async function runSvelteWizard(options) {
107
107
  addedEditorRules,
108
108
  packageManager: packageManagerForOutro,
109
109
  envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,
110
+ uploadedEnvVars: [],
110
111
  });
111
112
  clack_1.default.outro(outroMessage);
112
113
  await analytics_1.analytics.shutdown('success');
@@ -1 +1 @@
1
- {"version":3,"file":"svelte-wizard.js","sourceRoot":"","sources":["../../../src/svelte/svelte-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getSvelteDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { addEditorRulesStep } from '../steps/add-editor-rules';\nimport { getOutroMessage } from '../lib/messages';\nimport { addOrUpdateEnvironmentVariablesStep, runPrettierStep } from '../steps';\n\nexport async function runSvelteWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Svelte Wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Svelte wizard requires AI to get setup right now. Please view the docs to setup Svelte manually instead: https://posthog.com/docs/libraries/svelte',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', '@sveltejs/kit');\n\n const svelteVersion = getPackageVersion('@sveltejs/kit', packageJson);\n\n if (svelteVersion) {\n analytics.setTag('svelte-version', svelteVersion);\n }\n\n const { projectApiKey, wizardHash, host } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const sdkAlreadyInstalled = hasPackageInstalled('posthog-js', packageJson);\n\n analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const installationDocumentation = getSvelteDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Svelte`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.svelte,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.svelte,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n ['PUBLIC_POSTHOG_KEY']: projectApiKey,\n ['PUBLIC_POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'svelte-rules.md',\n integration: Integration.svelte,\n default: options.default,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.svelte,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
1
+ {"version":3,"file":"svelte-wizard.js","sourceRoot":"","sources":["../../../src/svelte/svelte-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getSvelteDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { addEditorRulesStep } from '../steps/add-editor-rules';\nimport { getOutroMessage } from '../lib/messages';\nimport { addOrUpdateEnvironmentVariablesStep, runPrettierStep } from '../steps';\n\nexport async function runSvelteWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Svelte Wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Svelte wizard requires AI to get setup right now. Please view the docs to setup Svelte manually instead: https://posthog.com/docs/libraries/svelte',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, '@sveltejs/kit', '@sveltejs/kit');\n\n const svelteVersion = getPackageVersion('@sveltejs/kit', packageJson);\n\n if (svelteVersion) {\n analytics.setTag('svelte-version', svelteVersion);\n }\n\n const { projectApiKey, wizardHash, host } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const sdkAlreadyInstalled = hasPackageInstalled('posthog-js', packageJson);\n\n analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const installationDocumentation = getSvelteDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Svelte`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.svelte,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.svelte,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n ['PUBLIC_POSTHOG_KEY']: projectApiKey,\n ['PUBLIC_POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.svelte,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'svelte-rules.md',\n integration: Integration.svelte,\n default: options.default,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.svelte,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}