@posthog/wizard 1.23.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.
- package/README.md +37 -0
- package/dist/bin.js +38 -7
- package/dist/bin.js.map +1 -1
- package/dist/src/__tests__/cli.test.js +91 -0
- package/dist/src/__tests__/cli.test.js.map +1 -1
- package/dist/src/astro/astro-wizard.js +1 -0
- package/dist/src/astro/astro-wizard.js.map +1 -1
- package/dist/src/lib/agent-interface.js +7 -8
- package/dist/src/lib/agent-interface.js.map +1 -1
- package/dist/src/lib/agent-runner.d.ts +1 -1
- package/dist/src/lib/agent-runner.js +5 -3
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/config.d.ts +12 -1
- package/dist/src/lib/config.js +22 -0
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/constants.d.ts +5 -1
- package/dist/src/lib/constants.js +8 -1
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/framework-config.d.ts +8 -6
- package/dist/src/lib/framework-config.js +12 -0
- package/dist/src/lib/framework-config.js.map +1 -1
- package/dist/src/lib/safe-tools.d.ts +2 -0
- package/dist/src/lib/safe-tools.js +215 -0
- package/dist/src/lib/safe-tools.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard-agent.js +0 -3
- package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -1
- package/dist/src/react/react-wizard.js +1 -0
- package/dist/src/react/react-wizard.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +2 -3
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-router/react-router-wizard-agent.d.ts +5 -0
- package/dist/src/react-router/react-router-wizard-agent.js +151 -0
- package/dist/src/react-router/react-router-wizard-agent.js.map +1 -0
- package/dist/src/react-router/utils.d.ts +19 -0
- package/dist/src/react-router/utils.js +276 -0
- package/dist/src/react-router/utils.js.map +1 -0
- package/dist/src/run.d.ts +2 -0
- package/dist/src/run.js +17 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +2 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js +6 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
- package/dist/src/svelte/svelte-wizard.js +1 -0
- package/dist/src/svelte/svelte-wizard.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +6 -4
- package/dist/src/utils/clack-utils.js +51 -6
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/types.d.ts +8 -0
- package/dist/src/utils/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-wizard.js","sourceRoot":"","sources":["../../../src/react/react-wizard.ts"],"names":[],"mappings":";AAAA,8BAA8B;;;;;AAoC9B,
|
|
1
|
+
{"version":3,"file":"react-wizard.js","sourceRoot":"","sources":["../../../src/react/react-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 { getReactDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport { detectEnvVarPrefix } from '../utils/environment';\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 { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addMCPServerToClientsStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n} from '../steps';\nimport { uploadEnvironmentVariablesStep } from '../steps/upload-environment-variables';\n\nexport async function runReactWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog React wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The React wizard requires AI to get setup right now. Please view the docs to setup React manually instead: https://posthog.com/docs/libraries/react',\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, 'react', 'React');\n\n const reactVersion = getPackageVersion('react', packageJson);\n\n if (reactVersion) {\n analytics.setTag('react-version', reactVersion);\n }\n\n const { projectApiKey, accessToken, host, projectId } =\n 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.react,\n });\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const envVarPrefix = await detectEnvVarPrefix(options);\n\n const installationDocumentation = getReactDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n envVarPrefix,\n });\n\n clack.log.info(`Reviewing PostHog documentation for React`);\n\n const filesToChange = await getFilesToChange({\n integration: Integration.react,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.react,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n [envVarPrefix + 'POSTHOG_KEY']: projectApiKey,\n [envVarPrefix + 'POSTHOG_HOST']: host,\n },\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'react-rules.md',\n integration: Integration.react,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n [envVarPrefix + 'POSTHOG_KEY']: projectApiKey,\n [envVarPrefix + 'POSTHOG_HOST']: host,\n },\n {\n integration: Integration.react,\n options,\n },\n );\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.react,\n ci: options.ci,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.react,\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"]}
|
|
@@ -111,10 +111,9 @@ async function runReactNativeWizard(options) {
|
|
|
111
111
|
await (0, steps_1.addMCPServerToClientsStep)({
|
|
112
112
|
cloudRegion,
|
|
113
113
|
integration: constants_1.Integration.reactNative,
|
|
114
|
+
ci: options.ci,
|
|
114
115
|
});
|
|
115
|
-
const packageManagerForOutro = await (0, clack_utils_1.getPackageManager)(
|
|
116
|
-
installDir: options.installDir,
|
|
117
|
-
});
|
|
116
|
+
const packageManagerForOutro = await (0, clack_utils_1.getPackageManager)(options);
|
|
118
117
|
const outroMessage = (0, messages_1.getOutroMessage)({
|
|
119
118
|
options,
|
|
120
119
|
integration: constants_1.Integration.reactNative,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-native-wizard.js","sourceRoot":"","sources":["../../../src/react-native/react-native-wizard.ts"],"names":[],"mappings":";AAAA,8BAA8B;;;;;AAkC9B,
|
|
1
|
+
{"version":3,"file":"react-native-wizard.js","sourceRoot":"","sources":["../../../src/react-native/react-native-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 { getReactNativeDocumentation } 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 {\n addEditorRulesStep,\n addMCPServerToClientsStep,\n runPrettierStep,\n} from '../steps';\nimport { EXPO } from '../utils/package-manager';\nimport { getOutroMessage } from '../lib/messages';\n\nexport async function runReactNativeWizard(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'PostHog React Native wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The React Native wizard requires AI to get setup right now. Please view the docs to setup React Native manually instead: https://posthog.com/docs/libraries/react-native',\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, 'react-native', 'React Native');\n\n const reactNativeVersion = getPackageVersion('react-native', packageJson);\n\n if (reactNativeVersion) {\n analytics.setTag('react-native-version', reactNativeVersion);\n }\n\n const { projectApiKey, accessToken, host, projectId } =\n 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 isUsingExpo = hasPackageInstalled('expo', packageJson);\n\n if (isUsingExpo) {\n analytics.setTag('is-using-expo', true);\n analytics.setTag('expo-version', getPackageVersion('expo', packageJson));\n }\n\n clack.log.info(`Detected ${isUsingExpo ? 'Expo' : 'React Native'}`);\n\n const packagesToInstall = isUsingExpo\n ? [\n 'posthog-react-native',\n 'posthog-react-native-session-replay',\n 'expo-file-system',\n 'expo-application',\n 'expo-device',\n 'expo-localization',\n ]\n : [\n 'posthog-react-native',\n '@react-native-async-storage/async-storage',\n 'react-native-device-info',\n 'react-native-localize',\n ];\n\n for (const packageName of packagesToInstall) {\n await installPackage({\n packageName,\n packageNameDisplayLabel: packageName,\n alreadyInstalled: !!packageJson?.dependencies?.[packageName],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.reactNative,\n packageManager: isUsingExpo ? EXPO : undefined,\n });\n }\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.reactNative,\n });\n\n const installationDocumentation = getReactNativeDocumentation({\n language: typeScriptDetected ? 'typescript' : 'javascript',\n host,\n projectApiKey,\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${\n isUsingExpo ? 'Expo' : 'React Native'\n }`,\n );\n\n const filesToChange = await getFilesToChange({\n integration: Integration.reactNative,\n relevantFiles,\n documentation: installationDocumentation,\n accessToken,\n cloudRegion,\n projectId,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.reactNative,\n filesToChange,\n accessToken,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n projectId,\n });\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.reactNative,\n });\n\n const addedEditorRules = await addEditorRulesStep({\n installDir: options.installDir,\n rulesName: 'react-native-rules.md',\n integration: Integration.reactNative,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.reactNative,\n ci: options.ci,\n });\n\n const packageManagerForOutro = await getPackageManager(options);\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.reactNative,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n uploadedEnvVars: [],\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n"]}
|
|
@@ -0,0 +1,151 @@
|
|
|
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.runReactRouterWizardAgent = runReactRouterWizardAgent;
|
|
40
|
+
const debug_1 = require("../utils/debug");
|
|
41
|
+
const agent_runner_1 = require("../lib/agent-runner");
|
|
42
|
+
const constants_1 = require("../lib/constants");
|
|
43
|
+
const package_json_1 = require("../utils/package-json");
|
|
44
|
+
const clack_utils_1 = require("../utils/clack-utils");
|
|
45
|
+
const clack_1 = __importDefault(require("../utils/clack"));
|
|
46
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
47
|
+
const semver = __importStar(require("semver"));
|
|
48
|
+
const utils_1 = require("./utils");
|
|
49
|
+
/**
|
|
50
|
+
* React Router framework configuration for the universal agent runner.
|
|
51
|
+
*/
|
|
52
|
+
const MINIMUM_REACT_ROUTER_VERSION = '6.0.0';
|
|
53
|
+
const REACT_ROUTER_AGENT_CONFIG = {
|
|
54
|
+
metadata: {
|
|
55
|
+
name: 'React Router',
|
|
56
|
+
integration: constants_1.Integration.reactRouter,
|
|
57
|
+
docsUrl: 'https://posthog.com/docs/libraries/react',
|
|
58
|
+
unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/react',
|
|
59
|
+
gatherContext: async (options) => {
|
|
60
|
+
const routerMode = await (0, utils_1.getReactRouterMode)(options);
|
|
61
|
+
return { routerMode };
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
detection: {
|
|
65
|
+
packageName: 'react-router',
|
|
66
|
+
packageDisplayName: 'React Router',
|
|
67
|
+
getVersion: (packageJson) => (0, package_json_1.getPackageVersion)('react-router', packageJson),
|
|
68
|
+
getVersionBucket: utils_1.getReactRouterVersionBucket,
|
|
69
|
+
},
|
|
70
|
+
environment: {
|
|
71
|
+
uploadToHosting: false,
|
|
72
|
+
getEnvVars: (apiKey, host) => ({
|
|
73
|
+
REACT_APP_POSTHOG_KEY: apiKey,
|
|
74
|
+
REACT_APP_POSTHOG_HOST: host,
|
|
75
|
+
}),
|
|
76
|
+
},
|
|
77
|
+
analytics: {
|
|
78
|
+
getTags: (context) => {
|
|
79
|
+
const routerMode = context.routerMode;
|
|
80
|
+
return {
|
|
81
|
+
routerMode: routerMode || 'unknown',
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
prompts: {
|
|
86
|
+
getAdditionalContextLines: (context) => {
|
|
87
|
+
const routerMode = context.routerMode;
|
|
88
|
+
const modeName = routerMode
|
|
89
|
+
? (0, utils_1.getReactRouterModeName)(routerMode)
|
|
90
|
+
: 'unknown';
|
|
91
|
+
// Map router mode to framework ID for MCP docs resource
|
|
92
|
+
const frameworkIdMap = {
|
|
93
|
+
[utils_1.ReactRouterMode.V6]: 'react-react-router-6',
|
|
94
|
+
[utils_1.ReactRouterMode.V7_FRAMEWORK]: 'react-react-router-7-framework',
|
|
95
|
+
[utils_1.ReactRouterMode.V7_DATA]: 'react-react-router-7-data',
|
|
96
|
+
[utils_1.ReactRouterMode.V7_DECLARATIVE]: 'react-react-router-7-declarative',
|
|
97
|
+
};
|
|
98
|
+
const frameworkId = routerMode
|
|
99
|
+
? frameworkIdMap[routerMode]
|
|
100
|
+
: utils_1.ReactRouterMode.V7_FRAMEWORK;
|
|
101
|
+
return [
|
|
102
|
+
`Router mode: ${modeName}`,
|
|
103
|
+
`Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,
|
|
104
|
+
];
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
ui: {
|
|
108
|
+
successMessage: 'PostHog integration complete',
|
|
109
|
+
estimatedDurationMinutes: 8,
|
|
110
|
+
getOutroChanges: (context) => {
|
|
111
|
+
const routerMode = context.routerMode;
|
|
112
|
+
const modeName = routerMode
|
|
113
|
+
? (0, utils_1.getReactRouterModeName)(routerMode)
|
|
114
|
+
: 'React Router';
|
|
115
|
+
return [
|
|
116
|
+
`Analyzed your React Router project structure (${modeName})`,
|
|
117
|
+
`Created and configured PostHog initializers`,
|
|
118
|
+
`Integrated PostHog into your application`,
|
|
119
|
+
];
|
|
120
|
+
},
|
|
121
|
+
getOutroNextSteps: () => [
|
|
122
|
+
'Start your development server to see PostHog in action',
|
|
123
|
+
'Visit your PostHog dashboard to see incoming events',
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* React Router wizard powered by the universal agent runner.
|
|
129
|
+
*/
|
|
130
|
+
async function runReactRouterWizardAgent(options) {
|
|
131
|
+
if (options.debug) {
|
|
132
|
+
(0, debug_1.enableDebugLogs)();
|
|
133
|
+
}
|
|
134
|
+
// Check React Router version - agent wizard requires >= 6.0.0
|
|
135
|
+
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
|
|
136
|
+
const reactRouterVersion = (0, package_json_1.getPackageVersion)('react-router', packageJson);
|
|
137
|
+
if (reactRouterVersion) {
|
|
138
|
+
const coercedVersion = semver.coerce(reactRouterVersion);
|
|
139
|
+
if (coercedVersion &&
|
|
140
|
+
semver.lt(coercedVersion, MINIMUM_REACT_ROUTER_VERSION)) {
|
|
141
|
+
const docsUrl = REACT_ROUTER_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ??
|
|
142
|
+
REACT_ROUTER_AGENT_CONFIG.metadata.docsUrl;
|
|
143
|
+
clack_1.default.log.warn(`Sorry: the wizard can't help you with React Router ${reactRouterVersion}. Upgrade to React Router ${MINIMUM_REACT_ROUTER_VERSION} or later, or check out the manual setup guide.`);
|
|
144
|
+
clack_1.default.log.info(`Setup React Router manually: ${chalk_1.default.cyan(docsUrl)}`);
|
|
145
|
+
clack_1.default.outro('PostHog wizard will see you next time!');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
await (0, agent_runner_1.runAgentWizard)(REACT_ROUTER_AGENT_CONFIG, options);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=react-router-wizard-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-router-wizard-agent.js","sourceRoot":"","sources":["../../../src/react-router/react-router-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* React Router wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { enableDebugLogs } from '../utils/debug';\nimport { runAgentWizard } from '../lib/agent-runner';\nimport { Integration } from '../lib/constants';\nimport { getPackageVersion } from '../utils/package-json';\nimport { getPackageDotJson } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport chalk from 'chalk';\nimport * as semver from 'semver';\nimport {\n getReactRouterMode,\n getReactRouterModeName,\n getReactRouterVersionBucket,\n ReactRouterMode,\n} from './utils';\n\n/**\n * React Router framework configuration for the universal agent runner.\n */\nconst MINIMUM_REACT_ROUTER_VERSION = '6.0.0';\n\nconst REACT_ROUTER_AGENT_CONFIG: FrameworkConfig = {\n metadata: {\n name: 'React Router',\n integration: Integration.reactRouter,\n docsUrl: 'https://posthog.com/docs/libraries/react',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/react',\n gatherContext: async (options: WizardOptions) => {\n const routerMode = await getReactRouterMode(options);\n return { routerMode };\n },\n },\n\n detection: {\n packageName: 'react-router',\n packageDisplayName: 'React Router',\n getVersion: (packageJson: any) =>\n getPackageVersion('react-router', packageJson),\n getVersionBucket: getReactRouterVersionBucket,\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n REACT_APP_POSTHOG_KEY: apiKey,\n REACT_APP_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context: any) => {\n const routerMode = context.routerMode as ReactRouterMode;\n return {\n routerMode: routerMode || 'unknown',\n };\n },\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => {\n const routerMode = context.routerMode as ReactRouterMode;\n const modeName = routerMode\n ? getReactRouterModeName(routerMode)\n : 'unknown';\n\n // Map router mode to framework ID for MCP docs resource\n const frameworkIdMap: Record<ReactRouterMode, string> = {\n [ReactRouterMode.V6]: 'react-react-router-6',\n [ReactRouterMode.V7_FRAMEWORK]: 'react-react-router-7-framework',\n [ReactRouterMode.V7_DATA]: 'react-react-router-7-data',\n [ReactRouterMode.V7_DECLARATIVE]: 'react-react-router-7-declarative',\n };\n\n const frameworkId = routerMode\n ? frameworkIdMap[routerMode]\n : ReactRouterMode.V7_FRAMEWORK;\n\n return [\n `Router mode: ${modeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: (context: any) => {\n const routerMode = context.routerMode as ReactRouterMode;\n const modeName = routerMode\n ? getReactRouterModeName(routerMode)\n : 'React Router';\n return [\n `Analyzed your React Router project structure (${modeName})`,\n `Created and configured PostHog initializers`,\n `Integrated PostHog into your application`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ],\n },\n};\n\n/**\n * React Router wizard powered by the universal agent runner.\n */\nexport async function runReactRouterWizardAgent(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n // Check React Router version - agent wizard requires >= 6.0.0\n const packageJson = await getPackageDotJson(options);\n const reactRouterVersion = getPackageVersion('react-router', packageJson);\n\n if (reactRouterVersion) {\n const coercedVersion = semver.coerce(reactRouterVersion);\n if (\n coercedVersion &&\n semver.lt(coercedVersion, MINIMUM_REACT_ROUTER_VERSION)\n ) {\n const docsUrl =\n REACT_ROUTER_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ??\n REACT_ROUTER_AGENT_CONFIG.metadata.docsUrl;\n\n clack.log.warn(\n `Sorry: the wizard can't help you with React Router ${reactRouterVersion}. Upgrade to React Router ${MINIMUM_REACT_ROUTER_VERSION} or later, or check out the manual setup guide.`,\n );\n clack.log.info(`Setup React Router manually: ${chalk.cyan(docsUrl)}`);\n clack.outro('PostHog wizard will see you next time!');\n return;\n }\n }\n\n await runAgentWizard(REACT_ROUTER_AGENT_CONFIG, options);\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { WizardOptions } from '../utils/types';
|
|
2
|
+
export declare enum ReactRouterMode {
|
|
3
|
+
V6 = "v6",// React Router v6
|
|
4
|
+
V7_FRAMEWORK = "v7-framework",// React Router v7 with react-router.config.ts
|
|
5
|
+
V7_DATA = "v7-data",// React Router v7 with createBrowserRouter
|
|
6
|
+
V7_DECLARATIVE = "v7-declarative"
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Get React Router version bucket for analytics
|
|
10
|
+
*/
|
|
11
|
+
export declare function getReactRouterVersionBucket(version: string | undefined): string;
|
|
12
|
+
/**
|
|
13
|
+
* Detect React Router mode
|
|
14
|
+
*/
|
|
15
|
+
export declare function getReactRouterMode(options: WizardOptions): Promise<ReactRouterMode>;
|
|
16
|
+
/**
|
|
17
|
+
* Get human-readable name for React Router mode
|
|
18
|
+
*/
|
|
19
|
+
export declare function getReactRouterModeName(mode: ReactRouterMode): string;
|
|
@@ -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"]}
|