@posthog/wizard 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/constants.d.ts +0 -1
- package/dist/src/lib/constants.js +1 -6
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/nextjs/docs.js +33 -25
- package/dist/src/nextjs/docs.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.d.ts +4 -4
- package/dist/src/nextjs/nextjs-wizard.js +38 -30
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/utils.d.ts +3 -1
- package/dist/src/nextjs/utils.js +30 -7
- package/dist/src/nextjs/utils.js.map +1 -1
- package/dist/src/run.d.ts +1 -0
- package/dist/src/run.js +11 -23
- package/dist/src/run.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +8 -7
- package/dist/src/utils/clack-utils.js +15 -19
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/package-manager.d.ts +4 -3
- package/dist/src/utils/package-manager.js +24 -25
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/src/utils/types.d.ts +4 -0
- package/dist/src/utils/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -13,7 +13,6 @@ export interface Args {
|
|
|
13
13
|
}
|
|
14
14
|
export declare const DEFAULT_URL = "http://us.posthog.com";
|
|
15
15
|
export declare const ISSUES_URL = "https://github.com/posthog/wizard/issues";
|
|
16
|
-
export declare const INSTALL_DIR: string;
|
|
17
16
|
export declare const CLOUD_URL = "https://us.posthog.com";
|
|
18
17
|
export declare const DEFAULT_HOST_URL = "https://us.i.posthog.com";
|
|
19
18
|
export declare const DUMMY_PROJECT_API_KEY = "_YOUR_POSTHOG_PROJECT_API_KEY_";
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.DUMMY_PROJECT_API_KEY = exports.DEFAULT_HOST_URL = exports.CLOUD_URL = exports.
|
|
3
|
+
exports.DUMMY_PROJECT_API_KEY = exports.DEFAULT_HOST_URL = exports.CLOUD_URL = exports.ISSUES_URL = exports.DEFAULT_URL = exports.Integration = void 0;
|
|
7
4
|
exports.getIntegrationDescription = getIntegrationDescription;
|
|
8
5
|
exports.getIntegrationChoices = getIntegrationChoices;
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
6
|
var Integration;
|
|
11
7
|
(function (Integration) {
|
|
12
8
|
Integration["nextjs"] = "nextjs";
|
|
@@ -27,7 +23,6 @@ function getIntegrationChoices() {
|
|
|
27
23
|
}
|
|
28
24
|
exports.DEFAULT_URL = 'http://us.posthog.com';
|
|
29
25
|
exports.ISSUES_URL = 'https://github.com/posthog/wizard/issues';
|
|
30
|
-
exports.INSTALL_DIR = path_1.default.join(process.cwd(), process.env.POSTHOG_WIZARD_INSTALL_DIR ?? '');
|
|
31
26
|
exports.CLOUD_URL = 'https://us.posthog.com';
|
|
32
27
|
exports.DEFAULT_HOST_URL = 'https://us.i.posthog.com';
|
|
33
28
|
exports.DUMMY_PROJECT_API_KEY = '_YOUR_POSTHOG_PROJECT_API_KEY_';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":";;;AAIA,8DAOC;AAOD,sDAKC;AAvBD,IAAY,WAEX;AAFD,WAAY,WAAW;IACrB,gCAAiB,CAAA;AACnB,CAAC,EAFW,WAAW,2BAAX,WAAW,QAEtB;AAED,SAAgB,yBAAyB,CAAC,IAAY;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC,MAAM;YACrB,OAAO,SAAS,CAAC;QACnB;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAOD,SAAgB,qBAAqB;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,EAAE,yBAAyB,CAAC,IAAI,CAAC;QACrC,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC,CAAC;AACN,CAAC;AAOY,QAAA,WAAW,GAAG,uBAAuB,CAAC;AACtC,QAAA,UAAU,GAAG,0CAA0C,CAAC;AACxD,QAAA,SAAS,GAAG,wBAAwB,CAAC;AACrC,QAAA,gBAAgB,GAAG,0BAA0B,CAAC;AAC9C,QAAA,qBAAqB,GAAG,gCAAgC,CAAC","sourcesContent":["export enum Integration {\n nextjs = 'nextjs',\n}\n\nexport function getIntegrationDescription(type: string): string {\n switch (type) {\n case Integration.nextjs:\n return 'Next.js';\n default:\n throw new Error(`Unknown integration ${type}`);\n }\n}\n\ntype IntegrationChoice = {\n name: string;\n value: string;\n};\n\nexport function getIntegrationChoices(): IntegrationChoice[] {\n return Object.keys(Integration).map((type: string) => ({\n name: getIntegrationDescription(type),\n value: type,\n }));\n}\n\nexport interface Args {\n debug: boolean;\n integration: Integration;\n}\n\nexport const DEFAULT_URL = 'http://us.posthog.com';\nexport const ISSUES_URL = 'https://github.com/posthog/wizard/issues';\nexport const CLOUD_URL = 'https://us.posthog.com';\nexport const DEFAULT_HOST_URL = 'https://us.i.posthog.com';\nexport const DUMMY_PROJECT_API_KEY = '_YOUR_POSTHOG_PROJECT_API_KEY_';\n"]}
|
package/dist/src/nextjs/docs.js
CHANGED
|
@@ -5,25 +5,26 @@ const utils_1 = require("./utils");
|
|
|
5
5
|
const getNextjsAppRouterDocs = ({ host, language, }) => {
|
|
6
6
|
return `
|
|
7
7
|
==============================
|
|
8
|
-
FILE:
|
|
8
|
+
FILE: PostHogProvider.${language === 'typescript' ? 'tsx' : 'jsx'} (put it somewhere where client files are, like the components folder)
|
|
9
|
+
LOCATION: Wherever other providers are, or the components folder
|
|
9
10
|
==============================
|
|
10
11
|
Changes:
|
|
11
12
|
- Create a PostHogProvider component that will be imported into the layout file.
|
|
12
13
|
|
|
13
14
|
Example:
|
|
14
15
|
--------------------------------------------------
|
|
15
|
-
|
|
16
|
+
"use client"
|
|
16
17
|
|
|
17
|
-
import posthog from
|
|
18
|
-
import { PostHogProvider as PHProvider, usePostHog } from
|
|
19
|
-
import { Suspense, useEffect } from
|
|
18
|
+
import posthog from "posthog-js"
|
|
19
|
+
import { PostHogProvider as PHProvider, usePostHog } from "posthog-js/react"
|
|
20
|
+
import { Suspense, useEffect } from "react"
|
|
20
21
|
import { usePathname, useSearchParams } from "next/navigation"
|
|
21
22
|
|
|
22
23
|
export function PostHogProvider({ children }: { children: React.ReactNode }) {
|
|
23
24
|
useEffect(() => {
|
|
24
25
|
posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
|
|
25
26
|
api_host: "/ingest",
|
|
26
|
-
ui_host:
|
|
27
|
+
ui_host: "${(0, utils_1.getUiHostFromHost)(host)}",
|
|
27
28
|
capture_pageview: false, // We capture pageviews manually
|
|
28
29
|
capture_pageleave: true, // Enable pageleave capture
|
|
29
30
|
})
|
|
@@ -50,7 +51,7 @@ function PostHogPageView() {
|
|
|
50
51
|
if (search) {
|
|
51
52
|
url += "?" + search
|
|
52
53
|
}
|
|
53
|
-
posthog.capture(
|
|
54
|
+
posthog.capture("$pageview", { "$current_url": url })
|
|
54
55
|
}
|
|
55
56
|
}, [pathname, searchParams, posthog])
|
|
56
57
|
|
|
@@ -67,7 +68,8 @@ function SuspendedPostHogPageView() {
|
|
|
67
68
|
--------------------------------------------------
|
|
68
69
|
|
|
69
70
|
==============================
|
|
70
|
-
FILE:
|
|
71
|
+
FILE: layout.${language === 'typescript' ? 'tsx' : 'jsx'}
|
|
72
|
+
LOCATION: Wherever the root layout is
|
|
71
73
|
==============================
|
|
72
74
|
Changes:
|
|
73
75
|
- Import the PostHogProvider from the providers file and wrap the app in it.
|
|
@@ -75,7 +77,7 @@ Changes:
|
|
|
75
77
|
Example:
|
|
76
78
|
--------------------------------------------------
|
|
77
79
|
// other imports
|
|
78
|
-
import { PostHogProvider } from
|
|
80
|
+
import { PostHogProvider } from "LOCATION_OF_POSTHOG_PROVIDER"
|
|
79
81
|
|
|
80
82
|
export default function RootLayout({ children }) {
|
|
81
83
|
return (
|
|
@@ -93,18 +95,19 @@ export default function RootLayout({ children }) {
|
|
|
93
95
|
--------------------------------------------------
|
|
94
96
|
|
|
95
97
|
==============================
|
|
96
|
-
FILE:
|
|
98
|
+
FILE: posthog.${language === 'typescript' ? 'ts' : 'js'}
|
|
99
|
+
LOCATION: Wherever works best given the project structure
|
|
97
100
|
==============================
|
|
98
101
|
Changes:
|
|
99
102
|
- Initialize the PostHog Node.js client
|
|
100
103
|
|
|
101
104
|
Example:
|
|
102
105
|
--------------------------------------------------
|
|
103
|
-
import { PostHog } from
|
|
106
|
+
import { PostHog } from "posthog-node"
|
|
104
107
|
|
|
105
108
|
export default function PostHogClient() {
|
|
106
109
|
const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
|
|
107
|
-
host:
|
|
110
|
+
host: "${host}",
|
|
108
111
|
flushAt: 1,
|
|
109
112
|
flushInterval: 0,
|
|
110
113
|
})
|
|
@@ -114,6 +117,7 @@ export default function PostHogClient() {
|
|
|
114
117
|
|
|
115
118
|
==============================
|
|
116
119
|
FILE: next.config.{js,ts,mjs,cjs}
|
|
120
|
+
LOCATION: Wherever the root next config is
|
|
117
121
|
==============================
|
|
118
122
|
Changes:
|
|
119
123
|
- Add rewrites to the Next.js config to support PostHog, if there are existing rewrites, add the PostHog rewrites to them.
|
|
@@ -149,7 +153,8 @@ exports.getNextjsAppRouterDocs = getNextjsAppRouterDocs;
|
|
|
149
153
|
const getNextjsPagesRouterDocs = ({ host, language, }) => {
|
|
150
154
|
return `
|
|
151
155
|
==============================
|
|
152
|
-
FILE:
|
|
156
|
+
FILE: _app.${language === 'typescript' ? 'tsx' : 'jsx'}
|
|
157
|
+
LOCATION: Wherever the root _app.${language === 'typescript' ? 'tsx' : 'jsx'} file is
|
|
153
158
|
==============================
|
|
154
159
|
Changes:
|
|
155
160
|
- Initialize PostHog in _app.js.
|
|
@@ -158,25 +163,26 @@ Changes:
|
|
|
158
163
|
|
|
159
164
|
Example:
|
|
160
165
|
--------------------------------------------------
|
|
161
|
-
import { useEffect } from
|
|
162
|
-
import { Router } from
|
|
163
|
-
import posthog from
|
|
164
|
-
import { PostHogProvider } from
|
|
166
|
+
import { useEffect } from "react"
|
|
167
|
+
import { Router } from "next/router"
|
|
168
|
+
import posthog from "posthog-js"
|
|
169
|
+
import { PostHogProvider } from "posthog-js/react"
|
|
165
170
|
|
|
166
171
|
export default function App({ Component, pageProps }) {
|
|
167
172
|
useEffect(() => {
|
|
168
173
|
posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY, {
|
|
169
|
-
api_host:
|
|
174
|
+
api_host: "/ingest",
|
|
175
|
+
ui_host: "${(0, utils_1.getUiHostFromHost)(host)}",
|
|
170
176
|
loaded: (posthog) => {
|
|
171
|
-
if (process.env.NODE_ENV ===
|
|
177
|
+
if (process.env.NODE_ENV === "development") posthog.debug()
|
|
172
178
|
},
|
|
173
179
|
})
|
|
174
180
|
|
|
175
|
-
const handleRouteChange = () => posthog?.capture(
|
|
176
|
-
Router.events.on(
|
|
181
|
+
const handleRouteChange = () => posthog?.capture("$pageview")
|
|
182
|
+
Router.events.on("routeChangeComplete", handleRouteChange)
|
|
177
183
|
|
|
178
184
|
return () => {
|
|
179
|
-
Router.events.off(
|
|
185
|
+
Router.events.off("routeChangeComplete", handleRouteChange)
|
|
180
186
|
}
|
|
181
187
|
}, [])
|
|
182
188
|
|
|
@@ -189,18 +195,19 @@ export default function App({ Component, pageProps }) {
|
|
|
189
195
|
--------------------------------------------------
|
|
190
196
|
|
|
191
197
|
==============================
|
|
192
|
-
FILE:
|
|
198
|
+
FILE: posthog.${language === 'typescript' ? 'ts' : 'js'}
|
|
199
|
+
LOCATION: Wherever works best given the project structure
|
|
193
200
|
==============================
|
|
194
201
|
Changes:
|
|
195
202
|
- Initialize the PostHog Node.js client for server-side tracking.
|
|
196
203
|
|
|
197
204
|
Example:
|
|
198
205
|
--------------------------------------------------
|
|
199
|
-
import { PostHog } from
|
|
206
|
+
import { PostHog } from "posthog-node"
|
|
200
207
|
|
|
201
208
|
export default function PostHogClient() {
|
|
202
209
|
return new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
|
|
203
|
-
host:
|
|
210
|
+
host: "${host}",
|
|
204
211
|
flushAt: 1,
|
|
205
212
|
flushInterval: 0,
|
|
206
213
|
})
|
|
@@ -209,6 +216,7 @@ export default function PostHogClient() {
|
|
|
209
216
|
|
|
210
217
|
==============================
|
|
211
218
|
FILE: next.config.{js,ts,mjs,cjs}
|
|
219
|
+
LOCATION: Wherever the root next config is
|
|
212
220
|
==============================
|
|
213
221
|
Changes:
|
|
214
222
|
- Add rewrites to support PostHog tracking.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/nextjs/docs.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/nextjs/docs.ts"],"names":[],"mappings":";;;AAAA,mCAAkE;AAE3D,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,yBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA4C1B,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;;;;;;;;;;;;;;;;;;;;;;;;wBAwBO,IAAA,4BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AA1JW,QAAA,sBAAsB,0BA0JjC;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,yBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;gBAuBzB,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;aAY1C,IAAI;;;;;;;;;;;;;;;;;;;;yDAoBwC,IAAA,4BAAoB,EACrE,IAAI,CACL;kDAC2C,IAAI;kDACJ,IAAI;;;;;;;;CAQrD,CAAC;AACF,CAAC,CAAC;AAlGW,QAAA,wBAAwB,4BAkGnC","sourcesContent":["import { getAssetHostFromHost, getUiHostFromHost } from './utils';\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 })\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\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 })\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 for server-side tracking.\n\nExample:\n--------------------------------------------------\nimport { PostHog } from \"posthog-node\"\n\nexport default function PostHogClient() {\n return new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n host: \"${host}\",\n flushAt: 1,\n flushInterval: 0,\n })\n}\n--------------------------------------------------\n\n==============================\nFILE: next.config.{js,ts,mjs,cjs}\nLOCATION: Wherever the root next config is\n==============================\nChanges:\n- Add rewrites to support PostHog tracking.\n- Enable support for PostHog API trailing slash requests.\n\nExample:\n--------------------------------------------------\nconst nextConfig = {\n async rewrites() {\n return [\n { source: \"/ingest/static/:path*\", destination: \"${getAssetHostFromHost(\n host,\n )}/static/:path*\" },\n { source: \"/ingest/:path*\", destination: \"${host}/:path*\" },\n { source: \"/ingest/decide\", destination: \"${host}/decide\" },\n ]\n },\n skipTrailingSlashRedirect: true,\n}\n\nmodule.exports = nextConfig\n--------------------------------------------------\n`;\n};\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { WizardOptions } from '../utils/types';
|
|
2
2
|
import { Integration } from '../lib/constants';
|
|
3
3
|
export declare function runNextjsWizard(options: WizardOptions): Promise<void>;
|
|
4
|
-
export declare function detectNextJs(): Promise<Integration.nextjs | undefined>;
|
|
5
|
-
export declare function addOrUpdateEnvironmentVariables({ projectApiKey,
|
|
4
|
+
export declare function detectNextJs(options: Pick<WizardOptions, 'installDir'>): Promise<Integration.nextjs | undefined>;
|
|
5
|
+
export declare function addOrUpdateEnvironmentVariables({ projectApiKey, installDir, }: {
|
|
6
6
|
projectApiKey: string;
|
|
7
|
-
|
|
7
|
+
installDir: string;
|
|
8
8
|
}): Promise<void>;
|
|
9
|
-
export declare function getDotGitignore(): string | undefined;
|
|
9
|
+
export declare function getDotGitignore({ installDir, }: Pick<WizardOptions, 'installDir'>): string | undefined;
|
|
@@ -66,9 +66,9 @@ async function runNextjsWizard(options) {
|
|
|
66
66
|
if (!aiConsent) {
|
|
67
67
|
await (0, clack_utils_1.abort)('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', 0);
|
|
68
68
|
}
|
|
69
|
-
const typeScriptDetected = (0, clack_utils_1.isUsingTypeScript)();
|
|
69
|
+
const typeScriptDetected = (0, clack_utils_1.isUsingTypeScript)(options);
|
|
70
70
|
await (0, clack_utils_1.confirmContinueIfNoOrDirtyGitRepo)();
|
|
71
|
-
const packageJson = await (0, clack_utils_1.getPackageDotJson)();
|
|
71
|
+
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
|
|
72
72
|
await (0, clack_utils_1.ensurePackageIsInstalled)(packageJson, 'next', 'Next.js');
|
|
73
73
|
const nextVersion = (0, package_json_1.getPackageVersion)('next', packageJson);
|
|
74
74
|
analytics_1.Analytics.setTag('nextjs-version', (0, utils_1.getNextJsVersionBucket)(nextVersion));
|
|
@@ -81,6 +81,7 @@ async function runNextjsWizard(options) {
|
|
|
81
81
|
alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],
|
|
82
82
|
forceInstall,
|
|
83
83
|
askBeforeUpdating: false,
|
|
84
|
+
installDir: options.installDir,
|
|
84
85
|
});
|
|
85
86
|
await (0, clack_utils_1.installPackage)({
|
|
86
87
|
packageName: 'posthog-node',
|
|
@@ -89,9 +90,10 @@ async function runNextjsWizard(options) {
|
|
|
89
90
|
alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],
|
|
90
91
|
forceInstall,
|
|
91
92
|
askBeforeUpdating: false,
|
|
93
|
+
installDir: options.installDir,
|
|
92
94
|
});
|
|
93
|
-
const router = await (0, utils_1.getNextJsRouter)();
|
|
94
|
-
const relevantFiles = await getRelevantFilesForNextJs();
|
|
95
|
+
const router = await (0, utils_1.getNextJsRouter)(options);
|
|
96
|
+
const relevantFiles = await getRelevantFilesForNextJs(options);
|
|
95
97
|
const installationDocumentation = getInstallationDocumentation({
|
|
96
98
|
router,
|
|
97
99
|
host,
|
|
@@ -109,7 +111,7 @@ async function runNextjsWizard(options) {
|
|
|
109
111
|
try {
|
|
110
112
|
let oldContent = undefined;
|
|
111
113
|
try {
|
|
112
|
-
oldContent = await fs.promises.readFile(path_1.default.join(
|
|
114
|
+
oldContent = await fs.promises.readFile(path_1.default.join(options.installDir, filePath), 'utf8');
|
|
113
115
|
}
|
|
114
116
|
catch (readError) {
|
|
115
117
|
if (readError.code !== 'ENOENT') {
|
|
@@ -128,7 +130,7 @@ async function runNextjsWizard(options) {
|
|
|
128
130
|
wizardHash,
|
|
129
131
|
});
|
|
130
132
|
if (newContent !== oldContent) {
|
|
131
|
-
await updateFile({ filePath, oldContent, newContent });
|
|
133
|
+
await updateFile({ filePath, oldContent, newContent }, options);
|
|
132
134
|
changes.push({ filePath, oldContent, newContent });
|
|
133
135
|
}
|
|
134
136
|
fileChangeSpinner.stop(`${oldContent ? 'Updated' : 'Created'} file ${filePath}`);
|
|
@@ -139,10 +141,10 @@ async function runNextjsWizard(options) {
|
|
|
139
141
|
}
|
|
140
142
|
await addOrUpdateEnvironmentVariables({
|
|
141
143
|
projectApiKey,
|
|
142
|
-
|
|
144
|
+
installDir: options.installDir,
|
|
143
145
|
});
|
|
144
|
-
const packageManagerForOutro = packageManagerFromInstallStep ?? (await (0, clack_utils_1.getPackageManager)());
|
|
145
|
-
await (0, clack_utils_1.runPrettierIfInstalled)();
|
|
146
|
+
const packageManagerForOutro = packageManagerFromInstallStep ?? (await (0, clack_utils_1.getPackageManager)(options));
|
|
147
|
+
await (0, clack_utils_1.runPrettierIfInstalled)(options);
|
|
146
148
|
clack_1.default.outro(`
|
|
147
149
|
${chalk_1.default.green('Successfully installed PostHog!')} ${`\n\n${aiConsent
|
|
148
150
|
? `Note: This uses experimental AI to setup your project. It might have got it wrong, pleaes check!\n`
|
|
@@ -171,7 +173,7 @@ async function askForAIConsent() {
|
|
|
171
173
|
return aiConsent;
|
|
172
174
|
});
|
|
173
175
|
}
|
|
174
|
-
async function getRelevantFilesForNextJs() {
|
|
176
|
+
async function getRelevantFilesForNextJs({ installDir, }) {
|
|
175
177
|
const filterPatterns = ['**/*.{tsx,ts,jsx,js,mjs,cjs}'];
|
|
176
178
|
const ignorePatterns = [
|
|
177
179
|
'node_modules',
|
|
@@ -182,13 +184,13 @@ async function getRelevantFilesForNextJs() {
|
|
|
182
184
|
'next-env.d.*',
|
|
183
185
|
];
|
|
184
186
|
const filteredFiles = await (0, fast_glob_1.default)(filterPatterns, {
|
|
185
|
-
cwd:
|
|
187
|
+
cwd: installDir,
|
|
186
188
|
ignore: ignorePatterns,
|
|
187
189
|
});
|
|
188
190
|
return filteredFiles;
|
|
189
191
|
}
|
|
190
|
-
async function detectNextJs() {
|
|
191
|
-
const packageJson = await (0, clack_utils_1.getPackageDotJson)();
|
|
192
|
+
async function detectNextJs(options) {
|
|
193
|
+
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
|
|
192
194
|
const hasNextInstalled = (0, package_json_1.hasPackageInstalled)('next', packageJson);
|
|
193
195
|
if (hasNextInstalled)
|
|
194
196
|
return constants_1.Integration.nextjs;
|
|
@@ -238,32 +240,38 @@ async function generateFileChanges({ filePath, content, changedFiles, unchangedF
|
|
|
238
240
|
});
|
|
239
241
|
return response.newContent;
|
|
240
242
|
}
|
|
241
|
-
async function updateFile(change) {
|
|
242
|
-
const dir = path_1.default.dirname(path_1.default.join(
|
|
243
|
+
async function updateFile(change, { installDir }) {
|
|
244
|
+
const dir = path_1.default.dirname(path_1.default.join(installDir, change.filePath));
|
|
243
245
|
await fs.promises.mkdir(dir, { recursive: true });
|
|
244
|
-
await fs.promises.writeFile(path_1.default.join(
|
|
246
|
+
await fs.promises.writeFile(path_1.default.join(installDir, change.filePath), change.newContent);
|
|
245
247
|
}
|
|
246
|
-
async function addOrUpdateEnvironmentVariables({ projectApiKey,
|
|
247
|
-
const envVarContent = `# Posthog\nNEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}
|
|
248
|
-
const dotEnvLocalFilePath = path_1.default.join(
|
|
249
|
-
const dotEnvFilePath = path_1.default.join(
|
|
248
|
+
async function addOrUpdateEnvironmentVariables({ projectApiKey, installDir, }) {
|
|
249
|
+
const envVarContent = `# Posthog\nNEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`;
|
|
250
|
+
const dotEnvLocalFilePath = path_1.default.join(installDir, '.env.local');
|
|
251
|
+
const dotEnvFilePath = path_1.default.join(installDir, '.env');
|
|
250
252
|
const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath)
|
|
251
253
|
? dotEnvLocalFilePath
|
|
252
254
|
: dotEnvFilePath;
|
|
253
255
|
const dotEnvFileExists = fs.existsSync(targetEnvFilePath);
|
|
254
|
-
const relativeEnvFilePath = path_1.default.relative(
|
|
256
|
+
const relativeEnvFilePath = path_1.default.relative(installDir, targetEnvFilePath);
|
|
255
257
|
if (dotEnvFileExists) {
|
|
256
258
|
const dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');
|
|
257
259
|
const hasProjectApiKey = dotEnvFileContent.includes(`NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`);
|
|
258
|
-
|
|
259
|
-
if (hasProjectApiKey && hasHost) {
|
|
260
|
+
if (hasProjectApiKey) {
|
|
260
261
|
clack_1.default.log.success(`${chalk_1.default.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);
|
|
261
262
|
}
|
|
262
263
|
else {
|
|
263
264
|
try {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
.replace(/^
|
|
265
|
+
let newContent = dotEnvFileContent;
|
|
266
|
+
if (dotEnvFileContent.match(/^NEXT_PUBLIC_POSTHOG_KEY=.*$/m)) {
|
|
267
|
+
newContent = dotEnvFileContent.replace(/^NEXT_PUBLIC_POSTHOG_KEY=.*$/m, `NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
if (!dotEnvFileContent.endsWith('\n')) {
|
|
271
|
+
newContent += '\n';
|
|
272
|
+
}
|
|
273
|
+
newContent += envVarContent;
|
|
274
|
+
}
|
|
267
275
|
await fs.promises.writeFile(targetEnvFilePath, newContent, {
|
|
268
276
|
encoding: 'utf8',
|
|
269
277
|
flag: 'w',
|
|
@@ -287,7 +295,7 @@ async function addOrUpdateEnvironmentVariables({ projectApiKey, host, }) {
|
|
|
287
295
|
clack_1.default.log.warning(`Failed to create ${chalk_1.default.bold.cyan(relativeEnvFilePath)} with environment variables for PostHog. Please add them manually. Error: ${error.message}`);
|
|
288
296
|
}
|
|
289
297
|
}
|
|
290
|
-
const gitignorePath = getDotGitignore();
|
|
298
|
+
const gitignorePath = getDotGitignore({ installDir });
|
|
291
299
|
if (gitignorePath) {
|
|
292
300
|
const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');
|
|
293
301
|
const envFiles = ['.env', '.env.local'];
|
|
@@ -309,7 +317,7 @@ async function addOrUpdateEnvironmentVariables({ projectApiKey, host, }) {
|
|
|
309
317
|
else {
|
|
310
318
|
try {
|
|
311
319
|
const newGitignoreContent = `.env\n.env.local\n`;
|
|
312
|
-
await fs.promises.writeFile(path_1.default.join(
|
|
320
|
+
await fs.promises.writeFile(path_1.default.join(installDir, '.gitignore'), newGitignoreContent, {
|
|
313
321
|
encoding: 'utf8',
|
|
314
322
|
flag: 'w',
|
|
315
323
|
});
|
|
@@ -320,8 +328,8 @@ async function addOrUpdateEnvironmentVariables({ projectApiKey, host, }) {
|
|
|
320
328
|
}
|
|
321
329
|
}
|
|
322
330
|
}
|
|
323
|
-
function getDotGitignore() {
|
|
324
|
-
const gitignorePath = path_1.default.join(
|
|
331
|
+
function getDotGitignore({ installDir, }) {
|
|
332
|
+
const gitignorePath = path_1.default.join(installDir, '.gitignore');
|
|
325
333
|
const gitignoreExists = fs.existsSync(gitignorePath);
|
|
326
334
|
if (gitignoreExists) {
|
|
327
335
|
return gitignorePath;
|
|
@@ -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 */\n\nimport chalk from 'chalk';\nimport * as fs from 'fs';\nimport { z } from 'zod';\nimport {\n abort,\n abortIfCancelled,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { traceStep, } from '../telemetry';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport {\n filterFilesPromptTemplate,\n generateFileChangesPromptTemplate,\n} from './prompts';\nimport { query } from '../utils/query';\nimport clack from '../utils/clack';\nimport fg from 'fast-glob';\nimport path from 'path';\nimport { INSTALL_DIR, Integration, ISSUES_URL } from '../lib/constants';\nimport { getNextjsAppRouterDocs, getNextjsPagesRouterDocs } from './docs';\nimport { Analytics } from '../utils/analytics';\n\n\nexport async function runNextjsWizard(\n options: WizardOptions,\n): Promise<void> {\n const { telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'PostHog Next.js Wizard',\n telemetryEnabled,\n });\n\n const aiConsent = await askForAIConsent();\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 typeScriptDetected = isUsingTypeScript();\n\n await confirmContinueIfNoOrDirtyGitRepo();\n\n const packageJson = await getPackageDotJson();\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 );\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,\n askBeforeUpdating: false,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall,\n askBeforeUpdating: false,\n });\n\n const router = await getNextJsRouter();\n\n const relevantFiles = await getRelevantFilesForNextJs();\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 relevantFiles,\n installationDocumentation,\n wizardHash,\n });\n\n const changes: FileChange[] = [];\n\n for (const filePath of filesToChange) {\n const fileChangeSpinner = clack.spinner();\n\n try {\n let oldContent = undefined;\n try {\n oldContent = await fs.promises.readFile(\n path.join(INSTALL_DIR, filePath),\n 'utf8',\n );\n } catch (readError) {\n if (readError.code !== 'ENOENT') {\n await abort(`Error reading file ${filePath}`);\n continue;\n }\n }\n\n fileChangeSpinner.start(\n `${oldContent ? 'Updating' : 'Creating'} file ${filePath}`,\n );\n\n const unchangedFiles = filesToChange.filter(\n (filePath) => !changes.some((change) => change.filePath === filePath),\n );\n\n const newContent = await generateFileChanges({\n filePath,\n content: oldContent,\n changedFiles: changes,\n unchangedFiles,\n installationDocumentation,\n wizardHash,\n });\n\n if (newContent !== oldContent) {\n await updateFile({ filePath, oldContent, newContent });\n changes.push({ filePath, oldContent, newContent });\n }\n\n fileChangeSpinner.stop(\n `${oldContent ? 'Updated' : 'Created'} file ${filePath}`,\n );\n } catch (error) {\n await abort(`Error processing file ${filePath}`);\n }\n }\n\n await addOrUpdateEnvironmentVariables({\n projectApiKey,\n host,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager());\n\n await runPrettierIfInstalled();\n\n clack.outro(`\n${chalk.green('Successfully installed PostHog!')} ${`\\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\nasync function askForAIConsent() {\n return await traceStep('ask-for-ai-consent', async () => {\n const aiConsent = await abortIfCancelled(\n clack.select({\n message: 'Use AI to setup PostHog automatically? ✨',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'We will use AI to help you setup PostHog quickly',\n },\n {\n label: 'No',\n value: false,\n hint: 'Continue without AI assistance',\n },\n ],\n initialValue: true,\n }),\n );\n\n return aiConsent;\n });\n}\n\nasync function getRelevantFilesForNextJs() {\n const filterPatterns = ['**/*.{tsx,ts,jsx,js,mjs,cjs}'];\n const ignorePatterns = [\n 'node_modules',\n 'dist',\n 'build',\n 'public',\n 'static',\n 'next-env.d.*',\n ];\n\n const filteredFiles = await fg(filterPatterns, {\n cwd: INSTALL_DIR,\n ignore: ignorePatterns,\n });\n\n return filteredFiles;\n}\n\nexport async function detectNextJs(): Promise<Integration.nextjs | undefined> {\n const packageJson = await getPackageDotJson();\n\n const hasNextInstalled = hasPackageInstalled('next', packageJson);\n\n if (hasNextInstalled) return Integration.nextjs;\n\n return undefined;\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\nasync function getFilesToChange({\n relevantFiles,\n installationDocumentation,\n wizardHash,\n}: {\n relevantFiles: string[];\n installationDocumentation: string;\n wizardHash: string;\n}) {\n const filterFilesSpinner = clack.spinner();\n\n filterFilesSpinner.start('Selecting files to change...');\n\n const filterFilesResponseSchmea = z.object({\n files: z.array(z.string()),\n });\n\n const filterFilesPrompt = await filterFilesPromptTemplate.format({\n documentation: installationDocumentation,\n file_list: relevantFiles.join('\\n'),\n });\n\n const filterFilesResponse = await query({\n message: filterFilesPrompt,\n schema: filterFilesResponseSchmea,\n wizardHash,\n });\n\n const filesToChange = filterFilesResponse.files;\n\n filterFilesSpinner.stop(`Found ${filesToChange.length} files to change`);\n\n return filesToChange;\n}\n\nasync function generateFileChanges({\n filePath,\n content,\n changedFiles,\n unchangedFiles,\n installationDocumentation,\n wizardHash,\n}: {\n filePath: string;\n content: string | undefined;\n changedFiles: FileChange[];\n unchangedFiles: string[];\n installationDocumentation: string;\n wizardHash: string;\n}) {\n const generateFileChangesPrompt =\n await generateFileChangesPromptTemplate.format({\n file_path: filePath,\n file_content: content,\n changed_files: changedFiles\n .map((change) => `${change.filePath}\\n${change.oldContent}`)\n .join('\\n'),\n unchanged_files: unchangedFiles,\n documentation: installationDocumentation,\n });\n\n const response = await query({\n message: generateFileChangesPrompt,\n schema: z.object({\n newContent: z.string(),\n }),\n wizardHash: wizardHash,\n });\n\n return response.newContent;\n}\n\nasync function updateFile(change: FileChange) {\n const dir = path.dirname(path.join(INSTALL_DIR, change.filePath));\n await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(\n path.join(INSTALL_DIR, change.filePath),\n change.newContent,\n );\n}\n\ntype FileChange = {\n filePath: string;\n oldContent?: string;\n newContent: string;\n};\n\nexport async function addOrUpdateEnvironmentVariables({\n projectApiKey,\n host,\n}: {\n projectApiKey: string;\n host: string;\n}): Promise<void> {\n const envVarContent = `# Posthog\\nNEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}\\nNEXT_PUBLIC_POSTHOG_HOST=${host}\\n`;\n\n const dotEnvLocalFilePath = path.join(INSTALL_DIR, '.env.local');\n const dotEnvFilePath = path.join(INSTALL_DIR, '.env');\n const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath)\n ? dotEnvLocalFilePath\n : dotEnvFilePath;\n\n const dotEnvFileExists = fs.existsSync(targetEnvFilePath);\n\n const relativeEnvFilePath = path.relative(INSTALL_DIR, targetEnvFilePath);\n\n if (dotEnvFileExists) {\n const dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');\n\n const hasProjectApiKey = dotEnvFileContent.includes(\n `NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`,\n );\n const hasHost = dotEnvFileContent.includes(\n `NEXT_PUBLIC_POSTHOG_HOST=${host}`,\n );\n\n if (hasProjectApiKey && hasHost) {\n clack.log.success(\n `${chalk.bold.cyan(\n relativeEnvFilePath,\n )} already has the necessary environment variables.`,\n );\n } else {\n try {\n const newContent = dotEnvFileContent\n .replace(\n /^NEXT_PUBLIC_POSTHOG_KEY=.*$/m,\n `NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`,\n )\n .replace(\n /^NEXT_PUBLIC_POSTHOG_HOST=.*$/m,\n `NEXT_PUBLIC_POSTHOG_HOST=${host}`,\n );\n await fs.promises.writeFile(targetEnvFilePath, newContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Updated environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to update environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}. Please update them manually. Error: ${error.message}`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(targetEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Created ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables for PostHog.`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables for PostHog. Please add them manually. Error: ${error.message\n }`,\n );\n }\n }\n\n const gitignorePath = getDotGitignore();\n\n if (gitignorePath) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n const envFiles = ['.env', '.env.local'];\n const missingEnvFiles = envFiles\n\n if (missingEnvFiles.length > 0) {\n try {\n const newGitignoreContent = `${gitignoreContent}\\n${missingEnvFiles.join(\n '\\n',\n )}`;\n await fs.promises.writeFile(gitignorePath, newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Updated ${chalk.bold.cyan(\n '.gitignore',\n )} to include environment files.`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to update ${chalk.bold.cyan(\n '.gitignore',\n )} to include environment files. Error: ${error.message}`,\n );\n }\n }\n } else {\n try {\n const newGitignoreContent = `.env\\n.env.local\\n`;\n await fs.promises.writeFile(\n path.join(INSTALL_DIR, '.gitignore'),\n newGitignoreContent,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Created ${chalk.bold.cyan('.gitignore')} with environment files.`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n '.gitignore',\n )} with environment files. Error: ${error.message}`,\n );\n }\n }\n}\n\nexport function getDotGitignore() {\n const gitignorePath = path.join(INSTALL_DIR, '.gitignore');\n const gitignoreExists = fs.existsSync(gitignorePath);\n\n if (gitignoreExists) {\n return gitignorePath;\n }\n\n return undefined;\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 */\n\nimport chalk from 'chalk';\nimport * as fs from 'fs';\nimport { z } from 'zod';\nimport {\n abort,\n abortIfCancelled,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { traceStep } from '../telemetry';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport {\n filterFilesPromptTemplate,\n generateFileChangesPromptTemplate,\n} from './prompts';\nimport { query } from '../utils/query';\nimport clack from '../utils/clack';\nimport fg from 'fast-glob';\nimport path from 'path';\nimport { Integration, ISSUES_URL } from '../lib/constants';\nimport { getNextjsAppRouterDocs, getNextjsPagesRouterDocs } from './docs';\nimport { Analytics } from '../utils/analytics';\n\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n const { telemetryEnabled, forceInstall } = options;\n\n printWelcome({\n wizardName: 'PostHog Next.js Wizard',\n telemetryEnabled,\n });\n\n const aiConsent = await askForAIConsent();\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 typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo();\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 );\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,\n askBeforeUpdating: false,\n installDir: options.installDir,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n });\n\n const router = await getNextJsRouter(options);\n\n const relevantFiles = await getRelevantFilesForNextJs(options);\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 relevantFiles,\n installationDocumentation,\n wizardHash,\n });\n\n const changes: FileChange[] = [];\n\n for (const filePath of filesToChange) {\n const fileChangeSpinner = clack.spinner();\n\n try {\n let oldContent = undefined;\n try {\n oldContent = await fs.promises.readFile(\n path.join(options.installDir, filePath),\n 'utf8',\n );\n } catch (readError) {\n if (readError.code !== 'ENOENT') {\n await abort(`Error reading file ${filePath}`);\n continue;\n }\n }\n\n fileChangeSpinner.start(\n `${oldContent ? 'Updating' : 'Creating'} file ${filePath}`,\n );\n\n const unchangedFiles = filesToChange.filter(\n (filePath) => !changes.some((change) => change.filePath === filePath),\n );\n\n const newContent = await generateFileChanges({\n filePath,\n content: oldContent,\n changedFiles: changes,\n unchangedFiles,\n installationDocumentation,\n wizardHash,\n });\n\n if (newContent !== oldContent) {\n await updateFile({ filePath, oldContent, newContent }, options);\n changes.push({ filePath, oldContent, newContent });\n }\n\n fileChangeSpinner.stop(\n `${oldContent ? 'Updated' : 'Created'} file ${filePath}`,\n );\n } catch (error) {\n await abort(`Error processing file ${filePath}`);\n }\n }\n\n await addOrUpdateEnvironmentVariables({\n projectApiKey,\n installDir: options.installDir,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierIfInstalled(options);\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\nasync function askForAIConsent() {\n return await traceStep('ask-for-ai-consent', async () => {\n const aiConsent = await abortIfCancelled(\n clack.select({\n message: 'Use AI to setup PostHog automatically? ✨',\n options: [\n {\n label: 'Yes',\n value: true,\n hint: 'We will use AI to help you setup PostHog quickly',\n },\n {\n label: 'No',\n value: false,\n hint: 'Continue without AI assistance',\n },\n ],\n initialValue: true,\n }),\n );\n\n return aiConsent;\n });\n}\n\nasync function getRelevantFilesForNextJs({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n const filterPatterns = ['**/*.{tsx,ts,jsx,js,mjs,cjs}'];\n const ignorePatterns = [\n 'node_modules',\n 'dist',\n 'build',\n 'public',\n 'static',\n 'next-env.d.*',\n ];\n\n const filteredFiles = await fg(filterPatterns, {\n cwd: installDir,\n ignore: ignorePatterns,\n });\n\n return filteredFiles;\n}\n\nexport async function detectNextJs(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<Integration.nextjs | undefined> {\n const packageJson = await getPackageDotJson(options);\n\n const hasNextInstalled = hasPackageInstalled('next', packageJson);\n\n if (hasNextInstalled) return Integration.nextjs;\n\n return undefined;\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\nasync function getFilesToChange({\n relevantFiles,\n installationDocumentation,\n wizardHash,\n}: {\n relevantFiles: string[];\n installationDocumentation: string;\n wizardHash: string;\n}) {\n const filterFilesSpinner = clack.spinner();\n\n filterFilesSpinner.start('Selecting files to change...');\n\n const filterFilesResponseSchmea = z.object({\n files: z.array(z.string()),\n });\n\n const filterFilesPrompt = await filterFilesPromptTemplate.format({\n documentation: installationDocumentation,\n file_list: relevantFiles.join('\\n'),\n });\n\n const filterFilesResponse = await query({\n message: filterFilesPrompt,\n schema: filterFilesResponseSchmea,\n wizardHash,\n });\n\n const filesToChange = filterFilesResponse.files;\n\n filterFilesSpinner.stop(`Found ${filesToChange.length} files to change`);\n\n return filesToChange;\n}\n\nasync function generateFileChanges({\n filePath,\n content,\n changedFiles,\n unchangedFiles,\n installationDocumentation,\n wizardHash,\n}: {\n filePath: string;\n content: string | undefined;\n changedFiles: FileChange[];\n unchangedFiles: string[];\n installationDocumentation: string;\n wizardHash: string;\n}) {\n const generateFileChangesPrompt =\n await generateFileChangesPromptTemplate.format({\n file_path: filePath,\n file_content: content,\n changed_files: changedFiles\n .map((change) => `${change.filePath}\\n${change.oldContent}`)\n .join('\\n'),\n unchanged_files: unchangedFiles,\n documentation: installationDocumentation,\n });\n\n const response = await query({\n message: generateFileChangesPrompt,\n schema: z.object({\n newContent: z.string(),\n }),\n wizardHash: wizardHash,\n });\n\n return response.newContent;\n}\n\nasync function updateFile(\n change: FileChange,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n) {\n const dir = path.dirname(path.join(installDir, change.filePath));\n await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(\n path.join(installDir, change.filePath),\n change.newContent,\n );\n}\n\ntype FileChange = {\n filePath: string;\n oldContent?: string;\n newContent: string;\n};\n\nexport async function addOrUpdateEnvironmentVariables({\n projectApiKey,\n installDir,\n}: {\n projectApiKey: string;\n installDir: string;\n}): Promise<void> {\n const envVarContent = `# Posthog\\nNEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`;\n\n const dotEnvLocalFilePath = path.join(installDir, '.env.local');\n const dotEnvFilePath = path.join(installDir, '.env');\n const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath)\n ? dotEnvLocalFilePath\n : dotEnvFilePath;\n\n const dotEnvFileExists = fs.existsSync(targetEnvFilePath);\n\n const relativeEnvFilePath = path.relative(installDir, targetEnvFilePath);\n\n if (dotEnvFileExists) {\n const dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');\n\n const hasProjectApiKey = dotEnvFileContent.includes(\n `NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`,\n );\n if (hasProjectApiKey) {\n clack.log.success(\n `${chalk.bold.cyan(\n relativeEnvFilePath,\n )} already has the necessary environment variables.`,\n );\n } else {\n try {\n let newContent = dotEnvFileContent;\n\n if (dotEnvFileContent.match(/^NEXT_PUBLIC_POSTHOG_KEY=.*$/m)) {\n newContent = dotEnvFileContent.replace(\n /^NEXT_PUBLIC_POSTHOG_KEY=.*$/m,\n `NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`,\n );\n } else {\n if (!dotEnvFileContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n newContent += envVarContent;\n }\n\n await fs.promises.writeFile(targetEnvFilePath, newContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Updated environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to update environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}. Please update them manually. Error: ${error.message}`,\n );\n }\n }\n } else {\n try {\n await fs.promises.writeFile(targetEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Created ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables for PostHog.`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables for PostHog. Please add them manually. Error: ${\n error.message\n }`,\n );\n }\n }\n\n const gitignorePath = getDotGitignore({ installDir });\n\n if (gitignorePath) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n const envFiles = ['.env', '.env.local'];\n const missingEnvFiles = envFiles;\n\n if (missingEnvFiles.length > 0) {\n try {\n const newGitignoreContent = `${gitignoreContent}\\n${missingEnvFiles.join(\n '\\n',\n )}`;\n await fs.promises.writeFile(gitignorePath, newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(\n `Updated ${chalk.bold.cyan(\n '.gitignore',\n )} to include environment files.`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to update ${chalk.bold.cyan(\n '.gitignore',\n )} to include environment files. Error: ${error.message}`,\n );\n }\n }\n } else {\n try {\n const newGitignoreContent = `.env\\n.env.local\\n`;\n await fs.promises.writeFile(\n path.join(installDir, '.gitignore'),\n newGitignoreContent,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n clack.log.success(\n `Created ${chalk.bold.cyan('.gitignore')} with environment files.`,\n );\n } catch (error) {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n '.gitignore',\n )} with environment files. Error: ${error.message}`,\n );\n }\n }\n}\n\nexport function getDotGitignore({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n const gitignorePath = path.join(installDir, '.gitignore');\n const gitignoreExists = fs.existsSync(gitignorePath);\n\n if (gitignoreExists) {\n return gitignorePath;\n }\n\n return undefined;\n}\n"]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import type { WizardOptions } from '../utils/types';
|
|
1
2
|
export declare function getNextJsVersionBucket(version: string | undefined): string;
|
|
2
3
|
export declare enum NextJsRouter {
|
|
3
4
|
APP_ROUTER = "app-router",
|
|
4
5
|
PAGES_ROUTER = "pages-router"
|
|
5
6
|
}
|
|
6
7
|
export declare const IGNORE_PATTERNS: string[];
|
|
7
|
-
export declare function getNextJsRouter(): Promise<NextJsRouter>;
|
|
8
|
+
export declare function getNextJsRouter({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter>;
|
|
8
9
|
export declare const getNextJsRouterName: (router: NextJsRouter) => "app router" | "pages router";
|
|
9
10
|
export declare const getAssetHostFromHost: (host: string) => string;
|
|
11
|
+
export declare const getUiHostFromHost: (host: string) => string;
|