UNPKG

@posthog/wizard

Version:

The PostHog wizard helps you to configure your project

188 lines 8.48 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.runNextjsWizard = runNextjsWizard; /* eslint-disable max-lines */ const clack_utils_1 = require("../utils/clack-utils"); const package_json_1 = require("../utils/package-json"); const utils_1 = require("./utils"); const clack_1 = __importDefault(require("../utils/clack")); const constants_1 = require("../lib/constants"); const docs_1 = require("./docs"); const analytics_1 = require("../utils/analytics"); const file_utils_1 = require("../utils/file-utils"); const clack_utils_2 = require("../utils/clack-utils"); const messages_1 = require("../lib/messages"); const steps_1 = require("../steps"); const semver = __importStar(require("semver")); async function runNextjsWizard(options) { (0, clack_utils_1.printWelcome)({ wizardName: 'PostHog Next.js wizard', }); const aiConsent = await (0, clack_utils_1.askForAIConsent)(options); if (!aiConsent) { await (0, clack_utils_1.abort)('The Next.js wizard requires AI to get setup right now. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js', 0); } const cloudRegion = options.cloudRegion ?? (await (0, clack_utils_2.askForCloudRegion)()); const typeScriptDetected = (0, clack_utils_1.isUsingTypeScript)(options); await (0, clack_utils_1.confirmContinueIfNoOrDirtyGitRepo)(options); const packageJson = await (0, clack_utils_1.getPackageDotJson)(options); await (0, clack_utils_1.ensurePackageIsInstalled)(packageJson, 'next', 'Next.js'); const nextVersion = (0, package_json_1.getPackageVersion)('next', packageJson); analytics_1.analytics.setTag('nextjs-version', (0, utils_1.getNextJsVersionBucket)(nextVersion)); const { projectApiKey, wizardHash, host } = await (0, clack_utils_1.getOrAskForProjectData)({ ...options, cloudRegion, }); const sdkAlreadyInstalled = (0, package_json_1.hasPackageInstalled)('posthog-js', packageJson); analytics_1.analytics.setTag('sdk-already-installed', sdkAlreadyInstalled); const { packageManager: packageManagerFromInstallStep } = await (0, clack_utils_1.installPackage)({ packageName: 'posthog-js', packageNameDisplayLabel: 'posthog-js', alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'], forceInstall: options.forceInstall, askBeforeUpdating: false, installDir: options.installDir, integration: constants_1.Integration.nextjs, }); await (0, clack_utils_1.installPackage)({ packageName: 'posthog-node', packageNameDisplayLabel: 'posthog-node', packageManager: packageManagerFromInstallStep, alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'], forceInstall: options.forceInstall, askBeforeUpdating: false, installDir: options.installDir, integration: constants_1.Integration.nextjs, }); const relevantFiles = await (0, file_utils_1.getRelevantFilesForIntegration)({ installDir: options.installDir, integration: constants_1.Integration.nextjs, }); let installationDocumentation; // Documentation for the installation of the PostHog SDK if (instrumentationFileAvailable(nextVersion)) { installationDocumentation = (0, docs_1.getModernNextjsDocs)({ host, language: typeScriptDetected ? 'typescript' : 'javascript', }); clack_1.default.log.info(`Reviewing PostHog documentation for Next.js`); } else { const router = await (0, utils_1.getNextJsRouter)(options); installationDocumentation = getInstallationDocumentation({ router, host, language: typeScriptDetected ? 'typescript' : 'javascript', }); clack_1.default.log.info(`Reviewing PostHog documentation for ${(0, utils_1.getNextJsRouterName)(router)}`); } const filesToChange = await (0, file_utils_1.getFilesToChange)({ integration: constants_1.Integration.nextjs, relevantFiles, documentation: installationDocumentation, wizardHash, cloudRegion, }); await (0, file_utils_1.generateFileChangesForIntegration)({ integration: constants_1.Integration.nextjs, filesToChange, wizardHash, installDir: options.installDir, documentation: installationDocumentation, cloudRegion, }); const packageManagerForOutro = packageManagerFromInstallStep ?? (await (0, clack_utils_1.getPackageManager)(options)); await (0, steps_1.runPrettierStep)({ installDir: options.installDir, integration: constants_1.Integration.nextjs, }); const { relativeEnvFilePath, addedEnvVariables } = await (0, steps_1.addOrUpdateEnvironmentVariablesStep)({ variables: { NEXT_PUBLIC_POSTHOG_KEY: projectApiKey, NEXT_PUBLIC_POSTHOG_HOST: host, }, installDir: options.installDir, integration: constants_1.Integration.nextjs, }); const uploadedEnvVars = await (0, steps_1.uploadEnvironmentVariablesStep)({ NEXT_PUBLIC_POSTHOG_KEY: projectApiKey, NEXT_PUBLIC_POSTHOG_HOST: host, }, { integration: constants_1.Integration.nextjs, options, }); const addedEditorRules = await (0, steps_1.addEditorRulesStep)({ rulesName: 'next-rules.md', installDir: options.installDir, integration: constants_1.Integration.nextjs, }); await (0, steps_1.addMCPServerToClientsStep)({ cloudRegion, integration: constants_1.Integration.nextjs, }); const outroMessage = (0, messages_1.getOutroMessage)({ options, integration: constants_1.Integration.nextjs, cloudRegion, addedEditorRules, packageManager: packageManagerForOutro, envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined, uploadedEnvVars, }); clack_1.default.outro(outroMessage); clack_1.default.outro('Want to try our experimental event instrumentation? Run the wizard again with this argument: npx @posthog/wizard@latest event-setup'); await analytics_1.analytics.shutdown('success'); } function instrumentationFileAvailable(nextVersion) { const minimumVersion = '15.3.0'; //instrumentation-client.js|ts was introduced in 15.3 if (!nextVersion) { return false; } const coercedNextVersion = semver.coerce(nextVersion); if (!coercedNextVersion) { return false; // Unable to parse nextVersion } return semver.gte(coercedNextVersion, minimumVersion); } function getInstallationDocumentation({ router, host, language, }) { if (router === utils_1.NextJsRouter.PAGES_ROUTER) { return (0, docs_1.getNextjsPagesRouterDocs)({ host, language }); } return (0, docs_1.getNextjsAppRouterDocs)({ host, language }); } //# sourceMappingURL=nextjs-wizard.js.map