@posthog/wizard
Version:
The PostHog wizard helps you to configure your project
152 lines • 7.49 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.runWizard = runWizard;
const clack_utils_1 = require("./utils/clack-utils");
const nextjs_wizard_agent_1 = require("./nextjs/nextjs-wizard-agent");
const constants_1 = require("./lib/constants");
const environment_1 = require("./utils/environment");
const clack_1 = __importDefault(require("./utils/clack"));
const path_1 = __importDefault(require("path"));
const config_1 = require("./lib/config");
const react_wizard_1 = require("./react/react-wizard");
const analytics_1 = require("./utils/analytics");
const svelte_wizard_1 = require("./svelte/svelte-wizard");
const react_native_wizard_1 = require("./react-native/react-native-wizard");
const astro_wizard_1 = require("./astro/astro-wizard");
const react_router_wizard_agent_1 = require("./react-router/react-router-wizard-agent");
const django_wizard_agent_1 = require("./django/django-wizard-agent");
const flask_wizard_agent_1 = require("./flask/flask-wizard-agent");
const laravel_wizard_agent_1 = require("./laravel/laravel-wizard-agent");
const events_1 = require("events");
const chalk_1 = __importDefault(require("chalk"));
const errors_1 = require("./utils/errors");
events_1.EventEmitter.defaultMaxListeners = 50;
async function runWizard(argv) {
const finalArgs = {
...argv,
...(0, environment_1.readEnvironment)(),
};
let resolvedInstallDir;
if (finalArgs.installDir) {
if (path_1.default.isAbsolute(finalArgs.installDir)) {
resolvedInstallDir = finalArgs.installDir;
}
else {
resolvedInstallDir = path_1.default.join(process.cwd(), finalArgs.installDir);
}
}
else {
resolvedInstallDir = process.cwd();
}
const wizardOptions = {
debug: finalArgs.debug ?? false,
forceInstall: finalArgs.forceInstall ?? false,
installDir: resolvedInstallDir,
cloudRegion: finalArgs.region ?? undefined,
default: finalArgs.default ?? false,
signup: finalArgs.signup ?? false,
localMcp: finalArgs.localMcp ?? false,
ci: finalArgs.ci ?? false,
apiKey: finalArgs.apiKey,
};
clack_1.default.intro(`Welcome to the PostHog setup wizard ✨`);
if (wizardOptions.ci) {
clack_1.default.log.info(chalk_1.default.dim('Running in CI mode'));
}
const integration = finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));
analytics_1.analytics.setTag('integration', integration);
try {
switch (integration) {
case constants_1.Integration.nextjs:
await (0, nextjs_wizard_agent_1.runNextjsWizardAgent)(wizardOptions);
break;
case constants_1.Integration.react:
await (0, react_wizard_1.runReactWizard)(wizardOptions);
break;
case constants_1.Integration.svelte:
await (0, svelte_wizard_1.runSvelteWizard)(wizardOptions);
break;
case constants_1.Integration.reactNative:
await (0, react_native_wizard_1.runReactNativeWizard)(wizardOptions);
break;
case constants_1.Integration.astro:
await (0, astro_wizard_1.runAstroWizard)(wizardOptions);
break;
case constants_1.Integration.reactRouter: {
const flagValue = await analytics_1.analytics.getFeatureFlag(constants_1.FeatureFlagDefinition.ReactRouter);
// In CI mode, bypass feature flags and always use the React Router wizard
if (wizardOptions.ci || flagValue === true) {
await (0, react_router_wizard_agent_1.runReactRouterWizardAgent)(wizardOptions);
}
else {
await (0, react_wizard_1.runReactWizard)(wizardOptions);
}
break;
}
case constants_1.Integration.django:
clack_1.default.log.info(`${chalk_1.default.yellow('[BETA]')} The Django wizard is in beta. Questions or feedback? Email ${chalk_1.default.cyan('wizard@posthog.com')}`);
await (0, django_wizard_agent_1.runDjangoWizardAgent)(wizardOptions);
break;
case constants_1.Integration.flask:
clack_1.default.log.info(`${chalk_1.default.yellow('[BETA]')} The Flask wizard is in beta. Questions or feedback? Email ${chalk_1.default.cyan('wizard@posthog.com')}`);
await (0, flask_wizard_agent_1.runFlaskWizardAgent)(wizardOptions);
break;
case constants_1.Integration.laravel:
clack_1.default.log.info(`${chalk_1.default.yellow('[BETA]')} The Laravel wizard is in beta. Questions or feedback? Email ${chalk_1.default.cyan('wizard@posthog.com')}`);
await (0, laravel_wizard_agent_1.runLaravelWizardAgent)(wizardOptions);
break;
default:
clack_1.default.log.error('No setup wizard selected!');
}
}
catch (error) {
analytics_1.analytics.captureException(error, {
integration,
arguments: JSON.stringify(finalArgs),
});
await analytics_1.analytics.shutdown('error');
if (error instanceof errors_1.RateLimitError) {
clack_1.default.log.error('Wizard usage limit reached. Please try again later.');
}
else {
clack_1.default.log.error(`Something went wrong. You can read the documentation at ${chalk_1.default.cyan(`${config_1.INTEGRATION_CONFIG[integration].docsUrl}`)} to set up PostHog manually.`);
}
process.exit(1);
}
}
async function detectIntegration(options) {
const integrationConfigs = Object.entries(config_1.INTEGRATION_CONFIG).sort(([a], [b]) => config_1.INTEGRATION_ORDER.indexOf(a) -
config_1.INTEGRATION_ORDER.indexOf(b));
for (const [integration, config] of integrationConfigs) {
const detected = await config.detect(options);
if (detected) {
return integration;
}
}
}
async function getIntegrationForSetup(options) {
const detectedIntegration = await detectIntegration(options);
if (detectedIntegration) {
clack_1.default.log.success(`Detected integration: ${(0, constants_1.getIntegrationDescription)(detectedIntegration)}`);
return detectedIntegration;
}
const integration = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
message: 'What do you want to set up?',
options: [
{ value: constants_1.Integration.nextjs, label: 'Next.js' },
{ value: constants_1.Integration.astro, label: 'Astro' },
{ value: constants_1.Integration.react, label: 'React' },
{ value: constants_1.Integration.reactRouter, label: 'React Router' },
{ value: constants_1.Integration.django, label: 'Django' },
{ value: constants_1.Integration.flask, label: 'Flask' },
{ value: constants_1.Integration.laravel, label: 'Laravel' },
{ value: constants_1.Integration.svelte, label: 'Svelte' },
{ value: constants_1.Integration.reactNative, label: 'React Native' },
],
}));
return integration;
}
//# sourceMappingURL=run.js.map