@posthog/wizard 1.24.0 → 1.25.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.
@@ -0,0 +1,276 @@
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.ReactRouterMode = void 0;
40
+ exports.getReactRouterVersionBucket = getReactRouterVersionBucket;
41
+ exports.getReactRouterMode = getReactRouterMode;
42
+ exports.getReactRouterModeName = getReactRouterModeName;
43
+ const semver_1 = require("semver");
44
+ const fast_glob_1 = __importDefault(require("fast-glob"));
45
+ const clack_utils_1 = require("../utils/clack-utils");
46
+ const clack_1 = __importDefault(require("../utils/clack"));
47
+ const constants_1 = require("../lib/constants");
48
+ const package_json_1 = require("../utils/package-json");
49
+ const chalk_1 = __importDefault(require("chalk"));
50
+ const fs = __importStar(require("node:fs"));
51
+ const path = __importStar(require("node:path"));
52
+ const semver = __importStar(require("semver"));
53
+ var ReactRouterMode;
54
+ (function (ReactRouterMode) {
55
+ ReactRouterMode["V6"] = "v6";
56
+ ReactRouterMode["V7_FRAMEWORK"] = "v7-framework";
57
+ ReactRouterMode["V7_DATA"] = "v7-data";
58
+ ReactRouterMode["V7_DECLARATIVE"] = "v7-declarative";
59
+ })(ReactRouterMode || (exports.ReactRouterMode = ReactRouterMode = {}));
60
+ const IGNORE_PATTERNS = [
61
+ '**/node_modules/**',
62
+ '**/dist/**',
63
+ '**/build/**',
64
+ '**/public/**',
65
+ '**/.next/**',
66
+ ];
67
+ /**
68
+ * Get React Router version bucket for analytics
69
+ */
70
+ function getReactRouterVersionBucket(version) {
71
+ if (!version) {
72
+ return 'none';
73
+ }
74
+ try {
75
+ const minVer = (0, semver_1.minVersion)(version);
76
+ if (!minVer) {
77
+ return 'invalid';
78
+ }
79
+ const majorVersion = (0, semver_1.major)(minVer);
80
+ if (majorVersion >= 6) {
81
+ return `${majorVersion}.x`;
82
+ }
83
+ return `<6.0.0`;
84
+ }
85
+ catch {
86
+ return 'unknown';
87
+ }
88
+ }
89
+ /**
90
+ * Check if react-router.config.ts exists (indicates framework mode - React Router v7)
91
+ */
92
+ async function hasReactRouterConfig({ installDir, }) {
93
+ const configMatches = await (0, fast_glob_1.default)('**/react-router.config.@(ts|js|tsx|jsx)', {
94
+ dot: true,
95
+ cwd: installDir,
96
+ ignore: IGNORE_PATTERNS,
97
+ });
98
+ return configMatches.length > 0;
99
+ }
100
+ /**
101
+ * Search for createBrowserRouter usage in source files
102
+ */
103
+ async function hasCreateBrowserRouter({ installDir, }) {
104
+ const sourceFiles = await (0, fast_glob_1.default)('**/*.@(ts|tsx|js|jsx)', {
105
+ dot: true,
106
+ cwd: installDir,
107
+ ignore: IGNORE_PATTERNS,
108
+ });
109
+ for (const file of sourceFiles) {
110
+ try {
111
+ const filePath = path.join(installDir, file);
112
+ const content = fs.readFileSync(filePath, 'utf-8');
113
+ // Check for createBrowserRouter import or usage
114
+ if (content.includes('createBrowserRouter')) {
115
+ return true;
116
+ }
117
+ }
118
+ catch {
119
+ // Skip files that can't be read
120
+ continue;
121
+ }
122
+ }
123
+ return false;
124
+ }
125
+ /**
126
+ * Search for declarative BrowserRouter usage
127
+ */
128
+ async function hasDeclarativeRouter({ installDir, }) {
129
+ const sourceFiles = await (0, fast_glob_1.default)('**/*.@(ts|tsx|js|jsx)', {
130
+ dot: true,
131
+ cwd: installDir,
132
+ ignore: IGNORE_PATTERNS,
133
+ });
134
+ for (const file of sourceFiles) {
135
+ try {
136
+ const filePath = path.join(installDir, file);
137
+ const content = fs.readFileSync(filePath, 'utf-8');
138
+ // Check for BrowserRouter usage (JSX or import)
139
+ if (content.includes('<BrowserRouter') ||
140
+ (content.includes('BrowserRouter') &&
141
+ (content.includes('from "react-router-dom"') ||
142
+ content.includes("from 'react-router-dom'")))) {
143
+ return true;
144
+ }
145
+ }
146
+ catch {
147
+ // Skip files that can't be read
148
+ continue;
149
+ }
150
+ }
151
+ return false;
152
+ }
153
+ /**
154
+ * Detect React Router mode
155
+ */
156
+ async function getReactRouterMode(options) {
157
+ const { installDir } = options;
158
+ // First, get the React Router version
159
+ const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
160
+ const reactRouterVersion = (0, package_json_1.getPackageVersion)('react-router-dom', packageJson) ||
161
+ (0, package_json_1.getPackageVersion)('react-router', packageJson);
162
+ if (!reactRouterVersion) {
163
+ // If we can't detect version, ask the user
164
+ clack_1.default.log.info(`Learn more about React Router modes: ${chalk_1.default.cyan('https://reactrouter.com/start/modes')}`);
165
+ const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
166
+ message: 'What React Router version and mode are you using?',
167
+ options: [
168
+ {
169
+ label: 'React Router v6',
170
+ value: ReactRouterMode.V6,
171
+ },
172
+ {
173
+ label: 'React Router v7 - Framework mode',
174
+ value: ReactRouterMode.V7_FRAMEWORK,
175
+ },
176
+ {
177
+ label: 'React Router v7 - Data mode',
178
+ value: ReactRouterMode.V7_DATA,
179
+ },
180
+ {
181
+ label: 'React Router v7 - Declarative mode',
182
+ value: ReactRouterMode.V7_DECLARATIVE,
183
+ },
184
+ ],
185
+ }), constants_1.Integration.reactRouter);
186
+ return result;
187
+ }
188
+ const coercedVersion = semver.coerce(reactRouterVersion);
189
+ const majorVersion = coercedVersion ? (0, semver_1.major)(coercedVersion) : null;
190
+ // If v6, return V6
191
+ if (majorVersion === 6) {
192
+ clack_1.default.log.info('Detected React Router v6');
193
+ return ReactRouterMode.V6;
194
+ }
195
+ // If v7, detect the mode
196
+ if (majorVersion === 7) {
197
+ // First check for framework mode (react-router.config.ts)
198
+ const hasConfig = await hasReactRouterConfig({ installDir });
199
+ if (hasConfig) {
200
+ clack_1.default.log.info('Detected React Router v7 - Framework mode');
201
+ return ReactRouterMode.V7_FRAMEWORK;
202
+ }
203
+ // Check for data mode (createBrowserRouter)
204
+ const hasDataMode = await hasCreateBrowserRouter({ installDir });
205
+ if (hasDataMode) {
206
+ clack_1.default.log.info('Detected React Router v7 - Data mode');
207
+ return ReactRouterMode.V7_DATA;
208
+ }
209
+ // Check for declarative mode (BrowserRouter)
210
+ const hasDeclarative = await hasDeclarativeRouter({ installDir });
211
+ if (hasDeclarative) {
212
+ clack_1.default.log.info('Detected React Router v7 - Declarative mode');
213
+ return ReactRouterMode.V7_DECLARATIVE;
214
+ }
215
+ // If v7 but can't detect mode, ask the user
216
+ clack_1.default.log.info(`Learn more about React Router modes: ${chalk_1.default.cyan('https://reactrouter.com/start/modes')}`);
217
+ const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
218
+ message: 'What React Router v7 mode are you using?',
219
+ options: [
220
+ {
221
+ label: 'Framework mode',
222
+ value: ReactRouterMode.V7_FRAMEWORK,
223
+ },
224
+ {
225
+ label: 'Data mode',
226
+ value: ReactRouterMode.V7_DATA,
227
+ },
228
+ {
229
+ label: 'Declarative mode',
230
+ value: ReactRouterMode.V7_DECLARATIVE,
231
+ },
232
+ ],
233
+ }), constants_1.Integration.reactRouter);
234
+ return result;
235
+ }
236
+ // If version is not 6 or 7, default to asking
237
+ clack_1.default.log.info(`Learn more about React Router modes: ${chalk_1.default.cyan('https://reactrouter.com/start/modes')}`);
238
+ const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
239
+ message: 'What React Router version and mode are you using?',
240
+ options: [
241
+ {
242
+ label: 'React Router v6',
243
+ value: ReactRouterMode.V6,
244
+ },
245
+ {
246
+ label: 'React Router v7 - Framework mode',
247
+ value: ReactRouterMode.V7_FRAMEWORK,
248
+ },
249
+ {
250
+ label: 'React Router v7 - Data mode',
251
+ value: ReactRouterMode.V7_DATA,
252
+ },
253
+ {
254
+ label: 'React Router v7 - Declarative mode',
255
+ value: ReactRouterMode.V7_DECLARATIVE,
256
+ },
257
+ ],
258
+ }), constants_1.Integration.reactRouter);
259
+ return result;
260
+ }
261
+ /**
262
+ * Get human-readable name for React Router mode
263
+ */
264
+ function getReactRouterModeName(mode) {
265
+ switch (mode) {
266
+ case ReactRouterMode.V6:
267
+ return 'v6';
268
+ case ReactRouterMode.V7_FRAMEWORK:
269
+ return 'v7 Framework mode';
270
+ case ReactRouterMode.V7_DATA:
271
+ return 'v7 Data mode';
272
+ case ReactRouterMode.V7_DECLARATIVE:
273
+ return 'v7 Declarative mode';
274
+ }
275
+ }
276
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/react-router/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { major, minVersion } from 'semver';\nimport fg from 'fast-glob';\nimport { abortIfCancelled, getPackageDotJson } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport type { WizardOptions } from '../utils/types';\nimport { Integration } from '../lib/constants';\nimport { getPackageVersion } from '../utils/package-json';\nimport chalk from 'chalk';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as semver from 'semver';\n\nexport enum ReactRouterMode {\n V6 = 'v6', // React Router v6\n V7_FRAMEWORK = 'v7-framework', // React Router v7 with react-router.config.ts\n V7_DATA = 'v7-data', // React Router v7 with createBrowserRouter\n V7_DECLARATIVE = 'v7-declarative', // React Router v7 with BrowserRouter\n}\n\nconst IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/public/**',\n '**/.next/**',\n];\n\n/**\n * Get React Router version bucket for analytics\n */\nexport function getReactRouterVersionBucket(\n version: string | undefined,\n): string {\n if (!version) {\n return 'none';\n }\n\n try {\n const minVer = minVersion(version);\n if (!minVer) {\n return 'invalid';\n }\n const majorVersion = major(minVer);\n if (majorVersion >= 6) {\n return `${majorVersion}.x`;\n }\n return `<6.0.0`;\n } catch {\n return 'unknown';\n }\n}\n\n/**\n * Check if react-router.config.ts exists (indicates framework mode - React Router v7)\n */\nasync function hasReactRouterConfig({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const configMatches = await fg('**/react-router.config.@(ts|js|tsx|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n return configMatches.length > 0;\n}\n\n/**\n * Search for createBrowserRouter usage in source files\n */\nasync function hasCreateBrowserRouter({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const sourceFiles = await fg('**/*.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const file of sourceFiles) {\n try {\n const filePath = path.join(installDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Check for createBrowserRouter import or usage\n if (content.includes('createBrowserRouter')) {\n return true;\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Search for declarative BrowserRouter usage\n */\nasync function hasDeclarativeRouter({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n const sourceFiles = await fg('**/*.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const file of sourceFiles) {\n try {\n const filePath = path.join(installDir, file);\n const content = fs.readFileSync(filePath, 'utf-8');\n\n // Check for BrowserRouter usage (JSX or import)\n if (\n content.includes('<BrowserRouter') ||\n (content.includes('BrowserRouter') &&\n (content.includes('from \"react-router-dom\"') ||\n content.includes(\"from 'react-router-dom'\")))\n ) {\n return true;\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n return false;\n}\n\n/**\n * Detect React Router mode\n */\nexport async function getReactRouterMode(\n options: WizardOptions,\n): Promise<ReactRouterMode> {\n const { installDir } = options;\n\n // First, get the React Router version\n const packageJson = await getPackageDotJson(options);\n const reactRouterVersion =\n getPackageVersion('react-router-dom', packageJson) ||\n getPackageVersion('react-router', packageJson);\n\n if (!reactRouterVersion) {\n // If we can't detect version, ask the user\n clack.log.info(\n `Learn more about React Router modes: ${chalk.cyan(\n 'https://reactrouter.com/start/modes',\n )}`,\n );\n const result: ReactRouterMode = await abortIfCancelled(\n clack.select({\n message: 'What React Router version and mode are you using?',\n options: [\n {\n label: 'React Router v6',\n value: ReactRouterMode.V6,\n },\n {\n label: 'React Router v7 - Framework mode',\n value: ReactRouterMode.V7_FRAMEWORK,\n },\n {\n label: 'React Router v7 - Data mode',\n value: ReactRouterMode.V7_DATA,\n },\n {\n label: 'React Router v7 - Declarative mode',\n value: ReactRouterMode.V7_DECLARATIVE,\n },\n ],\n }),\n Integration.reactRouter,\n );\n return result;\n }\n\n const coercedVersion = semver.coerce(reactRouterVersion);\n const majorVersion = coercedVersion ? major(coercedVersion) : null;\n\n // If v6, return V6\n if (majorVersion === 6) {\n clack.log.info('Detected React Router v6');\n return ReactRouterMode.V6;\n }\n\n // If v7, detect the mode\n if (majorVersion === 7) {\n // First check for framework mode (react-router.config.ts)\n const hasConfig = await hasReactRouterConfig({ installDir });\n if (hasConfig) {\n clack.log.info('Detected React Router v7 - Framework mode');\n return ReactRouterMode.V7_FRAMEWORK;\n }\n\n // Check for data mode (createBrowserRouter)\n const hasDataMode = await hasCreateBrowserRouter({ installDir });\n if (hasDataMode) {\n clack.log.info('Detected React Router v7 - Data mode');\n return ReactRouterMode.V7_DATA;\n }\n\n // Check for declarative mode (BrowserRouter)\n const hasDeclarative = await hasDeclarativeRouter({ installDir });\n if (hasDeclarative) {\n clack.log.info('Detected React Router v7 - Declarative mode');\n return ReactRouterMode.V7_DECLARATIVE;\n }\n\n // If v7 but can't detect mode, ask the user\n clack.log.info(\n `Learn more about React Router modes: ${chalk.cyan(\n 'https://reactrouter.com/start/modes',\n )}`,\n );\n const result: ReactRouterMode = await abortIfCancelled(\n clack.select({\n message: 'What React Router v7 mode are you using?',\n options: [\n {\n label: 'Framework mode',\n value: ReactRouterMode.V7_FRAMEWORK,\n },\n {\n label: 'Data mode',\n value: ReactRouterMode.V7_DATA,\n },\n {\n label: 'Declarative mode',\n value: ReactRouterMode.V7_DECLARATIVE,\n },\n ],\n }),\n Integration.reactRouter,\n );\n return result;\n }\n\n // If version is not 6 or 7, default to asking\n clack.log.info(\n `Learn more about React Router modes: ${chalk.cyan(\n 'https://reactrouter.com/start/modes',\n )}`,\n );\n const result: ReactRouterMode = await abortIfCancelled(\n clack.select({\n message: 'What React Router version and mode are you using?',\n options: [\n {\n label: 'React Router v6',\n value: ReactRouterMode.V6,\n },\n {\n label: 'React Router v7 - Framework mode',\n value: ReactRouterMode.V7_FRAMEWORK,\n },\n {\n label: 'React Router v7 - Data mode',\n value: ReactRouterMode.V7_DATA,\n },\n {\n label: 'React Router v7 - Declarative mode',\n value: ReactRouterMode.V7_DECLARATIVE,\n },\n ],\n }),\n Integration.reactRouter,\n );\n return result;\n}\n\n/**\n * Get human-readable name for React Router mode\n */\nexport function getReactRouterModeName(mode: ReactRouterMode): string {\n switch (mode) {\n case ReactRouterMode.V6:\n return 'v6';\n case ReactRouterMode.V7_FRAMEWORK:\n return 'v7 Framework mode';\n case ReactRouterMode.V7_DATA:\n return 'v7 Data mode';\n case ReactRouterMode.V7_DECLARATIVE:\n return 'v7 Declarative mode';\n }\n}\n"]}
package/dist/src/run.js CHANGED
@@ -16,6 +16,7 @@ const analytics_1 = require("./utils/analytics");
16
16
  const svelte_wizard_1 = require("./svelte/svelte-wizard");
17
17
  const react_native_wizard_1 = require("./react-native/react-native-wizard");
18
18
  const astro_wizard_1 = require("./astro/astro-wizard");
19
+ const react_router_wizard_agent_1 = require("./react-router/react-router-wizard-agent");
19
20
  const events_1 = require("events");
20
21
  const chalk_1 = __importDefault(require("chalk"));
21
22
  const errors_1 = require("./utils/errors");
@@ -71,6 +72,16 @@ async function runWizard(argv) {
71
72
  case constants_1.Integration.astro:
72
73
  await (0, astro_wizard_1.runAstroWizard)(wizardOptions);
73
74
  break;
75
+ case constants_1.Integration.reactRouter: {
76
+ const flagValue = await analytics_1.analytics.getFeatureFlag(constants_1.FeatureFlagDefinition.ReactRouter);
77
+ if (flagValue === true) {
78
+ await (0, react_router_wizard_agent_1.runReactRouterWizardAgent)(wizardOptions);
79
+ }
80
+ else {
81
+ await (0, react_wizard_1.runReactWizard)(wizardOptions);
82
+ }
83
+ break;
84
+ }
74
85
  default:
75
86
  clack_1.default.log.error('No setup wizard selected!');
76
87
  }
@@ -112,6 +123,7 @@ async function getIntegrationForSetup(options) {
112
123
  { value: constants_1.Integration.nextjs, label: 'Next.js' },
113
124
  { value: constants_1.Integration.astro, label: 'Astro' },
114
125
  { value: constants_1.Integration.react, label: 'React' },
126
+ { value: constants_1.Integration.reactRouter, label: 'React Router' },
115
127
  { value: constants_1.Integration.svelte, label: 'Svelte' },
116
128
  { value: constants_1.Integration.reactNative, label: 'React Native' },
117
129
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport { runNextjsWizardAgent } from './nextjs/nextjs-wizard-agent';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport { getIntegrationDescription, Integration } from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { runAstroWizard } from './astro/astro-wizard';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\nimport { RateLimitError } from './utils/errors';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n localMcp?: boolean;\n ci?: boolean;\n apiKey?: string;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n localMcp: finalArgs.localMcp ?? false,\n ci: finalArgs.ci ?? false,\n apiKey: finalArgs.apiKey,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n if (wizardOptions.ci) {\n clack.log.info(chalk.dim('Running in CI mode'));\n }\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizardAgent(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n case Integration.astro:\n await runAstroWizard(wizardOptions);\n break;\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n analytics.captureException(error as Error, {\n integration,\n arguments: JSON.stringify(finalArgs),\n });\n\n await analytics.shutdown('error');\n\n if (error instanceof RateLimitError) {\n clack.log.error('Wizard usage limit reached. Please try again later.');\n } else {\n clack.log.error(\n `Something went wrong. You can read the documentation at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to set up PostHog manually.`,\n );\n }\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.astro, label: 'Astro' },\n { value: Integration.react, label: 'React' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport { runNextjsWizardAgent } from './nextjs/nextjs-wizard-agent';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport {\n getIntegrationDescription,\n Integration,\n FeatureFlagDefinition,\n} from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { runAstroWizard } from './astro/astro-wizard';\nimport { runReactRouterWizardAgent } from './react-router/react-router-wizard-agent';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\nimport { RateLimitError } from './utils/errors';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n localMcp?: boolean;\n ci?: boolean;\n apiKey?: string;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n localMcp: finalArgs.localMcp ?? false,\n ci: finalArgs.ci ?? false,\n apiKey: finalArgs.apiKey,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n if (wizardOptions.ci) {\n clack.log.info(chalk.dim('Running in CI mode'));\n }\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizardAgent(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n case Integration.astro:\n await runAstroWizard(wizardOptions);\n break;\n case Integration.reactRouter: {\n const flagValue = await analytics.getFeatureFlag(\n FeatureFlagDefinition.ReactRouter,\n );\n if (flagValue === true) {\n await runReactRouterWizardAgent(wizardOptions);\n } else {\n await runReactWizard(wizardOptions);\n }\n break;\n }\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n analytics.captureException(error as Error, {\n integration,\n arguments: JSON.stringify(finalArgs),\n });\n\n await analytics.shutdown('error');\n\n if (error instanceof RateLimitError) {\n clack.log.error('Wizard usage limit reached. Please try again later.');\n } else {\n clack.log.error(\n `Something went wrong. You can read the documentation at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to set up PostHog manually.`,\n );\n }\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.astro, label: 'Astro' },\n { value: Integration.react, label: 'React' },\n { value: Integration.reactRouter, label: 'React Router' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/wizard",
3
- "version": "1.24.0",
3
+ "version": "1.25.0",
4
4
  "homepage": "https://github.com/PostHog/wizard",
5
5
  "repository": "https://github.com/PostHog/wizard",
6
6
  "description": "The PostHog wizard helps you to configure your project",