@posthog/wizard 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/nextjs/docs.js +2 -0
- package/dist/src/nextjs/docs.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.js +8 -2
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/react/docs.js +5 -2
- package/dist/src/react/docs.js.map +1 -1
- package/dist/src/react/react-wizard.js +7 -0
- package/dist/src/react/react-wizard.js.map +1 -1
- package/dist/src/utils/rules/add-editor-rules.d.ts +9 -0
- package/dist/src/utils/rules/add-editor-rules.js +88 -0
- package/dist/src/utils/rules/add-editor-rules.js.map +1 -0
- package/dist/src/utils/rules/add-editor-rules.ts +82 -0
- package/dist/src/utils/rules/next-rules.md +9 -0
- package/dist/src/utils/rules/react-rules.md +7 -0
- package/dist/src/utils/rules/universal.md +20 -0
- package/package.json +2 -2
package/dist/src/nextjs/docs.js
CHANGED
|
@@ -27,6 +27,7 @@ export function PostHogProvider({ children }: { children: React.ReactNode }) {
|
|
|
27
27
|
ui_host: "${(0, urls_1.getUiHostFromHost)(host)}",
|
|
28
28
|
capture_pageview: false, // We capture pageviews manually
|
|
29
29
|
capture_pageleave: true, // Enable pageleave capture
|
|
30
|
+
debug: process.env.NODE_ENV === "development",
|
|
30
31
|
})
|
|
31
32
|
}, [])
|
|
32
33
|
|
|
@@ -177,6 +178,7 @@ export default function App({ Component, pageProps }) {
|
|
|
177
178
|
loaded: (posthog) => {
|
|
178
179
|
if (process.env.NODE_ENV === "development") posthog.debug()
|
|
179
180
|
},
|
|
181
|
+
debug: process.env.NODE_ENV === "development",
|
|
180
182
|
})
|
|
181
183
|
|
|
182
184
|
const handleRouteChange = () => posthog?.capture("$pageview")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/nextjs/docs.ts"],"names":[],"mappings":";;;AAAA,wCAAwE;AAEjE,MAAM,sBAAsB,GAAG,CAAC,EACrC,IAAI,EACJ,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO;;wBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;kBAmBgB,IAAA,wBAAiB,EAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/nextjs/docs.ts"],"names":[],"mappings":";;;AAAA,wCAAwE;AAEjE,MAAM,sBAAsB,GAAG,CAAC,EACrC,IAAI,EACJ,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO;;wBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;kBAmBgB,IAAA,wBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA6C1B,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2BxC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;aAY1C,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;wBAyBO,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AA5JW,QAAA,sBAAsB,0BA4JjC;AAEK,MAAM,wBAAwB,GAAG,CAAC,EACvC,IAAI,EACJ,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO;;aAEI,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;mCAElD,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;kBAkBgB,IAAA,wBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;gBAwBzB,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;aAY1C,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;wBAyBO,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AA5GW,QAAA,wBAAwB,4BA4GnC","sourcesContent":["import { getAssetHostFromHost, getUiHostFromHost } from '../utils/urls';\n\nexport const getNextjsAppRouterDocs = ({\n host,\n language,\n}: {\n host: string;\n language: 'typescript' | 'javascript';\n}) => {\n return `\n==============================\nFILE: PostHogProvider.${\n language === 'typescript' ? 'tsx' : 'jsx'\n } (put it somewhere where client files are, like the components folder)\nLOCATION: Wherever other providers are, or the components folder\n==============================\nChanges:\n- Create a PostHogProvider component that will be imported into the layout file.\n\nExample:\n--------------------------------------------------\n\"use client\"\n\nimport posthog from \"posthog-js\"\nimport { PostHogProvider as PHProvider, usePostHog } from \"posthog-js/react\"\nimport { Suspense, useEffect } from \"react\"\nimport { usePathname, useSearchParams } from \"next/navigation\"\n\nexport function PostHogProvider({ children }: { children: React.ReactNode }) {\n useEffect(() => {\n posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n api_host: \"/ingest\",\n ui_host: \"${getUiHostFromHost(host)}\",\n capture_pageview: false, // We capture pageviews manually\n capture_pageleave: true, // Enable pageleave capture\n debug: process.env.NODE_ENV === \"development\",\n })\n }, [])\n\n return (\n <PHProvider client={posthog}>\n <SuspendedPostHogPageView />\n {children}\n </PHProvider>\n )\n}\n\n\nfunction PostHogPageView() {\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const posthog = usePostHog()\n\n useEffect(() => {\n if (pathname && posthog) {\n let url = window.origin + pathname\n const search = searchParams.toString()\n if (search) {\n url += \"?\" + search\n }\n posthog.capture(\"$pageview\", { \"$current_url\": url })\n }\n }, [pathname, searchParams, posthog])\n\n return null\n}\n\nfunction SuspendedPostHogPageView() {\n return (\n <Suspense fallback={null}>\n <PostHogPageView />\n </Suspense>\n )\n}\n--------------------------------------------------\n\n==============================\nFILE: layout.${language === 'typescript' ? 'tsx' : 'jsx'}\nLOCATION: Wherever the root layout is\n==============================\nChanges:\n- Import the PostHogProvider from the providers file and wrap the app in it.\n\nExample:\n--------------------------------------------------\n// other imports\nimport { PostHogProvider } from \"LOCATION_OF_POSTHOG_PROVIDER\"\n\nexport default function RootLayout({ children }) {\n return (\n <html lang=\"en\">\n <body>\n <PostHogProvider>\n {/* other providers */}\n {children}\n {/* other providers */}\n </PostHogProvider>\n </body>\n </html>\n )\n}\n--------------------------------------------------\n\n==============================\nFILE: posthog.${language === 'typescript' ? 'ts' : 'js'}\nLOCATION: Wherever works best given the project structure\n==============================\nChanges:\n- Initialize the PostHog Node.js client\n\nExample:\n--------------------------------------------------\nimport { PostHog } from \"posthog-node\"\n\nexport default function PostHogClient() {\n const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n host: \"${host}\",\n flushAt: 1,\n flushInterval: 0,\n })\n return posthogClient\n}\n--------------------------------------------------\n\n==============================\nFILE: next.config.{js,ts,mjs,cjs}\nLOCATION: Wherever the root next config is\n==============================\nChanges:\n- Add rewrites to the Next.js config to support PostHog, if there are existing rewrites, add the PostHog rewrites to them.\n- Add skipTrailingSlashRedirect to the Next.js config to support PostHog trailing slash API requests.\n- This can be of type js, ts, mjs, cjs etc. You should adapt the file according to what extension it uses, and if it does not exist yet use '.js'.\n\nExample:\n--------------------------------------------------\nconst nextConfig = {\n // other config\n async rewrites() {\n return [\n {\n source: \"/ingest/static/:path*\",\n destination: \"${getAssetHostFromHost(host)}/static/:path*\",\n },\n {\n source: \"/ingest/:path*\",\n destination: \"${host}/:path*\",\n },\n {\n source: \"/ingest/decide\",\n destination: \"${host}/decide\",\n },\n ];\n },\n // This is required to support PostHog trailing slash API requests\n skipTrailingSlashRedirect: true,\n}\nmodule.exports = nextConfig\n--------------------------------------------------`;\n};\n\nexport const getNextjsPagesRouterDocs = ({\n host,\n language,\n}: {\n host: string;\n language: 'typescript' | 'javascript';\n}) => {\n return `\n==============================\nFILE: _app.${language === 'typescript' ? 'tsx' : 'jsx'}\nLOCATION: Wherever the root _app.${\n language === 'typescript' ? 'tsx' : 'jsx'\n } file is\n==============================\nChanges:\n- Initialize PostHog in _app.js.\n- Wrap the application in PostHogProvider.\n- Manually capture $pageview events.\n\nExample:\n--------------------------------------------------\nimport { useEffect } from \"react\"\nimport { Router } from \"next/router\"\nimport posthog from \"posthog-js\"\nimport { PostHogProvider } from \"posthog-js/react\"\n\nexport default function App({ Component, pageProps }) {\n useEffect(() => {\n posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY, {\n api_host: \"/ingest\",\n ui_host: \"${getUiHostFromHost(host)}\",\n loaded: (posthog) => {\n if (process.env.NODE_ENV === \"development\") posthog.debug()\n },\n debug: process.env.NODE_ENV === \"development\",\n })\n\n const handleRouteChange = () => posthog?.capture(\"$pageview\")\n Router.events.on(\"routeChangeComplete\", handleRouteChange)\n\n return () => {\n Router.events.off(\"routeChangeComplete\", handleRouteChange)\n }\n }, [])\n\n return (\n <PostHogProvider client={posthog}>\n <Component {...pageProps} />\n </PostHogProvider>\n )\n}\n--------------------------------------------------\n\n==============================\nFILE: posthog.${language === 'typescript' ? 'ts' : 'js'}\nLOCATION: Wherever works best given the project structure\n==============================\nChanges:\n- Initialize the PostHog Node.js client\n\nExample:\n--------------------------------------------------\nimport { PostHog } from \"posthog-node\"\n\nexport default function PostHogClient() {\n const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n host: \"${host}\",\n flushAt: 1,\n flushInterval: 0,\n })\n return posthogClient\n}\n--------------------------------------------------\n\n==============================\nFILE: next.config.{js,ts,mjs,cjs}\nLOCATION: Wherever the root next config is\n==============================\nChanges:\n- Add rewrites to the Next.js config to support PostHog, if there are existing rewrites, add the PostHog rewrites to them.\n- Add skipTrailingSlashRedirect to the Next.js config to support PostHog trailing slash API requests.\n- This can be of type js, ts, mjs, cjs etc. You should adapt the file according to what extension it uses, and if it does not exist yet use '.js'.\n\nExample:\n--------------------------------------------------\nconst nextConfig = {\n // other config\n async rewrites() {\n return [\n {\n source: \"/ingest/static/:path*\",\n destination: \"${getAssetHostFromHost(host)}/static/:path*\",\n },\n {\n source: \"/ingest/:path*\",\n destination: \"${host}/:path*\",\n },\n {\n source: \"/ingest/decide\",\n destination: \"${host}/decide\",\n },\n ];\n },\n // This is required to support PostHog trailing slash API requests\n skipTrailingSlashRedirect: true,\n}\nmodule.exports = nextConfig\n--------------------------------------------------`;\n};\n"]}
|
|
@@ -16,6 +16,7 @@ const analytics_1 = require("../utils/analytics");
|
|
|
16
16
|
const environment_1 = require("../utils/environment");
|
|
17
17
|
const file_utils_1 = require("../utils/file-utils");
|
|
18
18
|
const clack_utils_2 = require("../utils/clack-utils");
|
|
19
|
+
const add_editor_rules_1 = require("../utils/rules/add-editor-rules");
|
|
19
20
|
async function runNextjsWizard(options) {
|
|
20
21
|
(0, clack_utils_1.printWelcome)({
|
|
21
22
|
wizardName: 'PostHog Next.js Wizard',
|
|
@@ -94,8 +95,13 @@ async function runNextjsWizard(options) {
|
|
|
94
95
|
installDir: options.installDir,
|
|
95
96
|
integration: constants_1.Integration.nextjs,
|
|
96
97
|
});
|
|
97
|
-
|
|
98
|
-
|
|
98
|
+
await (0, add_editor_rules_1.addEditorRules)({
|
|
99
|
+
rulesName: 'next-rules.md',
|
|
100
|
+
installDir: options.installDir,
|
|
101
|
+
integration: constants_1.Integration.nextjs,
|
|
102
|
+
default: options.default,
|
|
103
|
+
});
|
|
104
|
+
clack_1.default.outro(`${chalk_1.default.green('Successfully installed PostHog!')} ${`\n\n${aiConsent
|
|
99
105
|
? `Note: This uses experimental AI to setup your project. It might have got it wrong, please check!\n`
|
|
100
106
|
: ``}You should validate your setup by (re)starting your dev environment (e.g. ${chalk_1.default.cyan(`${packageManagerForOutro.runScriptCommand} dev`)})`}
|
|
101
107
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":";AAAA,8BAA8B;;;;;
|
|
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 */\n\nimport chalk from 'chalk';\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\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, ISSUES_URL } from '../lib/constants';\nimport { getNextjsAppRouterDocs, getNextjsPagesRouterDocs } from './docs';\nimport { analytics } from '../utils/analytics';\nimport { addOrUpdateEnvironmentVariables } 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 { addEditorRules } from '../utils/rules/add-editor-rules';\n\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 await addOrUpdateEnvironmentVariables({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierIfInstalled({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n await addEditorRules({\n rulesName: 'next-rules.md',\n installDir: options.installDir,\n integration: Integration.nextjs,\n default: options.default,\n });\n\n clack.outro(`${chalk.green('Successfully installed PostHog!')} ${`\\n\\n${\n aiConsent\n ? `Note: This uses experimental AI to setup your project. It might have got it wrong, please check!\\n`\n : ``\n }You should validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )})`}\n\n${chalk.dim(`If you encounter any issues, let us know here: ${ISSUES_URL}`)}`);\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"]}
|
package/dist/src/react/docs.js
CHANGED
|
@@ -28,8 +28,11 @@ root.render(
|
|
|
28
28
|
<PostHogProvider
|
|
29
29
|
apiKey={${apiKeyText}}
|
|
30
30
|
options={{
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
api_host: ${host},
|
|
32
|
+
debug: ${envVarPrefix === 'VITE_PUBLIC_'
|
|
33
|
+
? 'import.meta.env.MODE === "development"'
|
|
34
|
+
: 'process.env.NODE_ENV === "development"'},
|
|
35
|
+
}}
|
|
33
36
|
>
|
|
34
37
|
<App />
|
|
35
38
|
</PostHogProvider>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/react/docs.ts"],"names":[],"mappings":";;;AAAO,MAAM,qBAAqB,GAAG,CAAC,EACpC,IAAI,EACJ,QAAQ,EACR,YAAY,GAKb,EAAE,EAAE;IACH,MAAM,UAAU,GACd,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,yCAAyC;QAC3C,CAAC,CAAC,eAAe,YAAY,aAAa,CAAC;IAC/C,OAAO;;sBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;gBAmBc,UAAU;;
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/react/docs.ts"],"names":[],"mappings":";;;AAAO,MAAM,qBAAqB,GAAG,CAAC,EACpC,IAAI,EACJ,QAAQ,EACR,YAAY,GAKb,EAAE,EAAE;IACH,MAAM,UAAU,GACd,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,yCAAyC;QAC3C,CAAC,CAAC,eAAe,YAAY,aAAa,CAAC;IAC/C,OAAO;;sBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;gBAmBc,UAAU;;oBAEN,IAAI;iBAEd,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,wCACN;;;;;;mDAM2C,CAAC;AACpD,CAAC,CAAC;AAlDW,QAAA,qBAAqB,yBAkDhC","sourcesContent":["export const getReactDocumentation = ({\n host,\n language,\n envVarPrefix,\n}: {\n host: string;\n language: 'typescript' | 'javascript';\n envVarPrefix: string;\n}) => {\n const apiKeyText =\n envVarPrefix === 'VITE_PUBLIC_'\n ? 'import.meta.env.VITE_PUBLIC_POSTHOG_KEY'\n : `process.env.${envVarPrefix}POSTHOG_KEY`;\n return `\n==============================\nFILE: {index / App}.${\n language === 'typescript' ? 'tsx' : 'jsx'\n } (wherever the root of the app is)\nLOCATION: Wherever the root of the app is\n==============================\nChanges:\n- Add the PostHogProvider to the root of the app in the provider tree.\n\nExample:\n--------------------------------------------------\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\n\nimport { PostHogProvider} from 'posthog-js/react'\n\nconst root = ReactDOM.createRoot(document.getElementById('root'));\n\nroot.render(\n <React.StrictMode>\n <PostHogProvider\n apiKey={${apiKeyText}}\n options={{\n api_host: ${host},\n debug: ${\n envVarPrefix === 'VITE_PUBLIC_'\n ? 'import.meta.env.MODE === \"development\"'\n : 'process.env.NODE_ENV === \"development\"'\n },\n }}\n >\n <App />\n </PostHogProvider>\n </React.StrictMode>\n--------------------------------------------------`;\n};\n"]}
|
|
@@ -15,6 +15,7 @@ const analytics_1 = require("../utils/analytics");
|
|
|
15
15
|
const environment_1 = require("../utils/environment");
|
|
16
16
|
const file_utils_1 = require("../utils/file-utils");
|
|
17
17
|
const clack_utils_2 = require("../utils/clack-utils");
|
|
18
|
+
const add_editor_rules_1 = require("../utils/rules/add-editor-rules");
|
|
18
19
|
async function runReactWizard(options) {
|
|
19
20
|
(0, clack_utils_1.printWelcome)({
|
|
20
21
|
wizardName: 'PostHog React Wizard',
|
|
@@ -85,6 +86,12 @@ async function runReactWizard(options) {
|
|
|
85
86
|
installDir: options.installDir,
|
|
86
87
|
integration: constants_1.Integration.react,
|
|
87
88
|
});
|
|
89
|
+
await (0, add_editor_rules_1.addEditorRules)({
|
|
90
|
+
installDir: options.installDir,
|
|
91
|
+
rulesName: 'react-rules.md',
|
|
92
|
+
integration: constants_1.Integration.react,
|
|
93
|
+
default: options.default,
|
|
94
|
+
});
|
|
88
95
|
clack_1.default.outro(`
|
|
89
96
|
${chalk_1.default.green('Successfully installed PostHog!')} ${`\n\n${aiConsent
|
|
90
97
|
? `Note: This uses experimental AI to setup your project. It might have got it wrong, pleaes check!\n`
|
|
@@ -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":";AAAA,8BAA8B;;;;;AAkC9B,wCAqHC;AArJD,kDAA0B;AAC1B,sDAY8B;AAC9B,wDAA+E;AAC/E,2DAAmC;AACnC,gDAA2D;AAC3D,iCAA+C;AAC/C,kDAA+C;AAC/C,sDAG8B;AAC9B,oDAI6B;AAE7B,sDAAyD;AACzD,sEAAiE;AAE1D,KAAK,UAAU,cAAc,CAAC,OAAsB;IACzD,IAAA,0BAAY,EAAC;QACX,UAAU,EAAE,sBAAsB;KACnC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAe,EAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAA,mBAAK,EACT,qJAAqJ,EACrJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,IAAA,+BAAiB,GAAE,CAAC,CAAC;IAEvE,MAAM,kBAAkB,GAAG,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;IAEtD,MAAM,IAAA,+CAAiC,EAAC,OAAO,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;IAErD,MAAM,IAAA,sCAAwB,EAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE9D,MAAM,YAAY,GAAG,IAAA,gCAAiB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE7D,IAAI,YAAY,EAAE,CAAC;QACjB,qBAAS,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,oCAAsB,EAAC;QACvE,GAAG,OAAO;QACV,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,mBAAmB,GAAG,IAAA,kCAAmB,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAE3E,qBAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,CAAC,CAAC;IAE/D,MAAM,EAAE,cAAc,EAAE,6BAA6B,EAAE,GACrD,MAAM,IAAA,4BAAc,EAAC;QACnB,WAAW,EAAE,YAAY;QACzB,uBAAuB,EAAE,YAAY;QACrC,gBAAgB,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,YAAY,CAAC;QAC7D,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,iBAAiB,EAAE,KAAK;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,uBAAW,CAAC,KAAK;KAC/B,CAAC,CAAC;IAEL,MAAM,aAAa,GAAG,MAAM,IAAA,2CAA8B,EAAC;QACzD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,uBAAW,CAAC,KAAK;KAC/B,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,IAAA,gCAAkB,EAAC,OAAO,CAAC,CAAC;IAEvD,MAAM,yBAAyB,GAAG,IAAA,4BAAqB,EAAC;QACtD,IAAI;QACJ,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;QAC1D,YAAY;KACb,CAAC,CAAC;IAEH,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAE5D,MAAM,aAAa,GAAG,MAAM,IAAA,6BAAgB,EAAC;QAC3C,WAAW,EAAE,uBAAW,CAAC,KAAK;QAC9B,aAAa;QACb,aAAa,EAAE,yBAAyB;QACxC,UAAU;QACV,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,IAAA,8CAAiC,EAAC;QACtC,WAAW,EAAE,uBAAW,CAAC,KAAK;QAC9B,aAAa;QACb,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,aAAa,EAAE,yBAAyB;QACxC,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,IAAA,6CAA+B,EAAC;QACpC,SAAS,EAAE;YACT,CAAC,YAAY,GAAG,aAAa,CAAC,EAAE,aAAa;SAC9C;QACD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,uBAAW,CAAC,KAAK;KAC/B,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAC1B,6BAA6B,IAAI,CAAC,MAAM,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC,CAAC;IAEtE,MAAM,IAAA,oCAAsB,EAAC;QAC3B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,uBAAW,CAAC,KAAK;KAC/B,CAAC,CAAC;IAEH,MAAM,IAAA,iCAAc,EAAC;QACnB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,gBAAgB;QAC3B,WAAW,EAAE,uBAAW,CAAC,KAAK;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,eAAK,CAAC,KAAK,CAAC;EACZ,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,IAAI,OAChD,SAAS;QACP,CAAC,CAAC,oGAAoG;QACtG,CAAC,CAAC,EACN,6EAA6E,eAAK,CAAC,IAAI,CACrF,GAAG,sBAAsB,CAAC,gBAAgB,MAAM,CACjD,GAAG;;EAEJ,eAAK,CAAC,GAAG,CAAC,kDAAkD,sBAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAE7E,MAAM,qBAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC","sourcesContent":["/* eslint-disable max-lines */\n\nimport chalk from 'chalk';\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport clack from '../utils/clack';\nimport { Integration, ISSUES_URL } from '../lib/constants';\nimport { getReactDocumentation } from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n addOrUpdateEnvironmentVariables,\n detectEnvVarPrefix,\n} 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 { addEditorRules } from '../utils/rules/add-editor-rules';\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 host,\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 await addOrUpdateEnvironmentVariables({\n variables: {\n [envVarPrefix + 'POSTHOG_KEY']: projectApiKey,\n },\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierIfInstalled({\n installDir: options.installDir,\n integration: Integration.react,\n });\n\n await addEditorRules({\n installDir: options.installDir,\n rulesName: 'react-rules.md',\n integration: Integration.react,\n default: options.default,\n });\n\n clack.outro(`\n${chalk.green('Successfully installed PostHog!')} ${`\\n\\n${\n aiConsent\n ? `Note: This uses experimental AI to setup your project. It might have got it wrong, pleaes check!\\n`\n : ``\n }You should validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )})`}\n\n${chalk.dim(`If you encounter any issues, let us know here: ${ISSUES_URL}`)}`);\n\n await analytics.shutdown('success');\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Integration } from '../../lib/constants';
|
|
2
|
+
type AddEditorRulesOptions = {
|
|
3
|
+
installDir: string;
|
|
4
|
+
rulesName: string;
|
|
5
|
+
integration: Integration;
|
|
6
|
+
default?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const addEditorRules: ({ installDir, rulesName, integration, default: defaultAddEditorRules, }: AddEditorRulesOptions) => Promise<void>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.addEditorRules = void 0;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const path_1 = __importDefault(require("path"));
|
|
43
|
+
const analytics_1 = require("../analytics");
|
|
44
|
+
const clack_1 = __importDefault(require("../clack"));
|
|
45
|
+
const telemetry_1 = require("../../telemetry");
|
|
46
|
+
const clack_utils_1 = require("../clack-utils");
|
|
47
|
+
const addEditorRules = async ({ installDir, rulesName, integration, default: defaultAddEditorRules, }) => {
|
|
48
|
+
// Add rules file if in Cursor environment
|
|
49
|
+
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
|
+
},
|
|
59
|
+
{
|
|
60
|
+
label: 'No, thanks',
|
|
61
|
+
value: false,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
}));
|
|
65
|
+
if (!addEditorRules) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
return (0, telemetry_1.traceStep)('add-editor-rules', async () => {
|
|
69
|
+
const docsDir = path_1.default.join(installDir, '.cursor', 'rules');
|
|
70
|
+
await fs.promises.mkdir(docsDir, { recursive: true });
|
|
71
|
+
const frameworkRules = await fs.promises.readFile(path_1.default.join(__dirname, rulesName), 'utf8');
|
|
72
|
+
const universalRulesPath = path_1.default.join(__dirname, 'universal.md');
|
|
73
|
+
const universalRules = await fs.promises.readFile(universalRulesPath, 'utf8');
|
|
74
|
+
// Replace {universal} placeholder with universal rules content
|
|
75
|
+
const combinedRules = frameworkRules.replace('{universal}', universalRules);
|
|
76
|
+
const targetPath = path_1.default.join(docsDir, 'posthog-integration.mdc');
|
|
77
|
+
// Write the combined rules
|
|
78
|
+
await fs.promises.writeFile(targetPath, combinedRules, 'utf8');
|
|
79
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
80
|
+
action: 'added editor rules',
|
|
81
|
+
integration,
|
|
82
|
+
});
|
|
83
|
+
clack_1.default.log.info(`Added Cursor rules to ${chalk_1.default.bold.cyan(docsDir)}`);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
exports.addEditorRules = addEditorRules;
|
|
88
|
+
//# sourceMappingURL=add-editor-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-editor-rules.js","sourceRoot":"","sources":["../../../../src/utils/rules/add-editor-rules.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,kDAA0B;AAC1B,gDAAwB;AAExB,4CAAyC;AACzC,qDAA6B;AAC7B,+CAA4C;AAC5C,gDAAkD;AAS3C,MAAM,cAAc,GAAG,KAAK,EAAE,EACnC,UAAU,EACV,SAAS,EACT,WAAW,EACX,OAAO,EAAE,qBAAqB,GACR,EAAE,EAAE;IAC1B,0CAA0C;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,cAAc,GAAY,qBAAqB;YACnD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,IAAA,8BAAgB,EACpB,eAAK,CAAC,MAAM,CAAC;gBACX,OAAO,EACL,4DAA4D;gBAC9D,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE,cAAc;wBACrB,KAAK,EAAE,IAAI;qBACZ;oBACD;wBACE,KAAK,EAAE,YAAY;wBACnB,KAAK,EAAE,KAAK;qBACb;iBACF;aACF,CAAC,CACH,CAAC;QAEN,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,OAAO,IAAA,qBAAS,EAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtD,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAC/C,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAC/B,MAAM,CACP,CAAC;YACF,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAEhE,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAC/C,kBAAkB,EAClB,MAAM,CACP,CAAC;YAEF,+DAA+D;YAC/D,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAC1C,aAAa,EACb,cAAc,CACf,CAAC;YACF,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;YAEjE,2BAA2B;YAC3B,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YAE/D,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;gBACtC,MAAM,EAAE,oBAAoB;gBAC5B,WAAW;aACZ,CAAC,CAAC;YAEH,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAjEW,QAAA,cAAc,kBAiEzB","sourcesContent":["import * as fs from 'fs';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { Integration } from '../../lib/constants';\nimport { analytics } from '../analytics';\nimport clack from '../clack';\nimport { traceStep } from '../../telemetry';\nimport { abortIfCancelled } from '../clack-utils';\n\ntype AddEditorRulesOptions = {\n installDir: string;\n rulesName: string;\n integration: Integration;\n default?: boolean;\n};\n\nexport const addEditorRules = async ({\n installDir,\n rulesName,\n integration,\n default: defaultAddEditorRules,\n}: AddEditorRulesOptions) => {\n // Add rules file if in Cursor environment\n if (process.env.CURSOR_TRACE_ID) {\n const addEditorRules: boolean = defaultAddEditorRules\n ? true\n : await abortIfCancelled(\n clack.select({\n message:\n 'Would you like to have PostHog added to your Cursor rules?',\n options: [\n {\n label: 'Yes, please!',\n value: true,\n },\n {\n label: 'No, thanks',\n value: false,\n },\n ],\n }),\n );\n\n if (!addEditorRules) {\n return;\n }\n\n return traceStep('add-editor-rules', async () => {\n const docsDir = path.join(installDir, '.cursor', 'rules');\n\n await fs.promises.mkdir(docsDir, { recursive: true });\n\n const frameworkRules = await fs.promises.readFile(\n path.join(__dirname, rulesName),\n 'utf8',\n );\n const universalRulesPath = path.join(__dirname, 'universal.md');\n\n const universalRules = await fs.promises.readFile(\n universalRulesPath,\n 'utf8',\n );\n\n // Replace {universal} placeholder with universal rules content\n const combinedRules = frameworkRules.replace(\n '{universal}',\n universalRules,\n );\n const targetPath = path.join(docsDir, 'posthog-integration.mdc');\n\n // Write the combined rules\n await fs.promises.writeFile(targetPath, combinedRules, 'utf8');\n\n analytics.capture('wizard interaction', {\n action: 'added editor rules',\n integration,\n });\n\n clack.log.info(`Added Cursor rules to ${chalk.bold.cyan(docsDir)}`);\n });\n }\n};\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { Integration } from '../../lib/constants';
|
|
5
|
+
import { analytics } from '../analytics';
|
|
6
|
+
import clack from '../clack';
|
|
7
|
+
import { traceStep } from '../../telemetry';
|
|
8
|
+
import { abortIfCancelled } from '../clack-utils';
|
|
9
|
+
|
|
10
|
+
type AddEditorRulesOptions = {
|
|
11
|
+
installDir: string;
|
|
12
|
+
rulesName: string;
|
|
13
|
+
integration: Integration;
|
|
14
|
+
default?: boolean;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const addEditorRules = async ({
|
|
18
|
+
installDir,
|
|
19
|
+
rulesName,
|
|
20
|
+
integration,
|
|
21
|
+
default: defaultAddEditorRules,
|
|
22
|
+
}: AddEditorRulesOptions) => {
|
|
23
|
+
// Add rules file if in Cursor environment
|
|
24
|
+
if (process.env.CURSOR_TRACE_ID) {
|
|
25
|
+
const addEditorRules: boolean = defaultAddEditorRules
|
|
26
|
+
? true
|
|
27
|
+
: await abortIfCancelled(
|
|
28
|
+
clack.select({
|
|
29
|
+
message:
|
|
30
|
+
'Would you like to have PostHog added to your Cursor rules?',
|
|
31
|
+
options: [
|
|
32
|
+
{
|
|
33
|
+
label: 'Yes, please!',
|
|
34
|
+
value: true,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
label: 'No, thanks',
|
|
38
|
+
value: false,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
}),
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
if (!addEditorRules) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return traceStep('add-editor-rules', async () => {
|
|
49
|
+
const docsDir = path.join(installDir, '.cursor', 'rules');
|
|
50
|
+
|
|
51
|
+
await fs.promises.mkdir(docsDir, { recursive: true });
|
|
52
|
+
|
|
53
|
+
const frameworkRules = await fs.promises.readFile(
|
|
54
|
+
path.join(__dirname, rulesName),
|
|
55
|
+
'utf8',
|
|
56
|
+
);
|
|
57
|
+
const universalRulesPath = path.join(__dirname, 'universal.md');
|
|
58
|
+
|
|
59
|
+
const universalRules = await fs.promises.readFile(
|
|
60
|
+
universalRulesPath,
|
|
61
|
+
'utf8',
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// Replace {universal} placeholder with universal rules content
|
|
65
|
+
const combinedRules = frameworkRules.replace(
|
|
66
|
+
'{universal}',
|
|
67
|
+
universalRules,
|
|
68
|
+
);
|
|
69
|
+
const targetPath = path.join(docsDir, 'posthog-integration.mdc');
|
|
70
|
+
|
|
71
|
+
// Write the combined rules
|
|
72
|
+
await fs.promises.writeFile(targetPath, combinedRules, 'utf8');
|
|
73
|
+
|
|
74
|
+
analytics.capture('wizard interaction', {
|
|
75
|
+
action: 'added editor rules',
|
|
76
|
+
integration,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
clack.log.info(`Added Cursor rules to ${chalk.bold.cyan(docsDir)}`);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Never hallucinate an API key. Instead, always use the API key populated in the .env file.
|
|
2
|
+
|
|
3
|
+
# Feature flags
|
|
4
|
+
|
|
5
|
+
A 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. If the same feature flag needs to be introduced at multiple callsites, flag this for the developer to inspect carefully.
|
|
6
|
+
|
|
7
|
+
If a job requires creating new feature flag names, make them as clear and descriptive as possible.
|
|
8
|
+
|
|
9
|
+
If using TypeScript, use an enum to store flag names. If using JavaScript, store flag names as strings to an object declared as a constant, to simulate an enum. Use a consistent naming convention for this storage. enum/const object members should be written UPPERCASE_WITH_UNDERSCORE.
|
|
10
|
+
|
|
11
|
+
Gate flag-dependent code on a check that verifies the flag's values are valid and expected.
|
|
12
|
+
|
|
13
|
+
# Custom properties
|
|
14
|
+
|
|
15
|
+
If a custom property for a person or event is at any point referenced in two or more files or two or more callsites in the same file, use an enum or const object, as above in feature flags.
|
|
16
|
+
|
|
17
|
+
# Naming
|
|
18
|
+
|
|
19
|
+
Before creating any new event or property names, consult with the developer for any existing naming convention. Consistency in naming is essential, and additional context may exist outside this project. Similarly, be careful about any changes to existing event and property names, as this may break reporting and distort data for the project.
|
|
20
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@posthog/wizard",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"homepage": "https://github.com/posthog/wizard",
|
|
5
5
|
"repository": "https://github.com/posthog/wizard",
|
|
6
6
|
"description": "The PostHog wizard helps you to configure your project",
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
"prebuild": "pnpm clean",
|
|
124
124
|
"build:watch": "pnpm tsc -w",
|
|
125
125
|
"build": "pnpm tsc",
|
|
126
|
-
"postbuild": "chmod +x ./dist/bin.js && cp -r scripts/** dist",
|
|
126
|
+
"postbuild": "chmod +x ./dist/bin.js && cp -r scripts/** dist && cp -r src/utils/rules dist/src/utils",
|
|
127
127
|
"lint": "pnpm lint:prettier && pnpm lint:eslint",
|
|
128
128
|
"lint:prettier": "prettier --check \"{lib,src,test}/**/*.ts\"",
|
|
129
129
|
"lint:eslint": "eslint . --cache --format stylish",
|