@sentry/wizard 3.35.0 → 3.37.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/CHANGELOG.md +12 -0
- package/dist/e2e-tests/tests/nuxt-3.test.js +45 -25
- package/dist/e2e-tests/tests/nuxt-3.test.js.map +1 -1
- package/dist/e2e-tests/tests/nuxt-4.test.js +45 -25
- package/dist/e2e-tests/tests/nuxt-4.test.js.map +1 -1
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/src/android/templates.js +1 -1
- package/dist/src/android/templates.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +36 -23
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/nuxt/sdk-setup.d.ts +8 -1
- package/dist/src/nuxt/sdk-setup.js +149 -35
- package/dist/src/nuxt/sdk-setup.js.map +1 -1
- package/dist/src/nuxt/templates.d.ts +1 -1
- package/dist/src/nuxt/templates.js +5 -3
- package/dist/src/nuxt/templates.js.map +1 -1
- package/dist/src/nuxt/types.d.ts +2 -0
- package/dist/src/nuxt/types.js +10 -0
- package/dist/src/nuxt/types.js.map +1 -0
- package/dist/src/nuxt/utils.js +42 -6
- package/dist/src/nuxt/utils.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +9 -1
- package/dist/src/utils/clack-utils.js +81 -23
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/package-json.d.ts +5 -0
- package/dist/src/utils/package-json.js.map +1 -1
- package/dist/src/utils/package-manager.d.ts +1 -0
- package/dist/src/utils/package-manager.js +129 -0
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/test/nuxt/templates.test.js +10 -1
- package/dist/test/nuxt/templates.test.js.map +1 -1
- package/e2e-tests/test-applications/nuxt-4-test-app/README.md +75 -0
- package/e2e-tests/test-applications/nuxt-4-test-app/nuxt.config.ts +6 -0
- package/e2e-tests/test-applications/nuxt-4-test-app/package.json +18 -0
- package/e2e-tests/test-applications/nuxt-4-test-app/public/favicon.ico +0 -0
- package/e2e-tests/test-applications/nuxt-4-test-app/public/robots.txt +1 -0
- package/e2e-tests/tests/nuxt-3.test.ts +23 -3
- package/e2e-tests/tests/nuxt-4.test.ts +22 -2
- package/e2e-tests/utils/index.ts +4 -1
- package/package.json +1 -1
- package/src/android/templates.ts +0 -2
- package/src/nuxt/nuxt-wizard.ts +23 -5
- package/src/nuxt/sdk-setup.ts +166 -30
- package/src/nuxt/templates.ts +15 -8
- package/src/nuxt/types.ts +8 -0
- package/src/nuxt/utils.ts +17 -7
- package/src/utils/clack-utils.ts +55 -6
- package/src/utils/package-json.ts +5 -0
- package/src/utils/package-manager.ts +66 -0
- package/test/nuxt/templates.test.ts +33 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/utils/package-json.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../../src/utils/package-json.ts"],"names":[],"mappings":";;;AAiBA;;;;;GAKG;AACH,SAAgB,4BAA4B,CAC1C,gBAA0B,EAC1B,WAA2B;IAE3B,OAAO,gBAAgB;SACpB,GAAG,CAAC,UAAC,WAAW,IAAK,OAAA,CAAC;QACrB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC;KACrD,CAAC,EAHoB,CAGpB,CAAC;SACF,IAAI,CAAC,UAAC,UAAU,IAA+B,OAAA,CAAC,CAAC,UAAU,CAAC,OAAO,EAApB,CAAoB,CAAC,CAAC;AAC1E,CAAC;AAVD,oEAUC;AAED,SAAgB,mBAAmB,CACjC,WAAmB,EACnB,WAA2B;IAE3B,OAAO,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,KAAK,SAAS,CAAC;AACnE,CAAC;AALD,kDAKC;AAED,SAAgB,iBAAiB,CAC/B,WAAmB,EACnB,WAA2B;;IAE3B,OAAO,CACL,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,0CAAG,WAAW,CAAC;SACxC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,0CAAG,WAAW,CAAC,CAAA,CAC5C,CAAC;AACJ,CAAC;AARD,8CAQC","sourcesContent":["export type PackageDotJson = {\n version?: string;\n scripts?: Record<string, string | undefined>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n resolutions?: Record<string, string>;\n overrides?: Record<string, string>;\n pnpm?: {\n overrides?: Record<string, string>;\n };\n};\n\ntype NpmPackage = {\n name: string;\n version: string;\n};\n\n/**\n * Checks if @param packageJson has any of the @param packageNamesList package names\n * listed as a dependency or devDependency.\n * If so, it returns the first package name that is found, including the\n * version (range) specified in the package.json.\n */\nexport function findInstalledPackageFromList(\n packageNamesList: string[],\n packageJson: PackageDotJson,\n): NpmPackage | undefined {\n return packageNamesList\n .map((packageName) => ({\n name: packageName,\n version: getPackageVersion(packageName, packageJson),\n }))\n .find((sdkPackage): sdkPackage is NpmPackage => !!sdkPackage.version);\n}\n\nexport function hasPackageInstalled(\n packageName: string,\n packageJson: PackageDotJson,\n): boolean {\n return getPackageVersion(packageName, packageJson) !== undefined;\n}\n\nexport function getPackageVersion(\n packageName: string,\n packageJson: PackageDotJson,\n): string | undefined {\n return (\n packageJson?.dependencies?.[packageName] ||\n packageJson?.devDependencies?.[packageName]\n );\n}\n"]}
|
|
@@ -7,6 +7,7 @@ export interface PackageManager {
|
|
|
7
7
|
runScriptCommand: string;
|
|
8
8
|
flags: string;
|
|
9
9
|
detect: () => boolean;
|
|
10
|
+
addOverride: (pkgName: string, pkgVersion: string) => Promise<void>;
|
|
10
11
|
}
|
|
11
12
|
export declare const BUN: PackageManager;
|
|
12
13
|
export declare const YARN_V1: PackageManager;
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
2
13
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
14
|
if (k2 === undefined) k2 = k;
|
|
4
15
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -22,6 +33,42 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
33
|
__setModuleDefault(result, mod);
|
|
23
34
|
return result;
|
|
24
35
|
};
|
|
36
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
47
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
+
function step(op) {
|
|
50
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
52
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
53
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
+
switch (op[0]) {
|
|
55
|
+
case 0: case 1: t = op; break;
|
|
56
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
+
default:
|
|
60
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
+
if (t[2]) _.ops.pop();
|
|
65
|
+
_.trys.pop(); continue;
|
|
66
|
+
}
|
|
67
|
+
op = body.call(thisArg, _);
|
|
68
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
+
}
|
|
71
|
+
};
|
|
25
72
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
73
|
exports.detectPackageManger = exports.packageManagers = exports.NPM = exports.PNPM = exports.YARN_V2 = exports.YARN_V1 = exports.BUN = void 0;
|
|
27
74
|
/* eslint-disable @typescript-eslint/typedef */
|
|
@@ -29,6 +76,7 @@ var fs = __importStar(require("fs"));
|
|
|
29
76
|
var path = __importStar(require("path"));
|
|
30
77
|
var Sentry = __importStar(require("@sentry/node"));
|
|
31
78
|
var telemetry_1 = require("../telemetry");
|
|
79
|
+
var clack_utils_1 = require("./clack-utils");
|
|
32
80
|
exports.BUN = {
|
|
33
81
|
name: 'bun',
|
|
34
82
|
label: 'Bun',
|
|
@@ -38,6 +86,22 @@ exports.BUN = {
|
|
|
38
86
|
runScriptCommand: 'bun run',
|
|
39
87
|
flags: '',
|
|
40
88
|
detect: function () { return fs.existsSync(path.join(process.cwd(), exports.BUN.lockFile)); },
|
|
89
|
+
addOverride: function (pkgName, pkgVersion) { return __awaiter(void 0, void 0, void 0, function () {
|
|
90
|
+
var packageDotJson, overrides;
|
|
91
|
+
var _a;
|
|
92
|
+
return __generator(this, function (_b) {
|
|
93
|
+
switch (_b.label) {
|
|
94
|
+
case 0: return [4 /*yield*/, (0, clack_utils_1.getPackageDotJson)()];
|
|
95
|
+
case 1:
|
|
96
|
+
packageDotJson = _b.sent();
|
|
97
|
+
overrides = packageDotJson.overrides || {};
|
|
98
|
+
return [4 /*yield*/, (0, clack_utils_1.updatePackageDotJson)(__assign(__assign({}, packageDotJson), { overrides: __assign(__assign({}, overrides), (_a = {}, _a[pkgName] = pkgVersion, _a)) }))];
|
|
99
|
+
case 2:
|
|
100
|
+
_b.sent();
|
|
101
|
+
return [2 /*return*/];
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}); },
|
|
41
105
|
};
|
|
42
106
|
exports.YARN_V1 = {
|
|
43
107
|
name: 'yarn',
|
|
@@ -58,6 +122,22 @@ exports.YARN_V1 = {
|
|
|
58
122
|
return false;
|
|
59
123
|
}
|
|
60
124
|
},
|
|
125
|
+
addOverride: function (pkgName, pkgVersion) { return __awaiter(void 0, void 0, void 0, function () {
|
|
126
|
+
var packageDotJson, resolutions;
|
|
127
|
+
var _a;
|
|
128
|
+
return __generator(this, function (_b) {
|
|
129
|
+
switch (_b.label) {
|
|
130
|
+
case 0: return [4 /*yield*/, (0, clack_utils_1.getPackageDotJson)()];
|
|
131
|
+
case 1:
|
|
132
|
+
packageDotJson = _b.sent();
|
|
133
|
+
resolutions = packageDotJson.resolutions || {};
|
|
134
|
+
return [4 /*yield*/, (0, clack_utils_1.updatePackageDotJson)(__assign(__assign({}, packageDotJson), { resolutions: __assign(__assign({}, resolutions), (_a = {}, _a[pkgName] = pkgVersion, _a)) }))];
|
|
135
|
+
case 2:
|
|
136
|
+
_b.sent();
|
|
137
|
+
return [2 /*return*/];
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}); },
|
|
61
141
|
};
|
|
62
142
|
/** YARN V2/3/4 */
|
|
63
143
|
exports.YARN_V2 = {
|
|
@@ -79,6 +159,22 @@ exports.YARN_V2 = {
|
|
|
79
159
|
return false;
|
|
80
160
|
}
|
|
81
161
|
},
|
|
162
|
+
addOverride: function (pkgName, pkgVersion) { return __awaiter(void 0, void 0, void 0, function () {
|
|
163
|
+
var packageDotJson, resolutions;
|
|
164
|
+
var _a;
|
|
165
|
+
return __generator(this, function (_b) {
|
|
166
|
+
switch (_b.label) {
|
|
167
|
+
case 0: return [4 /*yield*/, (0, clack_utils_1.getPackageDotJson)()];
|
|
168
|
+
case 1:
|
|
169
|
+
packageDotJson = _b.sent();
|
|
170
|
+
resolutions = packageDotJson.resolutions || {};
|
|
171
|
+
return [4 /*yield*/, (0, clack_utils_1.updatePackageDotJson)(__assign(__assign({}, packageDotJson), { resolutions: __assign(__assign({}, resolutions), (_a = {}, _a[pkgName] = pkgVersion, _a)) }))];
|
|
172
|
+
case 2:
|
|
173
|
+
_b.sent();
|
|
174
|
+
return [2 /*return*/];
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}); },
|
|
82
178
|
};
|
|
83
179
|
exports.PNPM = {
|
|
84
180
|
name: 'pnpm',
|
|
@@ -89,6 +185,23 @@ exports.PNPM = {
|
|
|
89
185
|
runScriptCommand: 'pnpm',
|
|
90
186
|
flags: '--ignore-workspace-root-check',
|
|
91
187
|
detect: function () { return fs.existsSync(path.join(process.cwd(), exports.PNPM.lockFile)); },
|
|
188
|
+
addOverride: function (pkgName, pkgVersion) { return __awaiter(void 0, void 0, void 0, function () {
|
|
189
|
+
var packageDotJson, pnpm, overrides;
|
|
190
|
+
var _a;
|
|
191
|
+
return __generator(this, function (_b) {
|
|
192
|
+
switch (_b.label) {
|
|
193
|
+
case 0: return [4 /*yield*/, (0, clack_utils_1.getPackageDotJson)()];
|
|
194
|
+
case 1:
|
|
195
|
+
packageDotJson = _b.sent();
|
|
196
|
+
pnpm = packageDotJson.pnpm || {};
|
|
197
|
+
overrides = pnpm.overrides || {};
|
|
198
|
+
return [4 /*yield*/, (0, clack_utils_1.updatePackageDotJson)(__assign(__assign({}, packageDotJson), { pnpm: __assign(__assign({}, pnpm), { overrides: __assign(__assign({}, overrides), (_a = {}, _a[pkgName] = pkgVersion, _a)) }) }))];
|
|
199
|
+
case 2:
|
|
200
|
+
_b.sent();
|
|
201
|
+
return [2 /*return*/];
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}); },
|
|
92
205
|
};
|
|
93
206
|
exports.NPM = {
|
|
94
207
|
name: 'npm',
|
|
@@ -99,6 +212,22 @@ exports.NPM = {
|
|
|
99
212
|
runScriptCommand: 'npm run',
|
|
100
213
|
flags: '',
|
|
101
214
|
detect: function () { return fs.existsSync(path.join(process.cwd(), exports.NPM.lockFile)); },
|
|
215
|
+
addOverride: function (pkgName, pkgVersion) { return __awaiter(void 0, void 0, void 0, function () {
|
|
216
|
+
var packageDotJson, overrides;
|
|
217
|
+
var _a;
|
|
218
|
+
return __generator(this, function (_b) {
|
|
219
|
+
switch (_b.label) {
|
|
220
|
+
case 0: return [4 /*yield*/, (0, clack_utils_1.getPackageDotJson)()];
|
|
221
|
+
case 1:
|
|
222
|
+
packageDotJson = _b.sent();
|
|
223
|
+
overrides = packageDotJson.overrides || {};
|
|
224
|
+
return [4 /*yield*/, (0, clack_utils_1.updatePackageDotJson)(__assign(__assign({}, packageDotJson), { overrides: __assign(__assign({}, overrides), (_a = {}, _a[pkgName] = pkgVersion, _a)) }))];
|
|
225
|
+
case 2:
|
|
226
|
+
_b.sent();
|
|
227
|
+
return [2 /*return*/];
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}); },
|
|
102
231
|
};
|
|
103
232
|
exports.packageManagers = [exports.BUN, exports.YARN_V1, exports.YARN_V2, exports.PNPM, exports.NPM];
|
|
104
233
|
function detectPackageManger() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../../src/utils/package-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../../src/utils/package-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/typedef */\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport * as Sentry from '@sentry/node';\nimport { traceStep } from '../telemetry';\nimport { getPackageDotJson, updatePackageDotJson } from './clack-utils';\n\nexport interface PackageManager {\n name: string;\n label: string;\n lockFile: string;\n installCommand: string;\n buildCommand: string;\n /* The command that the package manager uses to run a script from package.json */\n runScriptCommand: string;\n flags: string;\n detect: () => boolean;\n addOverride: (pkgName: string, pkgVersion: string) => Promise<void>;\n}\n\nexport const BUN: PackageManager = {\n name: 'bun',\n label: 'Bun',\n lockFile: 'bun.lockb',\n installCommand: 'bun add',\n buildCommand: 'bun run build',\n runScriptCommand: 'bun run',\n flags: '',\n detect: () => fs.existsSync(path.join(process.cwd(), BUN.lockFile)),\n addOverride: async (pkgName, pkgVersion): Promise<void> => {\n const packageDotJson = await getPackageDotJson();\n const overrides = packageDotJson.overrides || {};\n\n await updatePackageDotJson({\n ...packageDotJson,\n overrides: {\n ...overrides,\n [pkgName]: pkgVersion,\n },\n });\n },\n};\nexport const YARN_V1: PackageManager = {\n name: 'yarn',\n label: 'Yarn V1',\n lockFile: 'yarn.lock',\n installCommand: 'yarn add',\n buildCommand: 'yarn build',\n runScriptCommand: 'yarn',\n flags: '--ignore-workspace-root-check',\n detect: () => {\n try {\n return fs\n .readFileSync(path.join(process.cwd(), YARN_V1.lockFile), 'utf-8')\n .slice(0, 500)\n .includes('yarn lockfile v1');\n } catch (e) {\n return false;\n }\n },\n addOverride: async (pkgName, pkgVersion): Promise<void> => {\n const packageDotJson = await getPackageDotJson();\n const resolutions = packageDotJson.resolutions || {};\n\n await updatePackageDotJson({\n ...packageDotJson,\n resolutions: {\n ...resolutions,\n [pkgName]: pkgVersion,\n },\n });\n },\n};\n/** YARN V2/3/4 */\nexport const YARN_V2: PackageManager = {\n name: 'yarn',\n label: 'Yarn V2/3/4',\n lockFile: 'yarn.lock',\n installCommand: 'yarn add',\n buildCommand: 'yarn build',\n runScriptCommand: 'yarn',\n flags: '',\n detect: () => {\n try {\n return fs\n .readFileSync(path.join(process.cwd(), YARN_V2.lockFile), 'utf-8')\n .slice(0, 500)\n .includes('__metadata');\n } catch (e) {\n return false;\n }\n },\n addOverride: async (pkgName, pkgVersion): Promise<void> => {\n const packageDotJson = await getPackageDotJson();\n const resolutions = packageDotJson.resolutions || {};\n\n await updatePackageDotJson({\n ...packageDotJson,\n resolutions: {\n ...resolutions,\n [pkgName]: pkgVersion,\n },\n });\n },\n};\nexport const PNPM: PackageManager = {\n name: 'pnpm',\n label: 'PNPM',\n lockFile: 'pnpm-lock.yaml',\n installCommand: 'pnpm add',\n buildCommand: 'pnpm build',\n runScriptCommand: 'pnpm',\n flags: '--ignore-workspace-root-check',\n detect: () => fs.existsSync(path.join(process.cwd(), PNPM.lockFile)),\n addOverride: async (pkgName, pkgVersion): Promise<void> => {\n const packageDotJson = await getPackageDotJson();\n const pnpm = packageDotJson.pnpm || {};\n const overrides = pnpm.overrides || {};\n\n await updatePackageDotJson({\n ...packageDotJson,\n pnpm: {\n ...pnpm,\n overrides: {\n ...overrides,\n [pkgName]: pkgVersion,\n },\n },\n });\n },\n};\nexport const NPM: PackageManager = {\n name: 'npm',\n label: 'NPM',\n lockFile: 'package-lock.json',\n installCommand: 'npm add',\n buildCommand: 'npm run build',\n runScriptCommand: 'npm run',\n flags: '',\n detect: () => fs.existsSync(path.join(process.cwd(), NPM.lockFile)),\n addOverride: async (pkgName, pkgVersion): Promise<void> => {\n const packageDotJson = await getPackageDotJson();\n const overrides = packageDotJson.overrides || {};\n\n await updatePackageDotJson({\n ...packageDotJson,\n overrides: {\n ...overrides,\n [pkgName]: pkgVersion,\n },\n });\n },\n};\n\nexport const packageManagers = [BUN, YARN_V1, YARN_V2, PNPM, NPM];\n\nexport function detectPackageManger(): PackageManager | null {\n return traceStep('detect-package-manager', () => {\n for (const packageManager of packageManagers) {\n if (packageManager.detect()) {\n Sentry.setTag('package-manager', packageManager.name);\n return packageManager;\n }\n }\n Sentry.setTag('package-manager', 'not-detected');\n return null;\n });\n}\n"]}
|
|
@@ -62,9 +62,18 @@ describe('Nuxt code templates', function () {
|
|
|
62
62
|
project: 'my-project',
|
|
63
63
|
url: 'https://sentry.io',
|
|
64
64
|
selfHosted: false,
|
|
65
|
-
});
|
|
65
|
+
}, false);
|
|
66
66
|
expect(template).toMatchInlineSnapshot("\n \" modules: [\"@sentry/nuxt/module\"],\n sentry: {\n sourceMapsUploadOptions: {\n org: \"my-org\",\n project: \"my-project\",\n },\n },\n sourcemap: { client: \"hidden\" },\"\n ");
|
|
67
67
|
});
|
|
68
|
+
it('generates configuration options for the nuxt config with top level import', function () {
|
|
69
|
+
var template = (0, templates_1.getNuxtModuleFallbackTemplate)({
|
|
70
|
+
org: 'my-org',
|
|
71
|
+
project: 'my-project',
|
|
72
|
+
url: 'https://sentry.io',
|
|
73
|
+
selfHosted: false,
|
|
74
|
+
}, true);
|
|
75
|
+
expect(template).toMatchInlineSnapshot("\n \" modules: [\"@sentry/nuxt/module\"],\n sentry: {\n sourceMapsUploadOptions: {\n org: \"my-org\",\n project: \"my-project\",\n },\n autoInjectServerSentry: \"top-level-import\",\n },\n sourcemap: { client: \"hidden\" },\"\n ");
|
|
76
|
+
});
|
|
68
77
|
});
|
|
69
78
|
});
|
|
70
79
|
//# sourceMappingURL=templates.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/nuxt/templates.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDefaultNuxtConfig,\n getNuxtModuleFallbackTemplate,\n getSentryConfigContents,\n} from '../../src/nuxt/templates';\n\ndescribe('Nuxt code templates', () => {\n describe('getDefaultNuxtConfig', () => {\n it('returns a default nuxt config', () => {\n expect(getDefaultNuxtConfig()).toMatchInlineSnapshot(`\n \"// https://nuxt.com/docs/api/configuration/nuxt-config\n export default defineNuxtConfig({\n compatibilityDate: '2024-04-03',\n devtools: { enabled: true }\n })\n \"\n`);\n });\n });\n\n describe('getSentryConfigContents', () => {\n describe('client config', () => {\n it('generates Sentry config with all features enabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: true,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n\n // We recommend adjusting this value in production, or using tracesSampler\n // for finer control\n tracesSampleRate: 1.0,\n\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n \n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n \n // If you don't want to use Session Replay, just remove the line below:\n integrations: [Sentry.replayIntegration()],\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with performance monitoring disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: false,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n \n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n \n // If you don't want to use Session Replay, just remove the line below:\n integrations: [Sentry.replayIntegration()],\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with session replay disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: true,\n replay: false,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n\n // We recommend adjusting this value in production, or using tracesSampler\n // for finer control\n tracesSampleRate: 1.0,\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with performance monitoring and session replay disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: false,\n replay: false,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n });\n\n describe('server config', () => {\n it('generates Sentry config with all features enabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'server',\n {\n performance: true,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n \n Sentry.init({\n dsn: \"https://sentry.io/123\",\n\n // We recommend adjusting this value in production, or using tracesSampler\n // for finer control\n tracesSampleRate: 1.0,\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with performance monitoring disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'server',\n {\n performance: false,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n \n Sentry.init({\n dsn: \"https://sentry.io/123\",\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n });\n });\n\n describe('getNuxtModuleFallbackTemplate', () => {\n it('generates configuration options for the nuxt config', () => {\n const template = getNuxtModuleFallbackTemplate({\n org: 'my-org',\n project: 'my-project',\n url: 'https://sentry.io',\n selfHosted: false,\n });\n\n expect(template).toMatchInlineSnapshot(`\n \" modules: [\"@sentry/nuxt/module\"],\n sentry: {\n sourceMapsUploadOptions: {\n org: \"my-org\",\n project: \"my-project\",\n },\n },\n sourcemap: { client: \"hidden\" },\"\n `);\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/nuxt/templates.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getDefaultNuxtConfig,\n getNuxtModuleFallbackTemplate,\n getSentryConfigContents,\n} from '../../src/nuxt/templates';\n\ndescribe('Nuxt code templates', () => {\n describe('getDefaultNuxtConfig', () => {\n it('returns a default nuxt config', () => {\n expect(getDefaultNuxtConfig()).toMatchInlineSnapshot(`\n \"// https://nuxt.com/docs/api/configuration/nuxt-config\n export default defineNuxtConfig({\n compatibilityDate: '2024-04-03',\n devtools: { enabled: true }\n })\n \"\n`);\n });\n });\n\n describe('getSentryConfigContents', () => {\n describe('client config', () => {\n it('generates Sentry config with all features enabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: true,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n\n // We recommend adjusting this value in production, or using tracesSampler\n // for finer control\n tracesSampleRate: 1.0,\n\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n \n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n \n // If you don't want to use Session Replay, just remove the line below:\n integrations: [Sentry.replayIntegration()],\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with performance monitoring disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: false,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n\n // This sets the sample rate to be 10%. You may want this to be 100% while\n // in development and sample at a lower rate in production\n replaysSessionSampleRate: 0.1,\n \n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 1.0,\n \n // If you don't want to use Session Replay, just remove the line below:\n integrations: [Sentry.replayIntegration()],\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with session replay disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: true,\n replay: false,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n\n // We recommend adjusting this value in production, or using tracesSampler\n // for finer control\n tracesSampleRate: 1.0,\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with performance monitoring and session replay disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'client',\n {\n performance: false,\n replay: false,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n\n Sentry.init({\n // If set up, you can use your runtime config here\n // dsn: useRuntimeConfig().public.sentry.dsn,\n dsn: \"https://sentry.io/123\",\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n });\n\n describe('server config', () => {\n it('generates Sentry config with all features enabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'server',\n {\n performance: true,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n \n Sentry.init({\n dsn: \"https://sentry.io/123\",\n\n // We recommend adjusting this value in production, or using tracesSampler\n // for finer control\n tracesSampleRate: 1.0,\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n\n it('generates Sentry config with performance monitoring disabled', () => {\n const template = getSentryConfigContents(\n 'https://sentry.io/123',\n 'server',\n {\n performance: false,\n replay: true,\n },\n );\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from \"@sentry/nuxt\";\n \n Sentry.init({\n dsn: \"https://sentry.io/123\",\n \n // Setting this option to true will print useful information to the console while you're setting up Sentry.\n debug: false,\n });\n \"\n `);\n });\n });\n });\n\n describe('getNuxtModuleFallbackTemplate', () => {\n it('generates configuration options for the nuxt config', () => {\n const template = getNuxtModuleFallbackTemplate(\n {\n org: 'my-org',\n project: 'my-project',\n url: 'https://sentry.io',\n selfHosted: false,\n },\n false,\n );\n\n expect(template).toMatchInlineSnapshot(`\n \" modules: [\"@sentry/nuxt/module\"],\n sentry: {\n sourceMapsUploadOptions: {\n org: \"my-org\",\n project: \"my-project\",\n },\n },\n sourcemap: { client: \"hidden\" },\"\n `);\n });\n\n it('generates configuration options for the nuxt config with top level import', () => {\n const template = getNuxtModuleFallbackTemplate(\n {\n org: 'my-org',\n project: 'my-project',\n url: 'https://sentry.io',\n selfHosted: false,\n },\n true,\n );\n\n expect(template).toMatchInlineSnapshot(`\n \" modules: [\"@sentry/nuxt/module\"],\n sentry: {\n sourceMapsUploadOptions: {\n org: \"my-org\",\n project: \"my-project\",\n },\n autoInjectServerSentry: \"top-level-import\",\n },\n sourcemap: { client: \"hidden\" },\"\n `);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Nuxt Minimal Starter
|
|
2
|
+
|
|
3
|
+
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
Make sure to install dependencies:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# npm
|
|
11
|
+
npm install
|
|
12
|
+
|
|
13
|
+
# pnpm
|
|
14
|
+
pnpm install
|
|
15
|
+
|
|
16
|
+
# yarn
|
|
17
|
+
yarn install
|
|
18
|
+
|
|
19
|
+
# bun
|
|
20
|
+
bun install
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Development Server
|
|
24
|
+
|
|
25
|
+
Start the development server on `http://localhost:3000`:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# npm
|
|
29
|
+
npm run dev
|
|
30
|
+
|
|
31
|
+
# pnpm
|
|
32
|
+
pnpm dev
|
|
33
|
+
|
|
34
|
+
# yarn
|
|
35
|
+
yarn dev
|
|
36
|
+
|
|
37
|
+
# bun
|
|
38
|
+
bun run dev
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Production
|
|
42
|
+
|
|
43
|
+
Build the application for production:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# npm
|
|
47
|
+
npm run build
|
|
48
|
+
|
|
49
|
+
# pnpm
|
|
50
|
+
pnpm build
|
|
51
|
+
|
|
52
|
+
# yarn
|
|
53
|
+
yarn build
|
|
54
|
+
|
|
55
|
+
# bun
|
|
56
|
+
bun run build
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Locally preview production build:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# npm
|
|
63
|
+
npm run preview
|
|
64
|
+
|
|
65
|
+
# pnpm
|
|
66
|
+
pnpm preview
|
|
67
|
+
|
|
68
|
+
# yarn
|
|
69
|
+
yarn preview
|
|
70
|
+
|
|
71
|
+
# bun
|
|
72
|
+
bun run preview
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nuxt-4-app",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "nuxt build",
|
|
7
|
+
"dev": "nuxt dev",
|
|
8
|
+
"generate": "nuxt generate",
|
|
9
|
+
"preview": "nuxt preview",
|
|
10
|
+
"postinstall": "nuxt prepare",
|
|
11
|
+
"start": "node .output/server/index.mjs"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"nuxt": "^3.14.1592",
|
|
15
|
+
"vue": "latest",
|
|
16
|
+
"vue-router": "latest"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -44,13 +44,33 @@ async function runWizardOnNuxtProject(projectDir: string): Promise<void> {
|
|
|
44
44
|
'Please select your package manager.',
|
|
45
45
|
);
|
|
46
46
|
|
|
47
|
-
const
|
|
47
|
+
const nftOverridePrompted =
|
|
48
48
|
packageManagerPrompted &&
|
|
49
49
|
(await wizardInstance.sendStdinAndWaitForOutput(
|
|
50
50
|
// Selecting `yarn` as the package manager
|
|
51
51
|
[KEYS.DOWN, KEYS.ENTER],
|
|
52
|
+
'Do you want to add an override for @vercel/nft version ^0.27.4?',
|
|
53
|
+
{
|
|
54
|
+
timeout: 240_000,
|
|
55
|
+
},
|
|
56
|
+
));
|
|
57
|
+
|
|
58
|
+
const deploymentPlatformPrompted =
|
|
59
|
+
nftOverridePrompted &&
|
|
60
|
+
(await wizardInstance.sendStdinAndWaitForOutput(
|
|
61
|
+
KEYS.ENTER,
|
|
62
|
+
'Please select your deployment platform.',
|
|
63
|
+
{
|
|
64
|
+
timeout: 240_000,
|
|
65
|
+
},
|
|
66
|
+
));
|
|
67
|
+
|
|
68
|
+
const tracingOptionPrompted =
|
|
69
|
+
deploymentPlatformPrompted &&
|
|
70
|
+
(await wizardInstance.sendStdinAndWaitForOutput(
|
|
71
|
+
KEYS.ENTER,
|
|
52
72
|
// "Do you want to enable Tracing", sometimes doesn't work as `Tracing` can be printed in bold.
|
|
53
|
-
'
|
|
73
|
+
'Do you want to enable',
|
|
54
74
|
{
|
|
55
75
|
timeout: 240_000,
|
|
56
76
|
},
|
|
@@ -59,7 +79,7 @@ async function runWizardOnNuxtProject(projectDir: string): Promise<void> {
|
|
|
59
79
|
const replayOptionPrompted =
|
|
60
80
|
tracingOptionPrompted &&
|
|
61
81
|
(await wizardInstance.sendStdinAndWaitForOutput(
|
|
62
|
-
|
|
82
|
+
KEYS.ENTER,
|
|
63
83
|
// "Do you want to enable Sentry Session Replay", sometimes doesn't work as `Sentry Session Replay` can be printed in bold.
|
|
64
84
|
'to get a video-like reproduction of errors during a user session?',
|
|
65
85
|
));
|
|
@@ -43,13 +43,33 @@ async function runWizardOnNuxtProject(projectDir: string): Promise<void> {
|
|
|
43
43
|
'Please select your package manager.',
|
|
44
44
|
);
|
|
45
45
|
|
|
46
|
-
const
|
|
46
|
+
const nftOverridePrompted =
|
|
47
47
|
packageManagerPrompted &&
|
|
48
48
|
(await wizardInstance.sendStdinAndWaitForOutput(
|
|
49
49
|
// Selecting `yarn` as the package manager
|
|
50
50
|
[KEYS.DOWN, KEYS.ENTER],
|
|
51
|
+
'Do you want to add an override for @vercel/nft version ^0.27.4?',
|
|
52
|
+
{
|
|
53
|
+
timeout: 240_000,
|
|
54
|
+
},
|
|
55
|
+
));
|
|
56
|
+
|
|
57
|
+
const deploymentPlatformPrompted =
|
|
58
|
+
nftOverridePrompted &&
|
|
59
|
+
(await wizardInstance.sendStdinAndWaitForOutput(
|
|
60
|
+
KEYS.ENTER,
|
|
61
|
+
'Please select your deployment platform.',
|
|
62
|
+
{
|
|
63
|
+
timeout: 240_000,
|
|
64
|
+
},
|
|
65
|
+
));
|
|
66
|
+
|
|
67
|
+
const tracingOptionPrompted =
|
|
68
|
+
deploymentPlatformPrompted &&
|
|
69
|
+
(await wizardInstance.sendStdinAndWaitForOutput(
|
|
70
|
+
KEYS.ENTER,
|
|
51
71
|
// "Do you want to enable Tracing", sometimes doesn't work as `Tracing` can be printed in bold.
|
|
52
|
-
'
|
|
72
|
+
'Do you want to enable',
|
|
53
73
|
{
|
|
54
74
|
timeout: 240_000,
|
|
55
75
|
},
|
package/e2e-tests/utils/index.ts
CHANGED
|
@@ -243,7 +243,10 @@ export function createFile(filePath: string, content?: string) {
|
|
|
243
243
|
* @param oldContent
|
|
244
244
|
* @param newContent
|
|
245
245
|
*/
|
|
246
|
-
export function modifyFile(
|
|
246
|
+
export function modifyFile(
|
|
247
|
+
filePath: string,
|
|
248
|
+
replaceMap: Record<string, string>,
|
|
249
|
+
) {
|
|
247
250
|
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
248
251
|
let newFileContent = fileContent;
|
|
249
252
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/wizard",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.37.0",
|
|
4
4
|
"homepage": "https://github.com/getsentry/sentry-wizard",
|
|
5
5
|
"repository": "https://github.com/getsentry/sentry-wizard",
|
|
6
6
|
"description": "Sentry wizard helping you to configure your project",
|
package/src/android/templates.ts
CHANGED
|
@@ -33,8 +33,6 @@ export const manifest = (dsn: string) => `
|
|
|
33
33
|
|
|
34
34
|
<!-- enable the performance API by setting a sample-rate, adjust in production env -->
|
|
35
35
|
<meta-data android:name="io.sentry.traces.sample-rate" android:value="1.0" />
|
|
36
|
-
<!-- enable profiling when starting transactions, adjust in production env -->
|
|
37
|
-
<meta-data android:name="io.sentry.traces.profiling.sample-rate" android:value="1.0" />
|
|
38
36
|
`;
|
|
39
37
|
|
|
40
38
|
export const sentryImport = `import io.sentry.Sentry;\n`;
|
package/src/nuxt/nuxt-wizard.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
2
2
|
import * as clack from '@clack/prompts';
|
|
3
3
|
import * as Sentry from '@sentry/node';
|
|
4
|
+
import chalk from 'chalk';
|
|
4
5
|
import { lt, minVersion } from 'semver';
|
|
5
6
|
import type { WizardOptions } from '../utils/types';
|
|
6
7
|
import { traceStep, withTelemetry } from '../telemetry';
|
|
@@ -14,19 +15,26 @@ import {
|
|
|
14
15
|
ensurePackageIsInstalled,
|
|
15
16
|
getOrAskForProjectData,
|
|
16
17
|
getPackageDotJson,
|
|
18
|
+
getPackageManager,
|
|
17
19
|
installPackage,
|
|
18
20
|
printWelcome,
|
|
19
21
|
runPrettierIfInstalled,
|
|
20
22
|
} from '../utils/clack-utils';
|
|
21
23
|
import { getPackageVersion, hasPackageInstalled } from '../utils/package-json';
|
|
22
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
addSDKModule,
|
|
26
|
+
getNuxtConfig,
|
|
27
|
+
createConfigFiles,
|
|
28
|
+
addNuxtOverrides,
|
|
29
|
+
askDeploymentPlatform,
|
|
30
|
+
confirmReadImportDocs,
|
|
31
|
+
} from './sdk-setup';
|
|
23
32
|
import {
|
|
24
33
|
createExampleComponent,
|
|
25
34
|
createExamplePage,
|
|
26
35
|
supportsExamplePage,
|
|
27
36
|
} from './sdk-example';
|
|
28
37
|
import { isNuxtV4 } from './utils';
|
|
29
|
-
import chalk from 'chalk';
|
|
30
38
|
|
|
31
39
|
export function runNuxtWizard(options: WizardOptions) {
|
|
32
40
|
return withTelemetry(
|
|
@@ -85,12 +93,17 @@ export async function runNuxtWizardWithTelemetry(
|
|
|
85
93
|
const { authToken, selectedProject, selfHosted, sentryUrl } =
|
|
86
94
|
await getOrAskForProjectData(options, 'javascript-nuxt');
|
|
87
95
|
|
|
96
|
+
const packageManager = await getPackageManager();
|
|
97
|
+
|
|
98
|
+
await addNuxtOverrides(packageJson, packageManager, minVer);
|
|
99
|
+
|
|
88
100
|
const sdkAlreadyInstalled = hasPackageInstalled('@sentry/nuxt', packageJson);
|
|
89
101
|
Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);
|
|
90
102
|
|
|
91
103
|
await installPackage({
|
|
92
104
|
packageName: '@sentry/nuxt',
|
|
93
105
|
alreadyInstalled: sdkAlreadyInstalled,
|
|
106
|
+
packageManager,
|
|
94
107
|
});
|
|
95
108
|
|
|
96
109
|
await addDotEnvSentryBuildPluginFile(authToken);
|
|
@@ -105,8 +118,10 @@ export async function runNuxtWizardWithTelemetry(
|
|
|
105
118
|
selfHosted,
|
|
106
119
|
};
|
|
107
120
|
|
|
121
|
+
const deploymentPlatform = await askDeploymentPlatform();
|
|
122
|
+
|
|
108
123
|
await traceStep('configure-sdk', async () => {
|
|
109
|
-
await addSDKModule(nuxtConfig, projectData);
|
|
124
|
+
await addSDKModule(nuxtConfig, projectData, deploymentPlatform);
|
|
110
125
|
await createConfigFiles(selectedProject.keys[0].dsn.public);
|
|
111
126
|
});
|
|
112
127
|
|
|
@@ -137,6 +152,8 @@ export async function runNuxtWizardWithTelemetry(
|
|
|
137
152
|
|
|
138
153
|
await runPrettierIfInstalled();
|
|
139
154
|
|
|
155
|
+
await confirmReadImportDocs(deploymentPlatform);
|
|
156
|
+
|
|
140
157
|
clack.outro(
|
|
141
158
|
buildOutroMessage(shouldCreateExamplePage, shouldCreateExampleButton),
|
|
142
159
|
);
|
|
@@ -159,8 +176,9 @@ function buildOutroMessage(
|
|
|
159
176
|
)} component to a page and triggering it.`;
|
|
160
177
|
}
|
|
161
178
|
|
|
162
|
-
msg += `\n\nCheck out the SDK documentation for further configuration:
|
|
163
|
-
https://docs.sentry.io/platforms/javascript/guides/nuxt
|
|
179
|
+
msg += `\n\nCheck out the SDK documentation for further configuration: ${chalk.underline(
|
|
180
|
+
'https://docs.sentry.io/platforms/javascript/guides/nuxt/',
|
|
181
|
+
)}`;
|
|
164
182
|
|
|
165
183
|
return msg;
|
|
166
184
|
}
|