@posthog/wizard 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +28 -0
- package/dist/bin.js.map +1 -0
- package/dist/src/lib/config.d.ts +49 -0
- package/dist/src/lib/config.js +85 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/constants.d.ts +25 -0
- package/dist/src/lib/constants.js +45 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/messages.d.ts +17 -0
- package/dist/src/lib/messages.js +68 -0
- package/dist/src/lib/messages.js.map +1 -0
- package/dist/src/lib/prompts.d.ts +16 -0
- package/dist/src/lib/prompts.js +83 -0
- package/dist/src/lib/prompts.js.map +1 -0
- package/dist/src/nextjs/docs.d.ts +8 -0
- package/dist/src/nextjs/docs.js +257 -0
- package/dist/src/nextjs/docs.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard.d.ts +2 -0
- package/dist/src/nextjs/nextjs-wizard.js +136 -0
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -0
- package/dist/src/nextjs/utils.d.ts +9 -0
- package/dist/src/nextjs/utils.js +83 -0
- package/dist/src/nextjs/utils.js.map +1 -0
- package/dist/src/react/docs.d.ts +4 -0
- package/dist/src/react/docs.js +46 -0
- package/dist/src/react/docs.js.map +1 -0
- package/dist/src/react/react-wizard.d.ts +2 -0
- package/dist/src/react/react-wizard.js +115 -0
- package/dist/src/react/react-wizard.js.map +1 -0
- package/dist/src/react-native/docs.d.ts +5 -0
- package/dist/src/react-native/docs.js +31 -0
- package/dist/src/react-native/docs.js.map +1 -0
- package/dist/src/react-native/react-native-wizard.d.ts +2 -0
- package/dist/src/react-native/react-native-wizard.js +124 -0
- package/dist/src/react-native/react-native-wizard.js.map +1 -0
- package/dist/src/run.d.ts +13 -0
- package/dist/src/run.js +85 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/steps/__tests__/add-editor-rules.test.d.ts +1 -0
- package/dist/src/steps/__tests__/add-editor-rules.test.js +218 -0
- package/dist/src/steps/__tests__/add-editor-rules.test.js.map +1 -0
- package/dist/src/steps/__tests__/create-pr.test.d.ts +1 -0
- package/dist/src/steps/__tests__/create-pr.test.js +193 -0
- package/dist/src/steps/__tests__/create-pr.test.js.map +1 -0
- package/dist/src/steps/add-editor-rules.d.ts +9 -0
- package/dist/src/steps/add-editor-rules.js +92 -0
- package/dist/src/steps/add-editor-rules.js.map +1 -0
- package/dist/src/steps/add-or-update-environment-variables.d.ts +10 -0
- package/dist/src/steps/add-or-update-environment-variables.js +194 -0
- package/dist/src/steps/add-or-update-environment-variables.js.map +1 -0
- package/dist/src/steps/create-pr.d.ts +27 -0
- package/dist/src/steps/create-pr.js +305 -0
- package/dist/src/steps/create-pr.js.map +1 -0
- package/dist/src/steps/index.d.ts +4 -0
- package/dist/src/steps/index.js +21 -0
- package/dist/src/steps/index.js.map +1 -0
- package/dist/src/steps/run-prettier.d.ts +5 -0
- package/dist/src/steps/run-prettier.js +93 -0
- package/dist/src/steps/run-prettier.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +8 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +12 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
- package/dist/src/steps/upload-environment-variables/index.js +66 -0
- package/dist/src/steps/upload-environment-variables/index.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.d.ts +1 -0
- package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.js +117 -0
- package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +14 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js +146 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -0
- package/dist/src/svelte/docs.d.ts +3 -0
- package/dist/src/svelte/docs.js +110 -0
- package/dist/src/svelte/docs.js.map +1 -0
- package/dist/src/svelte/svelte-wizard.d.ts +2 -0
- package/dist/src/svelte/svelte-wizard.js +115 -0
- package/dist/src/svelte/svelte-wizard.js.map +1 -0
- package/dist/src/telemetry.d.ts +2 -0
- package/dist/src/telemetry.js +13 -0
- package/dist/src/telemetry.js.map +1 -0
- package/dist/src/utils/__tests__/clack-utils.test.d.ts +1 -0
- package/dist/src/utils/__tests__/clack-utils.test.js +128 -0
- package/dist/src/utils/__tests__/clack-utils.test.js.map +1 -0
- package/dist/src/utils/analytics.d.ts +12 -0
- package/dist/src/utils/analytics.js +59 -0
- package/dist/src/utils/analytics.js.map +1 -0
- package/dist/src/utils/bash.d.ts +2 -0
- package/dist/src/utils/bash.js +54 -0
- package/dist/src/utils/bash.js.map +1 -0
- package/dist/src/utils/clack-utils.d.ts +180 -0
- package/dist/src/utils/clack-utils.js +634 -0
- package/dist/src/utils/clack-utils.js.map +1 -0
- package/dist/src/utils/clack.d.ts +2 -0
- package/dist/src/utils/clack.js +9 -0
- package/dist/src/utils/clack.js.map +1 -0
- package/dist/src/utils/debug.d.ts +2 -0
- package/dist/src/utils/debug.js +22 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/environment.d.ts +3 -0
- package/dist/src/utils/environment.js +64 -0
- package/dist/src/utils/environment.js.map +1 -0
- package/dist/src/utils/file-utils.d.ts +29 -0
- package/dist/src/utils/file-utils.js +177 -0
- package/dist/src/utils/file-utils.js.map +1 -0
- package/dist/src/utils/logging.d.ts +9 -0
- package/dist/src/utils/logging.js +50 -0
- package/dist/src/utils/logging.js.map +1 -0
- package/dist/src/utils/package-json.d.ts +25 -0
- package/dist/src/utils/package-json.js +27 -0
- package/dist/src/utils/package-json.js.map +1 -0
- package/dist/src/utils/package-manager.d.ts +21 -0
- package/dist/src/utils/package-manager.js +208 -0
- package/dist/src/utils/package-manager.js.map +1 -0
- package/dist/src/utils/query.d.ts +8 -0
- package/dist/src/utils/query.js +27 -0
- package/dist/src/utils/query.js.map +1 -0
- package/dist/src/utils/rules/next-rules.md +9 -0
- package/dist/src/utils/rules/react-native-rules.md +7 -0
- package/dist/src/utils/rules/react-rules.md +7 -0
- package/dist/src/utils/rules/svelte-rules.md +7 -0
- package/dist/src/utils/rules/universal.md +20 -0
- package/dist/src/utils/semver.d.ts +5 -0
- package/dist/src/utils/semver.js +25 -0
- package/dist/src/utils/semver.js.map +1 -0
- package/dist/src/utils/string.d.ts +1 -0
- package/dist/src/utils/string.js +9 -0
- package/dist/src/utils/string.js.map +1 -0
- package/dist/src/utils/types.d.ts +48 -0
- package/dist/src/utils/types.js +3 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/utils/urls.d.ts +4 -0
- package/dist/src/utils/urls.js +35 -0
- package/dist/src/utils/urls.js.map +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.d.ts +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js +24 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getNextjsPagesRouterDocs = exports.getNextjsAppRouterDocs = void 0;
|
|
4
|
+
const urls_1 = require("../utils/urls");
|
|
5
|
+
const getNextjsAppRouterDocs = ({ host, language, }) => {
|
|
6
|
+
return `
|
|
7
|
+
==============================
|
|
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
|
|
10
|
+
==============================
|
|
11
|
+
Changes:
|
|
12
|
+
- Create a PostHogProvider component that will be imported into the layout file.
|
|
13
|
+
|
|
14
|
+
Example:
|
|
15
|
+
--------------------------------------------------
|
|
16
|
+
"use client"
|
|
17
|
+
|
|
18
|
+
import posthog from "posthog-js"
|
|
19
|
+
import { PostHogProvider as PHProvider, usePostHog } from "posthog-js/react"
|
|
20
|
+
import { Suspense, useEffect } from "react"
|
|
21
|
+
import { usePathname, useSearchParams } from "next/navigation"
|
|
22
|
+
|
|
23
|
+
export function PostHogProvider({ children }: { children: React.ReactNode }) {
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
|
|
26
|
+
api_host: "/ingest",
|
|
27
|
+
ui_host: "${(0, urls_1.getUiHostFromHost)(host)}",
|
|
28
|
+
capture_pageview: false, // We capture pageviews manually
|
|
29
|
+
capture_pageleave: true, // Enable pageleave capture
|
|
30
|
+
debug: process.env.NODE_ENV === "development",
|
|
31
|
+
})
|
|
32
|
+
}, [])
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<PHProvider client={posthog}>
|
|
36
|
+
<SuspendedPostHogPageView />
|
|
37
|
+
{children}
|
|
38
|
+
</PHProvider>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
function PostHogPageView() {
|
|
44
|
+
const pathname = usePathname()
|
|
45
|
+
const searchParams = useSearchParams()
|
|
46
|
+
const posthog = usePostHog()
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (pathname && posthog) {
|
|
50
|
+
let url = window.origin + pathname
|
|
51
|
+
const search = searchParams.toString()
|
|
52
|
+
if (search) {
|
|
53
|
+
url += "?" + search
|
|
54
|
+
}
|
|
55
|
+
posthog.capture("$pageview", { "$current_url": url })
|
|
56
|
+
}
|
|
57
|
+
}, [pathname, searchParams, posthog])
|
|
58
|
+
|
|
59
|
+
return null
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function SuspendedPostHogPageView() {
|
|
63
|
+
return (
|
|
64
|
+
<Suspense fallback={null}>
|
|
65
|
+
<PostHogPageView />
|
|
66
|
+
</Suspense>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
--------------------------------------------------
|
|
70
|
+
|
|
71
|
+
==============================
|
|
72
|
+
FILE: layout.${language === 'typescript' ? 'tsx' : 'jsx'}
|
|
73
|
+
LOCATION: Wherever the root layout is
|
|
74
|
+
==============================
|
|
75
|
+
Changes:
|
|
76
|
+
- Import the PostHogProvider from the providers file and wrap the app in it.
|
|
77
|
+
|
|
78
|
+
Example:
|
|
79
|
+
--------------------------------------------------
|
|
80
|
+
// other imports
|
|
81
|
+
import { PostHogProvider } from "LOCATION_OF_POSTHOG_PROVIDER"
|
|
82
|
+
|
|
83
|
+
export default function RootLayout({ children }) {
|
|
84
|
+
return (
|
|
85
|
+
<html lang="en">
|
|
86
|
+
<body>
|
|
87
|
+
<PostHogProvider>
|
|
88
|
+
{/* other providers */}
|
|
89
|
+
{children}
|
|
90
|
+
{/* other providers */}
|
|
91
|
+
</PostHogProvider>
|
|
92
|
+
</body>
|
|
93
|
+
</html>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
--------------------------------------------------
|
|
97
|
+
|
|
98
|
+
==============================
|
|
99
|
+
FILE: posthog.${language === 'typescript' ? 'ts' : 'js'}
|
|
100
|
+
LOCATION: Wherever works best given the project structure
|
|
101
|
+
==============================
|
|
102
|
+
Changes:
|
|
103
|
+
- Initialize the PostHog Node.js client
|
|
104
|
+
|
|
105
|
+
Example:
|
|
106
|
+
--------------------------------------------------
|
|
107
|
+
import { PostHog } from "posthog-node"
|
|
108
|
+
|
|
109
|
+
export default function PostHogClient() {
|
|
110
|
+
const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
|
|
111
|
+
host: process.env.NEXT_PUBLIC_POSTHOG_HOST,
|
|
112
|
+
flushAt: 1,
|
|
113
|
+
flushInterval: 0,
|
|
114
|
+
})
|
|
115
|
+
return posthogClient
|
|
116
|
+
}
|
|
117
|
+
--------------------------------------------------
|
|
118
|
+
|
|
119
|
+
==============================
|
|
120
|
+
FILE: next.config.{js,ts,mjs,cjs}
|
|
121
|
+
LOCATION: Wherever the root next config is
|
|
122
|
+
==============================
|
|
123
|
+
Changes:
|
|
124
|
+
- Add rewrites to the Next.js config to support PostHog, if there are existing rewrites, add the PostHog rewrites to them.
|
|
125
|
+
- Add skipTrailingSlashRedirect to the Next.js config to support PostHog trailing slash API requests.
|
|
126
|
+
- 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'.
|
|
127
|
+
|
|
128
|
+
Example:
|
|
129
|
+
--------------------------------------------------
|
|
130
|
+
const nextConfig = {
|
|
131
|
+
// other config
|
|
132
|
+
async rewrites() {
|
|
133
|
+
return [
|
|
134
|
+
{
|
|
135
|
+
source: "/ingest/static/:path*",
|
|
136
|
+
destination: "${(0, urls_1.getAssetHostFromHost)(host)}/static/:path*",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
source: "/ingest/:path*",
|
|
140
|
+
destination: "${host}/:path*",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
source: "/ingest/decide",
|
|
144
|
+
destination: "${host}/decide",
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
},
|
|
148
|
+
// This is required to support PostHog trailing slash API requests
|
|
149
|
+
skipTrailingSlashRedirect: true,
|
|
150
|
+
}
|
|
151
|
+
module.exports = nextConfig
|
|
152
|
+
--------------------------------------------------`;
|
|
153
|
+
};
|
|
154
|
+
exports.getNextjsAppRouterDocs = getNextjsAppRouterDocs;
|
|
155
|
+
const getNextjsPagesRouterDocs = ({ host, language, }) => {
|
|
156
|
+
return `
|
|
157
|
+
==============================
|
|
158
|
+
FILE: _app.${language === 'typescript' ? 'tsx' : 'jsx'}
|
|
159
|
+
LOCATION: Wherever the root _app.${language === 'typescript' ? 'tsx' : 'jsx'} file is
|
|
160
|
+
==============================
|
|
161
|
+
Changes:
|
|
162
|
+
- Initialize PostHog in _app.js.
|
|
163
|
+
- Wrap the application in PostHogProvider.
|
|
164
|
+
- Manually capture $pageview events.
|
|
165
|
+
|
|
166
|
+
Example:
|
|
167
|
+
--------------------------------------------------
|
|
168
|
+
import { useEffect } from "react"
|
|
169
|
+
import { Router } from "next/router"
|
|
170
|
+
import posthog from "posthog-js"
|
|
171
|
+
import { PostHogProvider } from "posthog-js/react"
|
|
172
|
+
|
|
173
|
+
export default function App({ Component, pageProps }) {
|
|
174
|
+
useEffect(() => {
|
|
175
|
+
posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY, {
|
|
176
|
+
api_host: "/ingest",
|
|
177
|
+
ui_host: "${(0, urls_1.getUiHostFromHost)(host)}",
|
|
178
|
+
loaded: (posthog) => {
|
|
179
|
+
if (process.env.NODE_ENV === "development") posthog.debug()
|
|
180
|
+
},
|
|
181
|
+
debug: process.env.NODE_ENV === "development",
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
const handleRouteChange = () => posthog?.capture("$pageview")
|
|
185
|
+
Router.events.on("routeChangeComplete", handleRouteChange)
|
|
186
|
+
|
|
187
|
+
return () => {
|
|
188
|
+
Router.events.off("routeChangeComplete", handleRouteChange)
|
|
189
|
+
}
|
|
190
|
+
}, [])
|
|
191
|
+
|
|
192
|
+
return (
|
|
193
|
+
<PostHogProvider client={posthog}>
|
|
194
|
+
<Component {...pageProps} />
|
|
195
|
+
</PostHogProvider>
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
--------------------------------------------------
|
|
199
|
+
|
|
200
|
+
==============================
|
|
201
|
+
FILE: posthog.${language === 'typescript' ? 'ts' : 'js'}
|
|
202
|
+
LOCATION: Wherever works best given the project structure
|
|
203
|
+
==============================
|
|
204
|
+
Changes:
|
|
205
|
+
- Initialize the PostHog Node.js client
|
|
206
|
+
|
|
207
|
+
Example:
|
|
208
|
+
--------------------------------------------------
|
|
209
|
+
import { PostHog } from "posthog-node"
|
|
210
|
+
|
|
211
|
+
export default function PostHogClient() {
|
|
212
|
+
const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
|
|
213
|
+
host: process.env.NEXT_PUBLIC_POSTHOG_HOST,
|
|
214
|
+
flushAt: 1,
|
|
215
|
+
flushInterval: 0,
|
|
216
|
+
})
|
|
217
|
+
return posthogClient
|
|
218
|
+
}
|
|
219
|
+
--------------------------------------------------
|
|
220
|
+
|
|
221
|
+
==============================
|
|
222
|
+
FILE: next.config.{js,ts,mjs,cjs}
|
|
223
|
+
LOCATION: Wherever the root next config is
|
|
224
|
+
==============================
|
|
225
|
+
Changes:
|
|
226
|
+
- Add rewrites to the Next.js config to support PostHog, if there are existing rewrites, add the PostHog rewrites to them.
|
|
227
|
+
- Add skipTrailingSlashRedirect to the Next.js config to support PostHog trailing slash API requests.
|
|
228
|
+
- 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'.
|
|
229
|
+
|
|
230
|
+
Example:
|
|
231
|
+
--------------------------------------------------
|
|
232
|
+
const nextConfig = {
|
|
233
|
+
// other config
|
|
234
|
+
async rewrites() {
|
|
235
|
+
return [
|
|
236
|
+
{
|
|
237
|
+
source: "/ingest/static/:path*",
|
|
238
|
+
destination: "${(0, urls_1.getAssetHostFromHost)(host)}/static/:path*",
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
source: "/ingest/:path*",
|
|
242
|
+
destination: "${host}/:path*",
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
source: "/ingest/decide",
|
|
246
|
+
destination: "${host}/decide",
|
|
247
|
+
},
|
|
248
|
+
];
|
|
249
|
+
},
|
|
250
|
+
// This is required to support PostHog trailing slash API requests
|
|
251
|
+
skipTrailingSlashRedirect: true,
|
|
252
|
+
}
|
|
253
|
+
module.exports = nextConfig
|
|
254
|
+
--------------------------------------------------`;
|
|
255
|
+
};
|
|
256
|
+
exports.getNextjsPagesRouterDocs = getNextjsPagesRouterDocs;
|
|
257
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA6C1B,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2BxC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAqC/B,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AA5JW,QAAA,sBAAsB,0BA4JjC;AAEK,MAAM,wBAAwB,GAAG,CAAC,EACvC,IAAI,EACJ,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO;;aAEI,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;mCAElD,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;kBAkBgB,IAAA,wBAAiB,EAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;gBAwBzB,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAqC/B,IAAA,2BAAoB,EAAC,IAAI,CAAC;;;;wBAI1B,IAAI;;;;wBAIJ,IAAI;;;;;;;;mDAQuB,CAAC;AACpD,CAAC,CAAC;AA5GW,QAAA,wBAAwB,4BA4GnC","sourcesContent":["import { getAssetHostFromHost, getUiHostFromHost } from '../utils/urls';\n\nexport const getNextjsAppRouterDocs = ({\n host,\n language,\n}: {\n host: string;\n language: 'typescript' | 'javascript';\n}) => {\n return `\n==============================\nFILE: PostHogProvider.${\n language === 'typescript' ? 'tsx' : 'jsx'\n } (put it somewhere where client files are, like the components folder)\nLOCATION: Wherever other providers are, or the components folder\n==============================\nChanges:\n- Create a PostHogProvider component that will be imported into the layout file.\n\nExample:\n--------------------------------------------------\n\"use client\"\n\nimport posthog from \"posthog-js\"\nimport { PostHogProvider as PHProvider, usePostHog } from \"posthog-js/react\"\nimport { Suspense, useEffect } from \"react\"\nimport { usePathname, useSearchParams } from \"next/navigation\"\n\nexport function PostHogProvider({ children }: { children: React.ReactNode }) {\n useEffect(() => {\n posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n api_host: \"/ingest\",\n ui_host: \"${getUiHostFromHost(host)}\",\n capture_pageview: false, // We capture pageviews manually\n capture_pageleave: true, // Enable pageleave capture\n debug: process.env.NODE_ENV === \"development\",\n })\n }, [])\n\n return (\n <PHProvider client={posthog}>\n <SuspendedPostHogPageView />\n {children}\n </PHProvider>\n )\n}\n\n\nfunction PostHogPageView() {\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const posthog = usePostHog()\n\n useEffect(() => {\n if (pathname && posthog) {\n let url = window.origin + pathname\n const search = searchParams.toString()\n if (search) {\n url += \"?\" + search\n }\n posthog.capture(\"$pageview\", { \"$current_url\": url })\n }\n }, [pathname, searchParams, posthog])\n\n return null\n}\n\nfunction SuspendedPostHogPageView() {\n return (\n <Suspense fallback={null}>\n <PostHogPageView />\n </Suspense>\n )\n}\n--------------------------------------------------\n\n==============================\nFILE: layout.${language === 'typescript' ? 'tsx' : 'jsx'}\nLOCATION: Wherever the root layout is\n==============================\nChanges:\n- Import the PostHogProvider from the providers file and wrap the app in it.\n\nExample:\n--------------------------------------------------\n// other imports\nimport { PostHogProvider } from \"LOCATION_OF_POSTHOG_PROVIDER\"\n\nexport default function RootLayout({ children }) {\n return (\n <html lang=\"en\">\n <body>\n <PostHogProvider>\n {/* other providers */}\n {children}\n {/* other providers */}\n </PostHogProvider>\n </body>\n </html>\n )\n}\n--------------------------------------------------\n\n==============================\nFILE: posthog.${language === 'typescript' ? 'ts' : 'js'}\nLOCATION: Wherever works best given the project structure\n==============================\nChanges:\n- Initialize the PostHog Node.js client\n\nExample:\n--------------------------------------------------\nimport { PostHog } from \"posthog-node\"\n\nexport default function PostHogClient() {\n const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n host: 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- Manually capture $pageview events.\n\nExample:\n--------------------------------------------------\nimport { useEffect } from \"react\"\nimport { Router } from \"next/router\"\nimport posthog from \"posthog-js\"\nimport { PostHogProvider } from \"posthog-js/react\"\n\nexport default function App({ Component, pageProps }) {\n useEffect(() => {\n posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY, {\n api_host: \"/ingest\",\n ui_host: \"${getUiHostFromHost(host)}\",\n loaded: (posthog) => {\n if (process.env.NODE_ENV === \"development\") posthog.debug()\n },\n debug: process.env.NODE_ENV === \"development\",\n })\n\n const handleRouteChange = () => posthog?.capture(\"$pageview\")\n Router.events.on(\"routeChangeComplete\", handleRouteChange)\n\n return () => {\n Router.events.off(\"routeChangeComplete\", handleRouteChange)\n }\n }, [])\n\n return (\n <PostHogProvider client={posthog}>\n <Component {...pageProps} />\n </PostHogProvider>\n )\n}\n--------------------------------------------------\n\n==============================\nFILE: posthog.${language === 'typescript' ? 'ts' : 'js'}\nLOCATION: Wherever works best given the project structure\n==============================\nChanges:\n- Initialize the PostHog Node.js client\n\nExample:\n--------------------------------------------------\nimport { PostHog } from \"posthog-node\"\n\nexport default function PostHogClient() {\n const posthogClient = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {\n host: 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"]}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runNextjsWizard = runNextjsWizard;
|
|
7
|
+
/* eslint-disable max-lines */
|
|
8
|
+
const clack_utils_1 = require("../utils/clack-utils");
|
|
9
|
+
const package_json_1 = require("../utils/package-json");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
const clack_1 = __importDefault(require("../utils/clack"));
|
|
12
|
+
const constants_1 = require("../lib/constants");
|
|
13
|
+
const docs_1 = require("./docs");
|
|
14
|
+
const analytics_1 = require("../utils/analytics");
|
|
15
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
16
|
+
const clack_utils_2 = require("../utils/clack-utils");
|
|
17
|
+
const messages_1 = require("../lib/messages");
|
|
18
|
+
const steps_1 = require("../steps");
|
|
19
|
+
const upload_environment_variables_1 = require("../steps/upload-environment-variables");
|
|
20
|
+
async function runNextjsWizard(options) {
|
|
21
|
+
(0, clack_utils_1.printWelcome)({
|
|
22
|
+
wizardName: 'PostHog Next.js Wizard',
|
|
23
|
+
});
|
|
24
|
+
const aiConsent = await (0, clack_utils_1.askForAIConsent)(options);
|
|
25
|
+
if (!aiConsent) {
|
|
26
|
+
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);
|
|
27
|
+
}
|
|
28
|
+
const cloudRegion = options.cloudRegion ?? (await (0, clack_utils_2.askForCloudRegion)());
|
|
29
|
+
const typeScriptDetected = (0, clack_utils_1.isUsingTypeScript)(options);
|
|
30
|
+
await (0, clack_utils_1.confirmContinueIfNoOrDirtyGitRepo)(options);
|
|
31
|
+
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
|
|
32
|
+
await (0, clack_utils_1.ensurePackageIsInstalled)(packageJson, 'next', 'Next.js');
|
|
33
|
+
const nextVersion = (0, package_json_1.getPackageVersion)('next', packageJson);
|
|
34
|
+
analytics_1.analytics.setTag('nextjs-version', (0, utils_1.getNextJsVersionBucket)(nextVersion));
|
|
35
|
+
const { projectApiKey, wizardHash, host } = await (0, clack_utils_1.getOrAskForProjectData)({
|
|
36
|
+
...options,
|
|
37
|
+
cloudRegion,
|
|
38
|
+
});
|
|
39
|
+
const sdkAlreadyInstalled = (0, package_json_1.hasPackageInstalled)('posthog-js', packageJson);
|
|
40
|
+
analytics_1.analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);
|
|
41
|
+
const { packageManager: packageManagerFromInstallStep } = await (0, clack_utils_1.installPackage)({
|
|
42
|
+
packageName: 'posthog-js',
|
|
43
|
+
packageNameDisplayLabel: 'posthog-js',
|
|
44
|
+
alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],
|
|
45
|
+
forceInstall: options.forceInstall,
|
|
46
|
+
askBeforeUpdating: false,
|
|
47
|
+
installDir: options.installDir,
|
|
48
|
+
integration: constants_1.Integration.nextjs,
|
|
49
|
+
});
|
|
50
|
+
await (0, clack_utils_1.installPackage)({
|
|
51
|
+
packageName: 'posthog-node',
|
|
52
|
+
packageNameDisplayLabel: 'posthog-node',
|
|
53
|
+
packageManager: packageManagerFromInstallStep,
|
|
54
|
+
alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],
|
|
55
|
+
forceInstall: options.forceInstall,
|
|
56
|
+
askBeforeUpdating: false,
|
|
57
|
+
installDir: options.installDir,
|
|
58
|
+
integration: constants_1.Integration.nextjs,
|
|
59
|
+
});
|
|
60
|
+
const router = await (0, utils_1.getNextJsRouter)(options);
|
|
61
|
+
const relevantFiles = await (0, file_utils_1.getRelevantFilesForIntegration)({
|
|
62
|
+
installDir: options.installDir,
|
|
63
|
+
integration: constants_1.Integration.nextjs,
|
|
64
|
+
});
|
|
65
|
+
const installationDocumentation = getInstallationDocumentation({
|
|
66
|
+
router,
|
|
67
|
+
host,
|
|
68
|
+
language: typeScriptDetected ? 'typescript' : 'javascript',
|
|
69
|
+
});
|
|
70
|
+
clack_1.default.log.info(`Reviewing PostHog documentation for ${(0, utils_1.getNextJsRouterName)(router)}`);
|
|
71
|
+
const filesToChange = await (0, file_utils_1.getFilesToChange)({
|
|
72
|
+
integration: constants_1.Integration.nextjs,
|
|
73
|
+
relevantFiles,
|
|
74
|
+
documentation: installationDocumentation,
|
|
75
|
+
wizardHash,
|
|
76
|
+
cloudRegion,
|
|
77
|
+
});
|
|
78
|
+
await (0, file_utils_1.generateFileChangesForIntegration)({
|
|
79
|
+
integration: constants_1.Integration.nextjs,
|
|
80
|
+
filesToChange,
|
|
81
|
+
wizardHash,
|
|
82
|
+
installDir: options.installDir,
|
|
83
|
+
documentation: installationDocumentation,
|
|
84
|
+
cloudRegion,
|
|
85
|
+
});
|
|
86
|
+
const packageManagerForOutro = packageManagerFromInstallStep ?? (await (0, clack_utils_1.getPackageManager)(options));
|
|
87
|
+
await (0, steps_1.runPrettierStep)({
|
|
88
|
+
installDir: options.installDir,
|
|
89
|
+
integration: constants_1.Integration.nextjs,
|
|
90
|
+
});
|
|
91
|
+
const { relativeEnvFilePath, addedEnvVariables } = await (0, steps_1.addOrUpdateEnvironmentVariablesStep)({
|
|
92
|
+
variables: {
|
|
93
|
+
NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,
|
|
94
|
+
NEXT_PUBLIC_POSTHOG_HOST: host,
|
|
95
|
+
},
|
|
96
|
+
installDir: options.installDir,
|
|
97
|
+
integration: constants_1.Integration.nextjs,
|
|
98
|
+
});
|
|
99
|
+
const uploadedEnvVars = await (0, upload_environment_variables_1.uploadEnvironmentVariablesStep)({
|
|
100
|
+
NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,
|
|
101
|
+
NEXT_PUBLIC_POSTHOG_HOST: host,
|
|
102
|
+
}, {
|
|
103
|
+
integration: constants_1.Integration.nextjs,
|
|
104
|
+
options,
|
|
105
|
+
});
|
|
106
|
+
const addedEditorRules = await (0, steps_1.addEditorRulesStep)({
|
|
107
|
+
rulesName: 'next-rules.md',
|
|
108
|
+
installDir: options.installDir,
|
|
109
|
+
integration: constants_1.Integration.nextjs,
|
|
110
|
+
default: options.default,
|
|
111
|
+
});
|
|
112
|
+
const prUrl = await (0, steps_1.createPRStep)({
|
|
113
|
+
installDir: options.installDir,
|
|
114
|
+
integration: constants_1.Integration.nextjs,
|
|
115
|
+
addedEditorRules,
|
|
116
|
+
});
|
|
117
|
+
const outroMessage = (0, messages_1.getOutroMessage)({
|
|
118
|
+
options,
|
|
119
|
+
integration: constants_1.Integration.nextjs,
|
|
120
|
+
cloudRegion,
|
|
121
|
+
addedEditorRules,
|
|
122
|
+
packageManager: packageManagerForOutro,
|
|
123
|
+
envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,
|
|
124
|
+
prUrl,
|
|
125
|
+
uploadedEnvVars,
|
|
126
|
+
});
|
|
127
|
+
clack_1.default.outro(outroMessage);
|
|
128
|
+
await analytics_1.analytics.shutdown('success');
|
|
129
|
+
}
|
|
130
|
+
function getInstallationDocumentation({ router, host, language, }) {
|
|
131
|
+
if (router === utils_1.NextJsRouter.PAGES_ROUTER) {
|
|
132
|
+
return (0, docs_1.getNextjsPagesRouterDocs)({ host, language });
|
|
133
|
+
}
|
|
134
|
+
return (0, docs_1.getNextjsAppRouterDocs)({ host, language });
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=nextjs-wizard.js.map
|
|
@@ -0,0 +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 { getNextjsAppRouterDocs, getNextjsPagesRouterDocs } from './docs';\nimport { analytics } from '../utils/analytics';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\nimport { getOutroMessage } from '../lib/messages';\nimport {\n addEditorRulesStep,\n addOrUpdateEnvironmentVariablesStep,\n createPRStep,\n runPrettierStep,\n} from '../steps';\nimport { uploadEnvironmentVariablesStep } from '../steps/upload-environment-variables';\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Next.js Wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Next.js wizard requires AI to get setup right now. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { projectApiKey, wizardHash, host } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const sdkAlreadyInstalled = hasPackageInstalled('posthog-js', packageJson);\n\n analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const router = await getNextJsRouter(options);\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const installationDocumentation = getInstallationDocumentation({\n router,\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${getNextJsRouterName(router)}`,\n );\n\n const filesToChange = await getFilesToChange({\n integration: Integration.nextjs,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.nextjs,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const { relativeEnvFilePath, addedEnvVariables } =\n await addOrUpdateEnvironmentVariablesStep({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const uploadedEnvVars = await uploadEnvironmentVariablesStep(\n {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n NEXT_PUBLIC_POSTHOG_HOST: host,\n },\n {\n integration: Integration.nextjs,\n options,\n },\n );\n\n const addedEditorRules = await addEditorRulesStep({\n rulesName: 'next-rules.md',\n installDir: options.installDir,\n integration: Integration.nextjs,\n default: options.default,\n });\n\n const prUrl = await createPRStep({\n installDir: options.installDir,\n integration: Integration.nextjs,\n addedEditorRules,\n });\n\n const outroMessage = getOutroMessage({\n options,\n integration: Integration.nextjs,\n cloudRegion,\n addedEditorRules,\n packageManager: packageManagerForOutro,\n envFileChanged: addedEnvVariables ? relativeEnvFilePath : undefined,\n prUrl,\n uploadedEnvVars,\n });\n\n clack.outro(outroMessage);\n\n await analytics.shutdown('success');\n}\n\nfunction getInstallationDocumentation({\n router,\n host,\n language,\n}: {\n router: NextJsRouter;\n host: string;\n language: 'typescript' | 'javascript';\n}) {\n if (router === NextJsRouter.PAGES_ROUTER) {\n return getNextjsPagesRouterDocs({ host, language });\n }\n\n return getNextjsAppRouterDocs({ host, language });\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WizardOptions } from '../utils/types';
|
|
2
|
+
export declare function getNextJsVersionBucket(version: string | undefined): string;
|
|
3
|
+
export declare enum NextJsRouter {
|
|
4
|
+
APP_ROUTER = "app-router",
|
|
5
|
+
PAGES_ROUTER = "pages-router"
|
|
6
|
+
}
|
|
7
|
+
export declare const IGNORE_PATTERNS: string[];
|
|
8
|
+
export declare function getNextJsRouter({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter>;
|
|
9
|
+
export declare const getNextJsRouterName: (router: NextJsRouter) => "app router" | "pages router";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getNextJsRouterName = exports.IGNORE_PATTERNS = exports.NextJsRouter = void 0;
|
|
7
|
+
exports.getNextJsVersionBucket = getNextJsVersionBucket;
|
|
8
|
+
exports.getNextJsRouter = getNextJsRouter;
|
|
9
|
+
const semver_1 = require("semver");
|
|
10
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
11
|
+
const clack_utils_1 = require("../utils/clack-utils");
|
|
12
|
+
const clack_1 = __importDefault(require("../utils/clack"));
|
|
13
|
+
function getNextJsVersionBucket(version) {
|
|
14
|
+
if (!version) {
|
|
15
|
+
return 'none';
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const minVer = (0, semver_1.minVersion)(version);
|
|
19
|
+
if (!minVer) {
|
|
20
|
+
return 'invalid';
|
|
21
|
+
}
|
|
22
|
+
const majorVersion = (0, semver_1.major)(minVer);
|
|
23
|
+
if (majorVersion >= 11) {
|
|
24
|
+
return `${majorVersion}.x`;
|
|
25
|
+
}
|
|
26
|
+
return '<11.0.0';
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return 'unknown';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
var NextJsRouter;
|
|
33
|
+
(function (NextJsRouter) {
|
|
34
|
+
NextJsRouter["APP_ROUTER"] = "app-router";
|
|
35
|
+
NextJsRouter["PAGES_ROUTER"] = "pages-router";
|
|
36
|
+
})(NextJsRouter || (exports.NextJsRouter = NextJsRouter = {}));
|
|
37
|
+
exports.IGNORE_PATTERNS = [
|
|
38
|
+
'**/node_modules/**',
|
|
39
|
+
'**/dist/**',
|
|
40
|
+
'**/build/**',
|
|
41
|
+
'**/public/**',
|
|
42
|
+
];
|
|
43
|
+
async function getNextJsRouter({ installDir, }) {
|
|
44
|
+
const pagesMatches = await (0, fast_glob_1.default)('**/pages/_app.@(ts|tsx|js|jsx)', {
|
|
45
|
+
dot: true,
|
|
46
|
+
cwd: installDir,
|
|
47
|
+
ignore: exports.IGNORE_PATTERNS,
|
|
48
|
+
});
|
|
49
|
+
const hasPagesDir = pagesMatches.length > 0;
|
|
50
|
+
const appMatches = await (0, fast_glob_1.default)('**/app/**/layout.@(ts|tsx|js|jsx)', {
|
|
51
|
+
dot: true,
|
|
52
|
+
cwd: installDir,
|
|
53
|
+
ignore: exports.IGNORE_PATTERNS,
|
|
54
|
+
});
|
|
55
|
+
const hasAppDir = appMatches.length > 0;
|
|
56
|
+
if (hasPagesDir && !hasAppDir) {
|
|
57
|
+
clack_1.default.log.info(`Detected ${(0, exports.getNextJsRouterName)(NextJsRouter.PAGES_ROUTER)} 📃`);
|
|
58
|
+
return NextJsRouter.PAGES_ROUTER;
|
|
59
|
+
}
|
|
60
|
+
if (hasAppDir && !hasPagesDir) {
|
|
61
|
+
clack_1.default.log.info(`Detected ${(0, exports.getNextJsRouterName)(NextJsRouter.APP_ROUTER)} 📱`);
|
|
62
|
+
return NextJsRouter.APP_ROUTER;
|
|
63
|
+
}
|
|
64
|
+
const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
65
|
+
message: 'What router are you using?',
|
|
66
|
+
options: [
|
|
67
|
+
{
|
|
68
|
+
label: (0, exports.getNextJsRouterName)(NextJsRouter.APP_ROUTER),
|
|
69
|
+
value: NextJsRouter.APP_ROUTER,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
label: (0, exports.getNextJsRouterName)(NextJsRouter.PAGES_ROUTER),
|
|
73
|
+
value: NextJsRouter.PAGES_ROUTER,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
}));
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
const getNextJsRouterName = (router) => {
|
|
80
|
+
return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';
|
|
81
|
+
};
|
|
82
|
+
exports.getNextJsRouterName = getNextJsRouterName;
|
|
83
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nextjs/utils.ts"],"names":[],"mappings":";;;;;;AAMA,wDAkBC;AAaD,0CAkDC;AAvFD,mCAA2C;AAC3C,0DAA2B;AAC3B,sDAAwD;AACxD,2DAAmC;AAGnC,SAAgB,sBAAsB,CAAC,OAA2B;IAChE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,MAAM,CAAC,CAAC;QACnC,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;YACvB,OAAO,GAAG,YAAY,IAAI,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,yCAAyB,CAAA;IACzB,6CAA6B,CAAA;AAC/B,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB;AAEY,QAAA,eAAe,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,aAAa;IACb,cAAc;CACf,CAAC;AACK,KAAK,UAAU,eAAe,CAAC,EACpC,UAAU,GACwB;IAClC,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAE,EAAC,gCAAgC,EAAE;QAC9D,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,uBAAe;KACxB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,MAAM,IAAA,mBAAE,EAAC,mCAAmC,EAAE;QAC/D,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,uBAAe;KACxB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAExC,IAAI,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,YAAY,IAAA,2BAAmB,EAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAChE,CAAC;QACF,OAAO,YAAY,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,IAAI,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,YAAY,IAAA,2BAAmB,EAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAC9D,CAAC;QACF,OAAO,YAAY,CAAC,UAAU,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAiB,MAAM,IAAA,8BAAgB,EACjD,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,4BAA4B;QACrC,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAA,2BAAmB,EAAC,YAAY,CAAC,UAAU,CAAC;gBACnD,KAAK,EAAE,YAAY,CAAC,UAAU;aAC/B;YACD;gBACE,KAAK,EAAE,IAAA,2BAAmB,EAAC,YAAY,CAAC,YAAY,CAAC;gBACrD,KAAK,EAAE,YAAY,CAAC,YAAY;aACjC;SACF;KACF,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,MAAM,mBAAmB,GAAG,CAAC,MAAoB,EAAE,EAAE;IAC1D,OAAO,MAAM,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;AAC5E,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B","sourcesContent":["import { major, minVersion } from 'semver';\nimport fg from 'fast-glob';\nimport { abortIfCancelled } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport type { WizardOptions } from '../utils/types';\n\nexport function getNextJsVersionBucket(version: string | undefined) {\n if (!version) {\n return 'none';\n }\n\n try {\n const minVer = minVersion(version);\n if (!minVer) {\n return 'invalid';\n }\n const majorVersion = major(minVer);\n if (majorVersion >= 11) {\n return `${majorVersion}.x`;\n }\n return '<11.0.0';\n } catch {\n return 'unknown';\n }\n}\n\nexport enum NextJsRouter {\n APP_ROUTER = 'app-router',\n PAGES_ROUTER = 'pages-router',\n}\n\nexport const IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/public/**',\n];\nexport async function getNextJsRouter({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter> {\n const pagesMatches = await fg('**/pages/_app.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasPagesDir = pagesMatches.length > 0;\n\n const appMatches = await fg('**/app/**/layout.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasAppDir = appMatches.length > 0;\n\n if (hasPagesDir && !hasAppDir) {\n clack.log.info(\n `Detected ${getNextJsRouterName(NextJsRouter.PAGES_ROUTER)} 📃`,\n );\n return NextJsRouter.PAGES_ROUTER;\n }\n\n if (hasAppDir && !hasPagesDir) {\n clack.log.info(\n `Detected ${getNextJsRouterName(NextJsRouter.APP_ROUTER)} 📱`,\n );\n return NextJsRouter.APP_ROUTER;\n }\n\n const result: NextJsRouter = await abortIfCancelled(\n clack.select({\n message: 'What router are you using?',\n options: [\n {\n label: getNextJsRouterName(NextJsRouter.APP_ROUTER),\n value: NextJsRouter.APP_ROUTER,\n },\n {\n label: getNextJsRouterName(NextJsRouter.PAGES_ROUTER),\n value: NextJsRouter.PAGES_ROUTER,\n },\n ],\n }),\n );\n\n return result;\n}\n\nexport const getNextJsRouterName = (router: NextJsRouter) => {\n return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';\n};\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getReactDocumentation = void 0;
|
|
4
|
+
const getReactDocumentation = ({ language, envVarPrefix, }) => {
|
|
5
|
+
const apiKeyText = envVarPrefix === 'VITE_PUBLIC_'
|
|
6
|
+
? 'import.meta.env.VITE_PUBLIC_POSTHOG_KEY'
|
|
7
|
+
: `process.env.${envVarPrefix}POSTHOG_KEY`;
|
|
8
|
+
const hostText = envVarPrefix === 'VITE_PUBLIC_'
|
|
9
|
+
? 'import.meta.env.VITE_PUBLIC_POSTHOG_HOST'
|
|
10
|
+
: `process.env.${envVarPrefix}POSTHOG_HOST`;
|
|
11
|
+
return `
|
|
12
|
+
==============================
|
|
13
|
+
FILE: {index / App}.${language === 'typescript' ? 'tsx' : 'jsx'} (wherever the root of the app is)
|
|
14
|
+
LOCATION: Wherever the root of the app is
|
|
15
|
+
==============================
|
|
16
|
+
Changes:
|
|
17
|
+
- Add the PostHogProvider to the root of the app in the provider tree.
|
|
18
|
+
|
|
19
|
+
Example:
|
|
20
|
+
--------------------------------------------------
|
|
21
|
+
import React from 'react';
|
|
22
|
+
import ReactDOM from 'react-dom/client';
|
|
23
|
+
import App from './App';
|
|
24
|
+
|
|
25
|
+
import { PostHogProvider} from 'posthog-js/react'
|
|
26
|
+
|
|
27
|
+
const root = ReactDOM.createRoot(document.getElementById('root'));
|
|
28
|
+
|
|
29
|
+
root.render(
|
|
30
|
+
<React.StrictMode>
|
|
31
|
+
<PostHogProvider
|
|
32
|
+
apiKey={${apiKeyText}}
|
|
33
|
+
options={{
|
|
34
|
+
api_host: ${hostText},
|
|
35
|
+
debug: ${envVarPrefix === 'VITE_PUBLIC_'
|
|
36
|
+
? 'import.meta.env.MODE === "development"'
|
|
37
|
+
: 'process.env.NODE_ENV === "development"'},
|
|
38
|
+
}}
|
|
39
|
+
>
|
|
40
|
+
<App />
|
|
41
|
+
</PostHogProvider>
|
|
42
|
+
</React.StrictMode>
|
|
43
|
+
--------------------------------------------------`;
|
|
44
|
+
};
|
|
45
|
+
exports.getReactDocumentation = getReactDocumentation;
|
|
46
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +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;iBAElB,YAAY,KAAK,cAAc;QAC7B,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,wCACN;;;;;;mDAM2C,CAAC;AACpD,CAAC,CAAC;AAtDW,QAAA,qBAAqB,yBAsDhC","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 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"]}
|