@sentry/wizard
Version:
Sentry wizard helping you to configure your project
211 lines • 9.94 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateAppConfigMod = void 0;
// @ts-expect-error - clack is ESM and TS complains about that. It works though
const clack = __importStar(require("@clack/prompts"));
const semver_1 = require("semver");
const recast = __importStar(require("recast"));
const chalk_1 = __importDefault(require("chalk"));
function updateAppConfigMod(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
originalAppConfigMod, angularVersion, isTracingEnabled) {
const isAboveAngularV19 = (0, semver_1.gte)(angularVersion, '19.0.0');
addImports(originalAppConfigMod, isAboveAngularV19, isTracingEnabled);
addProviders(originalAppConfigMod, isAboveAngularV19, isTracingEnabled);
return originalAppConfigMod;
}
exports.updateAppConfigMod = updateAppConfigMod;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function addSentryImport(originalAppConfigMod) {
const imports = originalAppConfigMod.imports;
const hasSentryImport = imports.$items.some((item) => item.from === '@sentry/angular');
if (!hasSentryImport) {
imports.$add({
from: '@sentry/angular',
imported: '*',
local: 'Sentry',
});
}
}
function addErrorHandlerImport(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
originalAppConfigMod) {
const imports = originalAppConfigMod.imports;
const hasErrorHandler = imports.$items.some((item) => item.local === 'ErrorHandler' && item.from === '@angular/core');
if (!hasErrorHandler) {
imports.$add({
from: '@angular/core',
imported: 'ErrorHandler',
local: 'ErrorHandler',
});
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function addRouterImport(originalAppConfigMod) {
const imports = originalAppConfigMod.imports;
const hasRouter = imports.$items.some((item) => item.local === 'Router' && item.from === '@angular/router');
if (!hasRouter) {
imports.$add({
from: '@angular/router',
imported: 'Router',
local: 'Router',
});
}
}
function addMissingImportsV19(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
originalAppConfigMod) {
const imports = originalAppConfigMod.imports;
const hasProvideAppInitializer = imports.$items.some((item) => item.local === 'provideAppInitializer' && item.from === '@angular/core');
if (!hasProvideAppInitializer) {
imports.$add({
from: '@angular/core',
imported: 'provideAppInitializer',
local: 'provideAppInitializer',
});
}
const hasInject = imports.$items.some((item) => item.local === 'inject' && item.from === '@angular/core');
if (!hasInject) {
imports.$add({
from: '@angular/core',
imported: 'inject',
local: 'inject',
});
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function addAppInitializer(originalAppConfigMod) {
const imports = originalAppConfigMod.imports;
const hasAppInitializer = imports.$items.some((item) => item.local === 'APP_INITIALIZER' && item.from === '@angular/core');
if (!hasAppInitializer) {
imports.$add({
from: '@angular/core',
imported: 'APP_INITIALIZER',
local: 'APP_INITIALIZER',
});
}
}
function addImports(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
originalAppConfigMod, isAboveAngularV19, isTracingEnabled) {
addSentryImport(originalAppConfigMod);
addErrorHandlerImport(originalAppConfigMod);
if (isTracingEnabled) {
addRouterImport(originalAppConfigMod);
}
if (isAboveAngularV19) {
addMissingImportsV19(originalAppConfigMod);
}
else if (isTracingEnabled) {
addAppInitializer(originalAppConfigMod);
}
}
function addProviders(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
originalAppConfigMod, isAboveAngularV19, isTracingEnabled) {
const b = recast.types.builders;
recast.visit(originalAppConfigMod.exports.$ast, {
visitExportNamedDeclaration(path) {
if (path.node.declaration?.type !== 'VariableDeclaration' ||
path.node.declaration.declarations[0]?.type !== 'VariableDeclarator' ||
path.node.declaration.declarations[0].id.type !== 'Identifier' ||
path.node.declaration.declarations[0].id.name !== 'appConfig' ||
path.node.declaration.declarations[0].init?.type !==
'ObjectExpression' ||
!path.node.declaration.declarations[0].init.properties) {
return;
}
const appConfigProps = path.node.declaration.declarations[0].init.properties;
const providersProperty = appConfigProps.find((prop) => prop?.type === 'ObjectProperty' &&
prop.key.type === 'Identifier' &&
prop.key.name === 'providers');
const validProviders = providersProperty?.value?.type === 'ArrayExpression'
? providersProperty.value
: undefined;
if (!validProviders) {
return;
}
// Check if there is already an ErrorHandler provider
const hasErrorHandlerProvider = validProviders?.elements.some((element) => element &&
element.type === 'ObjectExpression' &&
element.properties.some((prop) => prop.type === 'ObjectProperty' &&
prop.key.type === 'Identifier' &&
prop.key.name === 'provide' &&
prop.value.type === 'Identifier' &&
prop.value.name === 'ErrorHandler'));
// If there is already an ErrorHandler provider, we skip adding it and log a message
if (hasErrorHandlerProvider) {
clack.log.warn(`ErrorHandler provider already exists in your app config.
Please refer to the Sentry Angular SDK documentation to combine it manually with Sentry's ErrorHandler.
${chalk_1.default.underline('https://docs.sentry.io/platforms/javascript/guides/angular/features/error-handler/')}
`);
}
else {
const errorHandlerObject = b.objectExpression([
b.objectProperty(b.identifier('provide'), b.identifier('ErrorHandler')),
b.objectProperty(b.identifier('useValue'), b.identifier('Sentry.createErrorHandler()')),
]);
validProviders.elements.push(
// @ts-expect-error - errorHandlerObject is an objectExpression
errorHandlerObject);
}
if (isTracingEnabled) {
const traceServiceObject = b.objectExpression([
b.objectProperty(b.identifier('provide'), b.identifier('Sentry.TraceService')),
b.objectProperty(b.identifier('deps'), b.arrayExpression([b.identifier('Router')])),
]);
// @ts-expect-error - errorHandlerObject is an objectExpression
validProviders.elements.push(traceServiceObject);
if (isAboveAngularV19) {
const provideAppInitializerCall = b.callExpression(b.identifier('provideAppInitializer'), [
b.arrowFunctionExpression([], b.blockStatement([
b.expressionStatement(b.callExpression(b.identifier('inject'), [
b.identifier('Sentry.TraceService'),
])),
])),
]);
// @ts-expect-error - provideAppInitializerCall is an objectExpression
validProviders.elements.push(provideAppInitializerCall);
}
else {
const provideAppInitializerObject = b.objectExpression([
b.objectProperty(b.identifier('provide'), b.identifier('APP_INITIALIZER')),
b.objectProperty(b.identifier('useFactory'), b.arrowFunctionExpression([], b.arrowFunctionExpression([], b.blockStatement([])))),
b.objectProperty(b.identifier('deps'), b.arrayExpression([b.identifier('Sentry.TraceService')])),
b.objectProperty(b.identifier('multi'), b.booleanLiteral(true)),
]);
// @ts-expect-error - provideAppInitializerObject is an objectExpression
validProviders.elements.push(provideAppInitializerObject);
}
}
this.traverse(path);
},
});
}
//# sourceMappingURL=app-config.js.map