@posthog/wizard 0.7.0 → 0.7.1
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 +16 -0
- package/dist/src/lib/messages.js +52 -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 +127 -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 +106 -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 +123 -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 +90 -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/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 +114 -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 +1 -1
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.PR_CONFIG = void 0;
|
|
40
|
+
exports.execGitCommand = execGitCommand;
|
|
41
|
+
exports.getCurrentBranch = getCurrentBranch;
|
|
42
|
+
exports.checkGitHubAuth = checkGitHubAuth;
|
|
43
|
+
exports.checkBranchExists = checkBranchExists;
|
|
44
|
+
exports.createBranch = createBranch;
|
|
45
|
+
exports.stageChanges = stageChanges;
|
|
46
|
+
exports.checkForEnvFiles = checkForEnvFiles;
|
|
47
|
+
exports.commitChanges = commitChanges;
|
|
48
|
+
exports.pushBranch = pushBranch;
|
|
49
|
+
exports.createGitHubPR = createGitHubPR;
|
|
50
|
+
exports.createPRStep = createPRStep;
|
|
51
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
52
|
+
const constants_1 = require("../lib/constants");
|
|
53
|
+
const telemetry_1 = require("../telemetry");
|
|
54
|
+
const analytics_1 = require("../utils/analytics");
|
|
55
|
+
const clack_1 = __importDefault(require("../utils/clack"));
|
|
56
|
+
const clack_utils_1 = require("../utils/clack-utils");
|
|
57
|
+
const childProcess = __importStar(require("node:child_process"));
|
|
58
|
+
const messages_1 = require("../lib/messages");
|
|
59
|
+
exports.PR_CONFIG = {
|
|
60
|
+
defaultBranchName: 'posthog-integration',
|
|
61
|
+
defaultTitle: 'feat: add PostHog integration',
|
|
62
|
+
};
|
|
63
|
+
async function execGitCommand(command, cwd) {
|
|
64
|
+
return new Promise((resolve) => {
|
|
65
|
+
childProcess.exec(command, { cwd }, (err, stdout, stderr) => {
|
|
66
|
+
if (err) {
|
|
67
|
+
resolve({ success: false, error: stderr || err.message });
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
resolve({ success: true, data: stdout.trim() });
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function getCurrentBranch(installDir) {
|
|
76
|
+
return execGitCommand('git rev-parse --abbrev-ref HEAD', installDir);
|
|
77
|
+
}
|
|
78
|
+
async function checkGitHubAuth(installDir) {
|
|
79
|
+
return execGitCommand('gh auth status', installDir);
|
|
80
|
+
}
|
|
81
|
+
async function checkBranchExists(branch, installDir) {
|
|
82
|
+
const result = await execGitCommand(`git rev-parse --verify ${branch}`, installDir);
|
|
83
|
+
// If the command fails, the branch does not exist
|
|
84
|
+
if (!result.success) {
|
|
85
|
+
return { success: true, data: true };
|
|
86
|
+
}
|
|
87
|
+
// If the command succeeds, the branch exists
|
|
88
|
+
return { success: false, data: false };
|
|
89
|
+
}
|
|
90
|
+
async function createBranch(branch, installDir) {
|
|
91
|
+
return execGitCommand(`git checkout -b ${branch}`, installDir);
|
|
92
|
+
}
|
|
93
|
+
async function stageChanges(installDir) {
|
|
94
|
+
return execGitCommand('git add .', installDir);
|
|
95
|
+
}
|
|
96
|
+
async function checkForEnvFiles(installDir) {
|
|
97
|
+
const result = await execGitCommand('git diff --cached --name-only', installDir);
|
|
98
|
+
if (!result.success) {
|
|
99
|
+
return { success: false, error: result.error };
|
|
100
|
+
}
|
|
101
|
+
const files = result.data
|
|
102
|
+
? result.data
|
|
103
|
+
.split('\n')
|
|
104
|
+
.map((f) => f.trim())
|
|
105
|
+
.filter(Boolean)
|
|
106
|
+
: [];
|
|
107
|
+
const hasEnv = files.some((f) => f.startsWith('.env'));
|
|
108
|
+
return { success: true, data: hasEnv };
|
|
109
|
+
}
|
|
110
|
+
async function commitChanges(message, installDir) {
|
|
111
|
+
return execGitCommand(`git commit -m "${message}"`, installDir);
|
|
112
|
+
}
|
|
113
|
+
async function pushBranch(branch, installDir) {
|
|
114
|
+
return execGitCommand(`git push -u origin ${branch}`, installDir);
|
|
115
|
+
}
|
|
116
|
+
async function createGitHubPR(baseBranch, newBranch, title, body, installDir) {
|
|
117
|
+
return execGitCommand(`gh pr create --base ${baseBranch} --head ${newBranch} --title "${title}" --body "${body}"`, installDir);
|
|
118
|
+
}
|
|
119
|
+
async function createPRStep({ installDir, integration, addedEditorRules, }) {
|
|
120
|
+
return (0, telemetry_1.traceStep)('create-pr', async () => {
|
|
121
|
+
if (!(0, clack_utils_1.isInGitRepo)()) {
|
|
122
|
+
clack_1.default.log.warn('Not in a git repository. Cannot create a pull request.');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Get current branch
|
|
126
|
+
const currentBranchResult = await getCurrentBranch(installDir);
|
|
127
|
+
if (!currentBranchResult.success || !currentBranchResult.data) {
|
|
128
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
129
|
+
action: 'skipping pr creation',
|
|
130
|
+
reason: 'failed to get current branch',
|
|
131
|
+
error: currentBranchResult.error,
|
|
132
|
+
integration,
|
|
133
|
+
});
|
|
134
|
+
if (constants_1.DEBUG) {
|
|
135
|
+
clack_1.default.log.error(currentBranchResult.error ?? 'Failed to get current branch');
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const baseBranch = currentBranchResult.data;
|
|
140
|
+
if (!['main', 'master'].includes(baseBranch)) {
|
|
141
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
142
|
+
action: 'skipping pr creation',
|
|
143
|
+
reason: 'not on main or master',
|
|
144
|
+
base_branch: baseBranch,
|
|
145
|
+
integration,
|
|
146
|
+
});
|
|
147
|
+
if (constants_1.DEBUG) {
|
|
148
|
+
clack_1.default.log.error(`Not on main or master. Skipping PR creation.`);
|
|
149
|
+
}
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Check GitHub auth
|
|
153
|
+
const authResult = await checkGitHubAuth(installDir);
|
|
154
|
+
if (!authResult.success) {
|
|
155
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
156
|
+
action: 'skipping pr creation',
|
|
157
|
+
reason: 'not logged into github',
|
|
158
|
+
integration,
|
|
159
|
+
});
|
|
160
|
+
if (constants_1.DEBUG) {
|
|
161
|
+
clack_1.default.log.error(authResult.error ?? 'Failed to check github auth');
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const newBranch = exports.PR_CONFIG.defaultBranchName;
|
|
166
|
+
// Check if branch exists
|
|
167
|
+
const branchExistsResult = await checkBranchExists(newBranch, installDir);
|
|
168
|
+
if (!branchExistsResult.success) {
|
|
169
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
170
|
+
action: 'skipping pr creation',
|
|
171
|
+
reason: 'branch already exists',
|
|
172
|
+
error: branchExistsResult.error,
|
|
173
|
+
integration,
|
|
174
|
+
});
|
|
175
|
+
if (constants_1.DEBUG) {
|
|
176
|
+
clack_1.default.log.error(branchExistsResult.error ?? 'Failed to check branch exists');
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const prTitle = exports.PR_CONFIG.defaultTitle;
|
|
181
|
+
const prDescription = (0, messages_1.getPRDescription)({
|
|
182
|
+
integration,
|
|
183
|
+
addedEditorRules,
|
|
184
|
+
});
|
|
185
|
+
const createPR = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
186
|
+
message: 'Would you like to create a PR automatically?',
|
|
187
|
+
initialValue: true,
|
|
188
|
+
options: [
|
|
189
|
+
{
|
|
190
|
+
value: true,
|
|
191
|
+
label: 'Yes',
|
|
192
|
+
hint: 'We will create a PR for you',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
value: false,
|
|
196
|
+
label: 'No',
|
|
197
|
+
hint: 'You can create a PR manually later',
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
}));
|
|
201
|
+
if (!createPR) {
|
|
202
|
+
clack_1.default.log.info('Skipping PR creation');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// Create branch
|
|
206
|
+
const createBranchResult = await createBranch(newBranch, installDir);
|
|
207
|
+
if (!createBranchResult.success) {
|
|
208
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
209
|
+
action: 'aborting pr creation',
|
|
210
|
+
reason: 'failed to create branch',
|
|
211
|
+
error: createBranchResult.error,
|
|
212
|
+
integration,
|
|
213
|
+
});
|
|
214
|
+
clack_1.default.log.warn('Failed to create branch. Aborting PR creation 🚶➡️');
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// Stage changes
|
|
218
|
+
const stageResult = await stageChanges(installDir);
|
|
219
|
+
if (!stageResult.success) {
|
|
220
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
221
|
+
action: 'aborting pr creation',
|
|
222
|
+
reason: 'failed to stage changes',
|
|
223
|
+
error: stageResult.error,
|
|
224
|
+
integration,
|
|
225
|
+
});
|
|
226
|
+
clack_1.default.log.warn('Failed to stage changes. Aborting PR creation 🚶➡️');
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// Check for env files
|
|
230
|
+
const envCheckResult = await checkForEnvFiles(installDir);
|
|
231
|
+
if (!envCheckResult.success) {
|
|
232
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
233
|
+
action: 'aborting pr creation',
|
|
234
|
+
reason: 'failed to check for env files in staged changes',
|
|
235
|
+
error: envCheckResult.error,
|
|
236
|
+
integration,
|
|
237
|
+
});
|
|
238
|
+
clack_1.default.log.warn('Failed to check for .env files. Aborting PR creation 🚶➡️');
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (envCheckResult.data) {
|
|
242
|
+
clack_1.default.log.warn('Found .env files in staged changes. Aborting PR creation to prevent exposing sensitive data 🔐');
|
|
243
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
244
|
+
action: 'aborting pr creation',
|
|
245
|
+
reason: 'env files detected in staged changes',
|
|
246
|
+
integration,
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
// Commit changes
|
|
251
|
+
const commitSpinner = clack_1.default.spinner();
|
|
252
|
+
commitSpinner.start('Committing changes...');
|
|
253
|
+
const commitResult = await commitChanges(prTitle, installDir);
|
|
254
|
+
if (!commitResult.success) {
|
|
255
|
+
commitSpinner.stop('Failed to commit changes. Aborting PR creation 🚶➡️');
|
|
256
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
257
|
+
action: 'aborting pr creation',
|
|
258
|
+
reason: 'failed to commit changes',
|
|
259
|
+
error: commitResult.error,
|
|
260
|
+
integration,
|
|
261
|
+
});
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
commitSpinner.stop('Changes committed successfully.');
|
|
265
|
+
// Push branch
|
|
266
|
+
const pushSpinner = clack_1.default.spinner();
|
|
267
|
+
pushSpinner.start('Pushing branch to remote...');
|
|
268
|
+
const pushResult = await pushBranch(newBranch, installDir);
|
|
269
|
+
if (!pushResult.success) {
|
|
270
|
+
pushSpinner.stop('Failed to push branch. Aborting PR creation 🚶➡️');
|
|
271
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
272
|
+
action: 'aborting pr creation',
|
|
273
|
+
reason: 'failed to push branch',
|
|
274
|
+
error: pushResult.error,
|
|
275
|
+
integration,
|
|
276
|
+
});
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
pushSpinner.stop('Branch pushed successfully.');
|
|
280
|
+
// Create PR
|
|
281
|
+
const prSpinner = clack_1.default.spinner();
|
|
282
|
+
prSpinner.start(`Creating a PR on branch '${newBranch}' with base '${baseBranch}'...`);
|
|
283
|
+
const prResult = await createGitHubPR(baseBranch, newBranch, prTitle, prDescription, installDir);
|
|
284
|
+
if (!prResult.success || !prResult.data) {
|
|
285
|
+
prSpinner.stop(`Failed to create PR on branch '${newBranch}'. Aborting PR creation 🚶➡️`);
|
|
286
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
287
|
+
action: 'aborting pr creation',
|
|
288
|
+
reason: 'failed to create pr',
|
|
289
|
+
error: prResult.error,
|
|
290
|
+
integration,
|
|
291
|
+
});
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const prUrl = prResult.data;
|
|
295
|
+
prSpinner.stop(`Successfully created PR! 🎉 You can review it here: ${chalk_1.default.cyan(prUrl)}`);
|
|
296
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
297
|
+
action: 'pr created',
|
|
298
|
+
branch: newBranch,
|
|
299
|
+
base_branch: baseBranch,
|
|
300
|
+
integration,
|
|
301
|
+
});
|
|
302
|
+
return prUrl;
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=create-pr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-pr.js","sourceRoot":"","sources":["../../../src/steps/create-pr.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport { DEBUG, type Integration } from '../lib/constants';\nimport { traceStep } from '../telemetry';\nimport { analytics } from '../utils/analytics';\nimport clack from '../utils/clack';\nimport { abortIfCancelled, isInGitRepo } from '../utils/clack-utils';\nimport * as childProcess from 'node:child_process';\nimport { getPRDescription } from '../lib/messages';\n\nexport const PR_CONFIG = {\n defaultBranchName: 'posthog-integration',\n defaultTitle: 'feat: add PostHog integration',\n} as const;\n\ninterface GitCommandResult<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nexport async function execGitCommand(\n command: string,\n cwd: string,\n): Promise<GitCommandResult<string>> {\n return new Promise((resolve) => {\n childProcess.exec(command, { cwd }, (err, stdout, stderr) => {\n if (err) {\n resolve({ success: false, error: stderr || err.message });\n } else {\n resolve({ success: true, data: stdout.trim() });\n }\n });\n });\n}\n\nexport async function getCurrentBranch(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('git rev-parse --abbrev-ref HEAD', installDir);\n}\n\nexport async function checkGitHubAuth(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('gh auth status', installDir);\n}\n\nexport async function checkBranchExists(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<boolean>> {\n const result = await execGitCommand(\n `git rev-parse --verify ${branch}`,\n installDir,\n );\n // If the command fails, the branch does not exist\n if (!result.success) {\n return { success: true, data: true };\n }\n // If the command succeeds, the branch exists\n return { success: false, data: false };\n}\n\nexport async function createBranch(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git checkout -b ${branch}`, installDir);\n}\n\nexport async function stageChanges(\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand('git add .', installDir);\n}\n\nexport async function checkForEnvFiles(\n installDir: string,\n): Promise<GitCommandResult<boolean>> {\n const result = await execGitCommand(\n 'git diff --cached --name-only',\n installDir,\n );\n if (!result.success) {\n return { success: false, error: result.error };\n }\n const files = result.data\n ? result.data\n .split('\\n')\n .map((f) => f.trim())\n .filter(Boolean)\n : [];\n const hasEnv = files.some((f) => f.startsWith('.env'));\n return { success: true, data: hasEnv };\n}\n\nexport async function commitChanges(\n message: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git commit -m \"${message}\"`, installDir);\n}\n\nexport async function pushBranch(\n branch: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(`git push -u origin ${branch}`, installDir);\n}\n\nexport async function createGitHubPR(\n baseBranch: string,\n newBranch: string,\n title: string,\n body: string,\n installDir: string,\n): Promise<GitCommandResult<string>> {\n return execGitCommand(\n `gh pr create --base ${baseBranch} --head ${newBranch} --title \"${title}\" --body \"${body}\"`,\n installDir,\n );\n}\n\ninterface CreatePRStepOptions {\n installDir: string;\n integration: Integration;\n addedEditorRules: boolean;\n}\n\nexport async function createPRStep({\n installDir,\n integration,\n addedEditorRules,\n}: CreatePRStepOptions): Promise<string | undefined> {\n return traceStep('create-pr', async () => {\n if (!isInGitRepo()) {\n clack.log.warn('Not in a git repository. Cannot create a pull request.');\n return;\n }\n\n // Get current branch\n const currentBranchResult = await getCurrentBranch(installDir);\n if (!currentBranchResult.success || !currentBranchResult.data) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'failed to get current branch',\n error: currentBranchResult.error,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(\n currentBranchResult.error ?? 'Failed to get current branch',\n );\n }\n\n return;\n }\n const baseBranch = currentBranchResult.data;\n\n if (!['main', 'master'].includes(baseBranch)) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'not on main or master',\n base_branch: baseBranch,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(`Not on main or master. Skipping PR creation.`);\n }\n return;\n }\n\n // Check GitHub auth\n const authResult = await checkGitHubAuth(installDir);\n if (!authResult.success) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'not logged into github',\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(authResult.error ?? 'Failed to check github auth');\n }\n\n return;\n }\n\n const newBranch = PR_CONFIG.defaultBranchName;\n\n // Check if branch exists\n const branchExistsResult = await checkBranchExists(newBranch, installDir);\n if (!branchExistsResult.success) {\n analytics.capture('wizard interaction', {\n action: 'skipping pr creation',\n reason: 'branch already exists',\n error: branchExistsResult.error,\n integration,\n });\n\n if (DEBUG) {\n clack.log.error(\n branchExistsResult.error ?? 'Failed to check branch exists',\n );\n }\n\n return;\n }\n\n const prTitle = PR_CONFIG.defaultTitle;\n const prDescription = getPRDescription({\n integration,\n addedEditorRules,\n });\n\n const createPR = await abortIfCancelled(\n clack.select({\n message: 'Would you like to create a PR automatically?',\n initialValue: true,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: 'We will create a PR for you',\n },\n {\n value: false,\n label: 'No',\n hint: 'You can create a PR manually later',\n },\n ],\n }),\n );\n\n if (!createPR) {\n clack.log.info('Skipping PR creation');\n return;\n }\n\n // Create branch\n const createBranchResult = await createBranch(newBranch, installDir);\n if (!createBranchResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to create branch',\n error: createBranchResult.error,\n integration,\n });\n clack.log.warn('Failed to create branch. Aborting PR creation 🚶➡️');\n return;\n }\n\n // Stage changes\n const stageResult = await stageChanges(installDir);\n if (!stageResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to stage changes',\n error: stageResult.error,\n integration,\n });\n clack.log.warn('Failed to stage changes. Aborting PR creation 🚶➡️');\n return;\n }\n\n // Check for env files\n const envCheckResult = await checkForEnvFiles(installDir);\n if (!envCheckResult.success) {\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to check for env files in staged changes',\n error: envCheckResult.error,\n integration,\n });\n clack.log.warn(\n 'Failed to check for .env files. Aborting PR creation 🚶➡️',\n );\n return;\n }\n\n if (envCheckResult.data) {\n clack.log.warn(\n 'Found .env files in staged changes. Aborting PR creation to prevent exposing sensitive data 🔐',\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'env files detected in staged changes',\n integration,\n });\n return;\n }\n\n // Commit changes\n const commitSpinner = clack.spinner();\n commitSpinner.start('Committing changes...');\n const commitResult = await commitChanges(prTitle, installDir);\n if (!commitResult.success) {\n commitSpinner.stop(\n 'Failed to commit changes. Aborting PR creation 🚶➡️',\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to commit changes',\n error: commitResult.error,\n integration,\n });\n return;\n }\n commitSpinner.stop('Changes committed successfully.');\n\n // Push branch\n const pushSpinner = clack.spinner();\n pushSpinner.start('Pushing branch to remote...');\n const pushResult = await pushBranch(newBranch, installDir);\n if (!pushResult.success) {\n pushSpinner.stop('Failed to push branch. Aborting PR creation 🚶➡️');\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to push branch',\n error: pushResult.error,\n integration,\n });\n return;\n }\n pushSpinner.stop('Branch pushed successfully.');\n\n // Create PR\n const prSpinner = clack.spinner();\n prSpinner.start(\n `Creating a PR on branch '${newBranch}' with base '${baseBranch}'...`,\n );\n const prResult = await createGitHubPR(\n baseBranch,\n newBranch,\n prTitle,\n prDescription,\n installDir,\n );\n if (!prResult.success || !prResult.data) {\n prSpinner.stop(\n `Failed to create PR on branch '${newBranch}'. Aborting PR creation 🚶➡️`,\n );\n analytics.capture('wizard interaction', {\n action: 'aborting pr creation',\n reason: 'failed to create pr',\n error: prResult.error,\n integration,\n });\n return;\n }\n\n const prUrl = prResult.data;\n prSpinner.stop(\n `Successfully created PR! 🎉 You can review it here: ${chalk.cyan(\n prUrl,\n )}`,\n );\n\n analytics.capture('wizard interaction', {\n action: 'pr created',\n branch: newBranch,\n base_branch: baseBranch,\n integration,\n });\n\n return prUrl;\n });\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./add-editor-rules"), exports);
|
|
18
|
+
__exportStar(require("./create-pr"), exports);
|
|
19
|
+
__exportStar(require("./run-prettier"), exports);
|
|
20
|
+
__exportStar(require("./add-or-update-environment-variables"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B;AAC/B,wEAAsD","sourcesContent":["export * from './add-editor-rules';\nexport * from './create-pr';\nexport * from './run-prettier';\nexport * from './add-or-update-environment-variables';\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runPrettierStep = runPrettierStep;
|
|
40
|
+
const telemetry_1 = require("../telemetry");
|
|
41
|
+
const analytics_1 = require("../utils/analytics");
|
|
42
|
+
const clack_1 = __importDefault(require("../utils/clack"));
|
|
43
|
+
const clack_utils_1 = require("../utils/clack-utils");
|
|
44
|
+
const package_json_1 = require("../utils/package-json");
|
|
45
|
+
const childProcess = __importStar(require("node:child_process"));
|
|
46
|
+
async function runPrettierStep({ installDir, integration, }) {
|
|
47
|
+
return (0, telemetry_1.traceStep)('run-prettier', async () => {
|
|
48
|
+
if (!(0, clack_utils_1.isInGitRepo)()) {
|
|
49
|
+
// We only run formatting on changed files. If we're not in a git repo, we can't find
|
|
50
|
+
// changed files. So let's early-return without showing any formatting-related messages.
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const changedOrUntrackedFiles = (0, clack_utils_1.getUncommittedOrUntrackedFiles)()
|
|
54
|
+
.map((filename) => {
|
|
55
|
+
return filename.startsWith('- ') ? filename.slice(2) : filename;
|
|
56
|
+
})
|
|
57
|
+
.join(' ');
|
|
58
|
+
if (!changedOrUntrackedFiles.length) {
|
|
59
|
+
// Likewise, if we can't find changed or untracked files, there's no point in running Prettier.
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const packageJson = await (0, clack_utils_1.getPackageDotJson)({ installDir });
|
|
63
|
+
const prettierInstalled = (0, package_json_1.hasPackageInstalled)('prettier', packageJson);
|
|
64
|
+
analytics_1.analytics.setTag('prettier-installed', prettierInstalled);
|
|
65
|
+
if (!prettierInstalled) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const prettierSpinner = clack_1.default.spinner();
|
|
69
|
+
prettierSpinner.start('Running Prettier on your files.');
|
|
70
|
+
try {
|
|
71
|
+
await new Promise((resolve, reject) => {
|
|
72
|
+
childProcess.exec(`npx prettier --ignore-unknown --write ${changedOrUntrackedFiles}`, (err) => {
|
|
73
|
+
if (err) {
|
|
74
|
+
reject(err);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
resolve();
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
prettierSpinner.stop('Prettier failed to run. You may want to format the changes manually.');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
prettierSpinner.stop('Prettier has formatted your files.');
|
|
87
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
88
|
+
action: 'ran prettier',
|
|
89
|
+
integration,
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=run-prettier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-prettier.js","sourceRoot":"","sources":["../../../src/steps/run-prettier.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,0CA+DC;AA3ED,4CAAyC;AACzC,kDAA+C;AAC/C,2DAAmC;AACnC,sDAI8B;AAC9B,wDAA4D;AAE5D,iEAAmD;AAE5C,KAAK,UAAU,eAAe,CAAC,EACpC,UAAU,EACV,WAAW,GAGZ;IACC,OAAO,IAAA,qBAAS,EAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,IAAA,yBAAW,GAAE,EAAE,CAAC;YACnB,qFAAqF;YACrF,wFAAwF;YACxF,OAAO;QACT,CAAC;QAED,MAAM,uBAAuB,GAAG,IAAA,4CAA8B,GAAE;aAC7D,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;YACpC,+FAA+F;YAC/F,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,IAAA,kCAAmB,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEvE,qBAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;QAE1D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,eAAK,CAAC,OAAO,EAAE,CAAC;QACxC,eAAe,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,YAAY,CAAC,IAAI,CACf,yCAAyC,uBAAuB,EAAE,EAClE,CAAC,GAAG,EAAE,EAAE;oBACN,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAe,CAAC,IAAI,CAClB,sEAAsE,CACvE,CAAC;YACF,OAAO;QACT,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAE3D,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,cAAc;YACtB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Integration } from '../lib/constants';\nimport { traceStep } from '../telemetry';\nimport { analytics } from '../utils/analytics';\nimport clack from '../utils/clack';\nimport {\n getPackageDotJson,\n getUncommittedOrUntrackedFiles,\n isInGitRepo,\n} from '../utils/clack-utils';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport * as childProcess from 'node:child_process';\n\nexport async function runPrettierStep({\n installDir,\n integration,\n}: Pick<WizardOptions, 'installDir'> & {\n integration: Integration;\n}): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles()\n .map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n })\n .join(' ');\n\n if (!changedOrUntrackedFiles.length) {\n // Likewise, if we can't find changed or untracked files, there's no point in running Prettier.\n return;\n }\n\n const packageJson = await getPackageDotJson({ installDir });\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n analytics.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n const prettierSpinner = clack.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `npx prettier --ignore-unknown --write ${changedOrUntrackedFiles}`,\n (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n prettierSpinner.stop(\n 'Prettier failed to run. You may want to format the changes manually.',\n );\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n\n analytics.capture('wizard interaction', {\n action: 'ran prettier',\n integration,\n });\n });\n}\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSvelteDocumentation = void 0;
|
|
4
|
+
const getSvelteDocumentation = ({ language, }) => {
|
|
5
|
+
return `
|
|
6
|
+
==============================
|
|
7
|
+
FILE: Root layout.${language === 'typescript' ? 'ts' : 'js'} file (e.g routes/+layout.${language === 'typescript' ? 'ts' : 'js'})
|
|
8
|
+
LOCATION: Usually placed at the root of the app (e.g src/routes/+layout.${language === 'typescript' ? 'ts' : 'js'})
|
|
9
|
+
==============================
|
|
10
|
+
Changes:
|
|
11
|
+
- Add a load function to initialize PostHog, checking if the browser is available to make sure it only initializes on the client
|
|
12
|
+
Example:
|
|
13
|
+
--------------------------------------------------
|
|
14
|
+
import posthog from 'posthog-js'
|
|
15
|
+
import { browser } from '$app/environment';
|
|
16
|
+
import { PUBLIC_POSTHOG_KEY } from '$env/static/public';
|
|
17
|
+
|
|
18
|
+
export const load = async () => {
|
|
19
|
+
|
|
20
|
+
if (browser) {
|
|
21
|
+
posthog.init(
|
|
22
|
+
PUBLIC_POSTHOG_KEY,
|
|
23
|
+
{
|
|
24
|
+
api_host: PUBLIC_POSTHOG_HOST,
|
|
25
|
+
capture_pageview: false,
|
|
26
|
+
capture_pageleave: false
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
return
|
|
31
|
+
};
|
|
32
|
+
--------------------------------------------------
|
|
33
|
+
|
|
34
|
+
==============================
|
|
35
|
+
File: Root layout .svelte file (e.g routes/+layout.svelte)
|
|
36
|
+
LOCATION: Usually placed at the root of the app (e.g src/routes/+layout.svelte)
|
|
37
|
+
==============================
|
|
38
|
+
Changes:
|
|
39
|
+
- Add pageview & pageleave tracking to the layout
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
--------------------------------------------------
|
|
43
|
+
<script>
|
|
44
|
+
import { browser } from '$app/environment';
|
|
45
|
+
import { beforeNavigate, afterNavigate } from '$app/navigation';
|
|
46
|
+
import posthog from 'posthog-js'
|
|
47
|
+
|
|
48
|
+
if (browser) {
|
|
49
|
+
beforeNavigate(() => posthog.capture('$pageleave'));
|
|
50
|
+
afterNavigate(() => posthog.capture('$pageview'));
|
|
51
|
+
}
|
|
52
|
+
</script>
|
|
53
|
+
--------------------------------------------------
|
|
54
|
+
|
|
55
|
+
==============================
|
|
56
|
+
File: PostHog server initializion
|
|
57
|
+
LOCATION: With other server-side code, e.g. src/lib/server/posthog${language === 'typescript' ? '.ts' : '.js'}
|
|
58
|
+
==============================
|
|
59
|
+
Changes:
|
|
60
|
+
- Initialize a PostHog client for the server using posthog-node that can be used in other server-side code
|
|
61
|
+
Example:
|
|
62
|
+
--------------------------------------------------
|
|
63
|
+
import posthog, { PostHog } from 'posthog-node';
|
|
64
|
+
import { PUBLIC_POSTHOG_KEY, PUBLIC_POSTHOG_HOST } from '$env/static/public';
|
|
65
|
+
|
|
66
|
+
let _client: PostHog | null = null;
|
|
67
|
+
|
|
68
|
+
export function getPostHogClient() {
|
|
69
|
+
if (!_client) {
|
|
70
|
+
_client = new posthog.PostHog(PUBLIC_POSTHOG_KEY, {
|
|
71
|
+
host: PUBLIC_POSTHOG_HOST,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return _client;
|
|
75
|
+
}
|
|
76
|
+
--------------------------------------------------
|
|
77
|
+
|
|
78
|
+
==============================
|
|
79
|
+
FILE: Svelte Config (e.g svelte.config.js)
|
|
80
|
+
LOCATION: Wherever the root of the app is
|
|
81
|
+
==============================
|
|
82
|
+
Changes:
|
|
83
|
+
- Set config to not use relative asset paths
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
--------------------------------------------------
|
|
87
|
+
import adapter from '@sveltejs/adapter-auto';
|
|
88
|
+
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
|
|
89
|
+
|
|
90
|
+
/** @type {import('@sveltejs/kit').Config} */
|
|
91
|
+
const config = {
|
|
92
|
+
// Consult https://svelte.dev/docs/kit/integrations
|
|
93
|
+
// for more information about preprocessors
|
|
94
|
+
preprocess: vitePreprocess(),
|
|
95
|
+
|
|
96
|
+
kit: {
|
|
97
|
+
// ...
|
|
98
|
+
paths: {
|
|
99
|
+
relative: false, // Required for PostHog session replay to work correctly
|
|
100
|
+
},
|
|
101
|
+
// ...
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export default config;
|
|
106
|
+
|
|
107
|
+
--------------------------------------------------`;
|
|
108
|
+
};
|
|
109
|
+
exports.getSvelteDocumentation = getSvelteDocumentation;
|
|
110
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/svelte/docs.ts"],"names":[],"mappings":";;;AAAO,MAAM,sBAAsB,GAAG,CAAC,EACrC,QAAQ,GAGT,EAAE,EAAE;IACH,OAAO;;oBAGL,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC,6BAA6B,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;0EAElE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oEAkDE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KACtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDAkDiD,CAAC;AACpD,CAAC,CAAC;AAlHW,QAAA,sBAAsB,0BAkHjC","sourcesContent":["export const getSvelteDocumentation = ({\n language,\n}: {\n language: 'typescript' | 'javascript';\n}) => {\n return `\n==============================\nFILE: Root layout.${\n language === 'typescript' ? 'ts' : 'js'\n } file (e.g routes/+layout.${language === 'typescript' ? 'ts' : 'js'})\nLOCATION: Usually placed at the root of the app (e.g src/routes/+layout.${\n language === 'typescript' ? 'ts' : 'js'\n })\n==============================\nChanges:\n- Add a load function to initialize PostHog, checking if the browser is available to make sure it only initializes on the client\nExample:\n--------------------------------------------------\nimport posthog from 'posthog-js'\nimport { browser } from '$app/environment';\nimport { PUBLIC_POSTHOG_KEY } from '$env/static/public';\n\nexport const load = async () => {\n\n if (browser) {\n posthog.init(\n PUBLIC_POSTHOG_KEY,\n {\n api_host: PUBLIC_POSTHOG_HOST,\n capture_pageview: false,\n capture_pageleave: false\n }\n )\n }\n return\n};\n--------------------------------------------------\n\n==============================\nFile: Root layout .svelte file (e.g routes/+layout.svelte)\nLOCATION: Usually placed at the root of the app (e.g src/routes/+layout.svelte)\n==============================\nChanges:\n- Add pageview & pageleave tracking to the layout\n\nExample:\n--------------------------------------------------\n<script>\n import { browser } from '$app/environment';\n import { beforeNavigate, afterNavigate } from '$app/navigation';\n import posthog from 'posthog-js'\n\n if (browser) {\n beforeNavigate(() => posthog.capture('$pageleave'));\n afterNavigate(() => posthog.capture('$pageview'));\n }\n</script>\n--------------------------------------------------\n\n==============================\nFile: PostHog server initializion\nLOCATION: With other server-side code, e.g. src/lib/server/posthog${\n language === 'typescript' ? '.ts' : '.js'\n }\n==============================\nChanges:\n- Initialize a PostHog client for the server using posthog-node that can be used in other server-side code\nExample:\n--------------------------------------------------\nimport posthog, { PostHog } from 'posthog-node';\nimport { PUBLIC_POSTHOG_KEY, PUBLIC_POSTHOG_HOST } from '$env/static/public';\n\nlet _client: PostHog | null = null;\n\nexport function getPostHogClient() {\n if (!_client) {\n _client = new posthog.PostHog(PUBLIC_POSTHOG_KEY, {\n host: PUBLIC_POSTHOG_HOST,\n });\n }\n return _client;\n}\n--------------------------------------------------\n\n==============================\nFILE: Svelte Config (e.g svelte.config.js)\nLOCATION: Wherever the root of the app is\n==============================\nChanges:\n- Set config to not use relative asset paths\n\nExample:\n--------------------------------------------------\nimport adapter from '@sveltejs/adapter-auto';\nimport { vitePreprocess } from '@sveltejs/vite-plugin-svelte';\n\n/** @type {import('@sveltejs/kit').Config} */\nconst config = {\n\t// Consult https://svelte.dev/docs/kit/integrations\n\t// for more information about preprocessors\n\tpreprocess: vitePreprocess(),\n\n\tkit: {\n // ...\n paths: {\n relative: false, // Required for PostHog session replay to work correctly\n },\n // ...\n\t}\n};\n\nexport default config;\n\n--------------------------------------------------`;\n};\n"]}
|