@posthog/wizard 1.24.0 → 1.26.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/dist/src/lib/agent-interface.d.ts +7 -1
- package/dist/src/lib/agent-interface.js +121 -28
- 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 +41 -13
- 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/mcp.d.ts +0 -3
- package/dist/src/mcp.js +2 -32
- package/dist/src/mcp.js.map +1 -1
- 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-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.js +13 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +5 -4
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.d.ts +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.js +92 -0
- package/dist/src/steps/add-mcp-server-to-clients/__tests__/defaults.test.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +11 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +2 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +5 -3
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +2 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +2 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +3 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +4 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +3 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js +4 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +3 -2
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js +4 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +8 -8
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js +34 -13
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js +4 -5
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
- package/package.json +1 -1
package/dist/src/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,iFAG2C;AAC3C,0DAAkC;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,iFAG2C;AAC3C,0DAAkC;AAElC,yCAAgD;AAEzC,MAAM,aAAa,GAAG,KAAK,EAAE,OAKnC,EAAE,EAAE;IACH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAA,uBAAe,GAAE,CAAC;IACpB,CAAC;IACD,eAAK,CAAC,KAAK,CACT,eAAK,CAAC,aAAa,CACjB,qCAAqC,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,CAClE,CACF,CAAC;IAEF,MAAM,IAAA,qDAAyB,EAAC;QAC9B,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,aAAa,EAAE,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,eAAK,CAAC,GAAG,CAAC,OAAO,CACf,GAAG,eAAK,CAAC,WAAW,CAClB,gEAAgE,CACjE,EAAE,CACJ,CAAC;IAEF,eAAK,CAAC,GAAG,CAAC,OAAO,CACf,qEAAqE,CACtE,CAAC;IAEF,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC;;;kCAGc,CAAC,CAAC;IAElC,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC;EAClB,eAAK,CAAC,UAAU,CAAC,iDAAiD,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC,CAAC;AAtCW,QAAA,aAAa,iBAsCxB;AAEK,MAAM,YAAY,GAAG,KAAK,EAAE,OAA6B,EAAE,EAAE;IAClE,eAAK,CAAC,KAAK,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,IAAA,0DAA8B,EAAC;QACnD,KAAK,EAAE,OAAO,EAAE,KAAK;KACtB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,eAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,eAAK,CAAC,KAAK,CACT,GAAG,eAAK,CAAC,KAAK,CACZ,oEAAoE,CACrE,EAAE,CACJ,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,YAAY,gBAkBvB","sourcesContent":["import chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n removeMCPServerFromClientsStep,\n} from './steps/add-mcp-server-to-clients';\nimport clack from './utils/clack';\nimport type { CloudRegion } from './utils/types';\nimport { enableDebugLogs } from './utils/debug';\n\nexport const runMCPInstall = async (options: {\n signup: boolean;\n region?: CloudRegion;\n local?: boolean;\n debug?: boolean;\n}) => {\n if (options.debug) {\n enableDebugLogs();\n }\n clack.intro(\n chalk.bgGreenBright(\n `Installing the PostHog MCP server ${options.local && '(local)'}`,\n ),\n );\n\n await addMCPServerToClientsStep({\n cloudRegion: options.region,\n askPermission: false,\n local: options.local,\n });\n\n clack.log.message(\n `${chalk.greenBright(\n 'You might need to restart your MCP clients to see the changes.',\n )}`,\n );\n\n clack.log.message(\n `You'll be prompted to log in to PostHog when you first use the MCP.`,\n );\n\n clack.log.message(`Get started with some prompts like:\n- What feature flags do I have active?\n- Add a new feature flag for our homepage redesign\n- What are my most common errors?`);\n\n clack.log.message(`Check out our MCP Server documentation:\n${chalk.blueBright(`https://posthog.com/docs/model-context-protocol`)}`);\n};\n\nexport const runMCPRemove = async (options?: { local?: boolean }) => {\n clack.intro(chalk.bgRed('Removing the PostHog MCP server'));\n const results = await removeMCPServerFromClientsStep({\n local: options?.local,\n });\n\n if (results.length === 0) {\n clack.outro(`No PostHog MCP servers found to remove.`);\n return;\n }\n\n clack.log.success(`PostHog MCP server removed from:`);\n results.map((c) => clack.log.message(`- ${c}`));\n clack.outro(\n `${chalk.green(\n 'You might need to restart your MCP clients to see the changes.\\n\\n',\n )}`,\n );\n};\n"]}
|
|
@@ -56,7 +56,6 @@ const NEXTJS_AGENT_CONFIG = {
|
|
|
56
56
|
integration: constants_1.Integration.nextjs,
|
|
57
57
|
docsUrl: 'https://posthog.com/docs/libraries/next-js',
|
|
58
58
|
unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/next-js',
|
|
59
|
-
abortMessage: 'This wizard uses an LLM agent to intelligently modify your project. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',
|
|
60
59
|
gatherContext: async (options) => {
|
|
61
60
|
const router = await (0, utils_1.getNextJsRouter)(options);
|
|
62
61
|
return { router };
|
|
@@ -91,8 +90,6 @@ const NEXTJS_AGENT_CONFIG = {
|
|
|
91
90
|
},
|
|
92
91
|
},
|
|
93
92
|
ui: {
|
|
94
|
-
welcomeMessage: 'PostHog Next.js wizard (agent-powered)',
|
|
95
|
-
spinnerMessage: 'Writing your PostHog setup with events, error capture and more...',
|
|
96
93
|
successMessage: 'PostHog integration complete',
|
|
97
94
|
estimatedDurationMinutes: 8,
|
|
98
95
|
getOutroChanges: (context) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Simplified Next.js wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\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 getNextJsRouter,\n getNextJsVersionBucket,\n getNextJsRouterName,\n NextJsRouter,\n} from './utils';\n\n/**\n * Next.js framework configuration for the universal agent runner.\n */\nconst MINIMUM_NEXTJS_VERSION = '15.3.0';\n\nconst NEXTJS_AGENT_CONFIG = {\n metadata: {\n name: 'Next.js',\n integration: Integration.nextjs,\n docsUrl: 'https://posthog.com/docs/libraries/next-js',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/next-js',\n gatherContext: async (options: WizardOptions) => {\n const router = await getNextJsRouter(options);\n return { router };\n },\n },\n\n detection: {\n packageName: 'next',\n packageDisplayName: 'Next.js',\n getVersion: (packageJson: any) => getPackageVersion('next', packageJson),\n getVersionBucket: getNextJsVersionBucket,\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n NEXT_PUBLIC_POSTHOG_KEY: apiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context: any) => {\n const router = context.router as NextJsRouter;\n return {\n router: router === NextJsRouter.APP_ROUTER ? 'app' : 'pages',\n };\n },\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => {\n const router = context.router as NextJsRouter;\n const routerType = router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n return [`Router: ${routerType}`];\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 8,\n getOutroChanges: (context: any) => {\n const router = context.router as NextJsRouter;\n const routerName = getNextJsRouterName(router);\n return [\n `Analyzed your Next.js project structure (${routerName})`,\n `Created and configured PostHog initializers`,\n `Integrated PostHog into your application`,\n ];\n },\n getOutroNextSteps: () => {\n return [\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/**\n * Next.js wizard powered by the universal agent runner.\n */\nexport async function runNextjsWizardAgent(\n options: WizardOptions,\n): Promise<void> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n // Check Next.js version - agent wizard requires >= 15.3.0\n const packageJson = await getPackageDotJson(options);\n const nextVersion = getPackageVersion('next', packageJson);\n\n if (nextVersion) {\n const coercedVersion = semver.coerce(nextVersion);\n if (coercedVersion && semver.lt(coercedVersion, MINIMUM_NEXTJS_VERSION)) {\n const docsUrl =\n NEXTJS_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ??\n NEXTJS_AGENT_CONFIG.metadata.docsUrl;\n\n clack.log.warn(\n `Sorry: the wizard can't help you with Next.js ${nextVersion}. Upgrade to Next.js ${MINIMUM_NEXTJS_VERSION} or later, or check out the manual setup guide.`,\n );\n clack.log.info(`Setup Next.js manually: ${chalk.cyan(docsUrl)}`);\n clack.outro('PostHog wizard will see you next time!');\n return;\n }\n }\n\n await runAgentWizard(NEXTJS_AGENT_CONFIG, options);\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"]}
|
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,17 @@ 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
|
+
// In CI mode, bypass feature flags and always use the React Router wizard
|
|
78
|
+
if (wizardOptions.ci || flagValue === true) {
|
|
79
|
+
await (0, react_router_wizard_agent_1.runReactRouterWizardAgent)(wizardOptions);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
await (0, react_wizard_1.runReactWizard)(wizardOptions);
|
|
83
|
+
}
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
74
86
|
default:
|
|
75
87
|
clack_1.default.log.error('No setup wizard selected!');
|
|
76
88
|
}
|
|
@@ -112,6 +124,7 @@ async function getIntegrationForSetup(options) {
|
|
|
112
124
|
{ value: constants_1.Integration.nextjs, label: 'Next.js' },
|
|
113
125
|
{ value: constants_1.Integration.astro, label: 'Astro' },
|
|
114
126
|
{ value: constants_1.Integration.react, label: 'React' },
|
|
127
|
+
{ value: constants_1.Integration.reactRouter, label: 'React Router' },
|
|
115
128
|
{ value: constants_1.Integration.svelte, label: 'Svelte' },
|
|
116
129
|
{ value: constants_1.Integration.reactNative, label: 'React Native' },
|
|
117
130
|
],
|