@posthog/wizard 1.3.1 → 1.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.
Files changed (37) hide show
  1. package/README.md +2 -2
  2. package/dist/bin.js +1 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/astro/astro-wizard.d.ts +2 -0
  5. package/dist/src/astro/astro-wizard.js +86 -0
  6. package/dist/src/astro/astro-wizard.js.map +1 -0
  7. package/dist/src/astro/docs.d.ts +4 -0
  8. package/dist/src/astro/docs.js +101 -0
  9. package/dist/src/astro/docs.js.map +1 -0
  10. package/dist/src/lib/config.d.ts +12 -1
  11. package/dist/src/lib/config.js +15 -0
  12. package/dist/src/lib/config.js.map +1 -1
  13. package/dist/src/lib/constants.d.ts +2 -1
  14. package/dist/src/lib/constants.js +3 -0
  15. package/dist/src/lib/constants.js.map +1 -1
  16. package/dist/src/lib/messages.d.ts +1 -2
  17. package/dist/src/lib/messages.js +2 -3
  18. package/dist/src/lib/messages.js.map +1 -1
  19. package/dist/src/nextjs/docs.js +8 -14
  20. package/dist/src/nextjs/docs.js.map +1 -1
  21. package/dist/src/nextjs/nextjs-wizard.js +0 -6
  22. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  23. package/dist/src/react/docs.js +1 -0
  24. package/dist/src/react/docs.js.map +1 -1
  25. package/dist/src/run.js +5 -0
  26. package/dist/src/run.js.map +1 -1
  27. package/dist/src/steps/index.d.ts +0 -1
  28. package/dist/src/steps/index.js +0 -1
  29. package/dist/src/steps/index.js.map +1 -1
  30. package/dist/src/utils/rules/astro-rules.md +44 -0
  31. package/package.json +1 -1
  32. package/dist/src/steps/__tests__/create-pr.test.d.ts +0 -1
  33. package/dist/src/steps/__tests__/create-pr.test.js +0 -193
  34. package/dist/src/steps/__tests__/create-pr.test.js.map +0 -1
  35. package/dist/src/steps/create-pr.d.ts +0 -27
  36. package/dist/src/steps/create-pr.js +0 -305
  37. package/dist/src/steps/create-pr.js.map +0 -1
@@ -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;;;;;;;;;;;;;;;;;;eAkB1B,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2BxC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsC/B,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AAlIW,QAAA,sBAAsB,0BAkIjC;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;;;;;;;;;;;;;;;;;kBAiBgB,IAAA,wBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;gBAmBzB,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsC/B,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AAvGW,QAAA,wBAAwB,4BAuGnC;AAEK,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,EACJ,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO;;+BAEsB,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;gDAKlE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;2CAEE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;cAUY,IAAA,wBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;wBAyBb,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AAtEW,QAAA,mBAAmB,uBAsE9B","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: 'history_change',\n capture_pageleave: true, // Enable pageleave capture\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\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\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: process.env.NEXT_PUBLIC_POSTHOG_HOST,\n capture_pageview: 'history_change',\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\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 capture_pageview: 'history_change',\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\n loaded: (posthog) => {\n if (process.env.NODE_ENV === \"development\") posthog.debug()\n },\n debug: process.env.NODE_ENV === \"development\",\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: process.env.NEXT_PUBLIC_POSTHOG_HOST,\n capture_pageview: 'history_change',\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 getModernNextjsDocs = ({\n host,\n language,\n}: {\n host: string;\n language: 'typescript' | 'javascript';\n}) => {\n return `\n==============================\nFILE: instrumentation-client.${language === 'typescript' ? 'ts' : 'js'} \nLOCATION: in the root of the application or inside an src folder.\n==============================\nChanges:\n- Create or update the instrumentation-client.${\n language === 'typescript' ? 'tsx' : 'jsx'\n } file to use the PostHog client. If the file does not exist yet, create it.\n- Do *not* import instrumentation-client.${\n language === 'typescript' ? 'tsx' : 'jsx'\n } in any other file; Next.js will automatically handle it.\n- Do not modify any other pages/components in the Next.js application; the PostHog client will be automatically initialized and handle all pageview tasks on its own.\n\nExample:\n--------------------------------------------------\n\nimport posthog from \"posthog-js\"\n\nposthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n api_host: \"/ingest\",\n ui_host: \"${getUiHostFromHost(host)}\",\n capture_pageview: 'history_change',\n capture_pageleave: true, // Enable pageleave capture\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\n debug: process.env.NODE_ENV === \"development\",\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"]}
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;;;;;;;;;;;;;;;;eAgB1B,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2BxC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsC/B,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AAhIW,QAAA,sBAAsB,0BAgIjC;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;;;;;;;;;;;;;;;;;kBAiBgB,IAAA,wBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;gBAgBzB,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsC/B,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AApGW,QAAA,wBAAwB,4BAoGnC;AAEK,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,EACJ,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO;;+BAEsB,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;gDAKlE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC;2CAEE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC;;;;;;;;;;cAUY,IAAA,wBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;wBAwBb,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AArEW,QAAA,mBAAmB,uBAqE9B","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 defaults: '2025-05-24',\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\n debug: process.env.NODE_ENV === \"development\",\n })\n }, [])\n\n return (\n <PHProvider client={posthog}>\n {children}\n </PHProvider>\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\n// NOTE: This is a Node.js client, so you can use it for sending events from the server side to PostHog.\nexport default function PostHogClient() {\n const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n host: process.env.NEXT_PUBLIC_POSTHOG_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\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 defaults: '2025-05-24',\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\n debug: process.env.NODE_ENV === \"development\",\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\n// NOTE: This is a Node.js client, so you can use it for sending events from the server side to PostHog.\nexport default function PostHogClient() {\n const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n host: process.env.NEXT_PUBLIC_POSTHOG_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 getModernNextjsDocs = ({\n host,\n language,\n}: {\n host: string;\n language: 'typescript' | 'javascript';\n}) => {\n return `\n==============================\nFILE: instrumentation-client.${language === 'typescript' ? 'ts' : 'js'}\nLOCATION: in the root of the application or inside an src folder.\n==============================\nChanges:\n- Create or update the instrumentation-client.${\n language === 'typescript' ? 'ts' : 'js'\n } file to use the PostHog client. If the file does not exist yet, create it.\n- Do *not* import instrumentation-client.${\n language === 'typescript' ? 'ts' : 'js'\n } in any other file; Next.js will automatically handle it.\n- Do not modify any other pages/components in the Next.js application; the PostHog client will be automatically initialized and handle all pageview tasks on its own.\n\nExample:\n--------------------------------------------------\n\nimport posthog from \"posthog-js\"\n\nposthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n api_host: \"/ingest\",\n ui_host: \"${getUiHostFromHost(host)}\",\n defaults: '2025-05-24',\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\n debug: process.env.NODE_ENV === \"development\",\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"]}
@@ -151,11 +151,6 @@ async function runNextjsWizard(options) {
151
151
  installDir: options.installDir,
152
152
  integration: constants_1.Integration.nextjs,
153
153
  });
154
- const prUrl = await (0, steps_1.createPRStep)({
155
- installDir: options.installDir,
156
- integration: constants_1.Integration.nextjs,
157
- addedEditorRules,
158
- });
159
154
  await (0, steps_1.addMCPServerToClientsStep)({
160
155
  cloudRegion,
161
156
  integration: constants_1.Integration.nextjs,
@@ -167,7 +162,6 @@ async function runNextjsWizard(options) {
167
162
  addedEditorRules,
168
163
  packageManager: packageManagerForOutro,
169
164
  envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,
170
- prUrl,
171
165
  uploadedEnvVars,
172
166
  });
173
167
  clack_1.default.outro(outroMessage);
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport {\n getNextjsAppRouterDocs,\n getNextjsPagesRouterDocs,\n getModernNextjsDocs,\n} from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addOrUpdateEnvironmentVariablesStep,\n createPRStep,\n runPrettierStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\nimport * as semver from 'semver';\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 relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n let installationDocumentation; // Documentation for the installation of the PostHog SDK\n\n if (instrumentationFileAvailable(nextVersion)) {\n installationDocumentation = getModernNextjsDocs({\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Next.js`);\n } else {\n const router = await getNextJsRouter(options);\n\n 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\n const filesToChange = await getFilesToChange({\n integration: Integration.nextjs,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.nextjs,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n const addedEditorRules = await addEditorRulesStep({\n rulesName: 'next-rules.md',\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const prUrl = await createPRStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n addedEditorRules,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.nextjs,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n prUrl,\n uploadedEnvVars,\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\nfunction instrumentationFileAvailable(\n nextVersion: string | undefined,\n): boolean {\n const minimumVersion = '15.3.0'; //instrumentation-client.js|ts was introduced in 15.3\n\n if (!nextVersion) {\n return false;\n }\n const coercedNextVersion = semver.coerce(nextVersion);\n if (!coercedNextVersion) {\n return false; // Unable to parse nextVersion\n }\n return semver.gte(coercedNextVersion, minimumVersion);\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"]}
1
+ {"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport clack from '../utils/clack';\nimport { Integration } from '../lib/constants';\nimport {\n getNextjsAppRouterDocs,\n getNextjsPagesRouterDocs,\n getModernNextjsDocs,\n} from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addOrUpdateEnvironmentVariablesStep,\n runPrettierStep,\n addMCPServerToClientsStep,\n uploadEnvironmentVariablesStep,\n} from '../steps';\n\nimport * as semver from 'semver';\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 relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n let installationDocumentation; // Documentation for the installation of the PostHog SDK\n\n if (instrumentationFileAvailable(nextVersion)) {\n installationDocumentation = getModernNextjsDocs({\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(`Reviewing PostHog documentation for Next.js`);\n } else {\n const router = await getNextJsRouter(options);\n\n 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\n const filesToChange = await getFilesToChange({\n integration: Integration.nextjs,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.nextjs,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n const addedEditorRules = await addEditorRulesStep({\n rulesName: 'next-rules.md',\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n await addMCPServerToClientsStep({\n cloudRegion,\n integration: Integration.nextjs,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.nextjs,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n uploadedEnvVars,\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\nfunction instrumentationFileAvailable(\n nextVersion: string | undefined,\n): boolean {\n const minimumVersion = '15.3.0'; //instrumentation-client.js|ts was introduced in 15.3\n\n if (!nextVersion) {\n return false;\n }\n const coercedNextVersion = semver.coerce(nextVersion);\n if (!coercedNextVersion) {\n return false; // Unable to parse nextVersion\n }\n return semver.gte(coercedNextVersion, minimumVersion);\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"]}
@@ -32,6 +32,7 @@ root.render(
32
32
  apiKey={${apiKeyText}}
33
33
  options={{
34
34
  api_host: ${hostText},
35
+ defaults: '2025-05-24',
35
36
  capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this
36
37
  debug: ${envVarPrefix === 'VITE_PUBLIC_'
37
38
  ? 'import.meta.env.MODE === "development"'
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/react/docs.ts"],"names":[],"mappings":";;;AAAO,MAAM,qBAAqB,GAAG,CAAC,EACpC,QAAQ,EACR,YAAY,GAIb,EAAE,EAAE;IACH,MAAM,UAAU,GACd,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,yCAAyC;QAC3C,CAAC,CAAC,eAAe,YAAY,aAAa,CAAC;IAE/C,MAAM,QAAQ,GACZ,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,0CAA0C;QAC5C,CAAC,CAAC,eAAe,YAAY,cAAc,CAAC;IAEhD,OAAO;;sBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;gBAmBc,UAAU;;oBAEN,QAAQ;;iBAGlB,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,wCACN;;;;;;mDAM2C,CAAC;AACpD,CAAC,CAAC;AAvDW,QAAA,qBAAqB,yBAuDhC","sourcesContent":["export const getReactDocumentation = ({\n language,\n envVarPrefix,\n}: {\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\n const hostText =\n envVarPrefix === 'VITE_PUBLIC_'\n ? 'import.meta.env.VITE_PUBLIC_POSTHOG_HOST'\n : `process.env.${envVarPrefix}POSTHOG_HOST`;\n\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: ${hostText},\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\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"]}
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/react/docs.ts"],"names":[],"mappings":";;;AAAO,MAAM,qBAAqB,GAAG,CAAC,EACpC,QAAQ,EACR,YAAY,GAIb,EAAE,EAAE;IACH,MAAM,UAAU,GACd,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,yCAAyC;QAC3C,CAAC,CAAC,eAAe,YAAY,aAAa,CAAC;IAE/C,MAAM,QAAQ,GACZ,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,0CAA0C;QAC5C,CAAC,CAAC,eAAe,YAAY,cAAc,CAAC;IAEhD,OAAO;;sBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;gBAmBc,UAAU;;oBAEN,QAAQ;;;iBAIlB,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,wCACN;;;;;;mDAM2C,CAAC;AACpD,CAAC,CAAC;AAxDW,QAAA,qBAAqB,yBAwDhC","sourcesContent":["export const getReactDocumentation = ({\n language,\n envVarPrefix,\n}: {\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\n const hostText =\n envVarPrefix === 'VITE_PUBLIC_'\n ? 'import.meta.env.VITE_PUBLIC_POSTHOG_HOST'\n : `process.env.${envVarPrefix}POSTHOG_HOST`;\n\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: ${hostText},\n defaults: '2025-05-24',\n capture_exceptions: true, // This enables capturing exceptions using Error Tracking, set to false if you don't want this\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"]}
package/dist/src/run.js CHANGED
@@ -15,6 +15,7 @@ const react_wizard_1 = require("./react/react-wizard");
15
15
  const analytics_1 = require("./utils/analytics");
16
16
  const svelte_wizard_1 = require("./svelte/svelte-wizard");
17
17
  const react_native_wizard_1 = require("./react-native/react-native-wizard");
18
+ const astro_wizard_1 = require("./astro/astro-wizard");
18
19
  const events_1 = require("events");
19
20
  const chalk_1 = __importDefault(require("chalk"));
20
21
  events_1.EventEmitter.defaultMaxListeners = 50;
@@ -60,6 +61,9 @@ async function runWizard(argv) {
60
61
  case constants_1.Integration.reactNative:
61
62
  await (0, react_native_wizard_1.runReactNativeWizard)(wizardOptions);
62
63
  break;
64
+ case constants_1.Integration.astro:
65
+ await (0, astro_wizard_1.runAstroWizard)(wizardOptions);
66
+ break;
63
67
  default:
64
68
  clack_1.default.log.error('No setup wizard selected!');
65
69
  }
@@ -89,6 +93,7 @@ async function getIntegrationForSetup(options) {
89
93
  message: 'What do you want to set up?',
90
94
  options: [
91
95
  { value: constants_1.Integration.nextjs, label: 'Next.js' },
96
+ { value: constants_1.Integration.astro, label: 'Astro' },
92
97
  { value: constants_1.Integration.react, label: 'React' },
93
98
  { value: constants_1.Integration.svelte, label: 'Svelte' },
94
99
  { value: constants_1.Integration.reactNative, label: 'React Native' },
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport { getIntegrationDescription, Integration } from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizard(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n clack.log.error(\n `Something went wrong. You can read the documentation for PostHog at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to setup PostHog manually.`,\n );\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.react, label: 'React' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":";;;;;AA8BA,8BA6DC;AA3FD,qDAAuD;AAEvD,0DAAyD;AAGzD,+CAAyE;AACzE,qDAAsD;AACtD,0DAAkC;AAClC,gDAAwB;AACxB,yCAAqE;AACrE,uDAAsD;AACtD,iDAA8C;AAC9C,0DAAyD;AACzD,4EAA0E;AAC1E,uDAAsD;AACtD,mCAAsC;AACtC,kDAA0B;AAE1B,qBAAY,CAAC,mBAAmB,GAAG,EAAE,CAAC;AAY/B,KAAK,UAAU,SAAS,CAAC,IAAU;IACxC,MAAM,SAAS,GAAG;QAChB,GAAG,IAAI;QACP,GAAG,IAAA,6BAAe,GAAE;KACrB,CAAC;IAEF,IAAI,kBAA0B,CAAC;IAC/B,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,cAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,kBAAkB,GAAG,SAAS,CAAC,UAAU,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,aAAa,GAAkB;QACnC,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,KAAK;QAC/B,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,KAAK;QAC7C,UAAU,EAAE,kBAAkB;QAC9B,WAAW,EAAE,SAAS,CAAC,MAAM,IAAI,SAAS;QAC1C,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,KAAK;QACnC,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,KAAK;KAClC,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,qBAAS,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,uBAAW,CAAC,MAAM;gBACrB,MAAM,IAAA,+BAAe,EAAC,aAAa,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,uBAAW,CAAC,KAAK;gBACpB,MAAM,IAAA,6BAAc,EAAC,aAAa,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,uBAAW,CAAC,MAAM;gBACrB,MAAM,IAAA,+BAAe,EAAC,aAAa,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,uBAAW,CAAC,WAAW;gBAC1B,MAAM,IAAA,0CAAoB,EAAC,aAAa,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,uBAAW,CAAC,KAAK;gBACpB,MAAM,IAAA,6BAAc,EAAC,aAAa,CAAC,CAAC;gBACpC,MAAM;YACR;gBACE,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAK,CAAC,GAAG,CAAC,KAAK,CACb,uEAAuE,eAAK,CAAC,IAAI,CAC/E,GAAG,2BAAkB,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAC7C,6BAA6B,CAC/B,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAA0C;IAE1C,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,2BAAkB,CAAC,CAAC,IAAI,CAChE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACX,0BAAiB,CAAC,OAAO,CAAC,CAAgB,CAAC;QAC3C,0BAAiB,CAAC,OAAO,CAAC,CAAgB,CAAC,CAC9C,CAAC;IAEF,KAAK,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,WAA0B,CAAC;QACpC,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;YACP,EAAE,KAAK,EAAE,uBAAW,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;YAC/C,EAAE,KAAK,EAAE,uBAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;YAC5C,EAAE,KAAK,EAAE,uBAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;YAC5C,EAAE,KAAK,EAAE,uBAAW,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC9C,EAAE,KAAK,EAAE,uBAAW,CAAC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE;SAC1D;KACF,CAAC,CACH,CAAC;IAEF,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { abortIfCancelled } from './utils/clack-utils';\n\nimport { runNextjsWizard } from './nextjs/nextjs-wizard';\nimport type { CloudRegion, WizardOptions } from './utils/types';\n\nimport { getIntegrationDescription, Integration } from './lib/constants';\nimport { readEnvironment } from './utils/environment';\nimport clack from './utils/clack';\nimport path from 'path';\nimport { INTEGRATION_CONFIG, INTEGRATION_ORDER } from './lib/config';\nimport { runReactWizard } from './react/react-wizard';\nimport { analytics } from './utils/analytics';\nimport { runSvelteWizard } from './svelte/svelte-wizard';\nimport { runReactNativeWizard } from './react-native/react-native-wizard';\nimport { runAstroWizard } from './astro/astro-wizard';\nimport { EventEmitter } from 'events';\nimport chalk from 'chalk';\n\nEventEmitter.defaultMaxListeners = 50;\n\ntype Args = {\n integration?: Integration;\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n region?: CloudRegion;\n default?: boolean;\n signup?: boolean;\n};\n\nexport async function runWizard(argv: Args) {\n const finalArgs = {\n ...argv,\n ...readEnvironment(),\n };\n\n let resolvedInstallDir: string;\n if (finalArgs.installDir) {\n if (path.isAbsolute(finalArgs.installDir)) {\n resolvedInstallDir = finalArgs.installDir;\n } else {\n resolvedInstallDir = path.join(process.cwd(), finalArgs.installDir);\n }\n } else {\n resolvedInstallDir = process.cwd();\n }\n\n const wizardOptions: WizardOptions = {\n debug: finalArgs.debug ?? false,\n forceInstall: finalArgs.forceInstall ?? false,\n installDir: resolvedInstallDir,\n cloudRegion: finalArgs.region ?? undefined,\n default: finalArgs.default ?? false,\n signup: finalArgs.signup ?? false,\n };\n\n clack.intro(`Welcome to the PostHog setup wizard ✨`);\n\n const integration =\n finalArgs.integration ?? (await getIntegrationForSetup(wizardOptions));\n\n analytics.setTag('integration', integration);\n\n try {\n switch (integration) {\n case Integration.nextjs:\n await runNextjsWizard(wizardOptions);\n break;\n case Integration.react:\n await runReactWizard(wizardOptions);\n break;\n case Integration.svelte:\n await runSvelteWizard(wizardOptions);\n break;\n case Integration.reactNative:\n await runReactNativeWizard(wizardOptions);\n break;\n case Integration.astro:\n await runAstroWizard(wizardOptions);\n break;\n default:\n clack.log.error('No setup wizard selected!');\n }\n } catch (error) {\n clack.log.error(\n `Something went wrong. You can read the documentation for PostHog at ${chalk.cyan(\n `${INTEGRATION_CONFIG[integration].docsUrl}`,\n )} to setup PostHog manually.`,\n );\n process.exit(1);\n }\n}\n\nasync function detectIntegration(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration | undefined> {\n const integrationConfigs = Object.entries(INTEGRATION_CONFIG).sort(\n ([a], [b]) =>\n INTEGRATION_ORDER.indexOf(a as Integration) -\n INTEGRATION_ORDER.indexOf(b as Integration),\n );\n\n for (const [integration, config] of integrationConfigs) {\n const detected = await config.detect(options);\n if (detected) {\n return integration as Integration;\n }\n }\n}\n\nasync function getIntegrationForSetup(\n options: Pick<WizardOptions, 'installDir'>,\n) {\n const detectedIntegration = await detectIntegration(options);\n\n if (detectedIntegration) {\n clack.log.success(\n `Detected integration: ${getIntegrationDescription(detectedIntegration)}`,\n );\n return detectedIntegration;\n }\n\n const integration: Integration = await abortIfCancelled(\n clack.select({\n message: 'What do you want to set up?',\n options: [\n { value: Integration.nextjs, label: 'Next.js' },\n { value: Integration.astro, label: 'Astro' },\n { value: Integration.react, label: 'React' },\n { value: Integration.svelte, label: 'Svelte' },\n { value: Integration.reactNative, label: 'React Native' },\n ],\n }),\n );\n\n return integration;\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  export * from './add-editor-rules';
2
- export * from './create-pr';
3
2
  export * from './run-prettier';
4
3
  export * from './add-or-update-environment-variables';
5
4
  export * from './add-mcp-server-to-clients';
@@ -15,7 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./add-editor-rules"), exports);
18
- __exportStar(require("./create-pr"), exports);
19
18
  __exportStar(require("./run-prettier"), exports);
20
19
  __exportStar(require("./add-or-update-environment-variables"), exports);
21
20
  __exportStar(require("./add-mcp-server-to-clients"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B;AAC/B,wEAAsD;AACtD,8DAA4C;AAC5C,iEAA+C","sourcesContent":["export * from './add-editor-rules';\nexport * from './create-pr';\nexport * from './run-prettier';\nexport * from './add-or-update-environment-variables';\nexport * from './add-mcp-server-to-clients';\nexport * from './upload-environment-variables';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,iDAA+B;AAC/B,wEAAsD;AACtD,8DAA4C;AAC5C,iEAA+C","sourcesContent":["export * from './add-editor-rules';\nexport * from './run-prettier';\nexport * from './add-or-update-environment-variables';\nexport * from './add-mcp-server-to-clients';\nexport * from './upload-environment-variables';\n"]}
@@ -0,0 +1,44 @@
1
+ # PostHog Astro Rules
2
+
3
+ ## PostHog Integration
4
+
5
+ PostHog is already integrated into this Astro project. The configuration includes:
6
+
7
+ - PostHog initialization in `src/components/posthog.astro`
8
+ - Layout setup in `src/layouts/PostHogLayout.astro`
9
+ - Environment variables for API key and host
10
+
11
+ ## Key Guidelines
12
+
13
+ ### Component Structure
14
+ - PostHog component uses `is:inline` directive to prevent Astro from processing the script
15
+ - Layout wraps PostHog component in the `<head>` section
16
+ - Pages use PostHogLayout to ensure PostHog loads on all pages
17
+
18
+ ### Environment Variables
19
+ - Use `PUBLIC_` prefix for client-side environment variables in Astro
20
+ - `PUBLIC_POSTHOG_KEY` - Your PostHog project API key
21
+ - `PUBLIC_POSTHOG_HOST` - Your PostHog instance URL
22
+
23
+ ### Best Practices
24
+ - Always use `posthog.identify()` when users sign in
25
+ - Use `posthog.capture()` for custom events
26
+ - Feature flags can be accessed with `posthog.isFeatureEnabled()`
27
+ - Keep the PostHog script in the head section for accurate tracking
28
+
29
+ ### File Structure
30
+ ```
31
+ src/
32
+ ├── components/
33
+ │ └── posthog.astro # PostHog initialization
34
+ ├── layouts/
35
+ │ └── PostHogLayout.astro # Layout with PostHog
36
+ └── pages/
37
+ └── *.astro # Your pages using PostHogLayout
38
+ ```
39
+
40
+ ### Common Patterns
41
+ - Wrap pages with PostHogLayout for analytics
42
+ - Use PostHog's autocapture for basic interaction tracking
43
+ - Implement custom events for business-specific actions
44
+ - Use feature flags for A/B testing and gradual rollouts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/wizard",
3
- "version": "1.3.1",
3
+ "version": "1.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",
@@ -1 +0,0 @@
1
- export {};
@@ -1,193 +0,0 @@
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
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const childProcess = __importStar(require("node:child_process"));
37
- const create_pr_1 = require("../create-pr");
38
- // Mock dependencies
39
- jest.mock('node:child_process', () => ({
40
- exec: jest.fn(),
41
- }));
42
- describe('Git operations', () => {
43
- const execMock = childProcess.exec;
44
- const testDir = '/test/dir';
45
- beforeEach(() => {
46
- jest.clearAllMocks();
47
- });
48
- describe('getCurrentBranch', () => {
49
- it('should return the current branch name on success', async () => {
50
- execMock.mockImplementation((_cmd, _opts, callback) => {
51
- callback(null, 'main', '');
52
- return {};
53
- });
54
- const result = await (0, create_pr_1.getCurrentBranch)(testDir);
55
- expect(result).toEqual({ success: true, data: 'main' });
56
- expect(execMock).toHaveBeenCalledWith('git rev-parse --abbrev-ref HEAD', { cwd: testDir }, expect.any(Function));
57
- });
58
- it('should return error on failure', async () => {
59
- execMock.mockImplementation((_cmd, _opts, callback) => {
60
- callback(new Error('git error'), '', 'Failed to get branch');
61
- return {};
62
- });
63
- const result = await (0, create_pr_1.getCurrentBranch)(testDir);
64
- expect(result).toEqual({ success: false, error: 'Failed to get branch' });
65
- });
66
- });
67
- describe('checkForEnvFiles', () => {
68
- it('should return true when .env files are found', async () => {
69
- execMock.mockImplementation((_cmd, _opts, callback) => {
70
- callback(null, '.env\n.env.local', '');
71
- return {};
72
- });
73
- const result = await (0, create_pr_1.checkForEnvFiles)(testDir);
74
- expect(result).toEqual({ success: true, data: true });
75
- });
76
- it('should return false when no .env files are found', async () => {
77
- const error = new Error('No match');
78
- error.code = 1;
79
- execMock.mockImplementation((_cmd, _opts, callback) => {
80
- callback(error, '', 'command failed with exit code 1');
81
- return {};
82
- });
83
- const result = await (0, create_pr_1.checkForEnvFiles)(testDir);
84
- expect(result).toEqual({
85
- success: false,
86
- error: 'command failed with exit code 1',
87
- });
88
- });
89
- it('should handle grep errors correctly', async () => {
90
- execMock.mockImplementation((_cmd, _opts, callback) => {
91
- callback(new Error('grep error'), '', 'Some other error');
92
- return {};
93
- });
94
- const result = await (0, create_pr_1.checkForEnvFiles)(testDir);
95
- expect(result).toEqual({ success: false, error: 'Some other error' });
96
- });
97
- });
98
- describe('checkBranchExists', () => {
99
- it('should return success when branch does not exist', async () => {
100
- execMock.mockImplementation((_cmd, _opts, callback) => {
101
- callback(new Error('branch not found'), '', 'fatal: not a valid ref');
102
- return {};
103
- });
104
- const result = await (0, create_pr_1.checkBranchExists)('new-branch', testDir);
105
- expect(result).toEqual({ success: true, data: true });
106
- });
107
- it('should return failure when branch exists', async () => {
108
- execMock.mockImplementation((_cmd, _opts, callback) => {
109
- callback(null, 'ref exists', '');
110
- return {};
111
- });
112
- const result = await (0, create_pr_1.checkBranchExists)('existing-branch', testDir);
113
- expect(result).toEqual({ success: false, data: false });
114
- });
115
- });
116
- describe('createGitHubPR', () => {
117
- it('should create PR successfully', async () => {
118
- const prUrl = 'https://github.com/org/repo/pull/1';
119
- execMock.mockImplementation((_cmd, _opts, callback) => {
120
- callback(null, prUrl, '');
121
- return {};
122
- });
123
- const result = await (0, create_pr_1.createGitHubPR)('main', 'feature', 'title', 'body', testDir);
124
- expect(result).toEqual({ success: true, data: prUrl });
125
- expect(execMock).toHaveBeenCalledWith('gh pr create --base main --head feature --title "title" --body "body"', { cwd: testDir }, expect.any(Function));
126
- });
127
- it('should handle PR creation failure', async () => {
128
- execMock.mockImplementation((_cmd, _opts, callback) => {
129
- callback(new Error('PR creation failed'), '', 'Authentication failed');
130
- return {};
131
- });
132
- const result = await (0, create_pr_1.createGitHubPR)('main', 'feature', 'title', 'body', testDir);
133
- expect(result).toEqual({
134
- success: false,
135
- error: 'Authentication failed',
136
- });
137
- });
138
- });
139
- describe('Git operations', () => {
140
- const testCases = [
141
- {
142
- fn: create_pr_1.createBranch,
143
- args: ['new-branch', testDir],
144
- command: 'git checkout -b new-branch',
145
- name: 'createBranch',
146
- },
147
- {
148
- fn: create_pr_1.stageChanges,
149
- args: [testDir],
150
- command: 'git add .',
151
- name: 'stageChanges',
152
- },
153
- {
154
- fn: create_pr_1.commitChanges,
155
- args: ['commit message', testDir],
156
- command: 'git commit -m "commit message"',
157
- name: 'commitChanges',
158
- },
159
- {
160
- fn: create_pr_1.pushBranch,
161
- args: ['branch-name', testDir],
162
- command: 'git push -u origin branch-name',
163
- name: 'pushBranch',
164
- },
165
- {
166
- fn: create_pr_1.checkGitHubAuth,
167
- args: [testDir],
168
- command: 'gh auth status',
169
- name: 'checkGitHubAuth',
170
- },
171
- ];
172
- testCases.forEach(({ fn, args, command, name }) => {
173
- it(`${name} should execute correctly`, async () => {
174
- execMock.mockImplementation((_cmd, _opts, callback) => {
175
- callback(null, 'success', '');
176
- return {};
177
- });
178
- const result = await fn(...args);
179
- expect(result).toEqual({ success: true, data: 'success' });
180
- expect(execMock).toHaveBeenCalledWith(command, { cwd: testDir }, expect.any(Function));
181
- });
182
- it(`${name} should handle errors`, async () => {
183
- execMock.mockImplementation((_cmd, _opts, callback) => {
184
- callback(new Error('operation failed'), '', 'Command failed');
185
- return {};
186
- });
187
- const result = await fn(...args);
188
- expect(result).toEqual({ success: false, error: 'Command failed' });
189
- });
190
- });
191
- });
192
- });
193
- //# sourceMappingURL=create-pr.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-pr.test.js","sourceRoot":"","sources":["../../../../src/steps/__tests__/create-pr.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport type { ExecException } from 'node:child_process';\nimport {\n checkBranchExists,\n checkForEnvFiles,\n checkGitHubAuth,\n commitChanges,\n createBranch,\n createGitHubPR,\n getCurrentBranch,\n pushBranch,\n stageChanges,\n} from '../create-pr';\n\n// Mock dependencies\njest.mock('node:child_process', () => ({\n exec: jest.fn(),\n}));\n\ntype ExecCallback = (\n error: ExecException | null,\n stdout: string,\n stderr: string,\n) => void;\n\ntype TestCase = {\n fn: (...args: any[]) => Promise<any>;\n args: readonly any[];\n command: string;\n name: string;\n};\n\ndescribe('Git operations', () => {\n const execMock = childProcess.exec as unknown as jest.Mock;\n const testDir = '/test/dir';\n\n beforeEach(() => {\n jest.clearAllMocks();\n });\n\n describe('getCurrentBranch', () => {\n it('should return the current branch name on success', async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(null, 'main', '');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await getCurrentBranch(testDir);\n expect(result).toEqual({ success: true, data: 'main' });\n expect(execMock).toHaveBeenCalledWith(\n 'git rev-parse --abbrev-ref HEAD',\n { cwd: testDir },\n expect.any(Function),\n );\n });\n\n it('should return error on failure', async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(new Error('git error'), '', 'Failed to get branch');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await getCurrentBranch(testDir);\n expect(result).toEqual({ success: false, error: 'Failed to get branch' });\n });\n });\n\n describe('checkForEnvFiles', () => {\n it('should return true when .env files are found', async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(null, '.env\\n.env.local', '');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await checkForEnvFiles(testDir);\n expect(result).toEqual({ success: true, data: true });\n });\n\n it('should return false when no .env files are found', async () => {\n const error = new Error('No match') as ExecException;\n error.code = 1;\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(error, '', 'command failed with exit code 1');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await checkForEnvFiles(testDir);\n expect(result).toEqual({\n success: false,\n error: 'command failed with exit code 1',\n });\n });\n\n it('should handle grep errors correctly', async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(new Error('grep error'), '', 'Some other error');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await checkForEnvFiles(testDir);\n expect(result).toEqual({ success: false, error: 'Some other error' });\n });\n });\n\n describe('checkBranchExists', () => {\n it('should return success when branch does not exist', async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(new Error('branch not found'), '', 'fatal: not a valid ref');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await checkBranchExists('new-branch', testDir);\n expect(result).toEqual({ success: true, data: true });\n });\n\n it('should return failure when branch exists', async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(null, 'ref exists', '');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await checkBranchExists('existing-branch', testDir);\n expect(result).toEqual({ success: false, data: false });\n });\n });\n\n describe('createGitHubPR', () => {\n it('should create PR successfully', async () => {\n const prUrl = 'https://github.com/org/repo/pull/1';\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(null, prUrl, '');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await createGitHubPR(\n 'main',\n 'feature',\n 'title',\n 'body',\n testDir,\n );\n expect(result).toEqual({ success: true, data: prUrl });\n expect(execMock).toHaveBeenCalledWith(\n 'gh pr create --base main --head feature --title \"title\" --body \"body\"',\n { cwd: testDir },\n expect.any(Function),\n );\n });\n\n it('should handle PR creation failure', async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(\n new Error('PR creation failed'),\n '',\n 'Authentication failed',\n );\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await createGitHubPR(\n 'main',\n 'feature',\n 'title',\n 'body',\n testDir,\n );\n expect(result).toEqual({\n success: false,\n error: 'Authentication failed',\n });\n });\n });\n\n describe('Git operations', () => {\n const testCases: TestCase[] = [\n {\n fn: createBranch,\n args: ['new-branch', testDir] as const,\n command: 'git checkout -b new-branch',\n name: 'createBranch',\n },\n {\n fn: stageChanges,\n args: [testDir] as const,\n command: 'git add .',\n name: 'stageChanges',\n },\n {\n fn: commitChanges,\n args: ['commit message', testDir] as const,\n command: 'git commit -m \"commit message\"',\n name: 'commitChanges',\n },\n {\n fn: pushBranch,\n args: ['branch-name', testDir] as const,\n command: 'git push -u origin branch-name',\n name: 'pushBranch',\n },\n {\n fn: checkGitHubAuth,\n args: [testDir] as const,\n command: 'gh auth status',\n name: 'checkGitHubAuth',\n },\n ];\n\n testCases.forEach(({ fn, args, command, name }) => {\n it(`${name} should execute correctly`, async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(null, 'success', '');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await fn(...args);\n expect(result).toEqual({ success: true, data: 'success' });\n expect(execMock).toHaveBeenCalledWith(\n command,\n { cwd: testDir },\n expect.any(Function),\n );\n });\n\n it(`${name} should handle errors`, async () => {\n execMock.mockImplementation(\n (_cmd: string, _opts: any, callback: ExecCallback) => {\n callback(new Error('operation failed'), '', 'Command failed');\n return {} as childProcess.ChildProcess;\n },\n );\n\n const result = await fn(...args);\n expect(result).toEqual({ success: false, error: 'Command failed' });\n });\n });\n });\n});\n"]}
@@ -1,27 +0,0 @@
1
- import { type Integration } from '../lib/constants';
2
- export declare const PR_CONFIG: {
3
- readonly defaultBranchName: "posthog-integration";
4
- readonly defaultTitle: "feat: add PostHog integration";
5
- };
6
- interface GitCommandResult<T> {
7
- success: boolean;
8
- data?: T;
9
- error?: string;
10
- }
11
- export declare function execGitCommand(command: string, cwd: string): Promise<GitCommandResult<string>>;
12
- export declare function getCurrentBranch(installDir: string): Promise<GitCommandResult<string>>;
13
- export declare function checkGitHubAuth(installDir: string): Promise<GitCommandResult<string>>;
14
- export declare function checkBranchExists(branch: string, installDir: string): Promise<GitCommandResult<boolean>>;
15
- export declare function createBranch(branch: string, installDir: string): Promise<GitCommandResult<string>>;
16
- export declare function stageChanges(installDir: string): Promise<GitCommandResult<string>>;
17
- export declare function checkForEnvFiles(installDir: string): Promise<GitCommandResult<boolean>>;
18
- export declare function commitChanges(message: string, installDir: string): Promise<GitCommandResult<string>>;
19
- export declare function pushBranch(branch: string, installDir: string): Promise<GitCommandResult<string>>;
20
- export declare function createGitHubPR(baseBranch: string, newBranch: string, title: string, body: string, installDir: string): Promise<GitCommandResult<string>>;
21
- interface CreatePRStepOptions {
22
- installDir: string;
23
- integration: Integration;
24
- addedEditorRules: boolean;
25
- }
26
- export declare function createPRStep({ installDir, integration, addedEditorRules, }: CreatePRStepOptions): Promise<string | undefined>;
27
- export {};