@posthog/wizard 0.2.2 → 0.2.4

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.
@@ -3,14 +3,13 @@ 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.getAssetHostFromHost = exports.getNextJsRouterName = exports.IGNORE_PATTERNS = exports.NextJsRouter = void 0;
6
+ exports.getUiHostFromHost = exports.getAssetHostFromHost = exports.getNextJsRouterName = exports.IGNORE_PATTERNS = exports.NextJsRouter = void 0;
7
7
  exports.getNextJsVersionBucket = getNextJsVersionBucket;
8
8
  exports.getNextJsRouter = getNextJsRouter;
9
9
  const semver_1 = require("semver");
10
10
  const fast_glob_1 = __importDefault(require("fast-glob"));
11
11
  const clack_utils_1 = require("../utils/clack-utils");
12
12
  const clack_1 = __importDefault(require("../utils/clack"));
13
- const constants_1 = require("../lib/constants");
14
13
  function getNextJsVersionBucket(version) {
15
14
  if (!version) {
16
15
  return 'none';
@@ -41,10 +40,18 @@ exports.IGNORE_PATTERNS = [
41
40
  '**/build/**',
42
41
  '**/public/**',
43
42
  ];
44
- async function getNextJsRouter() {
45
- const pagesMatches = await (0, fast_glob_1.default)('**/pages/_app.@(ts|tsx|js|jsx)', { dot: true, cwd: constants_1.INSTALL_DIR, ignore: exports.IGNORE_PATTERNS });
43
+ async function getNextJsRouter({ installDir, }) {
44
+ const pagesMatches = await (0, fast_glob_1.default)('**/pages/_app.@(ts|tsx|js|jsx)', {
45
+ dot: true,
46
+ cwd: installDir,
47
+ ignore: exports.IGNORE_PATTERNS,
48
+ });
46
49
  const hasPagesDir = pagesMatches.length > 0;
47
- const appMatches = await (0, fast_glob_1.default)('**/app/layout.@(ts|tsx|js|jsx)', { dot: true, cwd: constants_1.INSTALL_DIR, ignore: exports.IGNORE_PATTERNS });
50
+ const appMatches = await (0, fast_glob_1.default)('**/app/**/layout.@(ts|tsx|js|jsx)', {
51
+ dot: true,
52
+ cwd: installDir,
53
+ ignore: exports.IGNORE_PATTERNS,
54
+ });
48
55
  const hasAppDir = appMatches.length > 0;
49
56
  if (hasPagesDir && !hasAppDir) {
50
57
  clack_1.default.log.info(`Detected ${(0, exports.getNextJsRouterName)(NextJsRouter.PAGES_ROUTER)} 📃`);
@@ -57,8 +64,14 @@ async function getNextJsRouter() {
57
64
  const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
58
65
  message: 'What router are you using?',
59
66
  options: [
60
- { label: (0, exports.getNextJsRouterName)(NextJsRouter.APP_ROUTER), value: NextJsRouter.APP_ROUTER },
61
- { label: (0, exports.getNextJsRouterName)(NextJsRouter.PAGES_ROUTER), value: NextJsRouter.PAGES_ROUTER },
67
+ {
68
+ label: (0, exports.getNextJsRouterName)(NextJsRouter.APP_ROUTER),
69
+ value: NextJsRouter.APP_ROUTER,
70
+ },
71
+ {
72
+ label: (0, exports.getNextJsRouterName)(NextJsRouter.PAGES_ROUTER),
73
+ value: NextJsRouter.PAGES_ROUTER,
74
+ },
62
75
  ],
63
76
  }));
64
77
  return result;
@@ -77,4 +90,14 @@ const getAssetHostFromHost = (host) => {
77
90
  return host;
78
91
  };
79
92
  exports.getAssetHostFromHost = getAssetHostFromHost;
93
+ const getUiHostFromHost = (host) => {
94
+ if (host.includes('us.i.posthog.com')) {
95
+ return 'https://us.posthog.com';
96
+ }
97
+ if (host.includes('eu.i.posthog.com')) {
98
+ return 'https://eu.posthog.com';
99
+ }
100
+ return host;
101
+ };
102
+ exports.getUiHostFromHost = getUiHostFromHost;
80
103
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nextjs/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { major, minVersion } from 'semver';\nimport fg from 'fast-glob';\nimport { abortIfCancelled } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport { INSTALL_DIR } from '../lib/constants';\n\nexport function getNextJsVersionBucket(version: string | undefined) {\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 >= 11) {\n return `${majorVersion}.x`;\n }\n return '<11.0.0';\n } catch {\n return 'unknown';\n }\n}\n\nexport enum NextJsRouter {\n APP_ROUTER = 'app-router',\n PAGES_ROUTER = 'pages-router',\n}\n\nexport const IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/public/**',\n]\nexport async function getNextJsRouter(): Promise<NextJsRouter> {\n const pagesMatches = await fg('**/pages/_app.@(ts|tsx|js|jsx)', { dot: true, cwd: INSTALL_DIR, ignore: IGNORE_PATTERNS });\n\n const hasPagesDir = pagesMatches.length > 0;\n\n const appMatches = await fg('**/app/layout.@(ts|tsx|js|jsx)', { dot: true, cwd: INSTALL_DIR, ignore: IGNORE_PATTERNS });\n\n const hasAppDir = appMatches.length > 0;\n\n if (hasPagesDir && !hasAppDir) {\n clack.log.info(`Detected ${getNextJsRouterName(NextJsRouter.PAGES_ROUTER)} 📃`);\n return NextJsRouter.PAGES_ROUTER;\n }\n\n if (hasAppDir && !hasPagesDir) {\n clack.log.info(`Detected ${getNextJsRouterName(NextJsRouter.APP_ROUTER)} 📱`);\n return NextJsRouter.APP_ROUTER;\n }\n\n const result: NextJsRouter = await abortIfCancelled(\n clack.select({\n message: 'What router are you using?',\n options: [\n { label: getNextJsRouterName(NextJsRouter.APP_ROUTER), value: NextJsRouter.APP_ROUTER },\n { label: getNextJsRouterName(NextJsRouter.PAGES_ROUTER), value: NextJsRouter.PAGES_ROUTER },\n ],\n })\n );\n\n return result;\n}\n\nexport const getNextJsRouterName = (router: NextJsRouter) => {\n return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';\n}\n\nexport const getAssetHostFromHost = (host: string) => {\n if (host.includes('us.i.posthog.com')) {\n return 'https://us-assets.i.posthog.com';\n }\n\n if (host.includes('eu.i.posthog.com')) {\n return 'https://eu-assets.i.posthog.com';\n }\n\n return host;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nextjs/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { major, minVersion } from 'semver';\nimport fg from 'fast-glob';\nimport { abortIfCancelled } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport type { WizardOptions } from '../utils/types';\n\nexport function getNextJsVersionBucket(version: string | undefined) {\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 >= 11) {\n return `${majorVersion}.x`;\n }\n return '<11.0.0';\n } catch {\n return 'unknown';\n }\n}\n\nexport enum NextJsRouter {\n APP_ROUTER = 'app-router',\n PAGES_ROUTER = 'pages-router',\n}\n\nexport const IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/public/**',\n];\nexport async function getNextJsRouter({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter> {\n const pagesMatches = await fg('**/pages/_app.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasPagesDir = pagesMatches.length > 0;\n\n const appMatches = await fg('**/app/**/layout.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasAppDir = appMatches.length > 0;\n\n if (hasPagesDir && !hasAppDir) {\n clack.log.info(\n `Detected ${getNextJsRouterName(NextJsRouter.PAGES_ROUTER)} 📃`,\n );\n return NextJsRouter.PAGES_ROUTER;\n }\n\n if (hasAppDir && !hasPagesDir) {\n clack.log.info(\n `Detected ${getNextJsRouterName(NextJsRouter.APP_ROUTER)} 📱`,\n );\n return NextJsRouter.APP_ROUTER;\n }\n\n const result: NextJsRouter = await abortIfCancelled(\n clack.select({\n message: 'What router are you using?',\n options: [\n {\n label: getNextJsRouterName(NextJsRouter.APP_ROUTER),\n value: NextJsRouter.APP_ROUTER,\n },\n {\n label: getNextJsRouterName(NextJsRouter.PAGES_ROUTER),\n value: NextJsRouter.PAGES_ROUTER,\n },\n ],\n }),\n );\n\n return result;\n}\n\nexport const getNextJsRouterName = (router: NextJsRouter) => {\n return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';\n};\n\nexport const getAssetHostFromHost = (host: string) => {\n if (host.includes('us.i.posthog.com')) {\n return 'https://us-assets.i.posthog.com';\n }\n\n if (host.includes('eu.i.posthog.com')) {\n return 'https://eu-assets.i.posthog.com';\n }\n\n return host;\n};\n\nexport const getUiHostFromHost = (host: string) => {\n if (host.includes('us.i.posthog.com')) {\n return 'https://us.posthog.com';\n }\n\n if (host.includes('eu.i.posthog.com')) {\n return 'https://eu.posthog.com';\n }\n\n return host;\n};\n"]}
package/dist/src/run.d.ts CHANGED
@@ -3,6 +3,7 @@ type Args = {
3
3
  integration?: Integration;
4
4
  debug?: boolean;
5
5
  forceInstall?: boolean;
6
+ installDir?: string;
6
7
  };
7
8
  export declare function run(argv: Args): Promise<void>;
8
9
  export {};
package/dist/src/run.js CHANGED
@@ -7,21 +7,24 @@ exports.run = run;
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");
10
- const node_fs_1 = require("node:fs");
11
10
  const environment_1 = require("./utils/environment");
12
11
  const clack_1 = __importDefault(require("./utils/clack"));
12
+ const path_1 = __importDefault(require("path"));
13
13
  async function run(argv) {
14
14
  const finalArgs = {
15
15
  ...argv,
16
16
  ...(0, environment_1.readEnvironment)(),
17
17
  };
18
- clack_1.default.intro(`PostHog Wizard ${tryGetWizardVersion()}`);
19
- const integration = finalArgs.integration ?? await getIntegrationForSetup();
20
18
  const wizardOptions = {
21
19
  debug: finalArgs.debug ?? false,
22
20
  forceInstall: finalArgs.forceInstall ?? false,
23
21
  telemetryEnabled: false,
22
+ installDir: finalArgs.installDir
23
+ ? path_1.default.join(process.cwd(), finalArgs.installDir)
24
+ : process.cwd(),
24
25
  };
26
+ clack_1.default.intro(`Welcome to the PostHog setup wizard ✨`);
27
+ const integration = finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));
25
28
  switch (integration) {
26
29
  case constants_1.Integration.nextjs:
27
30
  await (0, nextjs_wizard_1.runNextjsWizard)(wizardOptions);
@@ -30,32 +33,17 @@ async function run(argv) {
30
33
  clack_1.default.log.error('No setup wizard selected!');
31
34
  }
32
35
  }
33
- function tryGetWizardVersion() {
34
- let version = process.env.npm_package_version;
35
- if (!version) {
36
- try {
37
- const wizardPkgJson = JSON.parse((0, node_fs_1.readFileSync)('../package.json', 'utf-8'));
38
- version = wizardPkgJson.version;
39
- }
40
- catch {
41
- // ignore
42
- }
43
- }
44
- return version ?? '';
45
- }
46
- async function detectIntegration() {
47
- const detectors = [
48
- nextjs_wizard_1.detectNextJs
49
- ];
36
+ async function detectIntegration(options) {
37
+ const detectors = [nextjs_wizard_1.detectNextJs];
50
38
  for (const detector of detectors) {
51
- const integration = await detector();
39
+ const integration = await detector(options);
52
40
  if (integration) {
53
41
  return integration;
54
42
  }
55
43
  }
56
44
  }
57
- async function getIntegrationForSetup() {
58
- const detectedIntegration = await detectIntegration();
45
+ async function getIntegrationForSetup(options) {
46
+ const detectedIntegration = await detectIntegration(options);
59
47
  if (detectedIntegration) {
60
48
  clack_1.default.log.success(`Detected integration: ${(0, constants_1.getIntegrationDescription)(detectedIntegration)}`);
61
49
  return detectedIntegration;
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":";;;;;AAiBA,kBA0BC;AA3CD,qDAAuD;AAGvD,0DAAuE;AAEvE,+CAAyE;AAEzE,qCAAuC;AACvC,qDAAsD;AACtD,0DAAkC;AAQ3B,KAAK,UAAU,GAAG,CAAC,IAAU;IAClC,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,GAAG,IAAA,6BAAe,GAAE;KACrB,CAAC;IAGF,eAAK,CAAC,KAAK,CAAC,kBAAkB,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,MAAM,sBAAsB,EAAE,CAAC;IAG5E,MAAM,aAAa,GAAkB;QACnC,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,KAAK;QAC/B,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,KAAK;QAC7C,gBAAgB,EAAE,KAAK;KACxB,CAAC;IAEF,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,uBAAW,CAAC,MAAM;YACrB,MAAM,IAAA,+BAAe,EAAC,aAAa,CAAC,CAAC;YACrC,MAAM;QAER;YACE,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,IAAA,sBAAY,EAAC,iBAAiB,EAAE,OAAO,CAAC,CACvB,CAAC;YACpB,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,OAAO,IAAI,EAAE,CAAC;AACvB,CAAC;AAGD,KAAK,UAAU,iBAAiB;IAE9B,MAAM,SAAS,GAAG;QAChB,4BAAY;KACb,CAAA;IAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,MAAM,QAAQ,EAAE,CAAC;QACrC,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB;IAEnC,MAAM,mBAAmB,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEtD,IAAI,mBAAmB,EAAE,CAAC;QACxB,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,IAAA,qCAAyB,EAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,WAAW,GAAgB,MAAM,IAAA,8BAAgB,EACrD,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAW,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KAC3D,CAAC,CACH,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport type { WizardOptions } from './utils/types';\nimport { detectNextJs, runNextjsWizard } from './nextjs/nextjs-wizard';\n\nimport { getIntegrationDescription, Integration } from './lib/constants';\nimport type { PackageDotJson } from './utils/package-json';\nimport { readFileSync } from 'node:fs';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\n\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n};\nexport async function run(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n\n clack.intro(`PostHog Wizard ${tryGetWizardVersion()}`);\n\n const integration = finalArgs.integration ?? await getIntegrationForSetup();\n\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n telemetryEnabled: false,\n };\n\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizard(wizardOptions);\n break;\n\n default:\n clack.log.error('No setup wizard selected!');\n }\n}\n\nfunction tryGetWizardVersion(): string {\n let version = process.env.npm_package_version;\n if (!version) {\n try {\n const wizardPkgJson = JSON.parse(\n readFileSync('../package.json', 'utf-8'),\n ) as PackageDotJson;\n version = wizardPkgJson.version;\n } catch {\n // ignore\n }\n }\n return version ?? '';\n}\n\n\nasync function detectIntegration(): Promise<Integration | undefined> {\n\n const detectors = [\n detectNextJs\n ]\n\n for (const detector of detectors) {\n const integration = await detector();\n if (integration) {\n return integration;\n }\n }\n}\n\nasync function getIntegrationForSetup() {\n\n const detectedIntegration = await detectIntegration();\n\n if (detectedIntegration) {\n clack.log.success(`Detected integration: ${getIntegrationDescription(detectedIntegration)}`);\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: [{ value: Integration.nextjs, label: 'Next.js' }],\n }),\n );\n\n return integration;\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":";;;;;AAgBA,kBA4BC;AA5CD,qDAAuD;AAGvD,0DAAuE;AAEvE,+CAAyE;AACzE,qDAAsD;AACtD,0DAAkC;AAClC,gDAAwB;AAQjB,KAAK,UAAU,GAAG,CAAC,IAAU;IAClC,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,GAAG,IAAA,6BAAe,GAAE;KACrB,CAAC;IAEF,MAAM,aAAa,GAAkB;QACnC,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,KAAK;QAC/B,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,KAAK;QAC7C,gBAAgB,EAAE,KAAK;QACvB,UAAU,EAAE,SAAS,CAAC,UAAU;YAC9B,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC;YAChD,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;KAClB,CAAC;IAEF,eAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAErD,MAAM,WAAW,GACf,SAAS,CAAC,WAAW,IAAI,CAAC,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC;IAEzE,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,uBAAW,CAAC,MAAM;YACrB,MAAM,IAAA,+BAAe,EAAC,aAAa,CAAC,CAAC;YACrC,MAAM;QAER;YACE,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAA0C;IAE1C,MAAM,SAAS,GAAG,CAAC,4BAAY,CAAC,CAAC;IAEjC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,OAA0C;IAE1C,MAAM,mBAAmB,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE7D,IAAI,mBAAmB,EAAE,CAAC;QACxB,eAAK,CAAC,GAAG,CAAC,OAAO,CACf,yBAAyB,IAAA,qCAAyB,EAAC,mBAAmB,CAAC,EAAE,CAC1E,CAAC;QACF,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,WAAW,GAAgB,MAAM,IAAA,8BAAgB,EACrD,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAW,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KAC3D,CAAC,CACH,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport type { WizardOptions } from './utils/types';\nimport { detectNextJs, runNextjsWizard } from './nextjs/nextjs-wizard';\n\nimport { getIntegrationDescription, Integration } from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n};\nexport async function run(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 telemetryEnabled: false,\n installDir: finalArgs.installDir\n ? path.join(process.cwd(), finalArgs.installDir)\n : process.cwd(),\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizard(wizardOptions);\n break;\n\n default:\n clack.log.error('No setup wizard selected!');\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const detectors = [detectNextJs];\n\n for (const detector of detectors) {\n const integration = await detector(options);\n if (integration) {\n return 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: [{ value: Integration.nextjs, label: 'Next.js' }],\n }),\n );\n\n return integration;\n}\n"]}
@@ -45,7 +45,7 @@ export declare function confirmContinueIfPackageVersionNotSupported({ packageId,
45
45
  * IMPORTANT: This function modifies the `package.json`! Be sure to re-read
46
46
  * it if you make additional modifications to it after calling this function!
47
47
  */
48
- export declare function installPackage({ packageName, alreadyInstalled, askBeforeUpdating, packageNameDisplayLabel, packageManager, forceInstall, }: {
48
+ export declare function installPackage({ packageName, alreadyInstalled, askBeforeUpdating, packageNameDisplayLabel, packageManager, forceInstall, installDir, }: {
49
49
  /** The string that is passed to the package manager CLI as identifier to install (e.g. `posthog-js`, or `posthog-js@^1.100.0`) */
50
50
  packageName: string;
51
51
  alreadyInstalled: boolean;
@@ -55,10 +55,11 @@ export declare function installPackage({ packageName, alreadyInstalled, askBefor
55
55
  packageManager?: PackageManager;
56
56
  /** Add force install flag to command to skip install precondition fails */
57
57
  forceInstall?: boolean;
58
+ installDir: string;
58
59
  }): Promise<{
59
60
  packageManager?: PackageManager;
60
61
  }>;
61
- export declare function runPrettierIfInstalled(): Promise<void>;
62
+ export declare function runPrettierIfInstalled({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<void>;
62
63
  /**
63
64
  * Checks if @param packageId is listed as a dependency in @param packageJson.
64
65
  * If not, it will ask users if they want to continue without the package.
@@ -70,10 +71,10 @@ export declare function runPrettierIfInstalled(): Promise<void>;
70
71
  * @param packageName a human readable name of the package
71
72
  */
72
73
  export declare function ensurePackageIsInstalled(packageJson: PackageDotJson, packageId: string, packageName: string): Promise<void>;
73
- export declare function getPackageDotJson(): Promise<PackageDotJson>;
74
- export declare function updatePackageDotJson(packageDotJson: PackageDotJson): Promise<void>;
75
- export declare function getPackageManager(): Promise<PackageManager>;
76
- export declare function isUsingTypeScript(): boolean;
74
+ export declare function getPackageDotJson({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson>;
75
+ export declare function updatePackageDotJson(packageDotJson: PackageDotJson, { installDir }: Pick<WizardOptions, 'installDir'>): Promise<void>;
76
+ export declare function getPackageManager({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<PackageManager>;
77
+ export declare function isUsingTypeScript({ installDir, }: Pick<WizardOptions, 'installDir'>): boolean;
77
78
  /**
78
79
  * Checks if we already got project data from a previous wizard invocation.
79
80
  * If yes, this data is returned.
@@ -168,7 +169,7 @@ export declare function makeCodeSnippet(colors: boolean, callback: CodeSnippetFo
168
169
  *
169
170
  * @returns true on success, false otherwise
170
171
  */
171
- export declare function createNewConfigFile(filepath: string, codeSnippet: string, moreInformation?: string): Promise<boolean>;
172
+ export declare function createNewConfigFile(filepath: string, codeSnippet: string, { installDir }: Pick<WizardOptions, 'installDir'>, moreInformation?: string): Promise<boolean>;
172
173
  export declare function featureSelectionPrompt<F extends ReadonlyArray<Feature>>(features: F): Promise<{
173
174
  [key in F[number]['id']]: boolean;
174
175
  }>;
@@ -90,15 +90,11 @@ async function abortIfCancelled(input) {
90
90
  }
91
91
  }
92
92
  function printWelcome(options) {
93
- const wizardVersion = process.env.npm_package_version;
94
93
  // eslint-disable-next-line no-console
95
94
  console.log('');
96
95
  clack_1.default.intro(chalk_1.default.inverse(` ${options.wizardName} `));
97
96
  let welcomeText = options.message ||
98
97
  `The ${options.wizardName} will help you set up PostHog for your application.\nThank you for using PostHog :)`;
99
- if (wizardVersion) {
100
- welcomeText = `${welcomeText}\n\nVersion: ${wizardVersion}`;
101
- }
102
98
  if (options.telemetryEnabled) {
103
99
  welcomeText = `${welcomeText}
104
100
 
@@ -212,7 +208,7 @@ async function confirmContinueIfPackageVersionNotSupported({ packageId, packageN
212
208
  * IMPORTANT: This function modifies the `package.json`! Be sure to re-read
213
209
  * it if you make additional modifications to it after calling this function!
214
210
  */
215
- async function installPackage({ packageName, alreadyInstalled, askBeforeUpdating = true, packageNameDisplayLabel, packageManager, forceInstall = false, }) {
211
+ async function installPackage({ packageName, alreadyInstalled, askBeforeUpdating = true, packageNameDisplayLabel, packageManager, forceInstall = false, installDir, }) {
216
212
  return (0, telemetry_1.traceStep)('install-package', async () => {
217
213
  if (alreadyInstalled && askBeforeUpdating) {
218
214
  const shouldUpdatePackage = await abortIfCancelled(clack_1.default.confirm({
@@ -223,11 +219,11 @@ async function installPackage({ packageName, alreadyInstalled, askBeforeUpdating
223
219
  }
224
220
  }
225
221
  const sdkInstallSpinner = clack_1.default.spinner();
226
- const pkgManager = packageManager || (await getPackageManager());
222
+ const pkgManager = packageManager || (await getPackageManager({ installDir }));
227
223
  sdkInstallSpinner.start(`${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk_1.default.bold.cyan(packageNameDisplayLabel ?? packageName)} with ${chalk_1.default.bold(pkgManager.label)}.`);
228
224
  try {
229
225
  await new Promise((resolve, reject) => {
230
- childProcess.exec(`${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${forceInstall ? pkgManager.forceInstallFlag : ''}`, { cwd: constants_1.INSTALL_DIR }, (err, stdout, stderr) => {
226
+ childProcess.exec(`${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${forceInstall ? pkgManager.forceInstallFlag : ''}`, { cwd: installDir }, (err, stdout, stderr) => {
231
227
  if (err) {
232
228
  // Write a log file so we can better troubleshoot issues
233
229
  fs.writeFileSync((0, node_path_1.join)(process.cwd(), `posthog-wizard-installation-error-${Date.now()}.log`), JSON.stringify({
@@ -251,7 +247,7 @@ async function installPackage({ packageName, alreadyInstalled, askBeforeUpdating
251
247
  return { packageManager: pkgManager };
252
248
  });
253
249
  }
254
- async function runPrettierIfInstalled() {
250
+ async function runPrettierIfInstalled({ installDir, }) {
255
251
  return (0, telemetry_1.traceStep)('run-prettier', async () => {
256
252
  if (!isInGitRepo()) {
257
253
  // We only run formatting on changed files. If we're not in a git repo, we can't find
@@ -267,7 +263,7 @@ async function runPrettierIfInstalled() {
267
263
  // Likewise, if we can't find changed or untracked files, there's no point in running Prettier.
268
264
  return;
269
265
  }
270
- const packageJson = await getPackageDotJson();
266
+ const packageJson = await getPackageDotJson({ installDir });
271
267
  const prettierInstalled = (0, package_json_1.hasPackageInstalled)('prettier', packageJson);
272
268
  analytics_1.Analytics.setTag('prettier-installed', prettierInstalled);
273
269
  if (!prettierInstalled) {
@@ -321,9 +317,9 @@ async function ensurePackageIsInstalled(packageJson, packageId, packageName) {
321
317
  }
322
318
  });
323
319
  }
324
- async function getPackageDotJson() {
320
+ async function getPackageDotJson({ installDir, }) {
325
321
  const packageJsonFileContents = await fs.promises
326
- .readFile((0, node_path_1.join)(constants_1.INSTALL_DIR, 'package.json'), 'utf8')
322
+ .readFile((0, node_path_1.join)(installDir, 'package.json'), 'utf8')
327
323
  .catch(() => {
328
324
  clack_1.default.log.error('Could not find package.json. Make sure to run the wizard in the root of your app!');
329
325
  return abort();
@@ -339,9 +335,9 @@ async function getPackageDotJson() {
339
335
  }
340
336
  return packageJson || {};
341
337
  }
342
- async function updatePackageDotJson(packageDotJson) {
338
+ async function updatePackageDotJson(packageDotJson, { installDir }) {
343
339
  try {
344
- await fs.promises.writeFile((0, node_path_1.join)(constants_1.INSTALL_DIR, 'package.json'),
340
+ await fs.promises.writeFile((0, node_path_1.join)(installDir, 'package.json'),
345
341
  // TODO: maybe figure out the original indentation
346
342
  JSON.stringify(packageDotJson, null, 2), {
347
343
  encoding: 'utf8',
@@ -353,8 +349,8 @@ async function updatePackageDotJson(packageDotJson) {
353
349
  await abort();
354
350
  }
355
351
  }
356
- async function getPackageManager() {
357
- const detectedPackageManager = (0, package_manager_1.detectPackageManger)();
352
+ async function getPackageManager({ installDir, }) {
353
+ const detectedPackageManager = (0, package_manager_1.detectPackageManger)({ installDir });
358
354
  if (detectedPackageManager) {
359
355
  return detectedPackageManager;
360
356
  }
@@ -368,9 +364,9 @@ async function getPackageManager() {
368
364
  analytics_1.Analytics.setTag('package-manager', selectedPackageManager.name);
369
365
  return selectedPackageManager;
370
366
  }
371
- function isUsingTypeScript() {
367
+ function isUsingTypeScript({ installDir, }) {
372
368
  try {
373
- return fs.existsSync((0, node_path_1.join)(constants_1.INSTALL_DIR, 'tsconfig.json'));
369
+ return fs.existsSync((0, node_path_1.join)(installDir, 'tsconfig.json'));
374
370
  }
375
371
  catch {
376
372
  return false;
@@ -570,12 +566,12 @@ function makeCodeSnippet(colors, callback) {
570
566
  *
571
567
  * @returns true on success, false otherwise
572
568
  */
573
- async function createNewConfigFile(filepath, codeSnippet, moreInformation) {
569
+ async function createNewConfigFile(filepath, codeSnippet, { installDir }, moreInformation) {
574
570
  if (!(0, node_path_1.isAbsolute)(filepath)) {
575
571
  (0, debug_1.debug)(`createNewConfigFile: filepath is not absolute: ${filepath}`);
576
572
  return false;
577
573
  }
578
- const prettyFilename = chalk_1.default.cyan((0, node_path_1.relative)(constants_1.INSTALL_DIR, filepath));
574
+ const prettyFilename = chalk_1.default.cyan((0, node_path_1.relative)(installDir, filepath));
579
575
  try {
580
576
  await fs.promises.writeFile(filepath, codeSnippet);
581
577
  clack_1.default.log.success(`Added new ${prettyFilename} file.`);
@@ -1 +1 @@
1
- {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { basename, isAbsolute, join, relative } from 'node:path';\nimport { setInterval } from 'node:timers';\nimport { URL } from 'node:url';\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport opn from 'opn';\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport { type PackageDotJson, hasPackageInstalled } from './package-json';\nimport {\n type PackageManager,\n detectPackageManger,\n packageManagers,\n} from './package-manager';\nimport { fulfillsVersionRange } from './semver';\nimport type { Feature, WizardOptions } from './types';\nimport {\n CLOUD_URL,\n DEFAULT_HOST_URL,\n DUMMY_PROJECT_API_KEY,\n INSTALL_DIR,\n ISSUES_URL,\n} from '../lib/constants';\nimport { Analytics } from './analytics';\nimport clack from './clack';\n\ninterface ProjectData {\n projectApiKey: string;\n host: string;\n wizardHash: string;\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n clack.outro(message ?? 'Wizard setup cancelled.');\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n if (clack.isCancel(await input)) {\n clack.cancel('Wizard setup cancelled.');\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n message?: string;\n telemetryEnabled?: boolean;\n}): void {\n const wizardVersion = process.env.npm_package_version;\n\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n\n let welcomeText =\n options.message ||\n `The ${options.wizardName} will help you set up PostHog for your application.\\nThank you for using PostHog :)`;\n\n if (wizardVersion) {\n welcomeText = `${welcomeText}\\n\\nVersion: ${wizardVersion}`;\n }\n\n if (options.telemetryEnabled) {\n welcomeText = `${welcomeText}\n\nThis wizard sends telemetry data and crash reports to PostHog. This helps us improve the Wizard.\nYou can turn this off at any time by running ${chalk.cyanBright(\n 'npx @posthog/wizard --disable-telemetry',\n )}.`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n const continueWithoutGit = await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n Analytics.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n // return early to avoid checking for uncommitted files\n return;\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n Analytics.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n note,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n note?: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n Analytics.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n Analytics.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n note ??\n `Please upgrade to ${acceptableVersions} if you wish to use the PostHog Wizard.`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n Analytics.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n}: {\n /** The string that is passed to the package manager CLI as identifier to install (e.g. `posthog-js`, or `posthog-js@^1.100.0`) */\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n /** Overrides what is shown in the installation logs in place of the `packageName` option. Useful if the `packageName` is ugly */\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n /** Add force install flag to command to skip install precondition fails */\n forceInstall?: boolean;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return {};\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const pkgManager = packageManager || (await getPackageManager());\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${forceInstall ? pkgManager.forceInstallFlag : ''\n }`,\n { cwd: INSTALL_DIR },\n (err, stdout, stderr) => {\n if (err) {\n // Write a log file so we can better troubleshoot issues\n fs.writeFileSync(\n join(\n process.cwd(),\n `posthog-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n `The wizard has created a \\`posthog-wizard-installation-error-*.log\\` file. If you think this issue is caused by the PostHog Wizard, create an issue on GitHub and include the log file's content:\\n${ISSUES_URL}`,\n )}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n return { packageManager: pkgManager };\n });\n}\n\nexport async function runPrettierIfInstalled(): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles()\n .map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n })\n .join(' ');\n\n if (!changedOrUntrackedFiles.length) {\n // Likewise, if we can't find changed or untracked files, there's no point in running Prettier.\n return;\n }\n\n const packageJson = await getPackageDotJson();\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n Analytics.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n const prettierSpinner = clack.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `npx prettier --ignore-unknown --write ${changedOrUntrackedFiles}`,\n (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n prettierSpinner.stop('Prettier failed to run.');\n clack.log.warn(\n 'Prettier failed to run. There may be formatting issues in your updated files.',\n );\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n });\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n Analytics.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n Analytics.setTag(`${packageName.toLowerCase()}-installed`, false);\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson(): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(INSTALL_DIR, 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(INSTALL_DIR, 'package.json'),\n // TODO: maybe figure out the original indentation\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n clack.log.error(`Unable to update your ${chalk.cyan('package.json')}.`);\n\n await abort();\n }\n}\n\nexport async function getPackageManager(): Promise<PackageManager> {\n const detectedPackageManager = detectPackageManger();\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: packageManagers.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n Analytics.setTag('package-manager', selectedPackageManager.name);\n\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript() {\n try {\n return fs.existsSync(join(INSTALL_DIR, 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if we already got project data from a previous wizard invocation.\n * If yes, this data is returned.\n * Otherwise, we start the login flow and ask the user to select a project.\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @returns project data (token, url)\n */\nexport async function getOrAskForProjectData(_options: WizardOptions): Promise<{\n wizardHash: string;\n host: string;\n projectApiKey: string;\n}> {\n const { host, projectApiKey, wizardHash } = await traceStep('login', () =>\n askForWizardLogin({\n url: CLOUD_URL,\n }),\n );\n\n if (!projectApiKey) {\n clack.log.error(`Didn't receive a project API key. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${chalk.cyan(ISSUES_URL)}`);\n\n clack.log\n .info(`In the meantime, we'll add a dummy project API key (${chalk.cyan(\n `\"${DUMMY_PROJECT_API_KEY}\"`,\n )}) for you to replace later.\nYou can find your Project API key here:\n${chalk.cyan(`${CLOUD_URL}/settings/project#variables`)}`);\n }\n\n return {\n wizardHash,\n host: host || DEFAULT_HOST_URL,\n projectApiKey: projectApiKey || DUMMY_PROJECT_API_KEY,\n };\n}\n\nasync function askForWizardLogin(options: {\n url: string;\n}): Promise<ProjectData> {\n let wizardHash: string;\n\n try {\n wizardHash = (\n await axios.post<{ hash: string }>(`${options.url}/api/wizard/initialize`)\n ).data.hash;\n } catch (e: unknown) {\n clack.log.error('Loading wizard failed.');\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n `Please try again in a few minutes and let us know if this issue persists: ${ISSUES_URL}`,\n ),\n );\n }\n\n const loginUrl = new URL(`${options.url}/wizard?hash=${wizardHash!}`);\n\n const urlToOpen = loginUrl.toString();\n\n clack.log.info(\n `${chalk.bold(\n `If the browser window didn't open automatically, please open the following link to login into PostHog:`,\n )}\\n\\n${chalk.cyan(urlToOpen)}`,\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 loginSpinner = clack.spinner();\n\n loginSpinner.start('Waiting for you to log in using the link above');\n\n const data = await new Promise<ProjectData>((resolve) => {\n const pollingInterval = setInterval(() => {\n axios\n .get<{\n project_api_key: string;\n host: string;\n }>(`${options.url}/api/wizard/data`, {\n headers: {\n 'Accept-Encoding': 'deflate',\n 'X-PostHog-Wizard-Hash': wizardHash,\n },\n })\n .then((result) => {\n const data: ProjectData = {\n wizardHash,\n projectApiKey: result.data.project_api_key,\n host: result.data.host,\n };\n\n resolve(data);\n clearTimeout(timeout);\n clearInterval(pollingInterval);\n })\n .catch(() => {\n // noop - just try again\n });\n }, 500);\n\n const timeout = setTimeout(() => {\n clearInterval(pollingInterval);\n loginSpinner.stop(\n 'Login timed out. No worries - it happens to the best of us.',\n );\n\n Analytics.setTag('opened-wizard-link', false);\n void abort('Please restart the Wizard and log in to complete the setup.');\n }, 180_000);\n });\n\n loginSpinner.stop('Login complete.');\n Analytics.setTag('opened-wizard-link', true);\n\n return data;\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(basename(filename))} file:${hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''\n }`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(relative(INSTALL_DIR, filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function featureSelectionPrompt<F extends ReadonlyArray<Feature>>(\n features: F,\n): Promise<{ [key in F[number]['id']]: boolean }> {\n return traceStep('feature-selection', async () => {\n const selectedFeatures: Record<string, boolean> = {};\n\n for (const feature of features) {\n const selected = await abortIfCancelled(\n clack.select({\n message: feature.prompt,\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: feature.enabledHint,\n },\n {\n value: false,\n label: 'No',\n hint: feature.disabledHint,\n },\n ],\n }),\n );\n\n selectedFeatures[feature.id] = selected;\n }\n\n return selectedFeatures as { [key in F[number]['id']]: boolean };\n });\n}\n\nexport async function askShouldInstallPackage(\n pkgName: string,\n): Promise<boolean> {\n return traceStep(`ask-install-package`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to install ${chalk.cyan(pkgName)}?`,\n }),\n ),\n );\n}\n\nexport async function askShouldAddPackageOverride(\n pkgName: string,\n pkgVersion: string,\n): Promise<boolean> {\n return traceStep(`ask-add-package-override`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to add an override for ${chalk.cyan(\n pkgName,\n )} version ${chalk.cyan(pkgVersion)}?`,\n }),\n ),\n );\n}\n"]}
1
+ {"version":3,"file":"clack-utils.js","sourceRoot":"","sources":["../../../src/utils/clack-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { basename, isAbsolute, join, relative } from 'node:path';\nimport { setInterval } from 'node:timers';\nimport { URL } from 'node:url';\nimport axios from 'axios';\nimport chalk from 'chalk';\nimport opn from 'opn';\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport { type PackageDotJson, hasPackageInstalled } from './package-json';\nimport {\n type PackageManager,\n detectPackageManger,\n packageManagers,\n} from './package-manager';\nimport { fulfillsVersionRange } from './semver';\nimport type { Feature, WizardOptions } from './types';\nimport {\n CLOUD_URL,\n DEFAULT_HOST_URL,\n DUMMY_PROJECT_API_KEY,\n ISSUES_URL,\n} from '../lib/constants';\nimport { Analytics } from './analytics';\nimport clack from './clack';\n\ninterface ProjectData {\n projectApiKey: string;\n host: string;\n wizardHash: string;\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\nexport async function abort(message?: string, status?: number): Promise<never> {\n clack.outro(message ?? 'Wizard setup cancelled.');\n return process.exit(status ?? 1);\n}\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n if (clack.isCancel(await input)) {\n clack.cancel('Wizard setup cancelled.');\n process.exit(0);\n } else {\n return input as Exclude<T, symbol>;\n }\n}\n\nexport function printWelcome(options: {\n wizardName: string;\n message?: string;\n telemetryEnabled?: boolean;\n}): void {\n // eslint-disable-next-line no-console\n console.log('');\n clack.intro(chalk.inverse(` ${options.wizardName} `));\n\n let welcomeText =\n options.message ||\n `The ${options.wizardName} will help you set up PostHog for your application.\\nThank you for using PostHog :)`;\n\n if (options.telemetryEnabled) {\n welcomeText = `${welcomeText}\n\nThis wizard sends telemetry data and crash reports to PostHog. This helps us improve the Wizard.\nYou can turn this off at any time by running ${chalk.cyanBright(\n 'npx @posthog/wizard --disable-telemetry',\n )}.`;\n }\n\n clack.note(welcomeText);\n}\n\nexport async function confirmContinueIfNoOrDirtyGitRepo(): Promise<void> {\n return traceStep('check-git-status', async () => {\n if (!isInGitRepo()) {\n const continueWithoutGit = await abortIfCancelled(\n clack.confirm({\n message:\n 'You are not inside a git repository. The wizard will create and update files. Do you want to continue anyway?',\n }),\n );\n\n Analytics.setTag('continue-without-git', continueWithoutGit);\n\n if (!continueWithoutGit) {\n await abort(undefined, 0);\n }\n // return early to avoid checking for uncommitted files\n return;\n }\n\n const uncommittedOrUntrackedFiles = getUncommittedOrUntrackedFiles();\n if (uncommittedOrUntrackedFiles.length) {\n clack.log.warn(\n `You have uncommitted or untracked files in your repo:\n\n${uncommittedOrUntrackedFiles.join('\\n')}\n\nThe wizard will create and update files.`,\n );\n const continueWithDirtyRepo = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n\n Analytics.setTag('continue-with-dirty-repo', continueWithDirtyRepo);\n\n if (!continueWithDirtyRepo) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function askForItemSelection(\n items: string[],\n message: string,\n): Promise<{ value: string; index: number }> {\n const selection: { value: string; index: number } | symbol =\n await abortIfCancelled(\n clack.select({\n maxItems: 12,\n message: message,\n options: items.map((item, index) => {\n return {\n value: { value: item, index: index },\n label: item,\n };\n }),\n }),\n );\n\n return selection;\n}\n\nexport async function confirmContinueIfPackageVersionNotSupported({\n packageId,\n packageName,\n packageVersion,\n acceptableVersions,\n note,\n}: {\n packageId: string;\n packageName: string;\n packageVersion: string;\n acceptableVersions: string;\n note?: string;\n}): Promise<void> {\n return traceStep(`check-package-version`, async () => {\n Analytics.setTag(`${packageName.toLowerCase()}-version`, packageVersion);\n const isSupportedVersion = fulfillsVersionRange({\n acceptableVersions,\n version: packageVersion,\n canBeLatest: true,\n });\n\n if (isSupportedVersion) {\n Analytics.setTag(`${packageName.toLowerCase()}-supported`, true);\n return;\n }\n\n clack.log.warn(\n `You have an unsupported version of ${packageName} installed:\n\n ${packageId}@${packageVersion}`,\n );\n\n clack.note(\n note ??\n `Please upgrade to ${acceptableVersions} if you wish to use the PostHog Wizard.`,\n );\n const continueWithUnsupportedVersion = await abortIfCancelled(\n clack.confirm({\n message: 'Do you want to continue anyway?',\n }),\n );\n Analytics.setTag(\n `${packageName.toLowerCase()}-continue-with-unsupported-version`,\n continueWithUnsupportedVersion,\n );\n\n if (!continueWithUnsupportedVersion) {\n await abort(undefined, 0);\n }\n });\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n askBeforeUpdating = true,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n installDir,\n}: {\n /** The string that is passed to the package manager CLI as identifier to install (e.g. `posthog-js`, or `posthog-js@^1.100.0`) */\n packageName: string;\n alreadyInstalled: boolean;\n askBeforeUpdating?: boolean;\n /** Overrides what is shown in the installation logs in place of the `packageName` option. Useful if the `packageName` is ugly */\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n /** Add force install flag to command to skip install precondition fails */\n forceInstall?: boolean;\n installDir: string;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n if (alreadyInstalled && askBeforeUpdating) {\n const shouldUpdatePackage = await abortIfCancelled(\n clack.confirm({\n message: `The ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} package is already installed. Do you want to update it to the latest version?`,\n }),\n );\n\n if (!shouldUpdatePackage) {\n return {};\n }\n }\n\n const sdkInstallSpinner = clack.spinner();\n\n const pkgManager =\n packageManager || (await getPackageManager({ installDir }));\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${\n forceInstall ? pkgManager.forceInstallFlag : ''\n }`,\n { cwd: installDir },\n (err, stdout, stderr) => {\n if (err) {\n // Write a log file so we can better troubleshoot issues\n fs.writeFileSync(\n join(\n process.cwd(),\n `posthog-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n clack.log.error(\n `${chalk.red(\n 'Encountered the following error during installation:',\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n )}\\n\\n${e}\\n\\n${chalk.dim(\n `The wizard has created a \\`posthog-wizard-installation-error-*.log\\` file. If you think this issue is caused by the PostHog Wizard, create an issue on GitHub and include the log file's content:\\n${ISSUES_URL}`,\n )}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${chalk.bold.cyan(\n packageNameDisplayLabel ?? packageName,\n )} with ${chalk.bold(pkgManager.label)}.`,\n );\n\n return { packageManager: pkgManager };\n });\n}\n\nexport async function runPrettierIfInstalled({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles()\n .map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n })\n .join(' ');\n\n if (!changedOrUntrackedFiles.length) {\n // Likewise, if we can't find changed or untracked files, there's no point in running Prettier.\n return;\n }\n\n const packageJson = await getPackageDotJson({ installDir });\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n Analytics.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n const prettierSpinner = clack.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `npx prettier --ignore-unknown --write ${changedOrUntrackedFiles}`,\n (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n prettierSpinner.stop('Prettier failed to run.');\n clack.log.warn(\n 'Prettier failed to run. There may be formatting issues in your updated files.',\n );\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n });\n}\n\n/**\n * Checks if @param packageId is listed as a dependency in @param packageJson.\n * If not, it will ask users if they want to continue without the package.\n *\n * Use this function to check if e.g. a the framework of the SDK is installed\n *\n * @param packageJson the package.json object\n * @param packageId the npm name of the package\n * @param packageName a human readable name of the package\n */\nexport async function ensurePackageIsInstalled(\n packageJson: PackageDotJson,\n packageId: string,\n packageName: string,\n): Promise<void> {\n return traceStep('ensure-package-installed', async () => {\n const installed = hasPackageInstalled(packageId, packageJson);\n\n Analytics.setTag(`${packageName.toLowerCase()}-installed`, installed);\n\n if (!installed) {\n Analytics.setTag(`${packageName.toLowerCase()}-installed`, false);\n const continueWithoutPackage = await abortIfCancelled(\n clack.confirm({\n message: `${packageName} does not seem to be installed. Do you still want to continue?`,\n initialValue: false,\n }),\n );\n\n if (!continueWithoutPackage) {\n await abort(undefined, 0);\n }\n }\n });\n}\n\nexport async function getPackageDotJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(installDir, 'package.json'), 'utf8')\n .catch(() => {\n clack.log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n clack.log.error(\n `Unable to parse your ${chalk.cyan(\n 'package.json',\n )}. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(installDir, 'package.json'),\n // TODO: maybe figure out the original indentation\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n clack.log.error(`Unable to update your ${chalk.cyan('package.json')}.`);\n\n await abort();\n }\n}\n\nexport async function getPackageManager({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageManager> {\n const detectedPackageManager = detectPackageManger({ installDir });\n\n if (detectedPackageManager) {\n return detectedPackageManager;\n }\n\n const selectedPackageManager: PackageManager | symbol =\n await abortIfCancelled(\n clack.select({\n message: 'Please select your package manager.',\n options: packageManagers.map((packageManager) => ({\n value: packageManager,\n label: packageManager.label,\n })),\n }),\n );\n\n Analytics.setTag('package-manager', selectedPackageManager.name);\n\n return selectedPackageManager;\n}\n\nexport function isUsingTypeScript({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n try {\n return fs.existsSync(join(installDir, 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if we already got project data from a previous wizard invocation.\n * If yes, this data is returned.\n * Otherwise, we start the login flow and ask the user to select a project.\n *\n * Use this function to get project data for the wizard.\n *\n * @param options wizard options\n * @returns project data (token, url)\n */\nexport async function getOrAskForProjectData(_options: WizardOptions): Promise<{\n wizardHash: string;\n host: string;\n projectApiKey: string;\n}> {\n const { host, projectApiKey, wizardHash } = await traceStep('login', () =>\n askForWizardLogin({\n url: CLOUD_URL,\n }),\n );\n\n if (!projectApiKey) {\n clack.log.error(`Didn't receive a project API key. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${chalk.cyan(ISSUES_URL)}`);\n\n clack.log\n .info(`In the meantime, we'll add a dummy project API key (${chalk.cyan(\n `\"${DUMMY_PROJECT_API_KEY}\"`,\n )}) for you to replace later.\nYou can find your Project API key here:\n${chalk.cyan(`${CLOUD_URL}/settings/project#variables`)}`);\n }\n\n return {\n wizardHash,\n host: host || DEFAULT_HOST_URL,\n projectApiKey: projectApiKey || DUMMY_PROJECT_API_KEY,\n };\n}\n\nasync function askForWizardLogin(options: {\n url: string;\n}): Promise<ProjectData> {\n let wizardHash: string;\n\n try {\n wizardHash = (\n await axios.post<{ hash: string }>(`${options.url}/api/wizard/initialize`)\n ).data.hash;\n } catch (e: unknown) {\n clack.log.error('Loading wizard failed.');\n clack.log.info(JSON.stringify(e, null, 2));\n await abort(\n chalk.red(\n `Please try again in a few minutes and let us know if this issue persists: ${ISSUES_URL}`,\n ),\n );\n }\n\n const loginUrl = new URL(`${options.url}/wizard?hash=${wizardHash!}`);\n\n const urlToOpen = loginUrl.toString();\n\n clack.log.info(\n `${chalk.bold(\n `If the browser window didn't open automatically, please open the following link to login into PostHog:`,\n )}\\n\\n${chalk.cyan(urlToOpen)}`,\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 loginSpinner = clack.spinner();\n\n loginSpinner.start('Waiting for you to log in using the link above');\n\n const data = await new Promise<ProjectData>((resolve) => {\n const pollingInterval = setInterval(() => {\n axios\n .get<{\n project_api_key: string;\n host: string;\n }>(`${options.url}/api/wizard/data`, {\n headers: {\n 'Accept-Encoding': 'deflate',\n 'X-PostHog-Wizard-Hash': wizardHash,\n },\n })\n .then((result) => {\n const data: ProjectData = {\n wizardHash,\n projectApiKey: result.data.project_api_key,\n host: result.data.host,\n };\n\n resolve(data);\n clearTimeout(timeout);\n clearInterval(pollingInterval);\n })\n .catch(() => {\n // noop - just try again\n });\n }, 500);\n\n const timeout = setTimeout(() => {\n clearInterval(pollingInterval);\n loginSpinner.stop(\n 'Login timed out. No worries - it happens to the best of us.',\n );\n\n Analytics.setTag('opened-wizard-link', false);\n void abort('Please restart the Wizard and log in to complete the setup.');\n }, 180_000);\n });\n\n loginSpinner.stop('Login complete.');\n Analytics.setTag('opened-wizard-link', true);\n\n return data;\n}\n\n/**\n * Asks users if they have a config file for @param tool (e.g. Vite).\n * If yes, asks users to specify the path to their config file.\n *\n * Use this helper function as a fallback mechanism if the lookup for\n * a config file with its most usual location/name fails.\n *\n * @param toolName Name of the tool for which we're looking for the config file\n * @param configFileName Name of the most common config file name (e.g. vite.config.js)\n *\n * @returns a user path to the config file or undefined if the user doesn't have a config file\n */\nexport async function askForToolConfigPath(\n toolName: string,\n configFileName: string,\n): Promise<string | undefined> {\n const hasConfig = await abortIfCancelled(\n clack.confirm({\n message: `Do you have a ${toolName} config file (e.g. ${chalk.cyan(\n configFileName,\n )})?`,\n initialValue: true,\n }),\n );\n\n if (!hasConfig) {\n return undefined;\n }\n\n return await abortIfCancelled(\n clack.text({\n message: `Please enter the path to your ${toolName} config file:`,\n placeholder: join('.', configFileName),\n validate: (value) => {\n if (!value) {\n return 'Please enter a path.';\n }\n\n try {\n fs.accessSync(value);\n } catch {\n return 'Could not access the file at this path.';\n }\n },\n }),\n );\n}\n\n/**\n * Prints copy/paste-able instructions to the console.\n * Afterwards asks the user if they added the code snippet to their file.\n *\n * While there's no point in providing a \"no\" answer here, it gives users time to fulfill the\n * task before the wizard continues with additional steps.\n *\n * Use this function if you want to show users instructions on how to add/modify\n * code in their file. This is helpful if automatic insertion failed or is not possible/feasible.\n *\n * @param filename the name of the file to which the code snippet should be applied.\n * If a path is provided, only the filename will be used.\n *\n * @param codeSnippet the snippet to be printed. Use {@link makeCodeSnippet} to create the\n * diff-like format for visually highlighting unchanged or modified lines of code.\n *\n * @param hint (optional) a hint to be printed after the main instruction to add\n * the code from @param codeSnippet to their @param filename.\n *\n * TODO: refactor copy paste instructions across different wizards to use this function.\n * this might require adding a custom message parameter to the function\n */\nexport async function showCopyPasteInstructions(\n filename: string,\n codeSnippet: string,\n hint?: string,\n): Promise<void> {\n clack.log.step(\n `Add the following code to your ${chalk.cyan(basename(filename))} file:${\n hint ? chalk.dim(` (${chalk.dim(hint)})`) : ''\n }`,\n );\n\n // Padding the code snippet to be printed with a \\n at the beginning and end\n // This makes it easier to distinguish the snippet from the rest of the output\n // Intentionally logging directly to console here so that the code can be copied/pasted directly\n // eslint-disable-next-line no-console\n console.log(`\\n${codeSnippet}\\n`);\n\n await abortIfCancelled(\n clack.select({\n message: 'Did you apply the snippet above?',\n options: [{ label: 'Yes, continue!', value: true }],\n initialValue: true,\n }),\n );\n}\n\n/**\n * Callback that exposes formatting helpers for a code snippet.\n * @param unchanged - Formats text as old code.\n * @param plus - Formats text as new code.\n * @param minus - Formats text as removed code.\n */\ntype CodeSnippetFormatter = (\n unchanged: (txt: string) => string,\n plus: (txt: string) => string,\n minus: (txt: string) => string,\n) => string;\n\n/**\n * Crafts a code snippet that can be used to e.g.\n * - print copy/paste instructions to the console\n * - create a new config file.\n *\n * @param colors set this to true if you want the final snippet to be colored.\n * This is useful for printing the snippet to the console as part of copy/paste instructions.\n *\n * @param callback the callback that returns the formatted code snippet.\n * It exposes takes the helper functions for marking code as unchanged, new or removed.\n * These functions no-op if no special formatting should be applied\n * and otherwise apply the appropriate formatting/coloring.\n * (@see {@link CodeSnippetFormatter})\n *\n * @see {@link showCopyPasteInstructions} for the helper with which to display the snippet in the console.\n *\n * @returns a string containing the final, formatted code snippet.\n */\nexport function makeCodeSnippet(\n colors: boolean,\n callback: CodeSnippetFormatter,\n): string {\n const unchanged = (txt: string) => (colors ? chalk.grey(txt) : txt);\n const plus = (txt: string) => (colors ? chalk.greenBright(txt) : txt);\n const minus = (txt: string) => (colors ? chalk.redBright(txt) : txt);\n\n return callback(unchanged, plus, minus);\n}\n\n/**\n * Creates a new config file with the given @param filepath and @param codeSnippet.\n *\n * Use this function to create a new config file for users. This is useful\n * when users answered that they don't yet have a config file for a tool.\n *\n * (This doesn't mean that they don't yet have some other way of configuring\n * their tool but we can leave it up to them to figure out how to merge configs\n * here.)\n *\n * @param filepath absolute path to the new config file\n * @param codeSnippet the snippet to be inserted into the file\n * @param moreInformation (optional) the message to be printed after the file was created\n * For example, this can be a link to more information about configuring the tool.\n *\n * @returns true on success, false otherwise\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = chalk.cyan(relative(installDir, filepath));\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n clack.log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n clack.log.info(chalk.gray(moreInformation));\n }\n\n return true;\n } catch (e) {\n debug(e);\n clack.log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n\nexport async function featureSelectionPrompt<F extends ReadonlyArray<Feature>>(\n features: F,\n): Promise<{ [key in F[number]['id']]: boolean }> {\n return traceStep('feature-selection', async () => {\n const selectedFeatures: Record<string, boolean> = {};\n\n for (const feature of features) {\n const selected = await abortIfCancelled(\n clack.select({\n message: feature.prompt,\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: feature.enabledHint,\n },\n {\n value: false,\n label: 'No',\n hint: feature.disabledHint,\n },\n ],\n }),\n );\n\n selectedFeatures[feature.id] = selected;\n }\n\n return selectedFeatures as { [key in F[number]['id']]: boolean };\n });\n}\n\nexport async function askShouldInstallPackage(\n pkgName: string,\n): Promise<boolean> {\n return traceStep(`ask-install-package`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to install ${chalk.cyan(pkgName)}?`,\n }),\n ),\n );\n}\n\nexport async function askShouldAddPackageOverride(\n pkgName: string,\n pkgVersion: string,\n): Promise<boolean> {\n return traceStep(`ask-add-package-override`, () =>\n abortIfCancelled(\n clack.confirm({\n message: `Do you want to add an override for ${chalk.cyan(\n pkgName,\n )} version ${chalk.cyan(pkgVersion)}?`,\n }),\n ),\n );\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { WizardOptions } from './types';
1
2
  export interface PackageManager {
2
3
  name: string;
3
4
  label: string;
@@ -6,8 +7,8 @@ export interface PackageManager {
6
7
  runScriptCommand: string;
7
8
  flags: string;
8
9
  forceInstallFlag: string;
9
- detect: () => boolean;
10
- addOverride: (pkgName: string, pkgVersion: string) => Promise<void>;
10
+ detect: ({ installDir }: Pick<WizardOptions, 'installDir'>) => boolean;
11
+ addOverride: (pkgName: string, pkgVersion: string, { installDir }: Pick<WizardOptions, 'installDir'>) => Promise<void>;
11
12
  }
12
13
  export declare const BUN: PackageManager;
13
14
  export declare const YARN_V1: PackageManager;
@@ -16,4 +17,4 @@ export declare const YARN_V2: PackageManager;
16
17
  export declare const PNPM: PackageManager;
17
18
  export declare const NPM: PackageManager;
18
19
  export declare const packageManagers: PackageManager[];
19
- export declare function detectPackageManger(): PackageManager | null;
20
+ export declare function detectPackageManger({ installDir, }: Pick<WizardOptions, 'installDir'>): PackageManager | null;