@sentry/wizard 4.7.0 → 4.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.
Files changed (110) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +19 -19
  3. package/dist/e2e-tests/tests/angular-17.test.d.ts +1 -0
  4. package/dist/e2e-tests/tests/angular-17.test.js +196 -0
  5. package/dist/e2e-tests/tests/angular-17.test.js.map +1 -0
  6. package/dist/e2e-tests/tests/angular-19.test.d.ts +1 -0
  7. package/dist/e2e-tests/tests/angular-19.test.js +194 -0
  8. package/dist/e2e-tests/tests/angular-19.test.js.map +1 -0
  9. package/dist/e2e-tests/tests/expo.test.d.ts +1 -0
  10. package/dist/e2e-tests/tests/expo.test.js +95 -0
  11. package/dist/e2e-tests/tests/expo.test.js.map +1 -0
  12. package/dist/e2e-tests/tests/help-message.test.js +2 -2
  13. package/dist/e2e-tests/tests/help-message.test.js.map +1 -1
  14. package/dist/e2e-tests/tests/react-native.test.d.ts +1 -0
  15. package/dist/e2e-tests/tests/react-native.test.js +97 -0
  16. package/dist/e2e-tests/tests/react-native.test.js.map +1 -0
  17. package/dist/e2e-tests/tests/remix.test.js +4 -4
  18. package/dist/e2e-tests/tests/remix.test.js.map +1 -1
  19. package/dist/e2e-tests/tests/sveltekit.test.js +2 -2
  20. package/dist/e2e-tests/tests/sveltekit.test.js.map +1 -1
  21. package/dist/e2e-tests/utils/index.d.ts +7 -0
  22. package/dist/e2e-tests/utils/index.js +18 -1
  23. package/dist/e2e-tests/utils/index.js.map +1 -1
  24. package/dist/lib/Constants.d.ts +1 -0
  25. package/dist/lib/Constants.js +3 -0
  26. package/dist/lib/Constants.js.map +1 -1
  27. package/dist/src/angular/angular-wizard.d.ts +3 -0
  28. package/dist/src/angular/angular-wizard.js +186 -0
  29. package/dist/src/angular/angular-wizard.js.map +1 -0
  30. package/dist/src/angular/codemods/app-config.d.ts +3 -0
  31. package/dist/src/angular/codemods/app-config.js +211 -0
  32. package/dist/src/angular/codemods/app-config.js.map +1 -0
  33. package/dist/src/angular/codemods/main.d.ts +20 -0
  34. package/dist/src/angular/codemods/main.js +62 -0
  35. package/dist/src/angular/codemods/main.js.map +1 -0
  36. package/dist/src/angular/codemods/sourcemaps.d.ts +21 -0
  37. package/dist/src/angular/codemods/sourcemaps.js +94 -0
  38. package/dist/src/angular/codemods/sourcemaps.js.map +1 -0
  39. package/dist/src/angular/example-component.d.ts +8 -0
  40. package/dist/src/angular/example-component.js +286 -0
  41. package/dist/src/angular/example-component.js.map +1 -0
  42. package/dist/src/angular/sdk-setup.d.ts +6 -0
  43. package/dist/src/angular/sdk-setup.js +99 -0
  44. package/dist/src/angular/sdk-setup.js.map +1 -0
  45. package/dist/src/flutter/flutter-wizard.js +10 -2
  46. package/dist/src/flutter/flutter-wizard.js.map +1 -1
  47. package/dist/src/nextjs/nextjs-wizard.js +26 -12
  48. package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
  49. package/dist/src/nextjs/templates.js +56 -7
  50. package/dist/src/nextjs/templates.js.map +1 -1
  51. package/dist/src/nuxt/templates.js +30 -0
  52. package/dist/src/nuxt/templates.js.map +1 -1
  53. package/dist/src/react-native/expo-metro.js +4 -1
  54. package/dist/src/react-native/expo-metro.js.map +1 -1
  55. package/dist/src/react-native/expo.js +5 -1
  56. package/dist/src/react-native/expo.js.map +1 -1
  57. package/dist/src/react-native/javascript.js +9 -2
  58. package/dist/src/react-native/javascript.js.map +1 -1
  59. package/dist/src/react-native/metro.js +8 -2
  60. package/dist/src/react-native/metro.js.map +1 -1
  61. package/dist/src/react-native/xcode.js +5 -1
  62. package/dist/src/react-native/xcode.js.map +1 -1
  63. package/dist/src/remix/sdk-example.js +30 -1
  64. package/dist/src/remix/sdk-example.js.map +1 -1
  65. package/dist/src/remix/sdk-setup.js +11 -5
  66. package/dist/src/remix/sdk-setup.js.map +1 -1
  67. package/dist/src/run.d.ts +1 -1
  68. package/dist/src/run.js +5 -0
  69. package/dist/src/run.js.map +1 -1
  70. package/dist/src/sourcemaps/sourcemaps-wizard.d.ts +1 -1
  71. package/dist/src/sourcemaps/sourcemaps-wizard.js +35 -20
  72. package/dist/src/sourcemaps/sourcemaps-wizard.js.map +1 -1
  73. package/dist/src/sourcemaps/tools/angular.d.ts +1 -0
  74. package/dist/src/sourcemaps/tools/angular.js +7 -7
  75. package/dist/src/sourcemaps/tools/angular.js.map +1 -1
  76. package/dist/src/sourcemaps/tools/sentry-cli.d.ts +5 -1
  77. package/dist/src/sourcemaps/tools/sentry-cli.js +6 -3
  78. package/dist/src/sourcemaps/tools/sentry-cli.js.map +1 -1
  79. package/dist/src/sourcemaps/tools/tsc.js +5 -1
  80. package/dist/src/sourcemaps/tools/tsc.js.map +1 -1
  81. package/dist/src/sourcemaps/tools/vite.js +4 -1
  82. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  83. package/dist/src/sourcemaps/tools/webpack.js +4 -1
  84. package/dist/src/sourcemaps/tools/webpack.js.map +1 -1
  85. package/dist/src/sveltekit/sdk-example.js +1 -1
  86. package/dist/src/sveltekit/sdk-example.js.map +1 -1
  87. package/dist/src/sveltekit/sveltekit-wizard.js +2 -2
  88. package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
  89. package/dist/src/sveltekit/templates.js +28 -1
  90. package/dist/src/sveltekit/templates.js.map +1 -1
  91. package/dist/src/utils/clack/index.d.ts +11 -3
  92. package/dist/src/utils/clack/index.js +9 -3
  93. package/dist/src/utils/clack/index.js.map +1 -1
  94. package/dist/src/version.d.ts +1 -1
  95. package/dist/src/version.js +1 -1
  96. package/dist/src/version.js.map +1 -1
  97. package/dist/test/angular/angular-wizard.test.d.ts +1 -0
  98. package/dist/test/angular/angular-wizard.test.js +27 -0
  99. package/dist/test/angular/angular-wizard.test.js.map +1 -0
  100. package/dist/test/angular/codemods/sourcemaps.test.d.ts +1 -0
  101. package/dist/test/angular/codemods/sourcemaps.test.js +237 -0
  102. package/dist/test/angular/codemods/sourcemaps.test.js.map +1 -0
  103. package/dist/test/angular/example-component.test.d.ts +1 -0
  104. package/dist/test/angular/example-component.test.js +105 -0
  105. package/dist/test/angular/example-component.test.js.map +1 -0
  106. package/dist/test/react-native/metro.test.js +113 -0
  107. package/dist/test/react-native/metro.test.js.map +1 -1
  108. package/dist/test/remix/client-entry.test.js +10 -10
  109. package/dist/test/remix/client-entry.test.js.map +1 -1
  110. package/package.json +1 -1
@@ -9,6 +9,7 @@ var Integration;
9
9
  Integration["ios"] = "ios";
10
10
  Integration["android"] = "android";
11
11
  Integration["cordova"] = "cordova";
12
+ Integration["angular"] = "angular";
12
13
  Integration["electron"] = "electron";
13
14
  Integration["nextjs"] = "nextjs";
14
15
  Integration["nuxt"] = "nuxt";
@@ -76,6 +77,8 @@ function mapIntegrationToPlatform(type) {
76
77
  return 'flutter';
77
78
  case Integration.cordova:
78
79
  return 'cordova';
80
+ case Integration.angular:
81
+ return 'javascript-angular';
79
82
  case Integration.electron:
80
83
  return 'javascript-electron';
81
84
  case Integration.nextjs:
@@ -1 +1 @@
1
- {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../lib/Constants.ts"],"names":[],"mappings":"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","sourcesContent":["/** Key value should be the same here */\nexport enum Integration {\n reactNative = 'reactNative',\n flutter = 'flutter',\n ios = 'ios',\n android = 'android',\n cordova = 'cordova',\n electron = 'electron',\n nextjs = 'nextjs',\n nuxt = 'nuxt',\n remix = 'remix',\n sveltekit = 'sveltekit',\n sourcemaps = 'sourcemaps',\n}\n\n/** Key value should be the same here */\nexport enum Platform {\n ios = 'ios',\n android = 'android',\n}\n\nexport function getPlatformChoices(): Array<{\n checked: boolean;\n name: string;\n value: string;\n}> {\n return Object.keys(Platform).map((platform) => ({\n checked: true,\n name: getPlatformDescription(platform),\n value: platform,\n }));\n}\n\nexport function getPlatformDescription(type: string): string {\n switch (type) {\n case Platform.ios:\n return 'iOS';\n default:\n return 'Android';\n }\n}\n\nexport function getIntegrationDescription(type: string): string {\n switch (type) {\n case Integration.android:\n return 'Android';\n case Integration.reactNative:\n return 'React Native';\n case Integration.flutter:\n return 'Flutter';\n case Integration.cordova:\n return 'Cordova';\n case Integration.electron:\n return 'Electron';\n case Integration.nextjs:\n return 'Next.js';\n case Integration.remix:\n return 'Remix';\n case Integration.sveltekit:\n return 'SvelteKit';\n case Integration.sourcemaps:\n return 'Configure Source Maps Upload';\n case Integration.ios:\n return 'iOS';\n default:\n return 'React Native';\n }\n}\n\nexport function mapIntegrationToPlatform(type: string): string | undefined {\n switch (type) {\n case Integration.android:\n return 'android';\n case Integration.reactNative:\n return 'react-native';\n case Integration.flutter:\n return 'flutter';\n case Integration.cordova:\n return 'cordova';\n case Integration.electron:\n return 'javascript-electron';\n case Integration.nextjs:\n return 'javascript-nextjs';\n case Integration.remix:\n return 'javascript-remix';\n case Integration.sveltekit:\n return 'javascript-sveltekit';\n case Integration.sourcemaps:\n return undefined;\n case Integration.ios:\n return 'iOS';\n default:\n throw new Error(`Unknown integration ${type}`);\n }\n}\n\ntype IntegrationChoice = {\n name: string;\n value: string;\n};\n\nexport function getIntegrationChoices(): IntegrationChoice[] {\n return Object.keys(Integration).map((type: string) => ({\n name: getIntegrationDescription(type),\n value: type,\n }));\n}\n\nexport interface Args {\n url: string;\n debug: boolean;\n uninstall: boolean;\n integration: Integration;\n platform: Platform[];\n skipConnect: boolean;\n quiet: boolean;\n signup: boolean;\n promoCode?: string;\n disableTelemetry?: boolean;\n comingFrom?: string;\n ignoreGitChanges?: boolean;\n xcodeProjectDir?: string;\n}\n\nexport const DEFAULT_URL = 'https://sentry.io/';\n"]}
1
+ {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../lib/Constants.ts"],"names":[],"mappings":"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","sourcesContent":["/** Key value should be the same here */\nexport enum Integration {\n reactNative = 'reactNative',\n flutter = 'flutter',\n ios = 'ios',\n android = 'android',\n cordova = 'cordova',\n angular = 'angular',\n electron = 'electron',\n nextjs = 'nextjs',\n nuxt = 'nuxt',\n remix = 'remix',\n sveltekit = 'sveltekit',\n sourcemaps = 'sourcemaps',\n}\n\n/** Key value should be the same here */\nexport enum Platform {\n ios = 'ios',\n android = 'android',\n}\n\nexport function getPlatformChoices(): Array<{\n checked: boolean;\n name: string;\n value: string;\n}> {\n return Object.keys(Platform).map((platform) => ({\n checked: true,\n name: getPlatformDescription(platform),\n value: platform,\n }));\n}\n\nexport function getPlatformDescription(type: string): string {\n switch (type) {\n case Platform.ios:\n return 'iOS';\n default:\n return 'Android';\n }\n}\n\nexport function getIntegrationDescription(type: string): string {\n switch (type) {\n case Integration.android:\n return 'Android';\n case Integration.reactNative:\n return 'React Native';\n case Integration.flutter:\n return 'Flutter';\n case Integration.cordova:\n return 'Cordova';\n case Integration.electron:\n return 'Electron';\n case Integration.nextjs:\n return 'Next.js';\n case Integration.remix:\n return 'Remix';\n case Integration.sveltekit:\n return 'SvelteKit';\n case Integration.sourcemaps:\n return 'Configure Source Maps Upload';\n case Integration.ios:\n return 'iOS';\n default:\n return 'React Native';\n }\n}\n\nexport function mapIntegrationToPlatform(type: string): string | undefined {\n switch (type) {\n case Integration.android:\n return 'android';\n case Integration.reactNative:\n return 'react-native';\n case Integration.flutter:\n return 'flutter';\n case Integration.cordova:\n return 'cordova';\n case Integration.angular:\n return 'javascript-angular';\n case Integration.electron:\n return 'javascript-electron';\n case Integration.nextjs:\n return 'javascript-nextjs';\n case Integration.remix:\n return 'javascript-remix';\n case Integration.sveltekit:\n return 'javascript-sveltekit';\n case Integration.sourcemaps:\n return undefined;\n case Integration.ios:\n return 'iOS';\n default:\n throw new Error(`Unknown integration ${type}`);\n }\n}\n\ntype IntegrationChoice = {\n name: string;\n value: string;\n};\n\nexport function getIntegrationChoices(): IntegrationChoice[] {\n return Object.keys(Integration).map((type: string) => ({\n name: getIntegrationDescription(type),\n value: type,\n }));\n}\n\nexport interface Args {\n url: string;\n debug: boolean;\n uninstall: boolean;\n integration: Integration;\n platform: Platform[];\n skipConnect: boolean;\n quiet: boolean;\n signup: boolean;\n promoCode?: string;\n disableTelemetry?: boolean;\n comingFrom?: string;\n ignoreGitChanges?: boolean;\n xcodeProjectDir?: string;\n}\n\nexport const DEFAULT_URL = 'https://sentry.io/';\n"]}
@@ -0,0 +1,3 @@
1
+ import type { WizardOptions } from '../utils/types';
2
+ export declare function runAngularWizard(options: WizardOptions): Promise<void>;
3
+ export declare function buildOutroMessage(createdExampleComponent: boolean): string;
@@ -0,0 +1,186 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.buildOutroMessage = exports.runAngularWizard = void 0;
30
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
31
+ const prompts_1 = __importDefault(require("@clack/prompts"));
32
+ const chalk_1 = __importDefault(require("chalk"));
33
+ const telemetry_1 = require("../telemetry");
34
+ const clack_1 = require("../utils/clack");
35
+ const package_json_1 = require("../utils/package-json");
36
+ const semver_1 = require("semver");
37
+ const Sentry = __importStar(require("@sentry/node"));
38
+ const sdk_setup_1 = require("./sdk-setup");
39
+ const sdk_setup_2 = require("./sdk-setup");
40
+ const sourcemaps_wizard_1 = require("../sourcemaps/sourcemaps-wizard");
41
+ const sourcemaps_1 = require("./codemods/sourcemaps");
42
+ const example_component_1 = require("./example-component");
43
+ const MIN_SUPPORTED_ANGULAR_VERSION = '14.0.0';
44
+ const MIN_SUPPORTED_WIZARD_ANGULAR_VERSION = '17.0.0';
45
+ async function runAngularWizard(options) {
46
+ return (0, telemetry_1.withTelemetry)({
47
+ enabled: options.telemetryEnabled,
48
+ integration: 'angular',
49
+ wizardOptions: options,
50
+ }, () => runAngularWizardWithTelemetry(options));
51
+ }
52
+ exports.runAngularWizard = runAngularWizard;
53
+ async function runAngularWizardWithTelemetry(options) {
54
+ (0, clack_1.printWelcome)({
55
+ wizardName: 'Sentry Angular Wizard',
56
+ promoCode: options.promoCode,
57
+ telemetryEnabled: options.telemetryEnabled,
58
+ });
59
+ await (0, clack_1.confirmContinueIfNoOrDirtyGitRepo)({
60
+ ignoreGitChanges: options.ignoreGitChanges,
61
+ cwd: undefined,
62
+ });
63
+ const packageJson = await (0, clack_1.getPackageDotJson)();
64
+ await (0, clack_1.ensurePackageIsInstalled)(packageJson, '@angular/core', 'Angular');
65
+ let installedAngularVersion = (0, package_json_1.getPackageVersion)('@angular/core', packageJson);
66
+ if (!installedAngularVersion) {
67
+ prompts_1.default.log.warn('Could not determine installed Angular version.');
68
+ installedAngularVersion = await (0, clack_1.abortIfCancelled)(prompts_1.default.text({
69
+ message: `Please enter your installed Angular major version (e.g. ${chalk_1.default.cyan('18')} for Angular 18)`,
70
+ validate(value) {
71
+ if (!value) {
72
+ return 'Angular version is required';
73
+ }
74
+ try {
75
+ if (!(0, semver_1.minVersion)(value)) {
76
+ return `Invalid Angular version provided: ${value}`;
77
+ }
78
+ }
79
+ catch (error) {
80
+ return `Invalid Angular version provided: ${value}`;
81
+ }
82
+ },
83
+ }));
84
+ }
85
+ Sentry.setTag('angular-version', installedAngularVersion);
86
+ const installedMinVersion = (0, semver_1.minVersion)(installedAngularVersion);
87
+ const sdkSupportsAngularVersion = (0, semver_1.gte)(installedMinVersion, MIN_SUPPORTED_ANGULAR_VERSION);
88
+ const wizardSupportsAngularVersion = (0, semver_1.gte)(installedMinVersion, MIN_SUPPORTED_WIZARD_ANGULAR_VERSION);
89
+ if (!sdkSupportsAngularVersion) {
90
+ Sentry.setTag('angular-version-compatible', false);
91
+ prompts_1.default.log.warn(`Angular version ${chalk_1.default.cyan(MIN_SUPPORTED_ANGULAR_VERSION)} or higher is required for the Sentry SDK.`);
92
+ prompts_1.default.log.warn(`Please refer to Sentry's version compatibility table for more information:
93
+
94
+ ${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/angular/#angular-version-compatibility')}
95
+ `);
96
+ return (0, clack_1.abort)('Exiting the wizard.', 0);
97
+ }
98
+ if (!wizardSupportsAngularVersion) {
99
+ Sentry.setTag('angular-wizard-version-compatible', false);
100
+ prompts_1.default.log.warn(`The Sentry Angular Wizard requires Angular version ${chalk_1.default.cyan(MIN_SUPPORTED_WIZARD_ANGULAR_VERSION)} or higher.`);
101
+ prompts_1.default.log.warn(`Your Angular version (${installedAngularVersion}) is compatible with the Sentry SDK but you need to set it up manually by following our documentation:
102
+
103
+ ${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/angular')}
104
+
105
+ Apologies for the inconvenience!`);
106
+ return (0, clack_1.abort)('Exiting the wizard.', 0);
107
+ }
108
+ const { selectedProject, authToken, sentryUrl, selfHosted } = await (0, clack_1.getOrAskForProjectData)(options, 'javascript-angular');
109
+ const dsn = selectedProject.keys[0].dsn.public;
110
+ const sdkAlreadyInstalled = (0, package_json_1.hasPackageInstalled)('@sentry/angular', packageJson);
111
+ Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);
112
+ await (0, clack_1.installPackage)({
113
+ packageName: '@sentry/angular',
114
+ packageNameDisplayLabel: '@sentry/angular',
115
+ alreadyInstalled: sdkAlreadyInstalled,
116
+ });
117
+ const selectedFeatures = await (0, clack_1.featureSelectionPrompt)([
118
+ {
119
+ id: 'performance',
120
+ prompt: `Do you want to enable ${chalk_1.default.bold('Tracing')} to track the performance of your application?`,
121
+ enabledHint: 'recommended',
122
+ },
123
+ {
124
+ id: 'replay',
125
+ prompt: `Do you want to enable ${chalk_1.default.bold('Sentry Session Replay')} to get a video-like reproduction of errors during a user session?`,
126
+ enabledHint: 'recommended, but increases bundle size',
127
+ },
128
+ ]);
129
+ await (0, telemetry_1.traceStep)('Initialize Sentry on Angular application entry point', async () => {
130
+ await (0, sdk_setup_1.initalizeSentryOnApplicationEntry)(dsn, selectedFeatures);
131
+ });
132
+ await (0, telemetry_1.traceStep)('Update Angular project configuration', async () => {
133
+ await (0, sdk_setup_2.updateAppConfig)(installedMinVersion, selectedFeatures.performance);
134
+ });
135
+ await (0, telemetry_1.traceStep)('Setup for sourcemap uploads', async () => {
136
+ await (0, sourcemaps_1.addSourcemapEntryToAngularJSON)();
137
+ if (!options.preSelectedProject) {
138
+ options.preSelectedProject = {
139
+ authToken,
140
+ selfHosted,
141
+ project: {
142
+ organization: {
143
+ id: selectedProject.organization.id,
144
+ name: selectedProject.organization.name,
145
+ slug: selectedProject.organization.slug,
146
+ },
147
+ id: selectedProject.id,
148
+ slug: selectedProject.slug,
149
+ keys: [
150
+ {
151
+ dsn: {
152
+ public: dsn,
153
+ },
154
+ },
155
+ ],
156
+ },
157
+ };
158
+ options.url = sentryUrl;
159
+ }
160
+ await (0, sourcemaps_wizard_1.runSourcemapsWizard)(options, 'angular');
161
+ });
162
+ const shouldCreateExampleComponent = await (0, clack_1.askShouldCreateExampleComponent)();
163
+ Sentry.setTag('create-example-component', shouldCreateExampleComponent);
164
+ if (shouldCreateExampleComponent) {
165
+ await (0, telemetry_1.traceStep)('create-example-component', async () => await (0, example_component_1.createExampleComponent)({
166
+ url: sentryUrl,
167
+ orgSlug: selectedProject.organization.slug,
168
+ projectId: selectedProject.id,
169
+ }));
170
+ }
171
+ await (0, telemetry_1.traceStep)('Run Prettier', async () => {
172
+ await (0, clack_1.runPrettierIfInstalled)({ cwd: undefined });
173
+ });
174
+ prompts_1.default.outro(buildOutroMessage(shouldCreateExampleComponent));
175
+ }
176
+ function buildOutroMessage(createdExampleComponent) {
177
+ let msg = chalk_1.default.green('\nSuccessfully installed the Sentry Angular SDK!');
178
+ if (createdExampleComponent) {
179
+ msg += `\n\nYou can validate your setup by starting your dev environment (${chalk_1.default.cyan('ng serve')}) and throwing an error in the example component.`;
180
+ }
181
+ msg += `\n\nCheck out the SDK documentation for further configuration:
182
+ https://docs.sentry.io/platforms/javascript/guides/angular/`;
183
+ return msg;
184
+ }
185
+ exports.buildOutroMessage = buildOutroMessage;
186
+ //# sourceMappingURL=angular-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-wizard.js","sourceRoot":"","sources":["../../../src/angular/angular-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';\n\nimport chalk from 'chalk';\nimport type { WizardOptions } from '../utils/types';\nimport { traceStep, withTelemetry } from '../telemetry';\nimport {\n abortIfCancelled,\n askShouldCreateExampleComponent,\n confirmContinueIfNoOrDirtyGitRepo,\n ensurePackageIsInstalled,\n featureSelectionPrompt,\n getOrAskForProjectData,\n getPackageDotJson,\n installPackage,\n printWelcome,\n runPrettierIfInstalled,\n abort,\n} from '../utils/clack';\nimport { getPackageVersion, hasPackageInstalled } from '../utils/package-json';\nimport { gte, minVersion, SemVer } from 'semver';\n\nimport * as Sentry from '@sentry/node';\nimport { initalizeSentryOnApplicationEntry } from './sdk-setup';\nimport { updateAppConfig } from './sdk-setup';\nimport { runSourcemapsWizard } from '../sourcemaps/sourcemaps-wizard';\nimport { addSourcemapEntryToAngularJSON } from './codemods/sourcemaps';\nimport { createExampleComponent } from './example-component';\n\nconst MIN_SUPPORTED_ANGULAR_VERSION = '14.0.0';\nconst MIN_SUPPORTED_WIZARD_ANGULAR_VERSION = '17.0.0';\n\nexport async function runAngularWizard(options: WizardOptions): Promise<void> {\n return withTelemetry(\n {\n enabled: options.telemetryEnabled,\n integration: 'angular',\n wizardOptions: options,\n },\n () => runAngularWizardWithTelemetry(options),\n );\n}\n\nasync function runAngularWizardWithTelemetry(\n options: WizardOptions,\n): Promise<void> {\n printWelcome({\n wizardName: 'Sentry Angular Wizard',\n promoCode: options.promoCode,\n telemetryEnabled: options.telemetryEnabled,\n });\n\n await confirmContinueIfNoOrDirtyGitRepo({\n ignoreGitChanges: options.ignoreGitChanges,\n cwd: undefined,\n });\n\n const packageJson = await getPackageDotJson();\n\n await ensurePackageIsInstalled(packageJson, '@angular/core', 'Angular');\n\n let installedAngularVersion = getPackageVersion('@angular/core', packageJson);\n\n if (!installedAngularVersion) {\n clack.log.warn('Could not determine installed Angular version.');\n\n installedAngularVersion = await abortIfCancelled(\n clack.text({\n message: `Please enter your installed Angular major version (e.g. ${chalk.cyan(\n '18',\n )} for Angular 18)`,\n validate(value) {\n if (!value) {\n return 'Angular version is required';\n }\n\n try {\n if (!minVersion(value)) {\n return `Invalid Angular version provided: ${value}`;\n }\n } catch (error) {\n return `Invalid Angular version provided: ${value}`;\n }\n },\n }),\n );\n }\n\n Sentry.setTag('angular-version', installedAngularVersion);\n\n const installedMinVersion = minVersion(installedAngularVersion) as SemVer;\n\n const sdkSupportsAngularVersion = gte(\n installedMinVersion,\n MIN_SUPPORTED_ANGULAR_VERSION,\n );\n\n const wizardSupportsAngularVersion = gte(\n installedMinVersion,\n MIN_SUPPORTED_WIZARD_ANGULAR_VERSION,\n );\n\n if (!sdkSupportsAngularVersion) {\n Sentry.setTag('angular-version-compatible', false);\n\n clack.log.warn(\n `Angular version ${chalk.cyan(\n MIN_SUPPORTED_ANGULAR_VERSION,\n )} or higher is required for the Sentry SDK.`,\n );\n clack.log.warn(\n `Please refer to Sentry's version compatibility table for more information:\n\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/angular/#angular-version-compatibility',\n)}\n`,\n );\n\n return abort('Exiting the wizard.', 0);\n }\n\n if (!wizardSupportsAngularVersion) {\n Sentry.setTag('angular-wizard-version-compatible', false);\n\n clack.log.warn(\n `The Sentry Angular Wizard requires Angular version ${chalk.cyan(\n MIN_SUPPORTED_WIZARD_ANGULAR_VERSION,\n )} or higher.`,\n );\n clack.log.warn(\n `Your Angular version (${installedAngularVersion}) is compatible with the Sentry SDK but you need to set it up manually by following our documentation:\n\n${chalk.underline('https://docs.sentry.io/platforms/javascript/guides/angular')}\n\nApologies for the inconvenience!`,\n );\n\n return abort('Exiting the wizard.', 0);\n }\n\n const { selectedProject, authToken, sentryUrl, selfHosted } =\n await getOrAskForProjectData(options, 'javascript-angular');\n\n const dsn = selectedProject.keys[0].dsn.public;\n\n const sdkAlreadyInstalled = hasPackageInstalled(\n '@sentry/angular',\n packageJson,\n );\n\n Sentry.setTag('sdk-already-installed', sdkAlreadyInstalled);\n\n await installPackage({\n packageName: '@sentry/angular',\n packageNameDisplayLabel: '@sentry/angular',\n alreadyInstalled: sdkAlreadyInstalled,\n });\n\n const selectedFeatures = await featureSelectionPrompt([\n {\n id: 'performance',\n prompt: `Do you want to enable ${chalk.bold(\n 'Tracing',\n )} to track the performance of your application?`,\n enabledHint: 'recommended',\n },\n {\n id: 'replay',\n prompt: `Do you want to enable ${chalk.bold(\n 'Sentry Session Replay',\n )} to get a video-like reproduction of errors during a user session?`,\n enabledHint: 'recommended, but increases bundle size',\n },\n ] as const);\n\n await traceStep(\n 'Initialize Sentry on Angular application entry point',\n async () => {\n await initalizeSentryOnApplicationEntry(dsn, selectedFeatures);\n },\n );\n\n await traceStep('Update Angular project configuration', async () => {\n await updateAppConfig(installedMinVersion, selectedFeatures.performance);\n });\n\n await traceStep('Setup for sourcemap uploads', async () => {\n await addSourcemapEntryToAngularJSON();\n\n if (!options.preSelectedProject) {\n options.preSelectedProject = {\n authToken,\n selfHosted,\n project: {\n organization: {\n id: selectedProject.organization.id,\n name: selectedProject.organization.name,\n slug: selectedProject.organization.slug,\n },\n id: selectedProject.id,\n slug: selectedProject.slug,\n keys: [\n {\n dsn: {\n public: dsn,\n },\n },\n ],\n },\n };\n\n options.url = sentryUrl;\n }\n\n await runSourcemapsWizard(options, 'angular');\n });\n\n const shouldCreateExampleComponent = await askShouldCreateExampleComponent();\n\n Sentry.setTag('create-example-component', shouldCreateExampleComponent);\n\n if (shouldCreateExampleComponent) {\n await traceStep(\n 'create-example-component',\n async () =>\n await createExampleComponent({\n url: sentryUrl,\n orgSlug: selectedProject.organization.slug,\n projectId: selectedProject.id,\n }),\n );\n }\n\n await traceStep('Run Prettier', async () => {\n await runPrettierIfInstalled({ cwd: undefined });\n });\n\n clack.outro(buildOutroMessage(shouldCreateExampleComponent));\n}\n\nexport function buildOutroMessage(createdExampleComponent: boolean): string {\n let msg = chalk.green('\\nSuccessfully installed the Sentry Angular SDK!');\n\n if (createdExampleComponent) {\n msg += `\\n\\nYou can validate your setup by starting your dev environment (${chalk.cyan(\n 'ng serve',\n )}) and throwing an error in the example component.`;\n }\n\n msg += `\\n\\nCheck out the SDK documentation for further configuration:\nhttps://docs.sentry.io/platforms/javascript/guides/angular/`;\n\n return msg;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ProxifiedModule } from 'magicast';
2
+ import { type SemVer } from 'semver';
3
+ export declare function updateAppConfigMod(originalAppConfigMod: ProxifiedModule<any>, angularVersion: SemVer, isTracingEnabled: boolean): ProxifiedModule<any>;
@@ -0,0 +1,211 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.updateAppConfigMod = void 0;
30
+ // @ts-expect-error - clack is ESM and TS complains about that. It works though
31
+ const clack = __importStar(require("@clack/prompts"));
32
+ const semver_1 = require("semver");
33
+ const recast = __importStar(require("recast"));
34
+ const chalk_1 = __importDefault(require("chalk"));
35
+ function updateAppConfigMod(
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ originalAppConfigMod, angularVersion, isTracingEnabled) {
38
+ const isAboveAngularV19 = (0, semver_1.gte)(angularVersion, '19.0.0');
39
+ addImports(originalAppConfigMod, isAboveAngularV19, isTracingEnabled);
40
+ addProviders(originalAppConfigMod, isAboveAngularV19, isTracingEnabled);
41
+ return originalAppConfigMod;
42
+ }
43
+ exports.updateAppConfigMod = updateAppConfigMod;
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
+ function addSentryImport(originalAppConfigMod) {
46
+ const imports = originalAppConfigMod.imports;
47
+ const hasSentryImport = imports.$items.some((item) => item.from === '@sentry/angular');
48
+ if (!hasSentryImport) {
49
+ imports.$add({
50
+ from: '@sentry/angular',
51
+ imported: '*',
52
+ local: 'Sentry',
53
+ });
54
+ }
55
+ }
56
+ function addErrorHandlerImport(
57
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+ originalAppConfigMod) {
59
+ const imports = originalAppConfigMod.imports;
60
+ const hasErrorHandler = imports.$items.some((item) => item.local === 'ErrorHandler' && item.from === '@angular/core');
61
+ if (!hasErrorHandler) {
62
+ imports.$add({
63
+ from: '@angular/core',
64
+ imported: 'ErrorHandler',
65
+ local: 'ErrorHandler',
66
+ });
67
+ }
68
+ }
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ function addRouterImport(originalAppConfigMod) {
71
+ const imports = originalAppConfigMod.imports;
72
+ const hasRouter = imports.$items.some((item) => item.local === 'Router' && item.from === '@angular/router');
73
+ if (!hasRouter) {
74
+ imports.$add({
75
+ from: '@angular/router',
76
+ imported: 'Router',
77
+ local: 'Router',
78
+ });
79
+ }
80
+ }
81
+ function addMissingImportsV19(
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ originalAppConfigMod) {
84
+ const imports = originalAppConfigMod.imports;
85
+ const hasProvideAppInitializer = imports.$items.some((item) => item.local === 'provideAppInitializer' && item.from === '@angular/core');
86
+ if (!hasProvideAppInitializer) {
87
+ imports.$add({
88
+ from: '@angular/core',
89
+ imported: 'provideAppInitializer',
90
+ local: 'provideAppInitializer',
91
+ });
92
+ }
93
+ const hasInject = imports.$items.some((item) => item.local === 'inject' && item.from === '@angular/core');
94
+ if (!hasInject) {
95
+ imports.$add({
96
+ from: '@angular/core',
97
+ imported: 'inject',
98
+ local: 'inject',
99
+ });
100
+ }
101
+ }
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ function addAppInitializer(originalAppConfigMod) {
104
+ const imports = originalAppConfigMod.imports;
105
+ const hasAppInitializer = imports.$items.some((item) => item.local === 'APP_INITIALIZER' && item.from === '@angular/core');
106
+ if (!hasAppInitializer) {
107
+ imports.$add({
108
+ from: '@angular/core',
109
+ imported: 'APP_INITIALIZER',
110
+ local: 'APP_INITIALIZER',
111
+ });
112
+ }
113
+ }
114
+ function addImports(
115
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
+ originalAppConfigMod, isAboveAngularV19, isTracingEnabled) {
117
+ addSentryImport(originalAppConfigMod);
118
+ addErrorHandlerImport(originalAppConfigMod);
119
+ if (isTracingEnabled) {
120
+ addRouterImport(originalAppConfigMod);
121
+ }
122
+ if (isAboveAngularV19) {
123
+ addMissingImportsV19(originalAppConfigMod);
124
+ }
125
+ else if (isTracingEnabled) {
126
+ addAppInitializer(originalAppConfigMod);
127
+ }
128
+ }
129
+ function addProviders(
130
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
131
+ originalAppConfigMod, isAboveAngularV19, isTracingEnabled) {
132
+ const b = recast.types.builders;
133
+ recast.visit(originalAppConfigMod.exports.$ast, {
134
+ visitExportNamedDeclaration(path) {
135
+ if (path.node.declaration?.type !== 'VariableDeclaration' ||
136
+ path.node.declaration.declarations[0]?.type !== 'VariableDeclarator' ||
137
+ path.node.declaration.declarations[0].id.type !== 'Identifier' ||
138
+ path.node.declaration.declarations[0].id.name !== 'appConfig' ||
139
+ path.node.declaration.declarations[0].init?.type !==
140
+ 'ObjectExpression' ||
141
+ !path.node.declaration.declarations[0].init.properties) {
142
+ return;
143
+ }
144
+ const appConfigProps = path.node.declaration.declarations[0].init.properties;
145
+ const providersProperty = appConfigProps.find((prop) => prop?.type === 'ObjectProperty' &&
146
+ prop.key.type === 'Identifier' &&
147
+ prop.key.name === 'providers');
148
+ const validProviders = providersProperty?.value?.type === 'ArrayExpression'
149
+ ? providersProperty.value
150
+ : undefined;
151
+ if (!validProviders) {
152
+ return;
153
+ }
154
+ // Check if there is already an ErrorHandler provider
155
+ const hasErrorHandlerProvider = validProviders?.elements.some((element) => element &&
156
+ element.type === 'ObjectExpression' &&
157
+ element.properties.some((prop) => prop.type === 'ObjectProperty' &&
158
+ prop.key.type === 'Identifier' &&
159
+ prop.key.name === 'provide' &&
160
+ prop.value.type === 'Identifier' &&
161
+ prop.value.name === 'ErrorHandler'));
162
+ // If there is already an ErrorHandler provider, we skip adding it and log a message
163
+ if (hasErrorHandlerProvider) {
164
+ clack.log.warn(`ErrorHandler provider already exists in your app config.
165
+ Please refer to the Sentry Angular SDK documentation to combine it manually with Sentry's ErrorHandler.
166
+ ${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/angular/features/error-handler/')}
167
+ `);
168
+ }
169
+ else {
170
+ const errorHandlerObject = b.objectExpression([
171
+ b.objectProperty(b.identifier('provide'), b.identifier('ErrorHandler')),
172
+ b.objectProperty(b.identifier('useValue'), b.identifier('Sentry.createErrorHandler()')),
173
+ ]);
174
+ validProviders.elements.push(
175
+ // @ts-expect-error - errorHandlerObject is an objectExpression
176
+ errorHandlerObject);
177
+ }
178
+ if (isTracingEnabled) {
179
+ const traceServiceObject = b.objectExpression([
180
+ b.objectProperty(b.identifier('provide'), b.identifier('Sentry.TraceService')),
181
+ b.objectProperty(b.identifier('deps'), b.arrayExpression([b.identifier('Router')])),
182
+ ]);
183
+ // @ts-expect-error - errorHandlerObject is an objectExpression
184
+ validProviders.elements.push(traceServiceObject);
185
+ if (isAboveAngularV19) {
186
+ const provideAppInitializerCall = b.callExpression(b.identifier('provideAppInitializer'), [
187
+ b.arrowFunctionExpression([], b.blockStatement([
188
+ b.expressionStatement(b.callExpression(b.identifier('inject'), [
189
+ b.identifier('Sentry.TraceService'),
190
+ ])),
191
+ ])),
192
+ ]);
193
+ // @ts-expect-error - provideAppInitializerCall is an objectExpression
194
+ validProviders.elements.push(provideAppInitializerCall);
195
+ }
196
+ else {
197
+ const provideAppInitializerObject = b.objectExpression([
198
+ b.objectProperty(b.identifier('provide'), b.identifier('APP_INITIALIZER')),
199
+ b.objectProperty(b.identifier('useFactory'), b.arrowFunctionExpression([], b.arrowFunctionExpression([], b.blockStatement([])))),
200
+ b.objectProperty(b.identifier('deps'), b.arrayExpression([b.identifier('Sentry.TraceService')])),
201
+ b.objectProperty(b.identifier('multi'), b.booleanLiteral(true)),
202
+ ]);
203
+ // @ts-expect-error - provideAppInitializerObject is an objectExpression
204
+ validProviders.elements.push(provideAppInitializerObject);
205
+ }
206
+ }
207
+ this.traverse(path);
208
+ },
209
+ });
210
+ }
211
+ //# sourceMappingURL=app-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-config.js","sourceRoot":"","sources":["../../../../src/angular/codemods/app-config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ObjectProperty } from '@babel/types';\n\n// @ts-expect-error - magicast is ESM and TS complains about that. It works though\nimport type { ProxifiedModule } from 'magicast';\n\n// @ts-expect-error - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\nimport { gte, type SemVer } from 'semver';\nimport * as recast from 'recast';\nimport chalk from 'chalk';\n\nexport function updateAppConfigMod(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalAppConfigMod: ProxifiedModule<any>,\n angularVersion: SemVer,\n isTracingEnabled: boolean,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): ProxifiedModule<any> {\n const isAboveAngularV19 = gte(angularVersion, '19.0.0');\n\n addImports(originalAppConfigMod, isAboveAngularV19, isTracingEnabled);\n addProviders(originalAppConfigMod, isAboveAngularV19, isTracingEnabled);\n\n return originalAppConfigMod;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction addSentryImport(originalAppConfigMod: ProxifiedModule<any>): void {\n const imports = originalAppConfigMod.imports;\n const hasSentryImport = imports.$items.some(\n (item) => item.from === '@sentry/angular',\n );\n\n if (!hasSentryImport) {\n imports.$add({\n from: '@sentry/angular',\n imported: '*',\n local: 'Sentry',\n });\n }\n}\n\nfunction addErrorHandlerImport(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalAppConfigMod: ProxifiedModule<any>,\n): void {\n const imports = originalAppConfigMod.imports;\n const hasErrorHandler = imports.$items.some(\n (item) => item.local === 'ErrorHandler' && item.from === '@angular/core',\n );\n\n if (!hasErrorHandler) {\n imports.$add({\n from: '@angular/core',\n imported: 'ErrorHandler',\n local: 'ErrorHandler',\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction addRouterImport(originalAppConfigMod: ProxifiedModule<any>): void {\n const imports = originalAppConfigMod.imports;\n const hasRouter = imports.$items.some(\n (item) => item.local === 'Router' && item.from === '@angular/router',\n );\n\n if (!hasRouter) {\n imports.$add({\n from: '@angular/router',\n imported: 'Router',\n local: 'Router',\n });\n }\n}\n\nfunction addMissingImportsV19(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalAppConfigMod: ProxifiedModule<any>,\n): void {\n const imports = originalAppConfigMod.imports;\n\n const hasProvideAppInitializer = imports.$items.some(\n (item) =>\n item.local === 'provideAppInitializer' && item.from === '@angular/core',\n );\n\n if (!hasProvideAppInitializer) {\n imports.$add({\n from: '@angular/core',\n imported: 'provideAppInitializer',\n local: 'provideAppInitializer',\n });\n }\n\n const hasInject = imports.$items.some(\n (item) => item.local === 'inject' && item.from === '@angular/core',\n );\n\n if (!hasInject) {\n imports.$add({\n from: '@angular/core',\n imported: 'inject',\n local: 'inject',\n });\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction addAppInitializer(originalAppConfigMod: ProxifiedModule<any>): void {\n const imports = originalAppConfigMod.imports;\n\n const hasAppInitializer = imports.$items.some(\n (item) => item.local === 'APP_INITIALIZER' && item.from === '@angular/core',\n );\n\n if (!hasAppInitializer) {\n imports.$add({\n from: '@angular/core',\n imported: 'APP_INITIALIZER',\n local: 'APP_INITIALIZER',\n });\n }\n}\n\nfunction addImports(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalAppConfigMod: ProxifiedModule<any>,\n isAboveAngularV19: boolean,\n isTracingEnabled: boolean,\n): void {\n addSentryImport(originalAppConfigMod);\n addErrorHandlerImport(originalAppConfigMod);\n\n if (isTracingEnabled) {\n addRouterImport(originalAppConfigMod);\n }\n\n if (isAboveAngularV19) {\n addMissingImportsV19(originalAppConfigMod);\n } else if (isTracingEnabled) {\n addAppInitializer(originalAppConfigMod);\n }\n}\n\nfunction addProviders(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalAppConfigMod: ProxifiedModule<any>,\n isAboveAngularV19: boolean,\n isTracingEnabled: boolean,\n): void {\n const b = recast.types.builders;\n\n recast.visit(originalAppConfigMod.exports.$ast, {\n visitExportNamedDeclaration(path) {\n if (\n path.node.declaration?.type !== 'VariableDeclaration' ||\n path.node.declaration.declarations[0]?.type !== 'VariableDeclarator' ||\n path.node.declaration.declarations[0].id.type !== 'Identifier' ||\n path.node.declaration.declarations[0].id.name !== 'appConfig' ||\n path.node.declaration.declarations[0].init?.type !==\n 'ObjectExpression' ||\n !path.node.declaration.declarations[0].init.properties\n ) {\n return;\n }\n\n const appConfigProps =\n path.node.declaration.declarations[0].init.properties;\n\n const providersProperty = appConfigProps.find(\n (prop) =>\n prop?.type === 'ObjectProperty' &&\n prop.key.type === 'Identifier' &&\n prop.key.name === 'providers',\n // type cast is safe because we already check the type in the find condition\n ) as ObjectProperty | undefined;\n\n const validProviders =\n providersProperty?.value?.type === 'ArrayExpression'\n ? providersProperty.value\n : undefined;\n\n if (!validProviders) {\n return;\n }\n\n // Check if there is already an ErrorHandler provider\n const hasErrorHandlerProvider = validProviders?.elements.some(\n (element) =>\n element &&\n element.type === 'ObjectExpression' &&\n element.properties.some(\n (prop) =>\n prop.type === 'ObjectProperty' &&\n prop.key.type === 'Identifier' &&\n prop.key.name === 'provide' &&\n prop.value.type === 'Identifier' &&\n prop.value.name === 'ErrorHandler',\n ),\n );\n\n // If there is already an ErrorHandler provider, we skip adding it and log a message\n if (hasErrorHandlerProvider) {\n clack.log.warn(`ErrorHandler provider already exists in your app config.\nPlease refer to the Sentry Angular SDK documentation to combine it manually with Sentry's ErrorHandler.\n${chalk.underline(\n 'https://docs.sentry.io/platforms/javascript/guides/angular/features/error-handler/',\n)}\n`);\n } else {\n const errorHandlerObject = b.objectExpression([\n b.objectProperty(\n b.identifier('provide'),\n b.identifier('ErrorHandler'),\n ),\n b.objectProperty(\n b.identifier('useValue'),\n b.identifier('Sentry.createErrorHandler()'),\n ),\n ]);\n\n validProviders.elements.push(\n // @ts-expect-error - errorHandlerObject is an objectExpression\n errorHandlerObject,\n );\n }\n\n if (isTracingEnabled) {\n const traceServiceObject = b.objectExpression([\n b.objectProperty(\n b.identifier('provide'),\n b.identifier('Sentry.TraceService'),\n ),\n b.objectProperty(\n b.identifier('deps'),\n b.arrayExpression([b.identifier('Router')]),\n ),\n ]);\n\n // @ts-expect-error - errorHandlerObject is an objectExpression\n validProviders.elements.push(traceServiceObject);\n\n if (isAboveAngularV19) {\n const provideAppInitializerCall = b.callExpression(\n b.identifier('provideAppInitializer'),\n [\n b.arrowFunctionExpression(\n [],\n b.blockStatement([\n b.expressionStatement(\n b.callExpression(b.identifier('inject'), [\n b.identifier('Sentry.TraceService'),\n ]),\n ),\n ]),\n ),\n ],\n );\n\n // @ts-expect-error - provideAppInitializerCall is an objectExpression\n validProviders.elements.push(provideAppInitializerCall);\n } else {\n const provideAppInitializerObject = b.objectExpression([\n b.objectProperty(\n b.identifier('provide'),\n b.identifier('APP_INITIALIZER'),\n ),\n b.objectProperty(\n b.identifier('useFactory'),\n b.arrowFunctionExpression(\n [],\n b.arrowFunctionExpression([], b.blockStatement([])),\n ),\n ),\n b.objectProperty(\n b.identifier('deps'),\n b.arrayExpression([b.identifier('Sentry.TraceService')]),\n ),\n b.objectProperty(b.identifier('multi'), b.booleanLiteral(true)),\n ]);\n\n // @ts-expect-error - provideAppInitializerObject is an objectExpression\n validProviders.elements.push(provideAppInitializerObject);\n }\n }\n\n this.traverse(path);\n },\n });\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { Program } from '@babel/types';
2
+ import { Proxified, type ProxifiedModule } from 'magicast';
3
+ export declare function updateAppEntryMod(originalAppModuleMod: ProxifiedModule<any>, dsn: string, selectedFeatures: {
4
+ performance: boolean;
5
+ replay: boolean;
6
+ }): ProxifiedModule<any>;
7
+ export declare function insertInitCall(originalAppModuleMod: ProxifiedModule<any>, dsn: string, selectedFeatures: {
8
+ performance: boolean;
9
+ replay: boolean;
10
+ }): void;
11
+ type InitCallArgs = Record<string, string | number | Array<Proxified>>;
12
+ export declare function getInitCallArgs(dsn: string, selectedFeatures: {
13
+ performance: boolean;
14
+ replay: boolean;
15
+ }): InitCallArgs;
16
+ /**
17
+ * We want to insert the handleError function just after all imports
18
+ */
19
+ export declare function getAfterImportsInsertionIndex(originalEntryServerModAST: Program): number;
20
+ export {};
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAfterImportsInsertionIndex = exports.getInitCallArgs = exports.insertInitCall = exports.updateAppEntryMod = void 0;
4
+ const magicast_1 = require("magicast");
5
+ function updateAppEntryMod(
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ originalAppModuleMod, dsn, selectedFeatures) {
8
+ originalAppModuleMod.imports.$add({
9
+ from: '@sentry/angular',
10
+ imported: '*',
11
+ local: 'Sentry',
12
+ });
13
+ insertInitCall(originalAppModuleMod, dsn, selectedFeatures);
14
+ return originalAppModuleMod;
15
+ }
16
+ exports.updateAppEntryMod = updateAppEntryMod;
17
+ function insertInitCall(
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ originalAppModuleMod, dsn, selectedFeatures) {
20
+ const initCallArgs = getInitCallArgs(dsn, selectedFeatures);
21
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- builders return Proxified which defaults to any
22
+ const initCall = magicast_1.builders.functionCall('Sentry.init', initCallArgs);
23
+ const originalAppModuleModAst = originalAppModuleMod.$ast;
24
+ const initCallInsertionIndex = getAfterImportsInsertionIndex(originalAppModuleModAst);
25
+ originalAppModuleModAst.body.splice(initCallInsertionIndex, 0,
26
+ // @ts-expect-error - string works here because the AST is proxified by magicast
27
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- builders return Proxified which defaults to any.
28
+ (0, magicast_1.generateCode)(initCall).code);
29
+ }
30
+ exports.insertInitCall = insertInitCall;
31
+ function getInitCallArgs(dsn, selectedFeatures) {
32
+ const initCallArgs = {
33
+ dsn,
34
+ };
35
+ if (selectedFeatures.replay || selectedFeatures.performance) {
36
+ initCallArgs.integrations = [];
37
+ if (selectedFeatures.performance) {
38
+ initCallArgs.integrations.push(magicast_1.builders.functionCall('Sentry.browserTracingIntegration'));
39
+ initCallArgs.tracesSampleRate = 1.0;
40
+ }
41
+ if (selectedFeatures.replay) {
42
+ initCallArgs.integrations.push(magicast_1.builders.functionCall('Sentry.replayIntegration'));
43
+ initCallArgs.replaysSessionSampleRate = 0.1;
44
+ initCallArgs.replaysOnErrorSampleRate = 1.0;
45
+ }
46
+ }
47
+ return initCallArgs;
48
+ }
49
+ exports.getInitCallArgs = getInitCallArgs;
50
+ /**
51
+ * We want to insert the handleError function just after all imports
52
+ */
53
+ function getAfterImportsInsertionIndex(originalEntryServerModAST) {
54
+ for (let x = originalEntryServerModAST.body.length - 1; x >= 0; x--) {
55
+ if (originalEntryServerModAST.body[x].type === 'ImportDeclaration') {
56
+ return x + 1;
57
+ }
58
+ }
59
+ return 0;
60
+ }
61
+ exports.getAfterImportsInsertionIndex = getAfterImportsInsertionIndex;
62
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../src/angular/codemods/main.ts"],"names":[],"mappings":";;;AAEA,uCAMkB;AAElB,SAAgB,iBAAiB;AAC/B,8DAA8D;AAC9D,oBAA0C,EAC1C,GAAW,EACX,gBAGC;IAGD,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC;QAChC,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,GAAG;QACb,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEH,cAAc,CAAC,oBAAoB,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAE5D,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAnBD,8CAmBC;AAED,SAAgB,cAAc;AAC5B,8DAA8D;AAC9D,oBAA0C,EAC1C,GAAW,EACX,gBAGC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC5D,sHAAsH;IACtH,MAAM,QAAQ,GAAG,mBAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACpE,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,IAAe,CAAC;IAErE,MAAM,sBAAsB,GAAG,6BAA6B,CAC1D,uBAAuB,CACxB,CAAC;IAEF,uBAAuB,CAAC,IAAI,CAAC,MAAM,CACjC,sBAAsB,EACtB,CAAC;IACD,gFAAgF;IAChF,qHAAqH;IACrH,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC,IAAI,CAC5B,CAAC;AACJ,CAAC;AAzBD,wCAyBC;AAID,SAAgB,eAAe,CAC7B,GAAW,EACX,gBAGC;IAED,MAAM,YAAY,GAAiB;QACjC,GAAG;KACJ,CAAC;IAEF,IAAI,gBAAgB,CAAC,MAAM,IAAI,gBAAgB,CAAC,WAAW,EAAE;QAC3D,YAAY,CAAC,YAAY,GAAG,EAAE,CAAC;QAE/B,IAAI,gBAAgB,CAAC,WAAW,EAAE;YAChC,YAAY,CAAC,YAAY,CAAC,IAAI,CAC5B,mBAAQ,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAC1D,CAAC;YACF,YAAY,CAAC,gBAAgB,GAAG,GAAG,CAAC;SACrC;QAED,IAAI,gBAAgB,CAAC,MAAM,EAAE;YAC3B,YAAY,CAAC,YAAY,CAAC,IAAI,CAC5B,mBAAQ,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAClD,CAAC;YAEF,YAAY,CAAC,wBAAwB,GAAG,GAAG,CAAC;YAC5C,YAAY,CAAC,wBAAwB,GAAG,GAAG,CAAC;SAC7C;KACF;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAhCD,0CAgCC;AAED;;GAEG;AACH,SAAgB,6BAA6B,CAC3C,yBAAkC;IAElC,KAAK,IAAI,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QACnE,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,EAAE;YAClE,OAAO,CAAC,GAAG,CAAC,CAAC;SACd;KACF;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAVD,sEAUC","sourcesContent":["import type { Program } from '@babel/types';\n\nimport {\n builders,\n generateCode,\n Proxified,\n type ProxifiedModule,\n // @ts-expect-error - magicast is ESM and TS complains about that. It works though\n} from 'magicast';\n\nexport function updateAppEntryMod(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalAppModuleMod: ProxifiedModule<any>,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): ProxifiedModule<any> {\n originalAppModuleMod.imports.$add({\n from: '@sentry/angular',\n imported: '*',\n local: 'Sentry',\n });\n\n insertInitCall(originalAppModuleMod, dsn, selectedFeatures);\n\n return originalAppModuleMod;\n}\n\nexport function insertInitCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n originalAppModuleMod: ProxifiedModule<any>,\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): void {\n const initCallArgs = getInitCallArgs(dsn, selectedFeatures);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- builders return Proxified which defaults to any\n const initCall = builders.functionCall('Sentry.init', initCallArgs);\n const originalAppModuleModAst = originalAppModuleMod.$ast as Program;\n\n const initCallInsertionIndex = getAfterImportsInsertionIndex(\n originalAppModuleModAst,\n );\n\n originalAppModuleModAst.body.splice(\n initCallInsertionIndex,\n 0,\n // @ts-expect-error - string works here because the AST is proxified by magicast\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- builders return Proxified which defaults to any.\n generateCode(initCall).code,\n );\n}\n\ntype InitCallArgs = Record<string, string | number | Array<Proxified>>;\n\nexport function getInitCallArgs(\n dsn: string,\n selectedFeatures: {\n performance: boolean;\n replay: boolean;\n },\n): InitCallArgs {\n const initCallArgs: InitCallArgs = {\n dsn,\n };\n\n if (selectedFeatures.replay || selectedFeatures.performance) {\n initCallArgs.integrations = [];\n\n if (selectedFeatures.performance) {\n initCallArgs.integrations.push(\n builders.functionCall('Sentry.browserTracingIntegration'),\n );\n initCallArgs.tracesSampleRate = 1.0;\n }\n\n if (selectedFeatures.replay) {\n initCallArgs.integrations.push(\n builders.functionCall('Sentry.replayIntegration'),\n );\n\n initCallArgs.replaysSessionSampleRate = 0.1;\n initCallArgs.replaysOnErrorSampleRate = 1.0;\n }\n }\n\n return initCallArgs;\n}\n\n/**\n * We want to insert the handleError function just after all imports\n */\nexport function getAfterImportsInsertionIndex(\n originalEntryServerModAST: Program,\n): number {\n for (let x = originalEntryServerModAST.body.length - 1; x >= 0; x--) {\n if (originalEntryServerModAST.body[x].type === 'ImportDeclaration') {\n return x + 1;\n }\n }\n\n return 0;\n}\n"]}
@@ -0,0 +1,21 @@
1
+ interface PartialAngularJson {
2
+ projects?: {
3
+ [key: string]: {
4
+ architect?: {
5
+ build?: {
6
+ configurations?: {
7
+ production?: {
8
+ sourceMap?: boolean;
9
+ } & Record<string, unknown>;
10
+ };
11
+ };
12
+ };
13
+ };
14
+ };
15
+ }
16
+ export declare function addSourcemapEntryToAngularJSON(): Promise<void>;
17
+ /**
18
+ * Extracted from `addSourcemapEntryToAngularJSON` and exported to allow for easier testing.
19
+ */
20
+ export declare function addSourceMapsSetting(angularJson: PartialAngularJson): PartialAngularJson | undefined;
21
+ export {};