@posthog/wizard 1.1.0 → 1.2.1
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/bin.js +60 -4
- package/dist/bin.js.map +1 -1
- package/dist/src/lib/helper-functions.d.ts +1 -0
- package/dist/src/lib/helper-functions.js +6 -0
- package/dist/src/lib/helper-functions.js.map +1 -0
- package/dist/src/mcp.d.ts +9 -0
- package/dist/src/mcp.js +69 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard.js +5 -3
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/react/react-wizard.js +4 -1
- package/dist/src/react/react-wizard.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +4 -1
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/run.d.ts +1 -1
- package/dist/src/run.js +1 -4
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -10
- package/dist/src/steps/__tests__/add-editor-rules.test.js.map +1 -1
- package/dist/src/steps/add-editor-rules.d.ts +1 -2
- package/dist/src/steps/add-editor-rules.js +1 -22
- package/dist/src/steps/add-editor-rules.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +7 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +8 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.d.ts +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js +318 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/claude.test.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.d.ts +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js +443 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/cursor.test.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +40 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +119 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +40 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +112 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +35 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js +29 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +15 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.js +152 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -0
- package/dist/src/steps/index.d.ts +2 -0
- package/dist/src/steps/index.js +2 -0
- package/dist/src/steps/index.js.map +1 -1
- package/dist/src/svelte/svelte-wizard.js +4 -1
- package/dist/src/svelte/svelte-wizard.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +1 -1
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/package.json +3 -2
package/dist/bin.js
CHANGED
|
@@ -15,14 +15,70 @@ if (!(0, semver_1.satisfies)(process.version, NODE_VERSION_RANGE)) {
|
|
|
15
15
|
(0, logging_1.red)(`PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`);
|
|
16
16
|
process.exit(1);
|
|
17
17
|
}
|
|
18
|
+
const mcp_1 = require("./src/mcp");
|
|
18
19
|
const run_1 = require("./src/run");
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
(0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
21
|
+
// global options
|
|
22
|
+
.options({
|
|
21
23
|
debug: {
|
|
22
24
|
default: false,
|
|
23
25
|
describe: 'Enable verbose logging\nenv: POSTHOG_WIZARD_DEBUG',
|
|
24
26
|
type: 'boolean',
|
|
25
27
|
},
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
region: {
|
|
29
|
+
describe: 'PostHog cloud region\nenv: POSTHOG_WIZARD_REGION',
|
|
30
|
+
choices: ['us', 'eu'],
|
|
31
|
+
type: 'string',
|
|
32
|
+
},
|
|
33
|
+
default: {
|
|
34
|
+
default: false,
|
|
35
|
+
describe: 'Use default options for all prompts\nenv: POSTHOG_WIZARD_DEFAULT',
|
|
36
|
+
type: 'boolean',
|
|
37
|
+
},
|
|
38
|
+
signup: {
|
|
39
|
+
default: false,
|
|
40
|
+
describe: 'Create a new PostHog account during setup\nenv: POSTHOG_WIZARD_SIGNUP',
|
|
41
|
+
type: 'boolean',
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
.command(['$0'], 'Run the PostHog setup wizard', (yargs) => {
|
|
45
|
+
return yargs.options({
|
|
46
|
+
'force-install': {
|
|
47
|
+
default: false,
|
|
48
|
+
describe: 'Force install packages even if peer dependency checks fail\nenv: POSTHOG_WIZARD_FORCE_INSTALL',
|
|
49
|
+
type: 'boolean',
|
|
50
|
+
},
|
|
51
|
+
'install-dir': {
|
|
52
|
+
describe: 'Directory to install PostHog in\nenv: POSTHOG_WIZARD_INSTALL_DIR',
|
|
53
|
+
type: 'string',
|
|
54
|
+
},
|
|
55
|
+
integration: {
|
|
56
|
+
describe: 'Integration to set up',
|
|
57
|
+
choices: ['nextjs', 'react', 'svelte', 'react-native'],
|
|
58
|
+
type: 'string',
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}, (argv) => {
|
|
62
|
+
void (0, run_1.runWizard)(argv);
|
|
63
|
+
})
|
|
64
|
+
.command('mcp <command>', 'MCP server management commands', (yargs) => {
|
|
65
|
+
return yargs
|
|
66
|
+
.command('add', 'Install PostHog MCP server to supported clients', (yargs) => {
|
|
67
|
+
return yargs.options({});
|
|
68
|
+
}, (argv) => {
|
|
69
|
+
void (0, mcp_1.runMCPInstall)(argv);
|
|
70
|
+
})
|
|
71
|
+
.command('remove', 'Remove PostHog MCP server from supported clients', (yargs) => {
|
|
72
|
+
return yargs.options({});
|
|
73
|
+
}, () => {
|
|
74
|
+
void (0, mcp_1.runMCPRemove)();
|
|
75
|
+
})
|
|
76
|
+
.demandCommand(1, 'You must specify a subcommand (add or remove)')
|
|
77
|
+
.help();
|
|
78
|
+
})
|
|
79
|
+
.help()
|
|
80
|
+
.alias('help', 'h')
|
|
81
|
+
.version()
|
|
82
|
+
.alias('version', 'v')
|
|
83
|
+
.wrap(yargs_1.default.terminalWidth()).argv;
|
|
28
84
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":";;;;;;AACA,mCAAmC;AACnC,iDAA0C;AAE1C,kDAA0B;AAC1B,2CAAwC;AAExC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAEvC,iFAAiF;AACjF,+BAA+B;AAC/B,IAAI,CAAC,IAAA,kBAAS,EAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;IACpD,IAAA,aAAG,EACD,mCAAmC,kBAAkB,2BAA2B,OAAO,CAAC,OAAO,wCAAwC,CACxI,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":";;;;;;AACA,mCAAmC;AACnC,iDAA0C;AAE1C,kDAA0B;AAC1B,2CAAwC;AAExC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAEvC,iFAAiF;AACjF,+BAA+B;AAC/B,IAAI,CAAC,IAAA,kBAAS,EAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;IACpD,IAAA,aAAG,EACD,mCAAmC,kBAAkB,2BAA2B,OAAO,CAAC,OAAO,wCAAwC,CACxI,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,mCAAwD;AAExD,mCAAsC;AAEtC,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,iBAAiB;KAChB,OAAO,CAAC;IACP,KAAK,EAAE;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,mDAAmD;QAC7D,IAAI,EAAE,SAAS;KAChB;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,kDAAkD;QAC5D,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QACrB,IAAI,EAAE,QAAQ;KACf;IACD,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,QAAQ,EACN,kEAAkE;QACpE,IAAI,EAAE,SAAS;KAChB;IACD,MAAM,EAAE;QACN,OAAO,EAAE,KAAK;QACd,QAAQ,EACN,uEAAuE;QACzE,IAAI,EAAE,SAAS;KAChB;CACF,CAAC;KACD,OAAO,CACN,CAAC,IAAI,CAAC,EACN,8BAA8B,EAC9B,CAAC,KAAK,EAAE,EAAE;IACR,OAAO,KAAK,CAAC,OAAO,CAAC;QACnB,eAAe,EAAE;YACf,OAAO,EAAE,KAAK;YACd,QAAQ,EACN,+FAA+F;YACjG,IAAI,EAAE,SAAS;SAChB;QACD,aAAa,EAAE;YACb,QAAQ,EACN,kEAAkE;YACpE,IAAI,EAAE,QAAQ;SACf;QACD,WAAW,EAAE;YACX,QAAQ,EAAE,uBAAuB;YACjC,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC;YACtD,IAAI,EAAE,QAAQ;SACf;KACF,CAAC,CAAC;AACL,CAAC,EACD,CAAC,IAAI,EAAE,EAAE;IACP,KAAK,IAAA,eAAS,EAAC,IAAgC,CAAC,CAAC;AACnD,CAAC,CACF;KACA,OAAO,CAAC,eAAe,EAAE,gCAAgC,EAAE,CAAC,KAAK,EAAE,EAAE;IACpE,OAAO,KAAK;SACT,OAAO,CACN,KAAK,EACL,iDAAiD,EACjD,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,EACD,CAAC,IAAI,EAAE,EAAE;QACP,KAAK,IAAA,mBAAa,EAChB,IAA4D,CAC7D,CAAC;IACJ,CAAC,CACF;SACA,OAAO,CACN,QAAQ,EACR,kDAAkD,EAClD,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,EACD,GAAG,EAAE;QACH,KAAK,IAAA,kBAAY,GAAE,CAAC;IACtB,CAAC,CACF;SACA,aAAa,CAAC,CAAC,EAAE,+CAA+C,CAAC;SACjE,IAAI,EAAE,CAAC;AACZ,CAAC,CAAC;KACD,IAAI,EAAE;KACN,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;KAClB,OAAO,EAAE;KACT,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;KACrB,IAAI,CAAC,eAAK,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { satisfies } from 'semver';\nimport { red } from './src/utils/logging';\n\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nconst NODE_VERSION_RANGE = '>=18.17.0';\n\n// Have to run this above the other imports because they are importing clack that\n// has the problematic imports.\nif (!satisfies(process.version, NODE_VERSION_RANGE)) {\n red(\n `PostHog wizard requires Node.js ${NODE_VERSION_RANGE}. You are using Node.js ${process.version}. Please upgrade your Node.js version.`,\n );\n process.exit(1);\n}\n\nimport { runMCPInstall, runMCPRemove } from './src/mcp';\nimport type { CloudRegion, WizardOptions } from './src/utils/types';\nimport { runWizard } from './src/run';\n\nyargs(hideBin(process.argv))\n // global options\n .options({\n debug: {\n default: false,\n describe: 'Enable verbose logging\\nenv: POSTHOG_WIZARD_DEBUG',\n type: 'boolean',\n },\n region: {\n describe: 'PostHog cloud region\\nenv: POSTHOG_WIZARD_REGION',\n choices: ['us', 'eu'],\n type: 'string',\n },\n default: {\n default: false,\n describe:\n 'Use default options for all prompts\\nenv: POSTHOG_WIZARD_DEFAULT',\n type: 'boolean',\n },\n signup: {\n default: false,\n describe:\n 'Create a new PostHog account during setup\\nenv: POSTHOG_WIZARD_SIGNUP',\n type: 'boolean',\n },\n })\n .command(\n ['$0'],\n 'Run the PostHog setup wizard',\n (yargs) => {\n return yargs.options({\n 'force-install': {\n default: false,\n describe:\n 'Force install packages even if peer dependency checks fail\\nenv: POSTHOG_WIZARD_FORCE_INSTALL',\n type: 'boolean',\n },\n 'install-dir': {\n describe:\n 'Directory to install PostHog in\\nenv: POSTHOG_WIZARD_INSTALL_DIR',\n type: 'string',\n },\n integration: {\n describe: 'Integration to set up',\n choices: ['nextjs', 'react', 'svelte', 'react-native'],\n type: 'string',\n },\n });\n },\n (argv) => {\n void runWizard(argv as unknown as WizardOptions);\n },\n )\n .command('mcp <command>', 'MCP server management commands', (yargs) => {\n return yargs\n .command(\n 'add',\n 'Install PostHog MCP server to supported clients',\n (yargs) => {\n return yargs.options({});\n },\n (argv) => {\n void runMCPInstall(\n argv as unknown as { signup: boolean; region?: CloudRegion },\n );\n },\n )\n .command(\n 'remove',\n 'Remove PostHog MCP server from supported clients',\n (yargs) => {\n return yargs.options({});\n },\n () => {\n void runMCPRemove();\n },\n )\n .demandCommand(1, 'You must specify a subcommand (add or remove)')\n .help();\n })\n .help()\n .alias('help', 'h')\n .version()\n .alias('version', 'v')\n .wrap(yargs.terminalWidth()).argv;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const sleep: (ms: number) => Promise<unknown>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-functions.js","sourceRoot":"","sources":["../../../src/lib/helper-functions.ts"],"names":[],"mappings":";;;AAAO,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAClC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AADvC,QAAA,KAAK,SACkC","sourcesContent":["export const sleep = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CloudRegion } from './utils/types';
|
|
2
|
+
export declare const runMCPInstall: (options: {
|
|
3
|
+
signup: boolean;
|
|
4
|
+
region?: CloudRegion;
|
|
5
|
+
}) => Promise<void>;
|
|
6
|
+
export declare const runMCPRemove: () => Promise<void>;
|
|
7
|
+
export declare const getPersonalApiKey: (options: {
|
|
8
|
+
cloudRegion: CloudRegion;
|
|
9
|
+
}) => Promise<string>;
|
package/dist/src/mcp.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getPersonalApiKey = exports.runMCPRemove = exports.runMCPInstall = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const add_mcp_server_to_clients_1 = require("./steps/add-mcp-server-to-clients");
|
|
9
|
+
const clack_1 = __importDefault(require("./utils/clack"));
|
|
10
|
+
const clack_utils_1 = require("./utils/clack-utils");
|
|
11
|
+
const opn_1 = __importDefault(require("opn"));
|
|
12
|
+
const urls_1 = require("./utils/urls");
|
|
13
|
+
const helper_functions_1 = require("./lib/helper-functions");
|
|
14
|
+
const runMCPInstall = async (options) => {
|
|
15
|
+
clack_1.default.intro('Installing the PostHog MCP server.');
|
|
16
|
+
await (0, add_mcp_server_to_clients_1.addMCPServerToClientsStep)({
|
|
17
|
+
cloudRegion: options.region,
|
|
18
|
+
askPermission: false,
|
|
19
|
+
});
|
|
20
|
+
clack_1.default.outro(`${chalk_1.default.green('You might need to restart your MCP clients to see the changes.')}
|
|
21
|
+
|
|
22
|
+
Get started with some prompts like:
|
|
23
|
+
|
|
24
|
+
- What feature flags do I have active?
|
|
25
|
+
- Add a new feature flag for our homepage redesign
|
|
26
|
+
- What are my most common errors?
|
|
27
|
+
`);
|
|
28
|
+
};
|
|
29
|
+
exports.runMCPInstall = runMCPInstall;
|
|
30
|
+
const runMCPRemove = async () => {
|
|
31
|
+
const results = await (0, add_mcp_server_to_clients_1.removeMCPServerFromClientsStep)({});
|
|
32
|
+
if (results.length === 0) {
|
|
33
|
+
clack_1.default.outro(`No PostHog MCP servers found to remove.`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
clack_1.default.outro(`PostHog MCP server removed from:
|
|
37
|
+
${results.map((c) => `- ${c}`).join('\n ')}
|
|
38
|
+
|
|
39
|
+
${chalk_1.default.green('You might need to restart your MCP clients to see the changes.')}`);
|
|
40
|
+
};
|
|
41
|
+
exports.runMCPRemove = runMCPRemove;
|
|
42
|
+
const getPersonalApiKey = async (options) => {
|
|
43
|
+
const cloudUrl = (0, urls_1.getCloudUrlFromRegion)(options.cloudRegion);
|
|
44
|
+
const urlToOpen = `${cloudUrl}/settings/user-api-keys?preset=mcp_server`;
|
|
45
|
+
const spinner = clack_1.default.spinner();
|
|
46
|
+
spinner.start(`Opening your project settings so you can get a Personal API key...`);
|
|
47
|
+
await (0, helper_functions_1.sleep)(1500);
|
|
48
|
+
spinner.stop(`Opened your project settings. If the link didn't open automatically, open the following URL in your browser to get a Personal API key: \n\n${chalk_1.default.cyan(urlToOpen)}`);
|
|
49
|
+
(0, opn_1.default)(urlToOpen, { wait: false }).catch(() => {
|
|
50
|
+
// opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here
|
|
51
|
+
});
|
|
52
|
+
const personalApiKey = await clack_1.default.password({
|
|
53
|
+
message: 'Paste in your Personal API key:',
|
|
54
|
+
validate(value) {
|
|
55
|
+
if (value.length === 0)
|
|
56
|
+
return `Value is required!`;
|
|
57
|
+
if (!value.startsWith('phx_')) {
|
|
58
|
+
return `That doesn't look right, are you sure you copied the right key? It should start with 'phx_'`;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
if (!personalApiKey) {
|
|
63
|
+
await (0, clack_utils_1.abort)('Unable to proceed without a personal API key.');
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
return personalApiKey;
|
|
67
|
+
};
|
|
68
|
+
exports.getPersonalApiKey = getPersonalApiKey;
|
|
69
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,iFAG2C;AAC3C,0DAAkC;AAClC,qDAA4C;AAE5C,8CAAsB;AACtB,uCAAqD;AACrD,6DAA+C;AAExC,MAAM,aAAa,GAAG,KAAK,EAAE,OAGnC,EAAE,EAAE;IACH,eAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAElD,MAAM,IAAA,qDAAyB,EAAC;QAC9B,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;IAEH,eAAK,CAAC,KAAK,CAAC,GAAG,eAAK,CAAC,KAAK,CACxB,gEAAgE,CACjE;;;;;;;CAOF,CAAC,CAAC;AACH,CAAC,CAAC;AArBW,QAAA,aAAa,iBAqBxB;AAEK,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;IACrC,MAAM,OAAO,GAAG,MAAM,IAAA,0DAA8B,EAAC,EAAE,CAAC,CAAC;IAEzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,eAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,eAAK,CAAC,KAAK,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;IAEzC,eAAK,CAAC,KAAK,CACX,gEAAgE,CACjE,EAAE,CAAC,CAAC;AACP,CAAC,CAAC;AAdW,QAAA,YAAY,gBAcvB;AAEK,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAEvC,EAAmB,EAAE;IACpB,MAAM,QAAQ,GAAG,IAAA,4BAAqB,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG,GAAG,QAAQ,2CAA2C,CAAC;IAEzE,MAAM,OAAO,GAAG,eAAK,CAAC,OAAO,EAAE,CAAC;IAChC,OAAO,CAAC,KAAK,CACX,oEAAoE,CACrE,CAAC;IAEF,MAAM,IAAA,wBAAK,EAAC,IAAI,CAAC,CAAC;IAElB,OAAO,CAAC,IAAI,CACV,8IAA8I,eAAK,CAAC,IAAI,CACtJ,SAAS,CACV,EAAE,CACJ,CAAC;IAEF,IAAA,aAAG,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACzC,iGAAiG;IACnG,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,eAAK,CAAC,QAAQ,CAAC;QAC1C,OAAO,EAAE,iCAAiC;QAC1C,QAAQ,CAAC,KAAK;YACZ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,oBAAoB,CAAC;YAEpD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,OAAO,6FAA6F,CAAC;YACvG,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAA,mBAAK,EAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,cAAwB,CAAC;AAClC,CAAC,CAAC;AAzCW,QAAA,iBAAiB,qBAyC5B","sourcesContent":["import chalk from 'chalk';\nimport {\n addMCPServerToClientsStep,\n removeMCPServerFromClientsStep,\n} from './steps/add-mcp-server-to-clients';\nimport clack from './utils/clack';\nimport { abort } from './utils/clack-utils';\nimport type { CloudRegion } from './utils/types';\nimport opn from 'opn';\nimport { getCloudUrlFromRegion } from './utils/urls';\nimport { sleep } from './lib/helper-functions';\n\nexport const runMCPInstall = async (options: {\n signup: boolean;\n region?: CloudRegion;\n}) => {\n clack.intro('Installing the PostHog MCP server.');\n\n await addMCPServerToClientsStep({\n cloudRegion: options.region,\n askPermission: false,\n });\n\n clack.outro(`${chalk.green(\n 'You might need to restart your MCP clients to see the changes.',\n )}\n\nGet started with some prompts like:\n\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};\n\nexport const runMCPRemove = async () => {\n const results = await removeMCPServerFromClientsStep({});\n\n if (results.length === 0) {\n clack.outro(`No PostHog MCP servers found to remove.`);\n return;\n }\n\n clack.outro(`PostHog MCP server removed from:\n ${results.map((c) => `- ${c}`).join('\\n ')}\n \n ${chalk.green(\n 'You might need to restart your MCP clients to see the changes.',\n )}`);\n};\n\nexport const getPersonalApiKey = async (options: {\n cloudRegion: CloudRegion;\n}): Promise<string> => {\n const cloudUrl = getCloudUrlFromRegion(options.cloudRegion);\n\n const urlToOpen = `${cloudUrl}/settings/user-api-keys?preset=mcp_server`;\n\n const spinner = clack.spinner();\n spinner.start(\n `Opening your project settings so you can get a Personal API key...`,\n );\n\n await sleep(1500);\n\n spinner.stop(\n `Opened your project settings. If the link didn't open automatically, open the following URL in your browser to get a Personal API key: \\n\\n${chalk.cyan(\n urlToOpen,\n )}`,\n );\n\n opn(urlToOpen, { wait: false }).catch(() => {\n // opn throws in environments that don't have a browser (e.g. remote shells) so we just noop here\n });\n\n const personalApiKey = await clack.password({\n message: 'Paste in your Personal API key:',\n validate(value) {\n if (value.length === 0) return `Value is required!`;\n\n if (!value.startsWith('phx_')) {\n return `That doesn't look right, are you sure you copied the right key? It should start with 'phx_'`;\n }\n },\n });\n\n if (!personalApiKey) {\n await abort('Unable to proceed without a personal API key.');\n return '';\n }\n\n return personalApiKey as string;\n};\n"]}
|
|
@@ -16,7 +16,6 @@ const file_utils_1 = require("../utils/file-utils");
|
|
|
16
16
|
const clack_utils_2 = require("../utils/clack-utils");
|
|
17
17
|
const messages_1 = require("../lib/messages");
|
|
18
18
|
const steps_1 = require("../steps");
|
|
19
|
-
const upload_environment_variables_1 = require("../steps/upload-environment-variables");
|
|
20
19
|
async function runNextjsWizard(options) {
|
|
21
20
|
(0, clack_utils_1.printWelcome)({
|
|
22
21
|
wizardName: 'PostHog Next.js wizard',
|
|
@@ -96,7 +95,7 @@ async function runNextjsWizard(options) {
|
|
|
96
95
|
installDir: options.installDir,
|
|
97
96
|
integration: constants_1.Integration.nextjs,
|
|
98
97
|
});
|
|
99
|
-
const uploadedEnvVars = await (0,
|
|
98
|
+
const uploadedEnvVars = await (0, steps_1.uploadEnvironmentVariablesStep)({
|
|
100
99
|
NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,
|
|
101
100
|
NEXT_PUBLIC_POSTHOG_HOST: host,
|
|
102
101
|
}, {
|
|
@@ -107,13 +106,16 @@ async function runNextjsWizard(options) {
|
|
|
107
106
|
rulesName: 'next-rules.md',
|
|
108
107
|
installDir: options.installDir,
|
|
109
108
|
integration: constants_1.Integration.nextjs,
|
|
110
|
-
default: options.default,
|
|
111
109
|
});
|
|
112
110
|
const prUrl = await (0, steps_1.createPRStep)({
|
|
113
111
|
installDir: options.installDir,
|
|
114
112
|
integration: constants_1.Integration.nextjs,
|
|
115
113
|
addedEditorRules,
|
|
116
114
|
});
|
|
115
|
+
await (0, steps_1.addMCPServerToClientsStep)({
|
|
116
|
+
cloudRegion,
|
|
117
|
+
integration: constants_1.Integration.nextjs,
|
|
118
|
+
});
|
|
117
119
|
const outroMessage = (0, messages_1.getOutroMessage)({
|
|
118
120
|
options,
|
|
119
121
|
integration: constants_1.Integration.nextjs,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\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 {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport { getNextjsAppRouterDocs, getNextjsPagesRouterDocs } 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 { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addOrUpdateEnvironmentVariablesStep,\n createPRStep,\n runPrettierStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Next.js wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Next.js wizard requires AI to get setup right now. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\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, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { projectApiKey, wizardHash, host } = 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.nextjs,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const router = await getNextJsRouter(options);\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const installationDocumentation = getInstallationDocumentation({\n router,\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${getNextJsRouterName(router)}`,\n );\n\n const filesToChange = await getFilesToChange({\n integration: Integration.nextjs,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.nextjs,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n const addedEditorRules = await addEditorRulesStep({\n rulesName: 'next-rules.md',\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const prUrl = await createPRStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n addedEditorRules,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.nextjs,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n prUrl,\n uploadedEnvVars,\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\nfunction getInstallationDocumentation({\n router,\n host,\n language,\n}: {\n router: NextJsRouter;\n host: string;\n language: 'typescript' | 'javascript';\n}) {\n if (router === NextJsRouter.PAGES_ROUTER) {\n return getNextjsPagesRouterDocs({ host, language });\n }\n\n return getNextjsAppRouterDocs({ host, language });\n}\n"]}
|
|
@@ -91,7 +91,6 @@ async function runReactWizard(options) {
|
|
|
91
91
|
installDir: options.installDir,
|
|
92
92
|
rulesName: 'react-rules.md',
|
|
93
93
|
integration: constants_1.Integration.react,
|
|
94
|
-
default: options.default,
|
|
95
94
|
});
|
|
96
95
|
const uploadedEnvVars = await (0, upload_environment_variables_1.uploadEnvironmentVariablesStep)({
|
|
97
96
|
[envVarPrefix + 'POSTHOG_KEY']: projectApiKey,
|
|
@@ -100,6 +99,10 @@ async function runReactWizard(options) {
|
|
|
100
99
|
integration: constants_1.Integration.react,
|
|
101
100
|
options,
|
|
102
101
|
});
|
|
102
|
+
await (0, steps_1.addMCPServerToClientsStep)({
|
|
103
|
+
cloudRegion,
|
|
104
|
+
integration: constants_1.Integration.react,
|
|
105
|
+
});
|
|
103
106
|
const outroMessage = (0, messages_1.getOutroMessage)({
|
|
104
107
|
options,
|
|
105
108
|
integration: constants_1.Integration.react,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-wizard.js","sourceRoot":"","sources":["../../../src/react/react-wizard.ts"],"names":[],"mappings":";AAAA,8BAA8B;;;;;
|
|
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, wizardHash, host } = 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 wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.react,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\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 });\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"]}
|
|
@@ -105,7 +105,10 @@ async function runReactNativeWizard(options) {
|
|
|
105
105
|
installDir: options.installDir,
|
|
106
106
|
rulesName: 'react-native-rules.md',
|
|
107
107
|
integration: constants_1.Integration.reactNative,
|
|
108
|
-
|
|
108
|
+
});
|
|
109
|
+
await (0, steps_1.addMCPServerToClientsStep)({
|
|
110
|
+
cloudRegion,
|
|
111
|
+
integration: constants_1.Integration.reactNative,
|
|
109
112
|
});
|
|
110
113
|
const packageManagerForOutro = await (0, clack_utils_1.getPackageManager)({
|
|
111
114
|
installDir: options.installDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-native-wizard.js","sourceRoot":"","sources":["../../../src/react-native/react-native-wizard.ts"],"names":[],"mappings":";AAAA,8BAA8B;;;;;
|
|
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, wizardHash, host } = 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 wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.reactNative,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\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 });\n\n const packageManagerForOutro = await getPackageManager({\n installDir: options.installDir,\n });\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"]}
|
package/dist/src/run.d.ts
CHANGED
package/dist/src/run.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.runWizard = runWizard;
|
|
7
7
|
const clack_utils_1 = require("./utils/clack-utils");
|
|
8
8
|
const nextjs_wizard_1 = require("./nextjs/nextjs-wizard");
|
|
9
9
|
const constants_1 = require("./lib/constants");
|
|
@@ -18,9 +18,6 @@ const react_native_wizard_1 = require("./react-native/react-native-wizard");
|
|
|
18
18
|
const events_1 = require("events");
|
|
19
19
|
const chalk_1 = __importDefault(require("chalk"));
|
|
20
20
|
events_1.EventEmitter.defaultMaxListeners = 50;
|
|
21
|
-
async function run(argv) {
|
|
22
|
-
await runWizard(argv);
|
|
23
|
-
}
|
|
24
21
|
async function runWizard(argv) {
|
|
25
22
|
const finalArgs = {
|
|
26
23
|
...argv,
|
package/dist/src/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":";;;;;AA6BA,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport { getIntegrationDescription, Integration } from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: finalArgs.installDir\n ? path.join(process.cwd(), finalArgs.installDir)\n : process.cwd(),\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizard(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n clack.log.error(\n `Something went wrong. You can read the documentation for PostHog at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to setup PostHog manually.`,\n );\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.react, label: 'React' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n"]}
|
|
@@ -204,15 +204,5 @@ A given feature flag should be used in as few places as possible. Do not increas
|
|
|
204
204
|
// Check if success message was logged
|
|
205
205
|
expect(infoMock).toHaveBeenCalledWith(`Added Cursor rules to ${chalk_1.default.bold.cyan('.cursor/rules/posthog-integration.mdc')}`);
|
|
206
206
|
});
|
|
207
|
-
it('should not install rules when user declines', async () => {
|
|
208
|
-
process.env.CURSOR_TRACE_ID = 'test-trace-id';
|
|
209
|
-
selectMock.mockResolvedValue(false);
|
|
210
|
-
await (0, add_editor_rules_1.addEditorRulesStep)(mockOptions);
|
|
211
|
-
expect(mkdirMock).not.toHaveBeenCalled();
|
|
212
|
-
expect(readFileMock).not.toHaveBeenCalled();
|
|
213
|
-
expect(writeFileMock).not.toHaveBeenCalled();
|
|
214
|
-
expect(captureMock).not.toHaveBeenCalled();
|
|
215
|
-
expect(infoMock).not.toHaveBeenCalled();
|
|
216
|
-
});
|
|
217
207
|
});
|
|
218
208
|
//# sourceMappingURL=add-editor-rules.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-editor-rules.test.js","sourceRoot":"","sources":["../../../../src/steps/__tests__/add-editor-rules.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,gDAAwB;AACxB,0DAAyD;AACzD,qDAAkD;AAClD,8DAAsC;AAEtC,kDAA0B;AAE1B,oBAAoB;AACpB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACrB,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QACnB,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;KACrB;CACF,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,SAAS,EAAE;QACT,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KACjD;CACF,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,GAAG,EAAE;QACH,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;KAChB;IACD,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACzC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,KAAc,EAAmB,EAAE,CAAC,KAAK,CAAC;IAC7D,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,WAAW,GAAG;QAClB,UAAU,EAAE,WAAW;QACvB,SAAS,EAAE,gBAAgB;QAC3B,WAAW,EAAE,OAAsB;KACpC,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAChC,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAkB,CAAC;IACjD,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAqB,CAAC;IACvD,MAAM,aAAa,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAsB,CAAC;IACzD,6DAA6D;IAC7D,MAAM,WAAW,GAAG,qBAAS,CAAC,OAAoB,CAAC;IACnD,MAAM,QAAQ,GAAG,eAAK,CAAC,GAAG,CAAC,IAAiB,CAAC;IAC7C,MAAM,UAAU,GAAG,eAAK,CAAC,MAAmB,CAAC;IAC7C,MAAM,YAAY,GAAG,eAAK,CAAC,QAAgC,CAAC;IAC5D,MAAM,UAAU,GAAG,eAAK,CAAC,MAAmB,CAAC;IAE7C,UAAU,CAAC,GAAG,EAAE;QACd,mCAAmC;QACnC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,6BAA6B;QAC5B,EAAE,CAAC,QAAQ,CAAC,KAAmB,CAAC,SAAS,EAAE,CAAC;QAC5C,EAAE,CAAC,QAAQ,CAAC,QAAsB,CAAC,SAAS,EAAE,CAAC;QAC/C,EAAE,CAAC,QAAQ,CAAC,SAAuB,CAAC,SAAS,EAAE,CAAC;QACjD,UAAU,CAAC,SAAS,EAAE,CAAC;QACvB,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC;QACtE,YAAY,CAAC,SAAS,EAAE,CAAC;QACzB,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,UAAU,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAEnC,MAAM,IAAA,qCAAkB,EAAC,WAAW,CAAC,CAAC;QAEtC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC;QAE9C,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;QACjE,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;QACrD,MAAM,qBAAqB,GACzB,iDAAiD,CAAC;QAEnD,EAAE,CAAC,QAAQ,CAAC,QAAsB;aAChC,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;aACjE,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAErE,MAAM,IAAA,qCAAkB,EAAC,WAAW,CAAC,CAAC;QAEtC,iCAAiC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,EAC1C,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;QAEF,mCAAmC;QACnC,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,uBAAuB,CAC1C,CAAC,EACD,MAAM,CAAC,cAAc,CAAC,kBAAkB,CAAC,EACzC,MAAM,CACP,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,uBAAuB,CAC1C,CAAC,EACD,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,EACvC,MAAM,CACP,CAAC;QAEF,iDAAiD;QACjD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,CAAC,EACrE,qBAAqB,EACrB,MAAM,CACP,CAAC;QAEF,mCAAmC;QACnC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE;YAC7D,MAAM,EAAE,oBAAoB;YAC5B,WAAW,EAAE,WAAW,CAAC,WAAW;SACrC,CAAC,CAAC;QAEH,sCAAsC;QACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,yBAAyB,eAAK,CAAC,IAAI,CAAC,IAAI,CACtC,uCAAuC,CACxC,EAAE,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAE9C,kCAAkC;QACjC,EAAE,CAAC,QAAQ,CAAC,QAAsB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEjE,MAAM,MAAM,CAAC,IAAA,qCAAkB,EAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEjD,+BAA+B;QAC9B,EAAE,CAAC,QAAQ,CAAC,KAAmB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE9D,MAAM,MAAM,CAAC,IAAA,qCAAkB,EAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzE,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC;QAE9C,MAAM,kBAAkB,GAAG;;;;;;;;;;SAUtB,CAAC;QAEN,MAAM,kBAAkB,GAAG;;;;oLAIqJ,CAAC;QAEjL,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;SAczB,CAAC;QAEL,EAAE,CAAC,QAAQ,CAAC,QAAsB;aAChC,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;aACjE,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAErE,MAAM,IAAA,qCAAkB,EAAC,WAAW,CAAC,CAAC;QAEtC,iCAAiC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,EAC1C,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;QAEF,mCAAmC;QACnC,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,cAAc,CAAC,kBAAkB,CAAC,EACzC,MAAM,CACP,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,EACvC,MAAM,CACP,CAAC;QAEF,iDAAiD;QACjD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CACxC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,CAAC,EACrE,qBAAqB,EACrB,MAAM,CACP,CAAC;QAEF,mCAAmC;QACnC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE;YAC7D,MAAM,EAAE,oBAAoB;YAC5B,WAAW,EAAE,WAAW,CAAC,WAAW;SACrC,CAAC,CAAC;QAEH,sCAAsC;QACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,yBAAyB,eAAK,CAAC,IAAI,CAAC,IAAI,CACtC,uCAAuC,CACxC,EAAE,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC;QAC9C,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEpC,MAAM,IAAA,qCAAkB,EAAC,WAAW,CAAC,CAAC;QAEtC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import * as fs from 'fs';\nimport path from 'path';\nimport { addEditorRulesStep } from '../add-editor-rules';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport { Integration } from '../../lib/constants';\nimport chalk from 'chalk';\n\n// Mock dependencies\njest.mock('fs', () => ({\n promises: {\n mkdir: jest.fn(),\n readFile: jest.fn(),\n writeFile: jest.fn(),\n },\n}));\n\njest.mock('../../utils/analytics', () => ({\n analytics: {\n capture: jest.fn(),\n setTag: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n },\n}));\n\njest.mock('../../utils/clack', () => ({\n log: {\n info: jest.fn(),\n },\n select: jest.fn().mockResolvedValue(true),\n isCancel: jest.fn((value: unknown): value is symbol => false),\n cancel: jest.fn(),\n}));\n\ndescribe('addEditorRules', () => {\n const mockOptions = {\n installDir: '/test/dir',\n rulesName: 'react-rules.md',\n integration: 'react' as Integration,\n };\n\n const originalEnv = process.env;\n const mkdirMock = fs.promises.mkdir as jest.Mock;\n const readFileMock = fs.promises.readFile as jest.Mock;\n const writeFileMock = fs.promises.writeFile as jest.Mock;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const captureMock = analytics.capture as jest.Mock;\n const infoMock = clack.log.info as jest.Mock;\n const selectMock = clack.select as jest.Mock;\n const isCancelMock = clack.isCancel as unknown as jest.Mock;\n const cancelMock = clack.cancel as jest.Mock;\n\n beforeEach(() => {\n // Reset all mocks before each test\n jest.clearAllMocks();\n // Clear mock implementations\n (fs.promises.mkdir as jest.Mock).mockReset();\n (fs.promises.readFile as jest.Mock).mockReset();\n (fs.promises.writeFile as jest.Mock).mockReset();\n selectMock.mockReset();\n selectMock.mockResolvedValue(true); // Default to \"Yes\" for the prompt\n isCancelMock.mockReset();\n isCancelMock.mockReturnValue(false);\n cancelMock.mockReset();\n process.env = { ...originalEnv };\n });\n\n afterAll(() => {\n process.env = originalEnv;\n });\n\n it('should not install rules when CURSOR_TRACE_ID is not set', async () => {\n delete process.env.CURSOR_TRACE_ID;\n\n await addEditorRulesStep(mockOptions);\n\n expect(mkdirMock).not.toHaveBeenCalled();\n expect(readFileMock).not.toHaveBeenCalled();\n expect(writeFileMock).not.toHaveBeenCalled();\n expect(captureMock).not.toHaveBeenCalled();\n expect(infoMock).not.toHaveBeenCalled();\n });\n\n it('should install rules when CURSOR_TRACE_ID is set', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n\n const mockFrameworkRules = 'framework rules {universal} content';\n const mockUniversalRules = 'universal rules content';\n const expectedCombinedRules =\n 'framework rules universal rules content content';\n\n (fs.promises.readFile as jest.Mock)\n .mockImplementationOnce(() => Promise.resolve(mockFrameworkRules))\n .mockImplementationOnce(() => Promise.resolve(mockUniversalRules));\n\n await addEditorRulesStep(mockOptions);\n\n // Check if directory was created\n expect(mkdirMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules'),\n { recursive: true },\n );\n\n // Check if correct files were read\n expect(readFileMock).toHaveBeenCalledTimes(2);\n expect(readFileMock).toHaveBeenNthCalledWith(\n 1,\n expect.stringMatching(/react-rules\\.md$/),\n 'utf8',\n );\n expect(readFileMock).toHaveBeenNthCalledWith(\n 2,\n expect.stringMatching(/universal\\.md$/),\n 'utf8',\n );\n\n // Check if combined rules were written correctly\n expect(writeFileMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules', 'posthog-integration.mdc'),\n expectedCombinedRules,\n 'utf8',\n );\n\n // Check if analytics were captured\n expect(captureMock).toHaveBeenCalledWith('wizard interaction', {\n action: 'added editor rules',\n integration: mockOptions.integration,\n });\n\n // Check if success message was logged\n expect(infoMock).toHaveBeenCalledWith(\n `Added Cursor rules to ${chalk.bold.cyan(\n '.cursor/rules/posthog-integration.mdc',\n )}`,\n );\n });\n\n it('should handle file system errors gracefully', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n const mockError = new Error('File not found');\n\n // Mock readFile to throw an error\n (fs.promises.readFile as jest.Mock).mockRejectedValue(mockError);\n\n await expect(addEditorRulesStep(mockOptions)).rejects.toThrow(mockError);\n\n expect(writeFileMock).not.toHaveBeenCalled();\n expect(captureMock).not.toHaveBeenCalled();\n expect(infoMock).not.toHaveBeenCalled();\n });\n\n it('should handle missing rules files gracefully', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n const mockError = new Error('File system error');\n\n // Mock mkdir to throw an error\n (fs.promises.mkdir as jest.Mock).mockRejectedValue(mockError);\n\n await expect(addEditorRulesStep(mockOptions)).rejects.toThrow(mockError);\n\n expect(writeFileMock).not.toHaveBeenCalled();\n expect(captureMock).not.toHaveBeenCalled();\n expect(infoMock).not.toHaveBeenCalled();\n });\n\n it('should correctly substitute universal rules with realistic content', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n\n const mockFrameworkRules = `---\ndescription: apply when interacting with PostHog/analytics tasks\nglobs: \nalwaysApply: true\n---\n\n{universal}\n\n# Framework-specific rules\n- Rule 1\n- Rule 2`;\n\n const mockUniversalRules = `Never hallucinate an API key. Instead, always use the API key populated in the .env file.\n\n# Feature flags\n\nA given feature flag should be used in as few places as possible. Do not increase the risk of undefined behavior by scattering the same feature flag across multiple areas of code.`;\n\n const expectedCombinedRules = `---\ndescription: apply when interacting with PostHog/analytics tasks\nglobs: \nalwaysApply: true\n---\n\nNever hallucinate an API key. Instead, always use the API key populated in the .env file.\n\n# Feature flags\n\nA given feature flag should be used in as few places as possible. Do not increase the risk of undefined behavior by scattering the same feature flag across multiple areas of code.\n\n# Framework-specific rules\n- Rule 1\n- Rule 2`;\n\n (fs.promises.readFile as jest.Mock)\n .mockImplementationOnce(() => Promise.resolve(mockFrameworkRules))\n .mockImplementationOnce(() => Promise.resolve(mockUniversalRules));\n\n await addEditorRulesStep(mockOptions);\n\n // Check if directory was created\n expect(mkdirMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules'),\n { recursive: true },\n );\n\n // Check if correct files were read\n expect(readFileMock).toHaveBeenCalledWith(\n expect.stringMatching(/react-rules\\.md$/),\n 'utf8',\n );\n expect(readFileMock).toHaveBeenCalledWith(\n expect.stringMatching(/universal\\.md$/),\n 'utf8',\n );\n\n // Check if combined rules were written correctly\n expect(writeFileMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules', 'posthog-integration.mdc'),\n expectedCombinedRules,\n 'utf8',\n );\n\n // Check if analytics were captured\n expect(captureMock).toHaveBeenCalledWith('wizard interaction', {\n action: 'added editor rules',\n integration: mockOptions.integration,\n });\n\n // Check if success message was logged\n expect(infoMock).toHaveBeenCalledWith(\n `Added Cursor rules to ${chalk.bold.cyan(\n '.cursor/rules/posthog-integration.mdc',\n )}`,\n );\n });\n\n it('should not install rules when user declines', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n selectMock.mockResolvedValue(false);\n\n await addEditorRulesStep(mockOptions);\n\n expect(mkdirMock).not.toHaveBeenCalled();\n expect(readFileMock).not.toHaveBeenCalled();\n expect(writeFileMock).not.toHaveBeenCalled();\n expect(captureMock).not.toHaveBeenCalled();\n expect(infoMock).not.toHaveBeenCalled();\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"add-editor-rules.test.js","sourceRoot":"","sources":["../../../../src/steps/__tests__/add-editor-rules.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport path from 'path';\nimport { addEditorRulesStep } from '../add-editor-rules';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport { Integration } from '../../lib/constants';\nimport chalk from 'chalk';\n\n// Mock dependencies\njest.mock('fs', () => ({\n promises: {\n mkdir: jest.fn(),\n readFile: jest.fn(),\n writeFile: jest.fn(),\n },\n}));\n\njest.mock('../../utils/analytics', () => ({\n analytics: {\n capture: jest.fn(),\n setTag: jest.fn(),\n shutdown: jest.fn().mockResolvedValue(undefined),\n },\n}));\n\njest.mock('../../utils/clack', () => ({\n log: {\n info: jest.fn(),\n },\n select: jest.fn().mockResolvedValue(true),\n isCancel: jest.fn((value: unknown): value is symbol => false),\n cancel: jest.fn(),\n}));\n\ndescribe('addEditorRules', () => {\n const mockOptions = {\n installDir: '/test/dir',\n rulesName: 'react-rules.md',\n integration: 'react' as Integration,\n };\n\n const originalEnv = process.env;\n const mkdirMock = fs.promises.mkdir as jest.Mock;\n const readFileMock = fs.promises.readFile as jest.Mock;\n const writeFileMock = fs.promises.writeFile as jest.Mock;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const captureMock = analytics.capture as jest.Mock;\n const infoMock = clack.log.info as jest.Mock;\n const selectMock = clack.select as jest.Mock;\n const isCancelMock = clack.isCancel as unknown as jest.Mock;\n const cancelMock = clack.cancel as jest.Mock;\n\n beforeEach(() => {\n // Reset all mocks before each test\n jest.clearAllMocks();\n // Clear mock implementations\n (fs.promises.mkdir as jest.Mock).mockReset();\n (fs.promises.readFile as jest.Mock).mockReset();\n (fs.promises.writeFile as jest.Mock).mockReset();\n selectMock.mockReset();\n selectMock.mockResolvedValue(true); // Default to \"Yes\" for the prompt\n isCancelMock.mockReset();\n isCancelMock.mockReturnValue(false);\n cancelMock.mockReset();\n process.env = { ...originalEnv };\n });\n\n afterAll(() => {\n process.env = originalEnv;\n });\n\n it('should not install rules when CURSOR_TRACE_ID is not set', async () => {\n delete process.env.CURSOR_TRACE_ID;\n\n await addEditorRulesStep(mockOptions);\n\n expect(mkdirMock).not.toHaveBeenCalled();\n expect(readFileMock).not.toHaveBeenCalled();\n expect(writeFileMock).not.toHaveBeenCalled();\n expect(captureMock).not.toHaveBeenCalled();\n expect(infoMock).not.toHaveBeenCalled();\n });\n\n it('should install rules when CURSOR_TRACE_ID is set', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n\n const mockFrameworkRules = 'framework rules {universal} content';\n const mockUniversalRules = 'universal rules content';\n const expectedCombinedRules =\n 'framework rules universal rules content content';\n\n (fs.promises.readFile as jest.Mock)\n .mockImplementationOnce(() => Promise.resolve(mockFrameworkRules))\n .mockImplementationOnce(() => Promise.resolve(mockUniversalRules));\n\n await addEditorRulesStep(mockOptions);\n\n // Check if directory was created\n expect(mkdirMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules'),\n { recursive: true },\n );\n\n // Check if correct files were read\n expect(readFileMock).toHaveBeenCalledTimes(2);\n expect(readFileMock).toHaveBeenNthCalledWith(\n 1,\n expect.stringMatching(/react-rules\\.md$/),\n 'utf8',\n );\n expect(readFileMock).toHaveBeenNthCalledWith(\n 2,\n expect.stringMatching(/universal\\.md$/),\n 'utf8',\n );\n\n // Check if combined rules were written correctly\n expect(writeFileMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules', 'posthog-integration.mdc'),\n expectedCombinedRules,\n 'utf8',\n );\n\n // Check if analytics were captured\n expect(captureMock).toHaveBeenCalledWith('wizard interaction', {\n action: 'added editor rules',\n integration: mockOptions.integration,\n });\n\n // Check if success message was logged\n expect(infoMock).toHaveBeenCalledWith(\n `Added Cursor rules to ${chalk.bold.cyan(\n '.cursor/rules/posthog-integration.mdc',\n )}`,\n );\n });\n\n it('should handle file system errors gracefully', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n const mockError = new Error('File not found');\n\n // Mock readFile to throw an error\n (fs.promises.readFile as jest.Mock).mockRejectedValue(mockError);\n\n await expect(addEditorRulesStep(mockOptions)).rejects.toThrow(mockError);\n\n expect(writeFileMock).not.toHaveBeenCalled();\n expect(captureMock).not.toHaveBeenCalled();\n expect(infoMock).not.toHaveBeenCalled();\n });\n\n it('should handle missing rules files gracefully', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n const mockError = new Error('File system error');\n\n // Mock mkdir to throw an error\n (fs.promises.mkdir as jest.Mock).mockRejectedValue(mockError);\n\n await expect(addEditorRulesStep(mockOptions)).rejects.toThrow(mockError);\n\n expect(writeFileMock).not.toHaveBeenCalled();\n expect(captureMock).not.toHaveBeenCalled();\n expect(infoMock).not.toHaveBeenCalled();\n });\n\n it('should correctly substitute universal rules with realistic content', async () => {\n process.env.CURSOR_TRACE_ID = 'test-trace-id';\n\n const mockFrameworkRules = `---\ndescription: apply when interacting with PostHog/analytics tasks\nglobs: \nalwaysApply: true\n---\n\n{universal}\n\n# Framework-specific rules\n- Rule 1\n- Rule 2`;\n\n const mockUniversalRules = `Never hallucinate an API key. Instead, always use the API key populated in the .env file.\n\n# Feature flags\n\nA given feature flag should be used in as few places as possible. Do not increase the risk of undefined behavior by scattering the same feature flag across multiple areas of code.`;\n\n const expectedCombinedRules = `---\ndescription: apply when interacting with PostHog/analytics tasks\nglobs: \nalwaysApply: true\n---\n\nNever hallucinate an API key. Instead, always use the API key populated in the .env file.\n\n# Feature flags\n\nA given feature flag should be used in as few places as possible. Do not increase the risk of undefined behavior by scattering the same feature flag across multiple areas of code.\n\n# Framework-specific rules\n- Rule 1\n- Rule 2`;\n\n (fs.promises.readFile as jest.Mock)\n .mockImplementationOnce(() => Promise.resolve(mockFrameworkRules))\n .mockImplementationOnce(() => Promise.resolve(mockUniversalRules));\n\n await addEditorRulesStep(mockOptions);\n\n // Check if directory was created\n expect(mkdirMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules'),\n { recursive: true },\n );\n\n // Check if correct files were read\n expect(readFileMock).toHaveBeenCalledWith(\n expect.stringMatching(/react-rules\\.md$/),\n 'utf8',\n );\n expect(readFileMock).toHaveBeenCalledWith(\n expect.stringMatching(/universal\\.md$/),\n 'utf8',\n );\n\n // Check if combined rules were written correctly\n expect(writeFileMock).toHaveBeenCalledWith(\n path.join('/test/dir', '.cursor', 'rules', 'posthog-integration.mdc'),\n expectedCombinedRules,\n 'utf8',\n );\n\n // Check if analytics were captured\n expect(captureMock).toHaveBeenCalledWith('wizard interaction', {\n action: 'added editor rules',\n integration: mockOptions.integration,\n });\n\n // Check if success message was logged\n expect(infoMock).toHaveBeenCalledWith(\n `Added Cursor rules to ${chalk.bold.cyan(\n '.cursor/rules/posthog-integration.mdc',\n )}`,\n );\n });\n});\n"]}
|
|
@@ -3,7 +3,6 @@ type AddEditorRulesStepOptions = {
|
|
|
3
3
|
installDir: string;
|
|
4
4
|
rulesName: string;
|
|
5
5
|
integration: Integration;
|
|
6
|
-
default?: boolean;
|
|
7
6
|
};
|
|
8
|
-
export declare const addEditorRulesStep: ({ installDir, rulesName, integration,
|
|
7
|
+
export declare const addEditorRulesStep: ({ installDir, rulesName, integration, }: AddEditorRulesStepOptions) => Promise<boolean>;
|
|
9
8
|
export {};
|
|
@@ -43,30 +43,9 @@ const path_1 = __importDefault(require("path"));
|
|
|
43
43
|
const analytics_1 = require("../utils/analytics");
|
|
44
44
|
const clack_1 = __importDefault(require("../utils/clack"));
|
|
45
45
|
const telemetry_1 = require("../telemetry");
|
|
46
|
-
const
|
|
47
|
-
const addEditorRulesStep = async ({ installDir, rulesName, integration, default: defaultAddEditorRules, }) => {
|
|
46
|
+
const addEditorRulesStep = async ({ installDir, rulesName, integration, }) => {
|
|
48
47
|
// Add rules file if in Cursor environment
|
|
49
48
|
if (process.env.CURSOR_TRACE_ID) {
|
|
50
|
-
const addEditorRules = defaultAddEditorRules
|
|
51
|
-
? true
|
|
52
|
-
: await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
53
|
-
message: 'Would you like to have PostHog added to your Cursor rules?',
|
|
54
|
-
options: [
|
|
55
|
-
{
|
|
56
|
-
label: 'Yes, please!',
|
|
57
|
-
value: true,
|
|
58
|
-
hint: 'Add PostHog to your Cursor rules',
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
label: 'No, thanks',
|
|
62
|
-
value: false,
|
|
63
|
-
hint: 'Skip adding PostHog to your Cursor rules',
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
}), integration);
|
|
67
|
-
if (!addEditorRules) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
49
|
return (0, telemetry_1.traceStep)('add-editor-rules', async () => {
|
|
71
50
|
const docsDir = path_1.default.join(installDir, '.cursor', 'rules');
|
|
72
51
|
await fs.promises.mkdir(docsDir, { recursive: true });
|