@posthog/wizard 0.2.10 → 0.2.11
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/README.md +10 -10
- package/dist/src/lib/config.d.ts +21 -0
- package/dist/src/lib/config.js +49 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/constants.d.ts +2 -1
- package/dist/src/lib/constants.js +3 -0
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/prompts.d.ts +16 -0
- package/dist/src/{nextjs → lib}/prompts.js +18 -9
- package/dist/src/lib/prompts.js.map +1 -0
- package/dist/src/nextjs/docs.js +28 -16
- package/dist/src/nextjs/docs.js.map +1 -1
- package/dist/src/nextjs/nextjs-wizard.d.ts +0 -7
- package/dist/src/nextjs/nextjs-wizard.js +20 -304
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nextjs/utils.d.ts +1 -4
- package/dist/src/nextjs/utils.js +1 -32
- package/dist/src/nextjs/utils.js.map +1 -1
- package/dist/src/react/docs.d.ts +4 -0
- package/dist/src/react/docs.js +37 -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 +94 -0
- package/dist/src/react/react-wizard.js.map +1 -0
- package/dist/src/run.js +10 -4
- package/dist/src/run.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +2 -0
- package/dist/src/utils/clack-utils.js +45 -2
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/environment.d.ts +6 -0
- package/dist/src/utils/environment.js +100 -0
- package/dist/src/utils/environment.js.map +1 -1
- package/dist/src/utils/file-utils.d.ts +27 -0
- package/dist/src/utils/file-utils.js +139 -0
- package/dist/src/utils/file-utils.js.map +1 -1
- package/dist/src/utils/query.js +2 -2
- package/dist/src/utils/query.js.map +1 -1
- package/dist/src/utils/types.d.ts +5 -0
- package/dist/src/utils/types.js.map +1 -1
- 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/package.json +1 -1
- package/dist/src/nextjs/prompts.d.ts +0 -12
- package/dist/src/nextjs/prompts.js.map +0 -1
|
@@ -1,70 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/* eslint-disable max-lines */
|
|
3
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
-
if (k2 === undefined) k2 = k;
|
|
5
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
-
}
|
|
9
|
-
Object.defineProperty(o, k2, desc);
|
|
10
|
-
}) : (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === undefined) k2 = k;
|
|
12
|
-
o[k2] = m[k];
|
|
13
|
-
}));
|
|
14
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
-
}) : function(o, v) {
|
|
17
|
-
o["default"] = v;
|
|
18
|
-
});
|
|
19
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
-
var ownKeys = function(o) {
|
|
21
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
-
var ar = [];
|
|
23
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
-
return ar;
|
|
25
|
-
};
|
|
26
|
-
return ownKeys(o);
|
|
27
|
-
};
|
|
28
|
-
return function (mod) {
|
|
29
|
-
if (mod && mod.__esModule) return mod;
|
|
30
|
-
var result = {};
|
|
31
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
-
__setModuleDefault(result, mod);
|
|
33
|
-
return result;
|
|
34
|
-
};
|
|
35
|
-
})();
|
|
36
3
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
5
|
};
|
|
39
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
7
|
exports.runNextjsWizard = runNextjsWizard;
|
|
41
|
-
exports.detectNextJs = detectNextJs;
|
|
42
|
-
exports.addOrUpdateEnvironmentVariables = addOrUpdateEnvironmentVariables;
|
|
43
|
-
exports.getDotGitignore = getDotGitignore;
|
|
44
8
|
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
-
const fs = __importStar(require("fs"));
|
|
46
|
-
const zod_1 = require("zod");
|
|
47
9
|
const clack_utils_1 = require("../utils/clack-utils");
|
|
48
|
-
const telemetry_1 = require("../telemetry");
|
|
49
10
|
const package_json_1 = require("../utils/package-json");
|
|
50
11
|
const utils_1 = require("./utils");
|
|
51
|
-
const prompts_1 = require("./prompts");
|
|
52
|
-
const query_1 = require("../utils/query");
|
|
53
12
|
const clack_1 = __importDefault(require("../utils/clack"));
|
|
54
|
-
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
55
|
-
const path_1 = __importDefault(require("path"));
|
|
56
13
|
const constants_1 = require("../lib/constants");
|
|
57
14
|
const docs_1 = require("./docs");
|
|
58
15
|
const analytics_1 = require("../utils/analytics");
|
|
16
|
+
const environment_1 = require("../utils/environment");
|
|
17
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
18
|
+
const clack_utils_2 = require("../utils/clack-utils");
|
|
59
19
|
async function runNextjsWizard(options) {
|
|
60
20
|
(0, clack_utils_1.printWelcome)({
|
|
61
21
|
wizardName: 'PostHog Next.js Wizard',
|
|
62
22
|
});
|
|
63
|
-
const aiConsent = await askForAIConsent(options);
|
|
23
|
+
const aiConsent = await (0, clack_utils_1.askForAIConsent)(options);
|
|
64
24
|
if (!aiConsent) {
|
|
65
25
|
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);
|
|
66
26
|
}
|
|
67
|
-
const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());
|
|
27
|
+
const cloudRegion = options.cloudRegion ?? (await (0, clack_utils_2.askForCloudRegion)());
|
|
68
28
|
const typeScriptDetected = (0, clack_utils_1.isUsingTypeScript)(options);
|
|
69
29
|
await (0, clack_utils_1.confirmContinueIfNoOrDirtyGitRepo)(options);
|
|
70
30
|
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
|
|
@@ -97,11 +57,9 @@ async function runNextjsWizard(options) {
|
|
|
97
57
|
integration: constants_1.Integration.nextjs,
|
|
98
58
|
});
|
|
99
59
|
const router = await (0, utils_1.getNextJsRouter)(options);
|
|
100
|
-
const relevantFiles = await
|
|
101
|
-
|
|
102
|
-
action: 'detected relevant files',
|
|
60
|
+
const relevantFiles = await (0, file_utils_1.getRelevantFilesForIntegration)({
|
|
61
|
+
installDir: options.installDir,
|
|
103
62
|
integration: constants_1.Integration.nextjs,
|
|
104
|
-
number_of_files: relevantFiles.length,
|
|
105
63
|
});
|
|
106
64
|
const installationDocumentation = getInstallationDocumentation({
|
|
107
65
|
router,
|
|
@@ -109,68 +67,26 @@ async function runNextjsWizard(options) {
|
|
|
109
67
|
language: typeScriptDetected ? 'typescript' : 'javascript',
|
|
110
68
|
});
|
|
111
69
|
clack_1.default.log.info(`Reviewing PostHog documentation for ${(0, utils_1.getNextJsRouterName)(router)}`);
|
|
112
|
-
const filesToChange = await getFilesToChange({
|
|
70
|
+
const filesToChange = await (0, file_utils_1.getFilesToChange)({
|
|
71
|
+
integration: constants_1.Integration.nextjs,
|
|
113
72
|
relevantFiles,
|
|
114
|
-
installationDocumentation,
|
|
73
|
+
documentation: installationDocumentation,
|
|
115
74
|
wizardHash,
|
|
116
75
|
cloudRegion,
|
|
117
76
|
});
|
|
118
|
-
|
|
119
|
-
action: 'detected files to change',
|
|
77
|
+
await (0, file_utils_1.generateFileChangesForIntegration)({
|
|
120
78
|
integration: constants_1.Integration.nextjs,
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const changes = [];
|
|
124
|
-
for (const filePath of filesToChange) {
|
|
125
|
-
const fileChangeSpinner = clack_1.default.spinner();
|
|
126
|
-
analytics_1.analytics.capture('wizard interaction', {
|
|
127
|
-
action: 'processing file',
|
|
128
|
-
integration: constants_1.Integration.nextjs,
|
|
129
|
-
file: filePath,
|
|
130
|
-
});
|
|
131
|
-
try {
|
|
132
|
-
let oldContent = undefined;
|
|
133
|
-
try {
|
|
134
|
-
oldContent = await fs.promises.readFile(path_1.default.join(options.installDir, filePath), 'utf8');
|
|
135
|
-
}
|
|
136
|
-
catch (readError) {
|
|
137
|
-
if (readError.code !== 'ENOENT') {
|
|
138
|
-
await (0, clack_utils_1.abort)(`Error reading file ${filePath}`);
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
fileChangeSpinner.start(`${oldContent ? 'Updating' : 'Creating'} file ${filePath}`);
|
|
143
|
-
const unchangedFiles = filesToChange.filter((filePath) => !changes.some((change) => change.filePath === filePath));
|
|
144
|
-
const newContent = await generateFileChanges({
|
|
145
|
-
filePath,
|
|
146
|
-
content: oldContent,
|
|
147
|
-
changedFiles: changes,
|
|
148
|
-
unchangedFiles,
|
|
149
|
-
installationDocumentation,
|
|
150
|
-
wizardHash,
|
|
151
|
-
cloudRegion,
|
|
152
|
-
});
|
|
153
|
-
if (newContent !== oldContent) {
|
|
154
|
-
await updateFile({ filePath, oldContent, newContent }, options);
|
|
155
|
-
changes.push({ filePath, oldContent, newContent });
|
|
156
|
-
}
|
|
157
|
-
fileChangeSpinner.stop(`${oldContent ? 'Updated' : 'Created'} file ${filePath}`);
|
|
158
|
-
analytics_1.analytics.capture('wizard interaction', {
|
|
159
|
-
action: 'processed file',
|
|
160
|
-
integration: constants_1.Integration.nextjs,
|
|
161
|
-
file: filePath,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
await (0, clack_utils_1.abort)(`Error processing file ${filePath}`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
await addOrUpdateEnvironmentVariables({
|
|
169
|
-
projectApiKey,
|
|
79
|
+
filesToChange,
|
|
80
|
+
wizardHash,
|
|
170
81
|
installDir: options.installDir,
|
|
82
|
+
documentation: installationDocumentation,
|
|
83
|
+
cloudRegion,
|
|
171
84
|
});
|
|
172
|
-
|
|
173
|
-
|
|
85
|
+
await (0, environment_1.addOrUpdateEnvironmentVariables)({
|
|
86
|
+
variables: {
|
|
87
|
+
NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,
|
|
88
|
+
},
|
|
89
|
+
installDir: options.installDir,
|
|
174
90
|
integration: constants_1.Integration.nextjs,
|
|
175
91
|
});
|
|
176
92
|
const packageManagerForOutro = packageManagerFromInstallStep ?? (await (0, clack_utils_1.getPackageManager)(options));
|
|
@@ -186,210 +102,10 @@ ${chalk_1.default.green('Successfully installed PostHog!')} ${`\n\n${aiConsent
|
|
|
186
102
|
${chalk_1.default.dim(`If you encounter any issues, let us know here: ${constants_1.ISSUES_URL}`)}`);
|
|
187
103
|
await analytics_1.analytics.shutdown('success');
|
|
188
104
|
}
|
|
189
|
-
async function askForAIConsent(options) {
|
|
190
|
-
return await (0, telemetry_1.traceStep)('ask-for-ai-consent', async () => {
|
|
191
|
-
const aiConsent = options.default
|
|
192
|
-
? true
|
|
193
|
-
: await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
194
|
-
message: 'Use AI to setup PostHog automatically? ✨',
|
|
195
|
-
options: [
|
|
196
|
-
{
|
|
197
|
-
label: 'Yes',
|
|
198
|
-
value: true,
|
|
199
|
-
hint: 'We will use AI to help you setup PostHog quickly',
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
label: 'No',
|
|
203
|
-
value: false,
|
|
204
|
-
hint: 'Continue without AI assistance',
|
|
205
|
-
},
|
|
206
|
-
],
|
|
207
|
-
initialValue: true,
|
|
208
|
-
}));
|
|
209
|
-
return aiConsent;
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
async function askForCloudRegion() {
|
|
213
|
-
return await (0, telemetry_1.traceStep)('ask-for-cloud-region', async () => {
|
|
214
|
-
const cloudRegion = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
215
|
-
message: 'Select your cloud region',
|
|
216
|
-
options: [
|
|
217
|
-
{
|
|
218
|
-
label: 'US 🇺🇸',
|
|
219
|
-
value: 'us',
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
label: 'EU 🇪🇺',
|
|
223
|
-
value: 'eu',
|
|
224
|
-
},
|
|
225
|
-
],
|
|
226
|
-
}));
|
|
227
|
-
return cloudRegion;
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
async function getRelevantFilesForNextJs({ installDir, }) {
|
|
231
|
-
const filterPatterns = ['**/*.{tsx,ts,jsx,js,mjs,cjs}'];
|
|
232
|
-
const ignorePatterns = [
|
|
233
|
-
'node_modules',
|
|
234
|
-
'dist',
|
|
235
|
-
'build',
|
|
236
|
-
'public',
|
|
237
|
-
'static',
|
|
238
|
-
'next-env.d.*',
|
|
239
|
-
];
|
|
240
|
-
const filteredFiles = await (0, fast_glob_1.default)(filterPatterns, {
|
|
241
|
-
cwd: installDir,
|
|
242
|
-
ignore: ignorePatterns,
|
|
243
|
-
});
|
|
244
|
-
return filteredFiles;
|
|
245
|
-
}
|
|
246
|
-
async function detectNextJs(options) {
|
|
247
|
-
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
|
|
248
|
-
const hasNextInstalled = (0, package_json_1.hasPackageInstalled)('next', packageJson);
|
|
249
|
-
if (hasNextInstalled)
|
|
250
|
-
return constants_1.Integration.nextjs;
|
|
251
|
-
return undefined;
|
|
252
|
-
}
|
|
253
105
|
function getInstallationDocumentation({ router, host, language, }) {
|
|
254
106
|
if (router === utils_1.NextJsRouter.PAGES_ROUTER) {
|
|
255
107
|
return (0, docs_1.getNextjsPagesRouterDocs)({ host, language });
|
|
256
108
|
}
|
|
257
109
|
return (0, docs_1.getNextjsAppRouterDocs)({ host, language });
|
|
258
110
|
}
|
|
259
|
-
async function getFilesToChange({ relevantFiles, installationDocumentation, wizardHash, cloudRegion, }) {
|
|
260
|
-
const filterFilesSpinner = clack_1.default.spinner();
|
|
261
|
-
filterFilesSpinner.start('Selecting files to change...');
|
|
262
|
-
const filterFilesResponseSchmea = zod_1.z.object({
|
|
263
|
-
files: zod_1.z.array(zod_1.z.string()),
|
|
264
|
-
});
|
|
265
|
-
const filterFilesPrompt = await prompts_1.filterFilesPromptTemplate.format({
|
|
266
|
-
documentation: installationDocumentation,
|
|
267
|
-
file_list: relevantFiles.join('\n'),
|
|
268
|
-
});
|
|
269
|
-
const filterFilesResponse = await (0, query_1.query)({
|
|
270
|
-
message: filterFilesPrompt,
|
|
271
|
-
schema: filterFilesResponseSchmea,
|
|
272
|
-
wizardHash,
|
|
273
|
-
region: cloudRegion,
|
|
274
|
-
});
|
|
275
|
-
const filesToChange = filterFilesResponse.files;
|
|
276
|
-
filterFilesSpinner.stop(`Found ${filesToChange.length} files to change`);
|
|
277
|
-
return filesToChange;
|
|
278
|
-
}
|
|
279
|
-
async function generateFileChanges({ filePath, content, changedFiles, unchangedFiles, installationDocumentation, wizardHash, cloudRegion, }) {
|
|
280
|
-
const generateFileChangesPrompt = await prompts_1.generateFileChangesPromptTemplate.format({
|
|
281
|
-
file_path: filePath,
|
|
282
|
-
file_content: content,
|
|
283
|
-
changed_files: changedFiles
|
|
284
|
-
.map((change) => `${change.filePath}\n${change.oldContent}`)
|
|
285
|
-
.join('\n'),
|
|
286
|
-
unchanged_files: unchangedFiles,
|
|
287
|
-
documentation: installationDocumentation,
|
|
288
|
-
});
|
|
289
|
-
const response = await (0, query_1.query)({
|
|
290
|
-
message: generateFileChangesPrompt,
|
|
291
|
-
schema: zod_1.z.object({
|
|
292
|
-
newContent: zod_1.z.string(),
|
|
293
|
-
}),
|
|
294
|
-
wizardHash: wizardHash,
|
|
295
|
-
region: cloudRegion,
|
|
296
|
-
});
|
|
297
|
-
return response.newContent;
|
|
298
|
-
}
|
|
299
|
-
async function updateFile(change, { installDir }) {
|
|
300
|
-
const dir = path_1.default.dirname(path_1.default.join(installDir, change.filePath));
|
|
301
|
-
await fs.promises.mkdir(dir, { recursive: true });
|
|
302
|
-
await fs.promises.writeFile(path_1.default.join(installDir, change.filePath), change.newContent);
|
|
303
|
-
}
|
|
304
|
-
async function addOrUpdateEnvironmentVariables({ projectApiKey, installDir, }) {
|
|
305
|
-
const envVarContent = `# Posthog\nNEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`;
|
|
306
|
-
const dotEnvLocalFilePath = path_1.default.join(installDir, '.env.local');
|
|
307
|
-
const dotEnvFilePath = path_1.default.join(installDir, '.env');
|
|
308
|
-
const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath)
|
|
309
|
-
? dotEnvLocalFilePath
|
|
310
|
-
: dotEnvFilePath;
|
|
311
|
-
const dotEnvFileExists = fs.existsSync(targetEnvFilePath);
|
|
312
|
-
const relativeEnvFilePath = path_1.default.relative(installDir, targetEnvFilePath);
|
|
313
|
-
if (dotEnvFileExists) {
|
|
314
|
-
const dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');
|
|
315
|
-
const hasProjectApiKey = dotEnvFileContent.includes(`NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`);
|
|
316
|
-
if (hasProjectApiKey) {
|
|
317
|
-
clack_1.default.log.success(`${chalk_1.default.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
try {
|
|
321
|
-
let newContent = dotEnvFileContent;
|
|
322
|
-
if (dotEnvFileContent.match(/^NEXT_PUBLIC_POSTHOG_KEY=.*$/m)) {
|
|
323
|
-
newContent = dotEnvFileContent.replace(/^NEXT_PUBLIC_POSTHOG_KEY=.*$/m, `NEXT_PUBLIC_POSTHOG_KEY=${projectApiKey}`);
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
if (!dotEnvFileContent.endsWith('\n')) {
|
|
327
|
-
newContent += '\n';
|
|
328
|
-
}
|
|
329
|
-
newContent += envVarContent;
|
|
330
|
-
}
|
|
331
|
-
await fs.promises.writeFile(targetEnvFilePath, newContent, {
|
|
332
|
-
encoding: 'utf8',
|
|
333
|
-
flag: 'w',
|
|
334
|
-
});
|
|
335
|
-
clack_1.default.log.success(`Updated environment variables in ${chalk_1.default.bold.cyan(relativeEnvFilePath)}`);
|
|
336
|
-
}
|
|
337
|
-
catch (error) {
|
|
338
|
-
clack_1.default.log.warning(`Failed to update environment variables in ${chalk_1.default.bold.cyan(relativeEnvFilePath)}. Please update them manually. Error: ${error.message}`);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
else {
|
|
343
|
-
try {
|
|
344
|
-
await fs.promises.writeFile(targetEnvFilePath, envVarContent, {
|
|
345
|
-
encoding: 'utf8',
|
|
346
|
-
flag: 'w',
|
|
347
|
-
});
|
|
348
|
-
clack_1.default.log.success(`Created ${chalk_1.default.bold.cyan(relativeEnvFilePath)} with environment variables for PostHog.`);
|
|
349
|
-
}
|
|
350
|
-
catch (error) {
|
|
351
|
-
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}`);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
const gitignorePath = getDotGitignore({ installDir });
|
|
355
|
-
if (gitignorePath) {
|
|
356
|
-
const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');
|
|
357
|
-
const envFiles = ['.env', '.env.local'];
|
|
358
|
-
const missingEnvFiles = envFiles;
|
|
359
|
-
if (missingEnvFiles.length > 0) {
|
|
360
|
-
try {
|
|
361
|
-
const newGitignoreContent = `${gitignoreContent}\n${missingEnvFiles.join('\n')}`;
|
|
362
|
-
await fs.promises.writeFile(gitignorePath, newGitignoreContent, {
|
|
363
|
-
encoding: 'utf8',
|
|
364
|
-
flag: 'w',
|
|
365
|
-
});
|
|
366
|
-
clack_1.default.log.success(`Updated ${chalk_1.default.bold.cyan('.gitignore')} to include environment files.`);
|
|
367
|
-
}
|
|
368
|
-
catch (error) {
|
|
369
|
-
clack_1.default.log.warning(`Failed to update ${chalk_1.default.bold.cyan('.gitignore')} to include environment files. Error: ${error.message}`);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
else {
|
|
374
|
-
try {
|
|
375
|
-
const newGitignoreContent = `.env\n.env.local\n`;
|
|
376
|
-
await fs.promises.writeFile(path_1.default.join(installDir, '.gitignore'), newGitignoreContent, {
|
|
377
|
-
encoding: 'utf8',
|
|
378
|
-
flag: 'w',
|
|
379
|
-
});
|
|
380
|
-
clack_1.default.log.success(`Created ${chalk_1.default.bold.cyan('.gitignore')} with environment files.`);
|
|
381
|
-
}
|
|
382
|
-
catch (error) {
|
|
383
|
-
clack_1.default.log.warning(`Failed to create ${chalk_1.default.bold.cyan('.gitignore')} with environment files. Error: ${error.message}`);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
function getDotGitignore({ installDir, }) {
|
|
388
|
-
const gitignorePath = path_1.default.join(installDir, '.gitignore');
|
|
389
|
-
const gitignoreExists = fs.existsSync(gitignorePath);
|
|
390
|
-
if (gitignoreExists) {
|
|
391
|
-
return gitignorePath;
|
|
392
|
-
}
|
|
393
|
-
return undefined;
|
|
394
|
-
}
|
|
395
111
|
//# sourceMappingURL=nextjs-wizard.js.map
|
|
@@ -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 { CloudRegion, 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 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 getRelevantFilesForNextJs(options);\n\n analytics.capture('wizard interaction', {\n action: 'detected relevant files',\n integration: Integration.nextjs,\n number_of_files: relevantFiles.length,\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 relevantFiles,\n installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n analytics.capture('wizard interaction', {\n action: 'detected files to change',\n integration: Integration.nextjs,\n files: filesToChange,\n });\n\n const changes: FileChange[] = [];\n\n for (const filePath of filesToChange) {\n const fileChangeSpinner = clack.spinner();\n\n analytics.capture('wizard interaction', {\n action: 'processing file',\n integration: Integration.nextjs,\n file: filePath,\n });\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 cloudRegion,\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\n analytics.capture('wizard interaction', {\n action: 'processed file',\n integration: Integration.nextjs,\n 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 analytics.capture('wizard interaction', {\n action: 'added environment variables',\n integration: Integration.nextjs,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierIfInstalled({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n clack.outro(`\n${chalk.green('Successfully installed PostHog!')} ${`\\n\\n${\n aiConsent\n ? `Note: This uses experimental AI to setup your project. It might have got it wrong, pleaes check!\\n`\n : ``\n }You should validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )})`}\n\n${chalk.dim(`If you encounter any issues, let us know here: ${ISSUES_URL}`)}`);\n\n await analytics.shutdown('success');\n}\n\nasync function askForAIConsent(options: Pick<WizardOptions, 'default'>) {\n return await traceStep('ask-for-ai-consent', async () => {\n const aiConsent = options.default\n ? true\n : 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 askForCloudRegion(): Promise<CloudRegion> {\n return await traceStep('ask-for-cloud-region', async () => {\n const cloudRegion: CloudRegion = await abortIfCancelled(\n clack.select({\n message: 'Select your cloud region',\n options: [\n {\n label: 'US 🇺🇸',\n value: 'us',\n },\n {\n label: 'EU 🇪🇺',\n value: 'eu',\n },\n ],\n }),\n );\n\n return cloudRegion;\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 cloudRegion,\n}: {\n relevantFiles: string[];\n installationDocumentation: string;\n wizardHash: string;\n cloudRegion: CloudRegion;\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 region: cloudRegion,\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 cloudRegion,\n}: {\n filePath: string;\n content: string | undefined;\n changedFiles: FileChange[];\n unchangedFiles: string[];\n installationDocumentation: string;\n wizardHash: string;\n cloudRegion: CloudRegion;\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 region: cloudRegion,\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
|
+
{"version":3,"file":"nextjs-wizard.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n\nimport chalk from 'chalk';\nimport {\n abort,\n askForAIConsent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n getOrAskForProjectData,\n getPackageDotJson,\n getPackageManager,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n runPrettierIfInstalled,\n} from '../utils/clack-utils';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport {\n getNextJsRouter,\n getNextJsRouterName,\n getNextJsVersionBucket,\n NextJsRouter,\n} from './utils';\nimport clack from '../utils/clack';\nimport { Integration, ISSUES_URL } from '../lib/constants';\nimport { getNextjsAppRouterDocs, getNextjsPagesRouterDocs } from './docs';\nimport { analytics } from '../utils/analytics';\nimport { addOrUpdateEnvironmentVariables } from '../utils/environment';\nimport {\n generateFileChangesForIntegration,\n getFilesToChange,\n getRelevantFilesForIntegration,\n} from '../utils/file-utils';\nimport type { WizardOptions } from '../utils/types';\nimport { askForCloudRegion } from '../utils/clack-utils';\n\nexport async function runNextjsWizard(options: WizardOptions): Promise<void> {\n printWelcome({\n wizardName: 'PostHog Next.js Wizard',\n });\n\n const aiConsent = await askForAIConsent(options);\n\n if (!aiConsent) {\n await abort(\n 'The Next.js wizard requires AI to get setup right now. Please view the docs to setup Next.js manually instead: https://posthog.com/docs/libraries/next-js',\n 0,\n );\n }\n\n const cloudRegion = options.cloudRegion ?? (await askForCloudRegion());\n\n const typeScriptDetected = isUsingTypeScript(options);\n\n await confirmContinueIfNoOrDirtyGitRepo(options);\n\n const packageJson = await getPackageDotJson(options);\n\n await ensurePackageIsInstalled(packageJson, 'next', 'Next.js');\n\n const nextVersion = getPackageVersion('next', packageJson);\n\n analytics.setTag('nextjs-version', getNextJsVersionBucket(nextVersion));\n\n const { projectApiKey, wizardHash, host } = await getOrAskForProjectData({\n ...options,\n cloudRegion,\n });\n\n const sdkAlreadyInstalled = hasPackageInstalled('posthog-js', packageJson);\n\n analytics.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n const { packageManager: packageManagerFromInstallStep } =\n await installPackage({\n packageName: 'posthog-js',\n packageNameDisplayLabel: 'posthog-js',\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-js'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n await installPackage({\n packageName: 'posthog-node',\n packageNameDisplayLabel: 'posthog-node',\n packageManager: packageManagerFromInstallStep,\n alreadyInstalled: !!packageJson?.dependencies?.['posthog-node'],\n forceInstall: options.forceInstall,\n askBeforeUpdating: false,\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const router = await getNextJsRouter(options);\n\n const relevantFiles = await getRelevantFilesForIntegration({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const installationDocumentation = getInstallationDocumentation({\n router,\n host,\n language: typeScriptDetected ? 'typescript' : 'javascript',\n });\n\n clack.log.info(\n `Reviewing PostHog documentation for ${getNextJsRouterName(router)}`,\n );\n\n const filesToChange = await getFilesToChange({\n integration: Integration.nextjs,\n relevantFiles,\n documentation: installationDocumentation,\n wizardHash,\n cloudRegion,\n });\n\n await generateFileChangesForIntegration({\n integration: Integration.nextjs,\n filesToChange,\n wizardHash,\n installDir: options.installDir,\n documentation: installationDocumentation,\n cloudRegion,\n });\n\n await addOrUpdateEnvironmentVariables({\n variables: {\n NEXT_PUBLIC_POSTHOG_KEY: projectApiKey,\n },\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n const packageManagerForOutro =\n packageManagerFromInstallStep ?? (await getPackageManager(options));\n\n await runPrettierIfInstalled({\n installDir: options.installDir,\n integration: Integration.nextjs,\n });\n\n clack.outro(`\n${chalk.green('Successfully installed PostHog!')} ${`\\n\\n${\n aiConsent\n ? `Note: This uses experimental AI to setup your project. It might have got it wrong, pleaes check!\\n`\n : ``\n }You should validate your setup by (re)starting your dev environment (e.g. ${chalk.cyan(\n `${packageManagerForOutro.runScriptCommand} dev`,\n )})`}\n\n${chalk.dim(`If you encounter any issues, let us know here: ${ISSUES_URL}`)}`);\n\n await analytics.shutdown('success');\n}\n\nfunction getInstallationDocumentation({\n router,\n host,\n language,\n}: {\n router: NextJsRouter;\n host: string;\n language: 'typescript' | 'javascript';\n}) {\n if (router === NextJsRouter.PAGES_ROUTER) {\n return getNextjsPagesRouterDocs({ host, language });\n }\n\n return getNextjsAppRouterDocs({ host, language });\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { WizardOptions } from '../utils/types';
|
|
2
2
|
export declare function getNextJsVersionBucket(version: string | undefined): string;
|
|
3
3
|
export declare enum NextJsRouter {
|
|
4
4
|
APP_ROUTER = "app-router",
|
|
@@ -7,6 +7,3 @@ export declare enum NextJsRouter {
|
|
|
7
7
|
export declare const IGNORE_PATTERNS: string[];
|
|
8
8
|
export declare function getNextJsRouter({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter>;
|
|
9
9
|
export declare const getNextJsRouterName: (router: NextJsRouter) => "app router" | "pages router";
|
|
10
|
-
export declare const getAssetHostFromHost: (host: string) => string;
|
|
11
|
-
export declare const getUiHostFromHost: (host: string) => string;
|
|
12
|
-
export declare const getCloudUrlFromRegion: (region: CloudRegion) => "http://localhost:8010" | "https://us.posthog.com" | "https://eu.posthog.com";
|
package/dist/src/nextjs/utils.js
CHANGED
|
@@ -3,14 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.getNextJsRouterName = exports.IGNORE_PATTERNS = exports.NextJsRouter = void 0;
|
|
7
7
|
exports.getNextJsVersionBucket = getNextJsVersionBucket;
|
|
8
8
|
exports.getNextJsRouter = getNextJsRouter;
|
|
9
9
|
const semver_1 = require("semver");
|
|
10
10
|
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
11
11
|
const clack_utils_1 = require("../utils/clack-utils");
|
|
12
12
|
const clack_1 = __importDefault(require("../utils/clack"));
|
|
13
|
-
const constants_1 = require("../lib/constants");
|
|
14
13
|
function getNextJsVersionBucket(version) {
|
|
15
14
|
if (!version) {
|
|
16
15
|
return 'none';
|
|
@@ -81,34 +80,4 @@ const getNextJsRouterName = (router) => {
|
|
|
81
80
|
return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';
|
|
82
81
|
};
|
|
83
82
|
exports.getNextJsRouterName = getNextJsRouterName;
|
|
84
|
-
const getAssetHostFromHost = (host) => {
|
|
85
|
-
if (host.includes('us.i.posthog.com')) {
|
|
86
|
-
return 'https://us-assets.i.posthog.com';
|
|
87
|
-
}
|
|
88
|
-
if (host.includes('eu.i.posthog.com')) {
|
|
89
|
-
return 'https://eu-assets.i.posthog.com';
|
|
90
|
-
}
|
|
91
|
-
return host;
|
|
92
|
-
};
|
|
93
|
-
exports.getAssetHostFromHost = getAssetHostFromHost;
|
|
94
|
-
const getUiHostFromHost = (host) => {
|
|
95
|
-
if (host.includes('us.i.posthog.com')) {
|
|
96
|
-
return 'https://us.posthog.com';
|
|
97
|
-
}
|
|
98
|
-
if (host.includes('eu.i.posthog.com')) {
|
|
99
|
-
return 'https://eu.posthog.com';
|
|
100
|
-
}
|
|
101
|
-
return host;
|
|
102
|
-
};
|
|
103
|
-
exports.getUiHostFromHost = getUiHostFromHost;
|
|
104
|
-
const getCloudUrlFromRegion = (region) => {
|
|
105
|
-
if (constants_1.IS_DEV) {
|
|
106
|
-
return 'http://localhost:8010';
|
|
107
|
-
}
|
|
108
|
-
if (region === 'us') {
|
|
109
|
-
return 'https://us.posthog.com';
|
|
110
|
-
}
|
|
111
|
-
return 'https://eu.posthog.com';
|
|
112
|
-
};
|
|
113
|
-
exports.getCloudUrlFromRegion = getCloudUrlFromRegion;
|
|
114
83
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nextjs/utils.ts"],"names":[],"mappings":";;;;;;
|
|
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,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getReactDocumentation = void 0;
|
|
4
|
+
const getReactDocumentation = ({ host, language, }) => {
|
|
5
|
+
return `
|
|
6
|
+
==============================
|
|
7
|
+
FILE: {index / App}.${language === 'typescript' ? 'tsx' : 'jsx'} (wherever the root of the app is)
|
|
8
|
+
LOCATION: Wherever the root of the app is
|
|
9
|
+
==============================
|
|
10
|
+
Changes:
|
|
11
|
+
- Add the PostHogProvider to the root of the app in the provider tree.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
--------------------------------------------------
|
|
15
|
+
import React from 'react';
|
|
16
|
+
import ReactDOM from 'react-dom/client';
|
|
17
|
+
import App from './App';
|
|
18
|
+
|
|
19
|
+
import { PostHogProvider} from 'posthog-js/react'
|
|
20
|
+
|
|
21
|
+
const root = ReactDOM.createRoot(document.getElementById('root'));
|
|
22
|
+
|
|
23
|
+
root.render(
|
|
24
|
+
<React.StrictMode>
|
|
25
|
+
<PostHogProvider
|
|
26
|
+
apiKey={process.env.REACT_APP_PUBLIC_POSTHOG_KEY}
|
|
27
|
+
options={{
|
|
28
|
+
api_host: ${host},
|
|
29
|
+
}}
|
|
30
|
+
>
|
|
31
|
+
<App />
|
|
32
|
+
</PostHogProvider>
|
|
33
|
+
</React.StrictMode>
|
|
34
|
+
--------------------------------------------------`;
|
|
35
|
+
};
|
|
36
|
+
exports.getReactDocumentation = getReactDocumentation;
|
|
37
|
+
//# 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,IAAI,EACJ,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO;;sBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;;;cAqBY,IAAI;;;;;;mDAMiC,CAAC;AACpD,CAAC,CAAC;AAvCW,QAAA,qBAAqB,yBAuChC","sourcesContent":["export const getReactDocumentation = ({\n host,\n language,\n}: {\n host: string;\n language: 'typescript' | 'javascript';\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={process.env.REACT_APP_PUBLIC_POSTHOG_KEY}\n options={{\n api_host: ${host},\n}}\n >\n <App />\n </PostHogProvider>\n </React.StrictMode>\n--------------------------------------------------`;\n};\n"]}
|