@posthog/wizard 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +28 -0
- package/dist/bin.js.map +1 -0
- package/dist/src/lib/config.d.ts +49 -0
- package/dist/src/lib/config.js +85 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/constants.d.ts +25 -0
- package/dist/src/lib/constants.js +45 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/messages.d.ts +17 -0
- package/dist/src/lib/messages.js +68 -0
- package/dist/src/lib/messages.js.map +1 -0
- package/dist/src/lib/prompts.d.ts +16 -0
- package/dist/src/lib/prompts.js +83 -0
- package/dist/src/lib/prompts.js.map +1 -0
- package/dist/src/nextjs/docs.d.ts +8 -0
- package/dist/src/nextjs/docs.js +257 -0
- package/dist/src/nextjs/docs.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard.d.ts +2 -0
- package/dist/src/nextjs/nextjs-wizard.js +136 -0
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -0
- package/dist/src/nextjs/utils.d.ts +9 -0
- package/dist/src/nextjs/utils.js +83 -0
- package/dist/src/nextjs/utils.js.map +1 -0
- package/dist/src/react/docs.d.ts +4 -0
- package/dist/src/react/docs.js +46 -0
- package/dist/src/react/docs.js.map +1 -0
- package/dist/src/react/react-wizard.d.ts +2 -0
- package/dist/src/react/react-wizard.js +115 -0
- package/dist/src/react/react-wizard.js.map +1 -0
- package/dist/src/react-native/docs.d.ts +5 -0
- package/dist/src/react-native/docs.js +31 -0
- package/dist/src/react-native/docs.js.map +1 -0
- package/dist/src/react-native/react-native-wizard.d.ts +2 -0
- package/dist/src/react-native/react-native-wizard.js +124 -0
- package/dist/src/react-native/react-native-wizard.js.map +1 -0
- package/dist/src/run.d.ts +13 -0
- package/dist/src/run.js +85 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/steps/__tests__/add-editor-rules.test.d.ts +1 -0
- package/dist/src/steps/__tests__/add-editor-rules.test.js +218 -0
- package/dist/src/steps/__tests__/add-editor-rules.test.js.map +1 -0
- package/dist/src/steps/__tests__/create-pr.test.d.ts +1 -0
- package/dist/src/steps/__tests__/create-pr.test.js +193 -0
- package/dist/src/steps/__tests__/create-pr.test.js.map +1 -0
- package/dist/src/steps/add-editor-rules.d.ts +9 -0
- package/dist/src/steps/add-editor-rules.js +92 -0
- package/dist/src/steps/add-editor-rules.js.map +1 -0
- package/dist/src/steps/add-or-update-environment-variables.d.ts +10 -0
- package/dist/src/steps/add-or-update-environment-variables.js +194 -0
- package/dist/src/steps/add-or-update-environment-variables.js.map +1 -0
- package/dist/src/steps/create-pr.d.ts +27 -0
- package/dist/src/steps/create-pr.js +305 -0
- package/dist/src/steps/create-pr.js.map +1 -0
- package/dist/src/steps/index.d.ts +4 -0
- package/dist/src/steps/index.js +21 -0
- package/dist/src/steps/index.js.map +1 -0
- package/dist/src/steps/run-prettier.d.ts +5 -0
- package/dist/src/steps/run-prettier.js +93 -0
- package/dist/src/steps/run-prettier.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +8 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +12 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
- package/dist/src/steps/upload-environment-variables/index.js +66 -0
- package/dist/src/steps/upload-environment-variables/index.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.d.ts +1 -0
- package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.js +117 -0
- package/dist/src/steps/upload-environment-variables/providers/__tests__/vercel.test.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +14 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js +146 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -0
- package/dist/src/svelte/docs.d.ts +3 -0
- package/dist/src/svelte/docs.js +110 -0
- package/dist/src/svelte/docs.js.map +1 -0
- package/dist/src/svelte/svelte-wizard.d.ts +2 -0
- package/dist/src/svelte/svelte-wizard.js +115 -0
- package/dist/src/svelte/svelte-wizard.js.map +1 -0
- package/dist/src/telemetry.d.ts +2 -0
- package/dist/src/telemetry.js +13 -0
- package/dist/src/telemetry.js.map +1 -0
- package/dist/src/utils/__tests__/clack-utils.test.d.ts +1 -0
- package/dist/src/utils/__tests__/clack-utils.test.js +128 -0
- package/dist/src/utils/__tests__/clack-utils.test.js.map +1 -0
- package/dist/src/utils/analytics.d.ts +12 -0
- package/dist/src/utils/analytics.js +59 -0
- package/dist/src/utils/analytics.js.map +1 -0
- package/dist/src/utils/bash.d.ts +2 -0
- package/dist/src/utils/bash.js +54 -0
- package/dist/src/utils/bash.js.map +1 -0
- package/dist/src/utils/clack-utils.d.ts +180 -0
- package/dist/src/utils/clack-utils.js +634 -0
- package/dist/src/utils/clack-utils.js.map +1 -0
- package/dist/src/utils/clack.d.ts +2 -0
- package/dist/src/utils/clack.js +9 -0
- package/dist/src/utils/clack.js.map +1 -0
- package/dist/src/utils/debug.d.ts +2 -0
- package/dist/src/utils/debug.js +22 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/environment.d.ts +3 -0
- package/dist/src/utils/environment.js +64 -0
- package/dist/src/utils/environment.js.map +1 -0
- package/dist/src/utils/file-utils.d.ts +29 -0
- package/dist/src/utils/file-utils.js +177 -0
- package/dist/src/utils/file-utils.js.map +1 -0
- package/dist/src/utils/logging.d.ts +9 -0
- package/dist/src/utils/logging.js +50 -0
- package/dist/src/utils/logging.js.map +1 -0
- package/dist/src/utils/package-json.d.ts +25 -0
- package/dist/src/utils/package-json.js +27 -0
- package/dist/src/utils/package-json.js.map +1 -0
- package/dist/src/utils/package-manager.d.ts +21 -0
- package/dist/src/utils/package-manager.js +208 -0
- package/dist/src/utils/package-manager.js.map +1 -0
- package/dist/src/utils/query.d.ts +8 -0
- package/dist/src/utils/query.js +27 -0
- package/dist/src/utils/query.js.map +1 -0
- package/dist/src/utils/rules/next-rules.md +9 -0
- package/dist/src/utils/rules/react-native-rules.md +7 -0
- package/dist/src/utils/rules/react-rules.md +7 -0
- package/dist/src/utils/rules/svelte-rules.md +7 -0
- package/dist/src/utils/rules/universal.md +20 -0
- package/dist/src/utils/semver.d.ts +5 -0
- package/dist/src/utils/semver.js +25 -0
- package/dist/src/utils/semver.js.map +1 -0
- package/dist/src/utils/string.d.ts +1 -0
- package/dist/src/utils/string.js +9 -0
- package/dist/src/utils/string.js.map +1 -0
- package/dist/src/utils/types.d.ts +48 -0
- package/dist/src/utils/types.js +3 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/utils/urls.d.ts +4 -0
- package/dist/src/utils/urls.js +35 -0
- package/dist/src/utils/urls.js.map +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.d.ts +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js +24 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,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,8 @@
|
|
|
1
|
+
import type { WizardOptions } from '../../utils/types';
|
|
2
|
+
export declare abstract class EnvironmentProvider {
|
|
3
|
+
protected options: WizardOptions;
|
|
4
|
+
name: string;
|
|
5
|
+
constructor(options: WizardOptions);
|
|
6
|
+
abstract detect(): Promise<boolean>;
|
|
7
|
+
abstract uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnvironmentProvider = void 0;
|
|
4
|
+
class EnvironmentProvider {
|
|
5
|
+
options;
|
|
6
|
+
name;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.EnvironmentProvider = EnvironmentProvider;
|
|
12
|
+
//# sourceMappingURL=EnvironmentProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentProvider.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/EnvironmentProvider.ts"],"names":[],"mappings":";;;AAEA,MAAsB,mBAAmB;IAC7B,OAAO,CAAgB;IAEjC,IAAI,CAAS;IAEb,YAAY,OAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CAOF;AAdD,kDAcC","sourcesContent":["import type { WizardOptions } from '../../utils/types';\n\nexport abstract class EnvironmentProvider {\n protected options: WizardOptions;\n\n name: string;\n\n constructor(options: WizardOptions) {\n this.options = options;\n }\n\n abstract detect(): Promise<boolean>;\n\n abstract uploadEnvVars(\n vars: Record<string, string>,\n ): Promise<Record<string, boolean>>;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Integration } from '../../lib/constants';
|
|
2
|
+
import type { WizardOptions } from '../../utils/types';
|
|
3
|
+
export declare const uploadEnvironmentVariablesStep: (envVars: Record<string, string>, { integration, options, }: {
|
|
4
|
+
integration: Integration;
|
|
5
|
+
options: WizardOptions;
|
|
6
|
+
}) => Promise<string[]>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.uploadEnvironmentVariablesStep = void 0;
|
|
7
|
+
const telemetry_1 = require("../../telemetry");
|
|
8
|
+
const analytics_1 = require("../../utils/analytics");
|
|
9
|
+
const clack_1 = __importDefault(require("../../utils/clack"));
|
|
10
|
+
const clack_utils_1 = require("../../utils/clack-utils");
|
|
11
|
+
const vercel_1 = require("./providers/vercel");
|
|
12
|
+
const uploadEnvironmentVariablesStep = async (envVars, { integration, options, }) => {
|
|
13
|
+
const providers = [
|
|
14
|
+
new vercel_1.VercelEnvironmentProvider(options),
|
|
15
|
+
];
|
|
16
|
+
let provider = null;
|
|
17
|
+
for (const p of providers) {
|
|
18
|
+
if (await p.detect()) {
|
|
19
|
+
provider = p;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (!provider) {
|
|
24
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
25
|
+
action: 'not uploading environment variables',
|
|
26
|
+
reason: 'no environment provider found',
|
|
27
|
+
integration,
|
|
28
|
+
});
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const upload = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
32
|
+
message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,
|
|
33
|
+
options: [
|
|
34
|
+
{
|
|
35
|
+
value: true,
|
|
36
|
+
label: 'Yes',
|
|
37
|
+
hint: `Upload the environment variables to ${provider.name}`,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
value: false,
|
|
41
|
+
label: 'No',
|
|
42
|
+
hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
}));
|
|
46
|
+
if (!upload) {
|
|
47
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
48
|
+
action: 'not uploading environment variables',
|
|
49
|
+
reason: 'user declined to upload',
|
|
50
|
+
provider: provider.name,
|
|
51
|
+
integration,
|
|
52
|
+
});
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
const results = await (0, telemetry_1.traceStep)('uploading environment variables', async () => {
|
|
56
|
+
return await provider.uploadEnvVars(envVars);
|
|
57
|
+
});
|
|
58
|
+
analytics_1.analytics.capture('wizard interaction', {
|
|
59
|
+
action: 'uploaded environment variables',
|
|
60
|
+
provider: provider.name,
|
|
61
|
+
integration,
|
|
62
|
+
});
|
|
63
|
+
return Object.keys(results).filter((key) => results[key]);
|
|
64
|
+
};
|
|
65
|
+
exports.uploadEnvironmentVariablesStep = uploadEnvironmentVariablesStep;
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/index.ts"],"names":[],"mappings":";;;;;;AACA,+CAA4C;AAC5C,qDAAkD;AAClD,8DAAsC;AACtC,yDAA2D;AAG3D,+CAA+D;AAExD,MAAM,8BAA8B,GAAG,KAAK,EACjD,OAA+B,EAC/B,EACE,WAAW,EACX,OAAO,GAIR,EACkB,EAAE;IACrB,MAAM,SAAS,GAA0B;QACvC,IAAI,kCAAyB,CAAC,OAAO,CAAC;KACvC,CAAC;IAEF,IAAI,QAAQ,GAA+B,IAAI,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,+BAA+B;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAY,MAAM,IAAA,8BAAgB,EAC5C,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,+BAA+B,QAAQ,CAAC,IAAI,uDAAuD;QAC5G,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,uCAAuC,QAAQ,CAAC,IAAI,EAAE;aAC7D;YACD;gBACE,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,2CAA2C,QAAQ,CAAC,IAAI,0BAA0B;aACzF;SACF;KACF,CAAC,CACH,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;YACtC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAS,EAC7B,iCAAiC,EACjC,KAAK,IAAI,EAAE;QACT,OAAO,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;IAEF,qBAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE;QACtC,MAAM,EAAE,gCAAgC;QACxC,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC;AA1EW,QAAA,8BAA8B,kCA0EzC","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport clack from '../../utils/clack';\nimport { abortIfCancelled } from '../../utils/clack-utils';\nimport type { WizardOptions } from '../../utils/types';\nimport { EnvironmentProvider } from './EnvironmentProvider';\nimport { VercelEnvironmentProvider } from './providers/vercel';\n\nexport const uploadEnvironmentVariablesStep = async (\n envVars: Record<string, string>,\n {\n integration,\n options,\n }: {\n integration: Integration;\n options: WizardOptions;\n },\n): Promise<string[]> => {\n const providers: EnvironmentProvider[] = [\n new VercelEnvironmentProvider(options),\n ];\n\n let provider: EnvironmentProvider | null = null;\n\n for (const p of providers) {\n if (await p.detect()) {\n provider = p;\n break;\n }\n }\n\n if (!provider) {\n analytics.capture('wizard interaction', {\n action: 'not uploading environment variables',\n reason: 'no environment provider found',\n integration,\n });\n return [];\n }\n\n const upload: boolean = await abortIfCancelled(\n clack.select({\n message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Upload the environment variables to ${provider.name}`,\n },\n {\n value: false,\n label: 'No',\n hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,\n },\n ],\n }),\n );\n\n if (!upload) {\n analytics.capture('wizard interaction', {\n action: 'not uploading environment variables',\n reason: 'user declined to upload',\n provider: provider.name,\n integration,\n });\n return [];\n }\n\n const results = await traceStep(\n 'uploading environment variables',\n async () => {\n return await provider.uploadEnvVars(envVars);\n },\n );\n\n analytics.capture('wizard interaction', {\n action: 'uploaded environment variables',\n provider: provider.name,\n integration,\n });\n\n return Object.keys(results).filter((key) => results[key]);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vercel_1 = require("../vercel");
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const child_process = __importStar(require("child_process"));
|
|
39
|
+
jest.mock('fs');
|
|
40
|
+
jest.mock('child_process');
|
|
41
|
+
const mockOptions = { installDir: '/tmp/project' };
|
|
42
|
+
describe('VercelEnvironmentProvider', () => {
|
|
43
|
+
let provider;
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
provider = new vercel_1.VercelEnvironmentProvider(mockOptions);
|
|
46
|
+
jest.clearAllMocks();
|
|
47
|
+
});
|
|
48
|
+
it('should detect Vercel CLI, project link, and authentication', async () => {
|
|
49
|
+
child_process.execSync.mockReturnValue(undefined);
|
|
50
|
+
fs.existsSync.mockImplementation((p) => {
|
|
51
|
+
if (p.endsWith('.vercel'))
|
|
52
|
+
return true;
|
|
53
|
+
if (p.endsWith('project.json'))
|
|
54
|
+
return true;
|
|
55
|
+
return false;
|
|
56
|
+
});
|
|
57
|
+
child_process.spawnSync.mockReturnValue({
|
|
58
|
+
stdout: 'testuser',
|
|
59
|
+
stderr: '',
|
|
60
|
+
status: 0,
|
|
61
|
+
});
|
|
62
|
+
await expect(provider.detect()).resolves.toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it('should return false if Vercel CLI is missing', async () => {
|
|
65
|
+
child_process.execSync.mockImplementation(() => {
|
|
66
|
+
throw new Error();
|
|
67
|
+
});
|
|
68
|
+
await expect(provider.detect()).resolves.toBe(false);
|
|
69
|
+
});
|
|
70
|
+
it('should return false if project is not linked', async () => {
|
|
71
|
+
child_process.execSync.mockReturnValue(undefined);
|
|
72
|
+
fs.existsSync.mockReturnValue(false);
|
|
73
|
+
await expect(provider.detect()).resolves.toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it('should return false if not authenticated', async () => {
|
|
76
|
+
child_process.execSync.mockReturnValue(undefined);
|
|
77
|
+
fs.existsSync.mockReturnValue(true);
|
|
78
|
+
child_process.spawnSync.mockReturnValue({
|
|
79
|
+
stdout: 'Log in to Vercel',
|
|
80
|
+
stderr: '',
|
|
81
|
+
status: 0,
|
|
82
|
+
});
|
|
83
|
+
await expect(provider.detect()).resolves.toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it('should return false if env var already exists', async () => {
|
|
86
|
+
const stdinMock = { write: jest.fn(), end: jest.fn() };
|
|
87
|
+
let closeCallback;
|
|
88
|
+
const onMock = jest.fn((event, cb) => {
|
|
89
|
+
if (event === 'close')
|
|
90
|
+
closeCallback = cb;
|
|
91
|
+
});
|
|
92
|
+
// Simulate a process with a writable stderr stream
|
|
93
|
+
let stderrListener;
|
|
94
|
+
const stderr = {
|
|
95
|
+
on: jest.fn((event, cb) => {
|
|
96
|
+
if (event === 'data')
|
|
97
|
+
stderrListener = cb;
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
child_process.spawn.mockReturnValue({
|
|
101
|
+
stdin: stdinMock,
|
|
102
|
+
on: onMock,
|
|
103
|
+
stderr,
|
|
104
|
+
});
|
|
105
|
+
const uploadPromise = provider.uploadEnvVars({ FOO: 'bar' });
|
|
106
|
+
// Simulate "already exists" error on stderr, then process close
|
|
107
|
+
stderrListener && stderrListener('already exists');
|
|
108
|
+
closeCallback && closeCallback(1);
|
|
109
|
+
await expect(uploadPromise).resolves.toEqual({ FOO: false });
|
|
110
|
+
});
|
|
111
|
+
it('should attempt to upload environment variables', async () => {
|
|
112
|
+
child_process.spawn.mockReturnValue({});
|
|
113
|
+
await provider.uploadEnvVars({ FOO: 'bar' });
|
|
114
|
+
expect(child_process.spawn).toHaveBeenCalledWith('vercel', ['env', 'add', 'FOO', 'production'], expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }));
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=vercel.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel.test.js","sourceRoot":"","sources":["../../../../../../src/steps/upload-environment-variables/providers/__tests__/vercel.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { VercelEnvironmentProvider } from '../vercel';\nimport * as fs from 'fs';\nimport * as child_process from 'child_process';\n\njest.mock('fs');\njest.mock('child_process');\n\nconst mockOptions = { installDir: '/tmp/project' };\n\ndescribe('VercelEnvironmentProvider', () => {\n let provider: VercelEnvironmentProvider;\n\n beforeEach(() => {\n provider = new VercelEnvironmentProvider(mockOptions as any);\n jest.clearAllMocks();\n });\n\n it('should detect Vercel CLI, project link, and authentication', async () => {\n (child_process.execSync as jest.Mock).mockReturnValue(undefined);\n (fs.existsSync as jest.Mock).mockImplementation((p: string) => {\n if (p.endsWith('.vercel')) return true;\n if (p.endsWith('project.json')) return true;\n return false;\n });\n (child_process.spawnSync as jest.Mock).mockReturnValue({\n stdout: 'testuser',\n stderr: '',\n status: 0,\n });\n\n await expect(provider.detect()).resolves.toBe(true);\n });\n\n it('should return false if Vercel CLI is missing', async () => {\n (child_process.execSync as jest.Mock).mockImplementation(() => {\n throw new Error();\n });\n await expect(provider.detect()).resolves.toBe(false);\n });\n\n it('should return false if project is not linked', async () => {\n (child_process.execSync as jest.Mock).mockReturnValue(undefined);\n (fs.existsSync as jest.Mock).mockReturnValue(false);\n await expect(provider.detect()).resolves.toBe(false);\n });\n\n it('should return false if not authenticated', async () => {\n (child_process.execSync as jest.Mock).mockReturnValue(undefined);\n (fs.existsSync as jest.Mock).mockReturnValue(true);\n (child_process.spawnSync as jest.Mock).mockReturnValue({\n stdout: 'Log in to Vercel',\n stderr: '',\n status: 0,\n });\n await expect(provider.detect()).resolves.toBe(false);\n });\n\n it('should return false if env var already exists', async () => {\n const stdinMock = { write: jest.fn(), end: jest.fn() };\n let closeCallback: ((code: number) => void) | undefined;\n const onMock = jest.fn((event, cb) => {\n if (event === 'close') closeCallback = cb;\n });\n\n // Simulate a process with a writable stderr stream\n let stderrListener: ((data: Buffer | string) => void) | undefined;\n const stderr = {\n on: jest.fn((event, cb) => {\n if (event === 'data') stderrListener = cb;\n }),\n };\n\n (child_process.spawn as jest.Mock).mockReturnValue({\n stdin: stdinMock,\n on: onMock,\n stderr,\n });\n\n const uploadPromise = provider.uploadEnvVars({ FOO: 'bar' });\n\n // Simulate \"already exists\" error on stderr, then process close\n stderrListener && stderrListener('already exists');\n closeCallback && closeCallback(1);\n\n await expect(uploadPromise).resolves.toEqual({ FOO: false });\n });\n\n it('should attempt to upload environment variables', async () => {\n (child_process.spawn as jest.Mock).mockReturnValue({});\n\n await provider.uploadEnvVars({ FOO: 'bar' });\n\n expect(child_process.spawn).toHaveBeenCalledWith(\n 'vercel',\n ['env', 'add', 'FOO', 'production'],\n expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }),\n );\n });\n});\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EnvironmentProvider } from '../EnvironmentProvider';
|
|
2
|
+
import type { WizardOptions } from '../../../utils/types';
|
|
3
|
+
export declare class VercelEnvironmentProvider extends EnvironmentProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
environments: string[];
|
|
6
|
+
constructor(options: WizardOptions);
|
|
7
|
+
detect(): Promise<boolean>;
|
|
8
|
+
hasDotVercelDir(): boolean;
|
|
9
|
+
hasVercelCli(): boolean;
|
|
10
|
+
isProjectLinked(): boolean;
|
|
11
|
+
isAuthenticated(): boolean;
|
|
12
|
+
uploadEnvironmentVariable(key: string, value: string, environment: string): Promise<void>;
|
|
13
|
+
uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
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.VercelEnvironmentProvider = void 0;
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
const EnvironmentProvider_1 = require("../EnvironmentProvider");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const clack_1 = __importDefault(require("../../../utils/clack"));
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const analytics_1 = require("../../../utils/analytics");
|
|
47
|
+
class VercelEnvironmentProvider extends EnvironmentProvider_1.EnvironmentProvider {
|
|
48
|
+
name = 'Vercel';
|
|
49
|
+
environments = ['production', 'preview', 'development'];
|
|
50
|
+
constructor(options) {
|
|
51
|
+
super(options);
|
|
52
|
+
}
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
54
|
+
async detect() {
|
|
55
|
+
const vercelDetected = this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();
|
|
56
|
+
analytics_1.analytics.setTag('vercel-detected', vercelDetected);
|
|
57
|
+
return vercelDetected;
|
|
58
|
+
}
|
|
59
|
+
hasDotVercelDir() {
|
|
60
|
+
const dotVercelDir = path.join(this.options.installDir, '.vercel');
|
|
61
|
+
return fs.existsSync(dotVercelDir);
|
|
62
|
+
}
|
|
63
|
+
hasVercelCli() {
|
|
64
|
+
try {
|
|
65
|
+
(0, child_process_1.execSync)('vercel --version', { stdio: 'ignore' });
|
|
66
|
+
analytics_1.analytics.setTag('vercel-cli-installed', true);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
analytics_1.analytics.setTag('vercel-cli-installed', false);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
isProjectLinked() {
|
|
75
|
+
const isProjectLinked = fs.existsSync(path.join(this.options.installDir, '.vercel', 'project.json'));
|
|
76
|
+
analytics_1.analytics.setTag('vercel-project-linked', isProjectLinked);
|
|
77
|
+
return isProjectLinked;
|
|
78
|
+
}
|
|
79
|
+
isAuthenticated() {
|
|
80
|
+
const result = (0, child_process_1.spawnSync)('vercel', ['whoami'], {
|
|
81
|
+
encoding: 'utf-8',
|
|
82
|
+
stdio: ['pipe', 'pipe', 'pipe'], // suppress prompts
|
|
83
|
+
env: {
|
|
84
|
+
...process.env,
|
|
85
|
+
FORCE_COLOR: '0', // avoid ANSI formatting
|
|
86
|
+
CI: '1', // hint to CLI that it's a non-interactive env
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
const output = (result.stdout + result.stderr).toLowerCase();
|
|
90
|
+
if (output.includes('log in to vercel') ||
|
|
91
|
+
output.includes('vercel login') ||
|
|
92
|
+
result.status !== 0) {
|
|
93
|
+
analytics_1.analytics.setTag('vercel-authenticated', false);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
analytics_1.analytics.setTag('vercel-authenticated', true);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
async uploadEnvironmentVariable(key, value, environment) {
|
|
100
|
+
await new Promise((resolve, reject) => {
|
|
101
|
+
const proc = (0, child_process_1.spawn)('vercel', ['env', 'add', key, environment], {
|
|
102
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
103
|
+
});
|
|
104
|
+
let stderr = '';
|
|
105
|
+
proc.stderr.on('data', (data) => {
|
|
106
|
+
stderr += data.toString();
|
|
107
|
+
});
|
|
108
|
+
proc.stdin.write(value + '\n');
|
|
109
|
+
proc.stdin.end();
|
|
110
|
+
proc.on('close', (code) => {
|
|
111
|
+
if (stderr.includes('already exists') ||
|
|
112
|
+
stderr.includes('already been added') ||
|
|
113
|
+
stderr.includes('vercel env rm')) {
|
|
114
|
+
reject(new Error(`❌ Environment variable ${chalk_1.default.cyan(key)} already exists in ${this.name}. Please upload it manually.`));
|
|
115
|
+
}
|
|
116
|
+
else if (code === 0) {
|
|
117
|
+
resolve();
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
reject(new Error(`❌ Failed to upload environment variable ${chalk_1.default.cyan(key)} to ${this.name}. Please upload it manually.`));
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async uploadEnvVars(vars) {
|
|
126
|
+
const results = {};
|
|
127
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
128
|
+
const spinner = clack_1.default.spinner();
|
|
129
|
+
spinner.start(`Uploading ${chalk_1.default.cyan(key)} to ${this.name}...`);
|
|
130
|
+
await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))
|
|
131
|
+
.then(() => {
|
|
132
|
+
spinner.stop(`✅ Uploaded ${chalk_1.default.cyan(key)} to ${this.name}`);
|
|
133
|
+
results[key] = true;
|
|
134
|
+
})
|
|
135
|
+
.catch((err) => {
|
|
136
|
+
spinner.stop(err instanceof Error
|
|
137
|
+
? err.message
|
|
138
|
+
: `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`);
|
|
139
|
+
results[key] = false;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return results;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.VercelEnvironmentProvider = VercelEnvironmentProvider;
|
|
146
|
+
//# sourceMappingURL=vercel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../../../../src/steps/upload-environment-variables/providers/vercel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA2D;AAC3D,gEAA6D;AAC7D,uCAAyB;AACzB,2CAA6B;AAE7B,iEAAyC;AACzC,kDAA0B;AAC1B,wDAAqD;AAErD,MAAa,yBAA0B,SAAQ,yCAAmB;IAChE,IAAI,GAAG,QAAQ,CAAC;IAChB,YAAY,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IAExD,YAAY,OAAsB;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,MAAM;QACV,MAAM,cAAc,GAClB,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAE1E,qBAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;QAEpD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,eAAe;QACb,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;IAED,YAAY;QACV,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,qBAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,qBAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,CAC9D,CAAC;QAEF,qBAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;QAE3D,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,eAAe;QACb,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE;YAC7C,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB;YACpD,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,WAAW,EAAE,GAAG,EAAE,wBAAwB;gBAC1C,EAAE,EAAE,GAAG,EAAE,8CAA8C;aACxD;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAE7D,IACE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC/B,MAAM,CAAC,MAAM,KAAK,CAAC,EACnB,CAAC;YACD,qBAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qBAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QAE/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,yBAAyB,CAC7B,GAAW,EACX,KAAa,EACb,WAAmB;QAEnB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE;gBAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAEjB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IACE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oBACjC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC;oBACrC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAChC,CAAC;oBACD,MAAM,CACJ,IAAI,KAAK,CACP,0BAA0B,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,sBACvC,IAAI,CAAC,IACP,8BAA8B,CAC/B,CACF,CAAC;gBACJ,CAAC;qBAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACtB,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CACJ,IAAI,KAAK,CACP,2CAA2C,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OACxD,IAAI,CAAC,IACP,8BAA8B,CAC/B,CACF,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,IAA4B;QAE5B,MAAM,OAAO,GAA4B,EAAE,CAAC;QAE5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,eAAK,CAAC,OAAO,EAAE,CAAC;YAEhC,OAAO,CAAC,KAAK,CAAC,aAAa,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;YACjE,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CACpC,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,CACxD,CACF;iBACE,IAAI,CAAC,GAAG,EAAE;gBACT,OAAO,CAAC,IAAI,CAAC,cAAc,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACtB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,OAAO,CAAC,IAAI,CACV,GAAG,YAAY,KAAK;oBAClB,CAAC,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC,+CAA+C,IAAI,CAAC,IAAI,8BAA8B,CAC3F,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACvB,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAnJD,8DAmJC","sourcesContent":["import { execSync, spawn, spawnSync } from 'child_process';\nimport { EnvironmentProvider } from '../EnvironmentProvider';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { WizardOptions } from '../../../utils/types';\nimport clack from '../../../utils/clack';\nimport chalk from 'chalk';\nimport { analytics } from '../../../utils/analytics';\n\nexport class VercelEnvironmentProvider extends EnvironmentProvider {\n name = 'Vercel';\n environments = ['production', 'preview', 'development'];\n\n constructor(options: WizardOptions) {\n super(options);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async detect(): Promise<boolean> {\n const vercelDetected =\n this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();\n\n analytics.setTag('vercel-detected', vercelDetected);\n\n return vercelDetected;\n }\n\n hasDotVercelDir(): boolean {\n const dotVercelDir = path.join(this.options.installDir, '.vercel');\n return fs.existsSync(dotVercelDir);\n }\n\n hasVercelCli(): boolean {\n try {\n execSync('vercel --version', { stdio: 'ignore' });\n analytics.setTag('vercel-cli-installed', true);\n return true;\n } catch {\n analytics.setTag('vercel-cli-installed', false);\n return false;\n }\n }\n\n isProjectLinked(): boolean {\n const isProjectLinked = fs.existsSync(\n path.join(this.options.installDir, '.vercel', 'project.json'),\n );\n\n analytics.setTag('vercel-project-linked', isProjectLinked);\n\n return isProjectLinked;\n }\n\n isAuthenticated(): boolean {\n const result = spawnSync('vercel', ['whoami'], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'], // suppress prompts\n env: {\n ...process.env,\n FORCE_COLOR: '0', // avoid ANSI formatting\n CI: '1', // hint to CLI that it's a non-interactive env\n },\n });\n\n const output = (result.stdout + result.stderr).toLowerCase();\n\n if (\n output.includes('log in to vercel') ||\n output.includes('vercel login') ||\n result.status !== 0\n ) {\n analytics.setTag('vercel-authenticated', false);\n return false;\n }\n\n analytics.setTag('vercel-authenticated', true);\n\n return true;\n }\n\n async uploadEnvironmentVariable(\n key: string,\n value: string,\n environment: string,\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('vercel', ['env', 'add', key, environment], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stderr = '';\n proc.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.stdin.write(value + '\\n');\n proc.stdin.end();\n\n proc.on('close', (code) => {\n if (\n stderr.includes('already exists') ||\n stderr.includes('already been added') ||\n stderr.includes('vercel env rm')\n ) {\n reject(\n new Error(\n `❌ Environment variable ${chalk.cyan(key)} already exists in ${\n this.name\n }. Please upload it manually.`,\n ),\n );\n } else if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `❌ Failed to upload environment variable ${chalk.cyan(key)} to ${\n this.name\n }. Please upload it manually.`,\n ),\n );\n }\n });\n });\n }\n\n async uploadEnvVars(\n vars: Record<string, string>,\n ): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n\n for (const [key, value] of Object.entries(vars)) {\n const spinner = clack.spinner();\n\n spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);\n await Promise.all(\n this.environments.map((environment) =>\n this.uploadEnvironmentVariable(key, value, environment),\n ),\n )\n .then(() => {\n spinner.stop(`✅ Uploaded ${chalk.cyan(key)} to ${this.name}`);\n results[key] = true;\n })\n .catch((err) => {\n spinner.stop(\n err instanceof Error\n ? err.message\n : `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`,\n );\n results[key] = false;\n });\n }\n\n return results;\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
|