@posthog/wizard
Version:
The PostHog wizard helps you to configure your project
276 lines • 10.4 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReactRouterMode = void 0;
exports.getReactRouterVersionBucket = getReactRouterVersionBucket;
exports.getReactRouterMode = getReactRouterMode;
exports.getReactRouterModeName = getReactRouterModeName;
const semver_1 = require("semver");
const fast_glob_1 = __importDefault(require("fast-glob"));
const clack_utils_1 = require("../utils/clack-utils");
const clack_1 = __importDefault(require("../utils/clack"));
const constants_1 = require("../lib/constants");
const package_json_1 = require("../utils/package-json");
const chalk_1 = __importDefault(require("chalk"));
const fs = __importStar(require("node:fs"));
const path = __importStar(require("node:path"));
const semver = __importStar(require("semver"));
var ReactRouterMode;
(function (ReactRouterMode) {
ReactRouterMode["V6"] = "v6";
ReactRouterMode["V7_FRAMEWORK"] = "v7-framework";
ReactRouterMode["V7_DATA"] = "v7-data";
ReactRouterMode["V7_DECLARATIVE"] = "v7-declarative";
})(ReactRouterMode || (exports.ReactRouterMode = ReactRouterMode = {}));
const IGNORE_PATTERNS = [
'**/node_modules/**',
'**/dist/**',
'**/build/**',
'**/public/**',
'**/.next/**',
];
/**
* Get React Router version bucket for analytics
*/
function getReactRouterVersionBucket(version) {
if (!version) {
return 'none';
}
try {
const minVer = (0, semver_1.minVersion)(version);
if (!minVer) {
return 'invalid';
}
const majorVersion = (0, semver_1.major)(minVer);
if (majorVersion >= 6) {
return `${majorVersion}.x`;
}
return `<6.0.0`;
}
catch {
return 'unknown';
}
}
/**
* Check if react-router.config.ts exists (indicates framework mode - React Router v7)
*/
async function hasReactRouterConfig({ installDir, }) {
const configMatches = await (0, fast_glob_1.default)('**/react-router.config.@(ts|js|tsx|jsx)', {
dot: true,
cwd: installDir,
ignore: IGNORE_PATTERNS,
});
return configMatches.length > 0;
}
/**
* Search for createBrowserRouter usage in source files
*/
async function hasCreateBrowserRouter({ installDir, }) {
const sourceFiles = await (0, fast_glob_1.default)('**/*.@(ts|tsx|js|jsx)', {
dot: true,
cwd: installDir,
ignore: IGNORE_PATTERNS,
});
for (const file of sourceFiles) {
try {
const filePath = path.join(installDir, file);
const content = fs.readFileSync(filePath, 'utf-8');
// Check for createBrowserRouter import or usage
if (content.includes('createBrowserRouter')) {
return true;
}
}
catch {
// Skip files that can't be read
continue;
}
}
return false;
}
/**
* Search for declarative BrowserRouter usage
*/
async function hasDeclarativeRouter({ installDir, }) {
const sourceFiles = await (0, fast_glob_1.default)('**/*.@(ts|tsx|js|jsx)', {
dot: true,
cwd: installDir,
ignore: IGNORE_PATTERNS,
});
for (const file of sourceFiles) {
try {
const filePath = path.join(installDir, file);
const content = fs.readFileSync(filePath, 'utf-8');
// Check for BrowserRouter usage (JSX or import)
if (content.includes('<BrowserRouter') ||
(content.includes('BrowserRouter') &&
(content.includes('from "react-router-dom"') ||
content.includes("from 'react-router-dom'")))) {
return true;
}
}
catch {
// Skip files that can't be read
continue;
}
}
return false;
}
/**
* Detect React Router mode
*/
async function getReactRouterMode(options) {
const { installDir } = options;
// First, get the React Router version
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
const reactRouterVersion = (0, package_json_1.getPackageVersion)('react-router-dom', packageJson) ||
(0, package_json_1.getPackageVersion)('react-router', packageJson);
if (!reactRouterVersion) {
// If we can't detect version, ask the user
clack_1.default.log.info(`Learn more about React Router modes: ${chalk_1.default.cyan('https://reactrouter.com/start/modes')}`);
const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
message: 'What React Router version and mode are you using?',
options: [
{
label: 'React Router v6',
value: ReactRouterMode.V6,
},
{
label: 'React Router v7 - Framework mode',
value: ReactRouterMode.V7_FRAMEWORK,
},
{
label: 'React Router v7 - Data mode',
value: ReactRouterMode.V7_DATA,
},
{
label: 'React Router v7 - Declarative mode',
value: ReactRouterMode.V7_DECLARATIVE,
},
],
}), constants_1.Integration.reactRouter);
return result;
}
const coercedVersion = semver.coerce(reactRouterVersion);
const majorVersion = coercedVersion ? (0, semver_1.major)(coercedVersion) : null;
// If v6, return V6
if (majorVersion === 6) {
clack_1.default.log.info('Detected React Router v6');
return ReactRouterMode.V6;
}
// If v7, detect the mode
if (majorVersion === 7) {
// First check for framework mode (react-router.config.ts)
const hasConfig = await hasReactRouterConfig({ installDir });
if (hasConfig) {
clack_1.default.log.info('Detected React Router v7 - Framework mode');
return ReactRouterMode.V7_FRAMEWORK;
}
// Check for data mode (createBrowserRouter)
const hasDataMode = await hasCreateBrowserRouter({ installDir });
if (hasDataMode) {
clack_1.default.log.info('Detected React Router v7 - Data mode');
return ReactRouterMode.V7_DATA;
}
// Check for declarative mode (BrowserRouter)
const hasDeclarative = await hasDeclarativeRouter({ installDir });
if (hasDeclarative) {
clack_1.default.log.info('Detected React Router v7 - Declarative mode');
return ReactRouterMode.V7_DECLARATIVE;
}
// If v7 but can't detect mode, ask the user
clack_1.default.log.info(`Learn more about React Router modes: ${chalk_1.default.cyan('https://reactrouter.com/start/modes')}`);
const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
message: 'What React Router v7 mode are you using?',
options: [
{
label: 'Framework mode',
value: ReactRouterMode.V7_FRAMEWORK,
},
{
label: 'Data mode',
value: ReactRouterMode.V7_DATA,
},
{
label: 'Declarative mode',
value: ReactRouterMode.V7_DECLARATIVE,
},
],
}), constants_1.Integration.reactRouter);
return result;
}
// If version is not 6 or 7, default to asking
clack_1.default.log.info(`Learn more about React Router modes: ${chalk_1.default.cyan('https://reactrouter.com/start/modes')}`);
const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
message: 'What React Router version and mode are you using?',
options: [
{
label: 'React Router v6',
value: ReactRouterMode.V6,
},
{
label: 'React Router v7 - Framework mode',
value: ReactRouterMode.V7_FRAMEWORK,
},
{
label: 'React Router v7 - Data mode',
value: ReactRouterMode.V7_DATA,
},
{
label: 'React Router v7 - Declarative mode',
value: ReactRouterMode.V7_DECLARATIVE,
},
],
}), constants_1.Integration.reactRouter);
return result;
}
/**
* Get human-readable name for React Router mode
*/
function getReactRouterModeName(mode) {
switch (mode) {
case ReactRouterMode.V6:
return 'v6';
case ReactRouterMode.V7_FRAMEWORK:
return 'v7 Framework mode';
case ReactRouterMode.V7_DATA:
return 'v7 Data mode';
case ReactRouterMode.V7_DECLARATIVE:
return 'v7 Declarative mode';
}
}
//# sourceMappingURL=utils.js.map