@sentry/wizard 3.9.1 → 3.10.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/lib/Constants.d.ts +1 -0
  3. package/dist/lib/Constants.js +5 -0
  4. package/dist/lib/Constants.js.map +1 -1
  5. package/dist/lib/Steps/ChooseIntegration.js +7 -0
  6. package/dist/lib/Steps/ChooseIntegration.js.map +1 -1
  7. package/dist/lib/Steps/Integrations/Cordova.js +5 -1
  8. package/dist/lib/Steps/Integrations/Cordova.js.map +1 -1
  9. package/dist/lib/Steps/Integrations/Remix.d.ts +12 -0
  10. package/dist/lib/Steps/Integrations/Remix.js +98 -0
  11. package/dist/lib/Steps/Integrations/Remix.js.map +1 -0
  12. package/dist/package.json +1 -1
  13. package/dist/src/remix/codemods/handle-error.d.ts +2 -0
  14. package/dist/src/remix/codemods/handle-error.js +70 -0
  15. package/dist/src/remix/codemods/handle-error.js.map +1 -0
  16. package/dist/src/remix/codemods/root-v1.d.ts +1 -0
  17. package/dist/src/remix/codemods/root-v1.js +133 -0
  18. package/dist/src/remix/codemods/root-v1.js.map +1 -0
  19. package/dist/src/remix/codemods/root-v2.d.ts +1 -0
  20. package/dist/src/remix/codemods/root-v2.js +134 -0
  21. package/dist/src/remix/codemods/root-v2.js.map +1 -0
  22. package/dist/src/remix/remix-wizard.d.ts +2 -0
  23. package/dist/src/remix/remix-wizard.js +206 -0
  24. package/dist/src/remix/remix-wizard.js.map +1 -0
  25. package/dist/src/remix/sdk-setup.d.ts +18 -0
  26. package/dist/src/remix/sdk-setup.js +293 -0
  27. package/dist/src/remix/sdk-setup.js.map +1 -0
  28. package/dist/src/remix/templates.d.ts +2 -0
  29. package/dist/src/remix/templates.js +6 -0
  30. package/dist/src/remix/templates.js.map +1 -0
  31. package/dist/src/remix/utils.d.ts +6 -0
  32. package/dist/src/remix/utils.js +55 -0
  33. package/dist/src/remix/utils.js.map +1 -0
  34. package/dist/src/sourcemaps/sourcemaps-wizard.js +23 -12
  35. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  36. package/dist/src/sourcemaps/tools/remix.d.ts +3 -0
  37. package/dist/src/sourcemaps/tools/remix.js +125 -0
  38. package/dist/src/sourcemaps/tools/remix.js.map +1 -0
  39. package/dist/src/sourcemaps/tools/sentry-cli.js +6 -3
  40. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  41. package/dist/src/sourcemaps/utils/detect-tool.d.ts +1 -1
  42. package/dist/src/sourcemaps/utils/detect-tool.js +1 -0
  43. package/dist/src/sourcemaps/utils/detect-tool.js.map +1 -1
  44. package/dist/src/utils/clack-utils.d.ts +3 -2
  45. package/dist/src/utils/clack-utils.js +39 -2
  46. package/dist/src/utils/clack-utils.js.map +1 -1
  47. package/lib/Constants.ts +5 -0
  48. package/lib/Steps/ChooseIntegration.ts +7 -0
  49. package/lib/Steps/Integrations/Cordova.ts +5 -1
  50. package/lib/Steps/Integrations/Remix.ts +32 -0
  51. package/package.json +1 -1
  52. package/src/remix/codemods/handle-error.ts +67 -0
  53. package/src/remix/codemods/root-v1.ts +91 -0
  54. package/src/remix/codemods/root-v2.ts +84 -0
  55. package/src/remix/remix-wizard.ts +137 -0
  56. package/src/remix/sdk-setup.ts +300 -0
  57. package/src/remix/templates.ts +15 -0
  58. package/src/remix/utils.ts +41 -0
  59. package/src/sourcemaps/sourcemaps-wizard.ts +9 -0
  60. package/src/sourcemaps/tools/remix.ts +90 -0
  61. package/src/sourcemaps/tools/sentry-cli.ts +5 -3
  62. package/src/sourcemaps/utils/detect-tool.ts +3 -1
  63. package/src/utils/clack-utils.ts +56 -2
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
27
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
28
+ return new (P || (P = Promise))(function (resolve, reject) {
29
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
30
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
31
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
32
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
33
+ });
34
+ };
35
+ var __generator = (this && this.__generator) || function (thisArg, body) {
36
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
37
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
38
+ function verb(n) { return function (v) { return step([n, v]); }; }
39
+ function step(op) {
40
+ if (f) throw new TypeError("Generator is already executing.");
41
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
42
+ 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;
43
+ if (y = 0, t) op = [op[0] & 2, t.value];
44
+ switch (op[0]) {
45
+ case 0: case 1: t = op; break;
46
+ case 4: _.label++; return { value: op[1], done: false };
47
+ case 5: _.label++; y = op[1]; op = [0]; continue;
48
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
49
+ default:
50
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
51
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
52
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
53
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
54
+ if (t[2]) _.ops.pop();
55
+ _.trys.pop(); continue;
56
+ }
57
+ op = body.call(thisArg, _);
58
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
59
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
60
+ }
61
+ };
62
+ Object.defineProperty(exports, "__esModule", { value: true });
63
+ exports.instrumentRootRouteV2 = void 0;
64
+ var recast = __importStar(require("recast"));
65
+ var path = __importStar(require("path"));
66
+ // @ts-expect-error - magicast is ESM and TS complains about that. It works though
67
+ var magicast_1 = require("magicast");
68
+ var templates_1 = require("../templates");
69
+ function instrumentRootRouteV2(rootFileName) {
70
+ return __awaiter(this, void 0, void 0, function () {
71
+ var rootRouteAst, exportsAst, namedExports, foundErrorBoundary;
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0: return [4 /*yield*/, (0, magicast_1.loadFile)(path.join(process.cwd(), 'app', rootFileName))];
75
+ case 1:
76
+ rootRouteAst = _a.sent();
77
+ exportsAst = rootRouteAst.exports.$ast;
78
+ namedExports = exportsAst.body.filter(function (node) { return node.type === 'ExportNamedDeclaration'; });
79
+ foundErrorBoundary = false;
80
+ namedExports.forEach(function (namedExport) {
81
+ var _a;
82
+ var declaration = namedExport.declaration;
83
+ if (!declaration) {
84
+ return;
85
+ }
86
+ if (declaration.type === 'FunctionDeclaration') {
87
+ if (((_a = declaration.id) === null || _a === void 0 ? void 0 : _a.name) === 'ErrorBoundary') {
88
+ foundErrorBoundary = true;
89
+ }
90
+ }
91
+ else if (declaration.type === 'VariableDeclaration') {
92
+ var declarations = declaration.declarations;
93
+ declarations.forEach(function (declaration) {
94
+ var _a;
95
+ // @ts-expect-error - id should always have a name in this case
96
+ if (((_a = declaration.id) === null || _a === void 0 ? void 0 : _a.name) === 'ErrorBoundary') {
97
+ foundErrorBoundary = true;
98
+ }
99
+ });
100
+ }
101
+ });
102
+ if (!foundErrorBoundary) {
103
+ rootRouteAst.imports.$add({
104
+ from: '@sentry/remix',
105
+ imported: 'captureRemixErrorBoundaryError',
106
+ local: 'captureRemixErrorBoundaryError',
107
+ });
108
+ rootRouteAst.imports.$add({
109
+ from: '@remix-run/react',
110
+ imported: 'useRouteError',
111
+ local: 'useRouteError',
112
+ });
113
+ recast.visit(rootRouteAst.$ast, {
114
+ visitExportDefaultDeclaration: function (path) {
115
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
116
+ var implementation = recast.parse(templates_1.ERROR_BOUNDARY_TEMPLATE_V2).program
117
+ .body[0];
118
+ path.insertBefore(
119
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
120
+ recast.types.builders.exportDeclaration(false, implementation));
121
+ this.traverse(path);
122
+ },
123
+ });
124
+ }
125
+ return [4 /*yield*/, (0, magicast_1.writeFile)(rootRouteAst.$ast, path.join(process.cwd(), 'app', rootFileName))];
126
+ case 2:
127
+ _a.sent();
128
+ return [2 /*return*/];
129
+ }
130
+ });
131
+ });
132
+ }
133
+ exports.instrumentRootRouteV2 = instrumentRootRouteV2;
134
+ //# sourceMappingURL=root-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-v2.js","sourceRoot":"","sources":["../../../../src/remix/codemods/root-v2.ts"],"names":[],"mappings":";AAAA,4DAA4D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5D,6CAAiC;AACjC,yCAA6B;AAI7B,kFAAkF;AAClF,qCAA+C;AAE/C,0CAA0D;AAE1D,SAAsB,qBAAqB,CACzC,YAAoB;;;;;wBAEC,qBAAM,IAAA,mBAAQ,EACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAC9C,EAAA;;oBAFK,YAAY,GAAG,SAEpB;oBAEK,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,IAAe,CAAC;oBAElD,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CACzC,UAAC,IAAI,IAAK,OAAA,IAAI,CAAC,IAAI,KAAK,wBAAwB,EAAtC,CAAsC,CACrB,CAAC;oBAE1B,kBAAkB,GAAG,KAAK,CAAC;oBAE/B,YAAY,CAAC,OAAO,CAAC,UAAC,WAAW;;wBAC/B,IAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;wBAE5C,IAAI,CAAC,WAAW,EAAE;4BAChB,OAAO;yBACR;wBAED,IAAI,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;4BAC9C,IAAI,CAAA,MAAA,WAAW,CAAC,EAAE,0CAAE,IAAI,MAAK,eAAe,EAAE;gCAC5C,kBAAkB,GAAG,IAAI,CAAC;6BAC3B;yBACF;6BAAM,IAAI,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE;4BACrD,IAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;4BAE9C,YAAY,CAAC,OAAO,CAAC,UAAC,WAAW;;gCAC/B,+DAA+D;gCAC/D,IAAI,CAAA,MAAA,WAAW,CAAC,EAAE,0CAAE,IAAI,MAAK,eAAe,EAAE;oCAC5C,kBAAkB,GAAG,IAAI,CAAC;iCAC3B;4BACH,CAAC,CAAC,CAAC;yBACJ;oBACH,CAAC,CAAC,CAAC;oBAEH,IAAI,CAAC,kBAAkB,EAAE;wBACvB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;4BACxB,IAAI,EAAE,eAAe;4BACrB,QAAQ,EAAE,gCAAgC;4BAC1C,KAAK,EAAE,gCAAgC;yBACxC,CAAC,CAAC;wBAEH,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;4BACxB,IAAI,EAAE,kBAAkB;4BACxB,QAAQ,EAAE,eAAe;4BACzB,KAAK,EAAE,eAAe;yBACvB,CAAC,CAAC;wBAEH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE;4BAC9B,6BAA6B,YAAC,IAAI;gCAChC,sEAAsE;gCACtE,IAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,sCAA0B,CAAC,CAAC,OAAO;qCACpE,IAAI,CAAC,CAAC,CAAC,CAAC;gCAEX,IAAI,CAAC,YAAY;gCACf,iEAAiE;gCACjE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,CAC/D,CAAC;gCAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;4BACtB,CAAC;yBACF,CAAC,CAAC;qBACJ;oBAED,qBAAM,IAAA,oBAAS,EACb,YAAY,CAAC,IAAI,EACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAC9C,EAAA;;oBAHD,SAGC,CAAC;;;;;CACH;AAvED,sDAuEC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\nimport * as recast from 'recast';\nimport * as path from 'path';\n\nimport type { ExportNamedDeclaration, Program } from '@babel/types';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport { loadFile, writeFile } from 'magicast';\n\nimport { ERROR_BOUNDARY_TEMPLATE_V2 } from '../templates';\n\nexport async function instrumentRootRouteV2(\n rootFileName: string,\n): Promise<void> {\n const rootRouteAst = await loadFile(\n path.join(process.cwd(), 'app', rootFileName),\n );\n\n const exportsAst = rootRouteAst.exports.$ast as Program;\n\n const namedExports = exportsAst.body.filter(\n (node) => node.type === 'ExportNamedDeclaration',\n ) as ExportNamedDeclaration[];\n\n let foundErrorBoundary = false;\n\n namedExports.forEach((namedExport) => {\n const declaration = namedExport.declaration;\n\n if (!declaration) {\n return;\n }\n\n if (declaration.type === 'FunctionDeclaration') {\n if (declaration.id?.name === 'ErrorBoundary') {\n foundErrorBoundary = true;\n }\n } else if (declaration.type === 'VariableDeclaration') {\n const declarations = declaration.declarations;\n\n declarations.forEach((declaration) => {\n // @ts-expect-error - id should always have a name in this case\n if (declaration.id?.name === 'ErrorBoundary') {\n foundErrorBoundary = true;\n }\n });\n }\n });\n\n if (!foundErrorBoundary) {\n rootRouteAst.imports.$add({\n from: '@sentry/remix',\n imported: 'captureRemixErrorBoundaryError',\n local: 'captureRemixErrorBoundaryError',\n });\n\n rootRouteAst.imports.$add({\n from: '@remix-run/react',\n imported: 'useRouteError',\n local: 'useRouteError',\n });\n\n recast.visit(rootRouteAst.$ast, {\n visitExportDefaultDeclaration(path) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const implementation = recast.parse(ERROR_BOUNDARY_TEMPLATE_V2).program\n .body[0];\n\n path.insertBefore(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n recast.types.builders.exportDeclaration(false, implementation),\n );\n\n this.traverse(path);\n },\n });\n }\n\n await writeFile(\n rootRouteAst.$ast,\n path.join(process.cwd(), 'app', rootFileName),\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { WizardOptions } from '../utils/types';
2
+ export declare function runRemixWizard(options: WizardOptions): Promise<void>;
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.runRemixWizard = void 0;
43
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
44
+ var prompts_1 = __importDefault(require("@clack/prompts"));
45
+ var chalk_1 = __importDefault(require("chalk"));
46
+ var clack_utils_1 = require("../utils/clack-utils");
47
+ var package_json_1 = require("../utils/package-json");
48
+ var sdk_setup_1 = require("./sdk-setup");
49
+ var debug_1 = require("../utils/debug");
50
+ var telemetry_1 = require("../telemetry");
51
+ function runRemixWizard(options) {
52
+ return __awaiter(this, void 0, void 0, function () {
53
+ return __generator(this, function (_a) {
54
+ return [2 /*return*/, (0, telemetry_1.withTelemetry)({
55
+ enabled: options.telemetryEnabled,
56
+ integration: 'remix',
57
+ }, function () { return runRemixWizardWithTelemetry(options); })];
58
+ });
59
+ });
60
+ }
61
+ exports.runRemixWizard = runRemixWizard;
62
+ function runRemixWizardWithTelemetry(options) {
63
+ return __awaiter(this, void 0, void 0, function () {
64
+ var remixConfig, packageJson, sentryUrl, _a, projects, apiKeys, selectedProject, dsn, isTS, isV2;
65
+ var _this = this;
66
+ return __generator(this, function (_b) {
67
+ switch (_b.label) {
68
+ case 0:
69
+ (0, clack_utils_1.printWelcome)({
70
+ wizardName: 'Sentry Remix Wizard',
71
+ promoCode: options.promoCode,
72
+ telemetryEnabled: options.telemetryEnabled,
73
+ });
74
+ return [4 /*yield*/, (0, clack_utils_1.confirmContinueEvenThoughNoGitRepo)()];
75
+ case 1:
76
+ _b.sent();
77
+ return [4 /*yield*/, (0, sdk_setup_1.loadRemixConfig)()];
78
+ case 2:
79
+ remixConfig = _b.sent();
80
+ return [4 /*yield*/, (0, clack_utils_1.getPackageDotJson)()];
81
+ case 3:
82
+ packageJson = _b.sent();
83
+ // We expect `@remix-run/dev` to be installed for every Remix project
84
+ return [4 /*yield*/, (0, clack_utils_1.ensurePackageIsInstalled)(packageJson, '@remix-run/dev', 'Remix')];
85
+ case 4:
86
+ // We expect `@remix-run/dev` to be installed for every Remix project
87
+ _b.sent();
88
+ return [4 /*yield*/, (0, clack_utils_1.askForSelfHosted)(options.url)];
89
+ case 5:
90
+ sentryUrl = (_b.sent()).url;
91
+ return [4 /*yield*/, (0, clack_utils_1.askForWizardLogin)({
92
+ promoCode: options.promoCode,
93
+ url: sentryUrl,
94
+ platform: 'javascript-remix',
95
+ })];
96
+ case 6:
97
+ _a = _b.sent(), projects = _a.projects, apiKeys = _a.apiKeys;
98
+ return [4 /*yield*/, (0, clack_utils_1.askForProjectSelection)(projects)];
99
+ case 7:
100
+ selectedProject = _b.sent();
101
+ return [4 /*yield*/, (0, telemetry_1.traceStep)('Install Sentry SDK', function () {
102
+ return (0, clack_utils_1.installPackage)({
103
+ packageName: '@sentry/remix',
104
+ alreadyInstalled: (0, package_json_1.hasPackageInstalled)('@sentry/remix', packageJson),
105
+ });
106
+ })];
107
+ case 8:
108
+ _b.sent();
109
+ dsn = selectedProject.keys[0].dsn.public;
110
+ isTS = (0, clack_utils_1.isUsingTypeScript)();
111
+ isV2 = (0, sdk_setup_1.isRemixV2)(remixConfig, packageJson);
112
+ return [4 /*yield*/, (0, clack_utils_1.addSentryCliRc)(apiKeys.token, selectedProject.organization.slug, selectedProject.name)];
113
+ case 9:
114
+ _b.sent();
115
+ return [4 /*yield*/, (0, telemetry_1.traceStep)('Update build script for sourcemap uploads', function () { return __awaiter(_this, void 0, void 0, function () {
116
+ var e_1;
117
+ return __generator(this, function (_a) {
118
+ switch (_a.label) {
119
+ case 0:
120
+ _a.trys.push([0, 2, , 3]);
121
+ return [4 /*yield*/, (0, sdk_setup_1.updateBuildScript)()];
122
+ case 1:
123
+ _a.sent();
124
+ return [3 /*break*/, 3];
125
+ case 2:
126
+ e_1 = _a.sent();
127
+ prompts_1.default.log
128
+ .warn("Could not update build script to generate and upload sourcemaps.\n Please update your build script manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/");
129
+ (0, debug_1.debug)(e_1);
130
+ return [3 /*break*/, 3];
131
+ case 3: return [2 /*return*/];
132
+ }
133
+ });
134
+ }); })];
135
+ case 10:
136
+ _b.sent();
137
+ return [4 /*yield*/, (0, telemetry_1.traceStep)('Instrument root route', function () { return __awaiter(_this, void 0, void 0, function () {
138
+ var e_2;
139
+ return __generator(this, function (_a) {
140
+ switch (_a.label) {
141
+ case 0:
142
+ _a.trys.push([0, 2, , 3]);
143
+ return [4 /*yield*/, (0, sdk_setup_1.instrumentRootRoute)(isV2, isTS)];
144
+ case 1:
145
+ _a.sent();
146
+ return [3 /*break*/, 3];
147
+ case 2:
148
+ e_2 = _a.sent();
149
+ prompts_1.default.log.warn("Could not instrument root route.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/");
150
+ (0, debug_1.debug)(e_2);
151
+ return [3 /*break*/, 3];
152
+ case 3: return [2 /*return*/];
153
+ }
154
+ });
155
+ }); })];
156
+ case 11:
157
+ _b.sent();
158
+ return [4 /*yield*/, (0, telemetry_1.traceStep)('Initialize Sentry on client entry', function () { return __awaiter(_this, void 0, void 0, function () {
159
+ var e_3;
160
+ return __generator(this, function (_a) {
161
+ switch (_a.label) {
162
+ case 0:
163
+ _a.trys.push([0, 2, , 3]);
164
+ return [4 /*yield*/, (0, sdk_setup_1.initializeSentryOnEntryClient)(dsn, isTS)];
165
+ case 1:
166
+ _a.sent();
167
+ return [3 /*break*/, 3];
168
+ case 2:
169
+ e_3 = _a.sent();
170
+ prompts_1.default.log.warn("Could not initialize Sentry on client entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/");
171
+ (0, debug_1.debug)(e_3);
172
+ return [3 /*break*/, 3];
173
+ case 3: return [2 /*return*/];
174
+ }
175
+ });
176
+ }); })];
177
+ case 12:
178
+ _b.sent();
179
+ return [4 /*yield*/, (0, telemetry_1.traceStep)('Initialize Sentry on server entry', function () { return __awaiter(_this, void 0, void 0, function () {
180
+ var e_4;
181
+ return __generator(this, function (_a) {
182
+ switch (_a.label) {
183
+ case 0:
184
+ _a.trys.push([0, 2, , 3]);
185
+ return [4 /*yield*/, (0, sdk_setup_1.initializeSentryOnEntryServer)(dsn, isTS, isV2)];
186
+ case 1:
187
+ _a.sent();
188
+ return [3 /*break*/, 3];
189
+ case 2:
190
+ e_4 = _a.sent();
191
+ prompts_1.default.log.warn("Could not initialize Sentry on server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/");
192
+ (0, debug_1.debug)(e_4);
193
+ return [3 /*break*/, 3];
194
+ case 3: return [2 /*return*/];
195
+ }
196
+ });
197
+ }); })];
198
+ case 13:
199
+ _b.sent();
200
+ prompts_1.default.outro("\n".concat(chalk_1.default.green('Sentry has been successfully configured for your Remix project.'), "\n\n").concat(chalk_1.default.cyan('You can now deploy your project to see Sentry in action.'), "\n\n").concat(chalk_1.default.cyan("To learn more about how to use Sentry with Remix, visit our documentation:\nhttps://docs.sentry.io/platforms/javascript/guides/remix/")));
201
+ return [2 /*return*/];
202
+ }
203
+ });
204
+ });
205
+ }
206
+ //# sourceMappingURL=remix-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remix-wizard.js","sourceRoot":"","sources":["../../../src/remix/remix-wizard.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport clack from '@clack/prompts';\nimport chalk from 'chalk';\n\nimport {\n addSentryCliRc,\n askForProjectSelection,\n askForSelfHosted,\n askForWizardLogin,\n confirmContinueEvenThoughNoGitRepo,\n ensurePackageIsInstalled,\n getPackageDotJson,\n installPackage,\n isUsingTypeScript,\n printWelcome,\n} from '../utils/clack-utils';\nimport { hasPackageInstalled } from '../utils/package-json';\nimport { WizardOptions } from '../utils/types';\nimport {\n initializeSentryOnEntryClient,\n initializeSentryOnEntryServer,\n updateBuildScript,\n instrumentRootRoute,\n isRemixV2,\n loadRemixConfig,\n} from './sdk-setup';\nimport { debug } from '../utils/debug';\nimport { traceStep, withTelemetry } from '../telemetry';\n\nexport async function runRemixWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'remix',\n },\n () => runRemixWizardWithTelemetry(options),\n );\n}\n\nasync function runRemixWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Remix Wizard',\n promoCode: options.promoCode,\n telemetryEnabled: options.telemetryEnabled,\n });\n\n await confirmContinueEvenThoughNoGitRepo();\n\n const remixConfig = await loadRemixConfig();\n const packageJson = await getPackageDotJson();\n\n // We expect `@remix-run/dev` to be installed for every Remix project\n await ensurePackageIsInstalled(packageJson, '@remix-run/dev', 'Remix');\n\n const { url: sentryUrl } = await askForSelfHosted(options.url);\n\n const { projects, apiKeys } = await askForWizardLogin({\n promoCode: options.promoCode,\n url: sentryUrl,\n platform: 'javascript-remix',\n });\n\n const selectedProject = await askForProjectSelection(projects);\n\n await traceStep('Install Sentry SDK', () =>\n installPackage({\n packageName: '@sentry/remix',\n alreadyInstalled: hasPackageInstalled('@sentry/remix', packageJson),\n }),\n );\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const isTS = isUsingTypeScript();\n const isV2 = isRemixV2(remixConfig, packageJson);\n\n await addSentryCliRc(\n apiKeys.token,\n selectedProject.organization.slug,\n selectedProject.name,\n );\n\n await traceStep('Update build script for sourcemap uploads', async () => {\n try {\n await updateBuildScript();\n } catch (e) {\n clack.log\n .warn(`Could not update build script to generate and upload sourcemaps.\n Please update your build script manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/sourcemaps/`);\n debug(e);\n }\n });\n\n await traceStep('Instrument root route', async () => {\n try {\n await instrumentRootRoute(isV2, isTS);\n } catch (e) {\n clack.log.warn(`Could not instrument root route.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on client entry', async () => {\n try {\n await initializeSentryOnEntryClient(dsn, isTS);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on client entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/`);\n debug(e);\n }\n });\n\n await traceStep('Initialize Sentry on server entry', async () => {\n try {\n await initializeSentryOnEntryServer(dsn, isTS, isV2);\n } catch (e) {\n clack.log.warn(`Could not initialize Sentry on server entry.\n Please do it manually using instructions from https://docs.sentry.io/platforms/javascript/guides/remix/`);\n debug(e);\n }\n });\n\n clack.outro(`\n${chalk.green(\n 'Sentry has been successfully configured for your Remix project.',\n)}\n\n${chalk.cyan('You can now deploy your project to see Sentry in action.')}\n\n${chalk.cyan(\n `To learn more about how to use Sentry with Remix, visit our documentation:\nhttps://docs.sentry.io/platforms/javascript/guides/remix/`,\n)}`);\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { PackageDotJson } from '../utils/package-json';
2
+ export type PartialRemixConfig = {
3
+ unstable_dev?: boolean;
4
+ future?: {
5
+ v2_dev?: boolean;
6
+ v2_errorBoundary?: boolean;
7
+ v2_headers?: boolean;
8
+ v2_meta?: boolean;
9
+ v2_normalizeFormMethod?: boolean;
10
+ v2_routeConvention?: boolean;
11
+ };
12
+ };
13
+ export declare function isRemixV2(remixConfig: PartialRemixConfig, packageJson: PackageDotJson): boolean;
14
+ export declare function loadRemixConfig(): Promise<PartialRemixConfig>;
15
+ export declare function instrumentRootRoute(isV2?: boolean, isTS?: boolean): Promise<void>;
16
+ export declare function updateBuildScript(): Promise<void>;
17
+ export declare function initializeSentryOnEntryClient(dsn: string, isTS: boolean): Promise<void>;
18
+ export declare function initializeSentryOnEntryServer(dsn: string, isV2: boolean, isTS: boolean): Promise<void>;