@sentry/core
Advanced tools
+4
-2
| import { Breadcrumb, Context, SdkInfo, SentryEvent } from '@sentry/shim'; | ||
| import { DSN } from './dsn'; | ||
| import { Backend, Frontend, Options, Scope } from './interfaces'; | ||
| import { SendStatus } from './status'; | ||
| /** A class object that can instanciate Backend objects. */ | ||
@@ -135,3 +136,3 @@ export interface BackendClass<B extends Backend, O extends Options> { | ||
| /** | ||
| * Sends an event (either error or message) to Sentry. | ||
| * Processes an event (either error or message) and sends it to Sentry. | ||
| * | ||
@@ -149,5 +150,6 @@ * This also adds breadcrumbs and context information to the event. However, | ||
| * @param scope A scope containing event metadata. | ||
| * @param send A function to actually send the event. | ||
| * @returns A Promise that resolves with the event status. | ||
| */ | ||
| private sendEvent(event, scope); | ||
| protected processEvent(event: SentryEvent, scope: Scope, send: (finalEvent: SentryEvent) => Promise<number>): Promise<SendStatus>; | ||
| } |
+8
-4
@@ -187,5 +187,8 @@ "use strict"; | ||
| return __awaiter(this, void 0, void 0, function () { | ||
| var _this = this; | ||
| return __generator(this, function (_a) { | ||
| switch (_a.label) { | ||
| case 0: return [4 /*yield*/, this.sendEvent(event, scope)]; | ||
| case 0: return [4 /*yield*/, this.processEvent(event, scope, function (finalEvent) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { | ||
| return [2 /*return*/, this.getBackend().sendEvent(finalEvent)]; | ||
| }); }); })]; | ||
| case 1: | ||
@@ -339,3 +342,3 @@ _a.sent(); | ||
| /** | ||
| * Sends an event (either error or message) to Sentry. | ||
| * Processes an event (either error or message) and sends it to Sentry. | ||
| * | ||
@@ -353,5 +356,6 @@ * This also adds breadcrumbs and context information to the event. However, | ||
| * @param scope A scope containing event metadata. | ||
| * @param send A function to actually send the event. | ||
| * @returns A Promise that resolves with the event status. | ||
| */ | ||
| FrontendBase.prototype.sendEvent = function (event, scope) { | ||
| FrontendBase.prototype.processEvent = function (event, scope, send) { | ||
| return __awaiter(this, void 0, void 0, function () { | ||
@@ -373,3 +377,3 @@ var prepared, _a, shouldSend, beforeSend, afterSend, finalEvent, code, status; | ||
| finalEvent = beforeSend ? beforeSend(prepared) : prepared; | ||
| return [4 /*yield*/, this.getBackend().sendEvent(finalEvent)]; | ||
| return [4 /*yield*/, send(finalEvent)]; | ||
| case 2: | ||
@@ -376,0 +380,0 @@ code = _b.sent(); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { Breadcrumb, Context, SdkInfo, SentryEvent } from '@sentry/shim';\nimport { DSN } from './dsn';\nimport { Backend, Frontend, Options, Scope } from './interfaces';\nimport { SendStatus } from './status';\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 30;\n\n/**\n * Absolute maximum number of breadcrumbs added to an event. The\n * `maxBreadcrumbs` option cannot be higher than this value.\n */\nconst MAX_BREADCRUMBS = 100;\n\n/** A class object that can instanciate Backend objects. */\nexport interface BackendClass<B extends Backend, O extends Options> {\n new (frontend: Frontend<O>): B;\n}\n\n/**\n * Base implementation for all JavaScript SDK frontends.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the frontend subclass. To access these options later, use\n * {@link Frontend.getOptions}. Also, the Backend instance is available via\n * {@link Frontend.getBackend}.\n *\n * Subclasses must implement one abstract method: {@link getSdkInfo}. It must\n * return the unique name and the version of the SDK.\n *\n * If a DSN is specified in the options, it will be parsed and stored. Use\n * {@link Frontend.getDSN} to retrieve the DSN at any moment. In case the DSN is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid DSN, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link FrontendBase.prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Frontend.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Frontend.addBreadcrumb}.\n *\n * @example\n * class NodeFrontend extends FrontendBase<NodeBackend, NodeOptions> {\n * public constructor(options: NodeOptions) {\n * super(NodeBackend, options);\n * }\n *\n * // ...\n * }\n */\nexport abstract class FrontendBase<B extends Backend, O extends Options>\n implements Frontend<O> {\n /**\n * The backend used to physically interact in the enviornment. Usually, this\n * will correspond to the frontend. When composing SDKs, however, the Backend\n * from the root SDK will be used.\n */\n private readonly backend: B;\n\n /** Options passed to the SDK. */\n private readonly options: O;\n\n /**\n * The client DSN, if specified in options. Without this DSN, the SDK will be\n * disabled.\n */\n private readonly dsn?: DSN;\n\n /**\n * A scope instance containing breadcrumbs and context, used if none is\n * specified to the public methods. This is specifically used in standalone\n * mode, when the Frontend is directly instanciated by the user.\n */\n private readonly internalScope: Scope;\n\n /**\n * Stores whether installation has been performed and was successful. Before\n * installing, this is undefined. Then it contains the success state.\n */\n private installed?: boolean;\n\n /**\n * Initializes this frontend instance.\n *\n * @param backendClass A constructor function to create the backend.\n * @param options Options for the frontend.\n */\n protected constructor(backendClass: BackendClass<B, O>, options: O) {\n this.backend = new backendClass(this);\n this.options = options;\n\n if (options.dsn) {\n this.dsn = new DSN(options.dsn);\n }\n\n // The initial scope must have access to backend, options and DSN\n this.internalScope = this.getInitialScope();\n }\n\n /**\n * @inheritDoc\n */\n public install(): boolean {\n if (!this.isEnabled()) {\n return false;\n }\n\n if (this.installed === undefined) {\n this.installed = this.getBackend().install();\n }\n\n return this.installed;\n }\n\n /**\n * @inheritDoc\n */\n public async captureException(\n exception: any,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n const event = await this.getBackend().eventFromException(exception);\n await this.captureEvent(event, scope);\n }\n\n /**\n * @inheritDoc\n */\n public async captureMessage(\n message: string,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n const event = await this.getBackend().eventFromMessage(message);\n await this.captureEvent(event, scope);\n }\n\n /**\n * @inheritDoc\n */\n public async captureEvent(\n event: SentryEvent,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n await this.sendEvent(event, scope);\n }\n\n /**\n * @inheritDoc\n */\n public async addBreadcrumb(\n breadcrumb: Breadcrumb,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n const {\n shouldAddBreadcrumb,\n beforeBreadcrumb,\n afterBreadcrumb,\n maxBreadcrumbs = DEFAULT_BREADCRUMBS,\n } = this.getOptions();\n\n if (maxBreadcrumbs <= 0) {\n return;\n }\n\n const timestamp = new Date().getTime() / 1000;\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n if (shouldAddBreadcrumb && !shouldAddBreadcrumb(mergedBreadcrumb)) {\n return;\n }\n\n const finalBreadcrumb = beforeBreadcrumb\n ? beforeBreadcrumb(mergedBreadcrumb)\n : mergedBreadcrumb;\n\n if (await this.getBackend().storeBreadcrumb(finalBreadcrumb, scope)) {\n scope.breadcrumbs = [...scope.breadcrumbs, finalBreadcrumb].slice(\n -Math.max(0, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS)),\n );\n }\n\n if (afterBreadcrumb) {\n afterBreadcrumb(finalBreadcrumb);\n }\n }\n\n /**\n * @inheritDoc\n */\n public getDSN(): DSN | undefined {\n return this.dsn;\n }\n\n /**\n * @inheritDoc\n */\n public getOptions(): O {\n return this.options;\n }\n\n /**\n * @inheritDoc\n */\n public async setContext(\n nextContext: Context,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n if (await this.getBackend().storeContext(nextContext, scope)) {\n const context = scope.context;\n if (nextContext.extra) {\n context.extra = { ...context.extra, ...nextContext.extra };\n }\n if (nextContext.tags) {\n context.tags = { ...context.tags, ...nextContext.tags };\n }\n if (nextContext.user) {\n context.user = { ...context.user, ...nextContext.user };\n }\n }\n }\n\n /**\n * @inheritDoc\n */\n public getInitialScope(): Scope {\n return {\n breadcrumbs: [],\n context: {},\n };\n }\n\n /** Returns the current used SDK version and name. */\n protected abstract getSdkInfo(): SdkInfo;\n\n /** Returns the current internal scope of this instance. */\n protected getInternalScope(): Scope {\n return this.internalScope;\n }\n\n /** Returns the current backend. */\n protected getBackend(): B {\n return this.backend;\n }\n\n /** Determines whether this SDK is enabled and a valid DSN is present. */\n protected isEnabled(): boolean {\n return this.getOptions().enabled !== false && this.dsn !== undefined;\n }\n\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`, SDK\n * information returned by {@link FrontendBase.getSdkInfo}, as well as\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n protected async prepareEvent(\n event: SentryEvent,\n scope: Scope,\n ): Promise<SentryEvent> {\n const {\n environment,\n maxBreadcrumbs = DEFAULT_BREADCRUMBS,\n release,\n } = this.getOptions();\n\n const prepared = { sdk: this.getSdkInfo(), ...event };\n if (prepared.environment === undefined && environment !== undefined) {\n prepared.environment = environment;\n }\n if (prepared.release === undefined && release !== undefined) {\n prepared.release = release;\n }\n\n const breadcrumbs = scope.breadcrumbs;\n if (breadcrumbs.length > 0 && maxBreadcrumbs > 0) {\n prepared.breadcrumbs = breadcrumbs.slice(\n -Math.max(0, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS)),\n );\n }\n\n const context = scope.context;\n if (context.extra) {\n prepared.extra = { ...context.extra, ...event.extra };\n }\n if (context.tags) {\n prepared.tags = { ...context.tags, ...event.tags };\n }\n if (context.user) {\n prepared.user = { ...context.user, ...event.user };\n }\n\n return prepared;\n }\n\n /**\n * Sends an event (either error or message) to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n * The returned event status offers clues to whether the event was sent to\n * Sentry and accepted there. If the {@link Options.shouldSend} hook returns\n * `false`, the status will be {@link SendStatus.Skipped}. If the rate limit\n * was exceeded, the status will be {@link SendStatus.RateLimit}.\n *\n * @param event The event to send to Sentry.\n * @param scope A scope containing event metadata.\n * @returns A Promise that resolves with the event status.\n */\n private async sendEvent(\n event: SentryEvent,\n scope: Scope,\n ): Promise<SendStatus> {\n if (!this.isEnabled()) {\n return SendStatus.Skipped;\n }\n\n const prepared = await this.prepareEvent(event, scope);\n const { shouldSend, beforeSend, afterSend } = this.getOptions();\n if (shouldSend && !shouldSend(prepared)) {\n return SendStatus.Skipped;\n }\n\n const finalEvent = beforeSend ? beforeSend(prepared) : prepared;\n const code = await this.getBackend().sendEvent(finalEvent);\n const status = SendStatus.fromHttpCode(code);\n\n if (status === SendStatus.RateLimit) {\n // TODO: Handle rate limits and maintain a queue. For now, we require SDK\n // implementors to override this method and handle it themselves.\n }\n\n if (afterSend) {\n afterSend(finalEvent, status);\n }\n\n return status;\n }\n}\n"]} | ||
| {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { Breadcrumb, Context, SdkInfo, SentryEvent } from '@sentry/shim';\nimport { DSN } from './dsn';\nimport { Backend, Frontend, Options, Scope } from './interfaces';\nimport { SendStatus } from './status';\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 30;\n\n/**\n * Absolute maximum number of breadcrumbs added to an event. The\n * `maxBreadcrumbs` option cannot be higher than this value.\n */\nconst MAX_BREADCRUMBS = 100;\n\n/** A class object that can instanciate Backend objects. */\nexport interface BackendClass<B extends Backend, O extends Options> {\n new (frontend: Frontend<O>): B;\n}\n\n/**\n * Base implementation for all JavaScript SDK frontends.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the frontend subclass. To access these options later, use\n * {@link Frontend.getOptions}. Also, the Backend instance is available via\n * {@link Frontend.getBackend}.\n *\n * Subclasses must implement one abstract method: {@link getSdkInfo}. It must\n * return the unique name and the version of the SDK.\n *\n * If a DSN is specified in the options, it will be parsed and stored. Use\n * {@link Frontend.getDSN} to retrieve the DSN at any moment. In case the DSN is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid DSN, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link FrontendBase.prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Frontend.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Frontend.addBreadcrumb}.\n *\n * @example\n * class NodeFrontend extends FrontendBase<NodeBackend, NodeOptions> {\n * public constructor(options: NodeOptions) {\n * super(NodeBackend, options);\n * }\n *\n * // ...\n * }\n */\nexport abstract class FrontendBase<B extends Backend, O extends Options>\n implements Frontend<O> {\n /**\n * The backend used to physically interact in the enviornment. Usually, this\n * will correspond to the frontend. When composing SDKs, however, the Backend\n * from the root SDK will be used.\n */\n private readonly backend: B;\n\n /** Options passed to the SDK. */\n private readonly options: O;\n\n /**\n * The client DSN, if specified in options. Without this DSN, the SDK will be\n * disabled.\n */\n private readonly dsn?: DSN;\n\n /**\n * A scope instance containing breadcrumbs and context, used if none is\n * specified to the public methods. This is specifically used in standalone\n * mode, when the Frontend is directly instanciated by the user.\n */\n private readonly internalScope: Scope;\n\n /**\n * Stores whether installation has been performed and was successful. Before\n * installing, this is undefined. Then it contains the success state.\n */\n private installed?: boolean;\n\n /**\n * Initializes this frontend instance.\n *\n * @param backendClass A constructor function to create the backend.\n * @param options Options for the frontend.\n */\n protected constructor(backendClass: BackendClass<B, O>, options: O) {\n this.backend = new backendClass(this);\n this.options = options;\n\n if (options.dsn) {\n this.dsn = new DSN(options.dsn);\n }\n\n // The initial scope must have access to backend, options and DSN\n this.internalScope = this.getInitialScope();\n }\n\n /**\n * @inheritDoc\n */\n public install(): boolean {\n if (!this.isEnabled()) {\n return false;\n }\n\n if (this.installed === undefined) {\n this.installed = this.getBackend().install();\n }\n\n return this.installed;\n }\n\n /**\n * @inheritDoc\n */\n public async captureException(\n exception: any,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n const event = await this.getBackend().eventFromException(exception);\n await this.captureEvent(event, scope);\n }\n\n /**\n * @inheritDoc\n */\n public async captureMessage(\n message: string,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n const event = await this.getBackend().eventFromMessage(message);\n await this.captureEvent(event, scope);\n }\n\n /**\n * @inheritDoc\n */\n public async captureEvent(\n event: SentryEvent,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n await this.processEvent(event, scope, async finalEvent =>\n this.getBackend().sendEvent(finalEvent),\n );\n }\n\n /**\n * @inheritDoc\n */\n public async addBreadcrumb(\n breadcrumb: Breadcrumb,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n const {\n shouldAddBreadcrumb,\n beforeBreadcrumb,\n afterBreadcrumb,\n maxBreadcrumbs = DEFAULT_BREADCRUMBS,\n } = this.getOptions();\n\n if (maxBreadcrumbs <= 0) {\n return;\n }\n\n const timestamp = new Date().getTime() / 1000;\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n if (shouldAddBreadcrumb && !shouldAddBreadcrumb(mergedBreadcrumb)) {\n return;\n }\n\n const finalBreadcrumb = beforeBreadcrumb\n ? beforeBreadcrumb(mergedBreadcrumb)\n : mergedBreadcrumb;\n\n if (await this.getBackend().storeBreadcrumb(finalBreadcrumb, scope)) {\n scope.breadcrumbs = [...scope.breadcrumbs, finalBreadcrumb].slice(\n -Math.max(0, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS)),\n );\n }\n\n if (afterBreadcrumb) {\n afterBreadcrumb(finalBreadcrumb);\n }\n }\n\n /**\n * @inheritDoc\n */\n public getDSN(): DSN | undefined {\n return this.dsn;\n }\n\n /**\n * @inheritDoc\n */\n public getOptions(): O {\n return this.options;\n }\n\n /**\n * @inheritDoc\n */\n public async setContext(\n nextContext: Context,\n scope: Scope = this.internalScope,\n ): Promise<void> {\n if (await this.getBackend().storeContext(nextContext, scope)) {\n const context = scope.context;\n if (nextContext.extra) {\n context.extra = { ...context.extra, ...nextContext.extra };\n }\n if (nextContext.tags) {\n context.tags = { ...context.tags, ...nextContext.tags };\n }\n if (nextContext.user) {\n context.user = { ...context.user, ...nextContext.user };\n }\n }\n }\n\n /**\n * @inheritDoc\n */\n public getInitialScope(): Scope {\n return {\n breadcrumbs: [],\n context: {},\n };\n }\n\n /** Returns the current used SDK version and name. */\n protected abstract getSdkInfo(): SdkInfo;\n\n /** Returns the current internal scope of this instance. */\n protected getInternalScope(): Scope {\n return this.internalScope;\n }\n\n /** Returns the current backend. */\n protected getBackend(): B {\n return this.backend;\n }\n\n /** Determines whether this SDK is enabled and a valid DSN is present. */\n protected isEnabled(): boolean {\n return this.getOptions().enabled !== false && this.dsn !== undefined;\n }\n\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`, SDK\n * information returned by {@link FrontendBase.getSdkInfo}, as well as\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n protected async prepareEvent(\n event: SentryEvent,\n scope: Scope,\n ): Promise<SentryEvent> {\n const {\n environment,\n maxBreadcrumbs = DEFAULT_BREADCRUMBS,\n release,\n } = this.getOptions();\n\n const prepared = { sdk: this.getSdkInfo(), ...event };\n if (prepared.environment === undefined && environment !== undefined) {\n prepared.environment = environment;\n }\n if (prepared.release === undefined && release !== undefined) {\n prepared.release = release;\n }\n\n const breadcrumbs = scope.breadcrumbs;\n if (breadcrumbs.length > 0 && maxBreadcrumbs > 0) {\n prepared.breadcrumbs = breadcrumbs.slice(\n -Math.max(0, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS)),\n );\n }\n\n const context = scope.context;\n if (context.extra) {\n prepared.extra = { ...context.extra, ...event.extra };\n }\n if (context.tags) {\n prepared.tags = { ...context.tags, ...event.tags };\n }\n if (context.user) {\n prepared.user = { ...context.user, ...event.user };\n }\n\n return prepared;\n }\n\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n * The returned event status offers clues to whether the event was sent to\n * Sentry and accepted there. If the {@link Options.shouldSend} hook returns\n * `false`, the status will be {@link SendStatus.Skipped}. If the rate limit\n * was exceeded, the status will be {@link SendStatus.RateLimit}.\n *\n * @param event The event to send to Sentry.\n * @param scope A scope containing event metadata.\n * @param send A function to actually send the event.\n * @returns A Promise that resolves with the event status.\n */\n protected async processEvent(\n event: SentryEvent,\n scope: Scope,\n send: (finalEvent: SentryEvent) => Promise<number>,\n ): Promise<SendStatus> {\n if (!this.isEnabled()) {\n return SendStatus.Skipped;\n }\n\n const prepared = await this.prepareEvent(event, scope);\n const { shouldSend, beforeSend, afterSend } = this.getOptions();\n if (shouldSend && !shouldSend(prepared)) {\n return SendStatus.Skipped;\n }\n\n const finalEvent = beforeSend ? beforeSend(prepared) : prepared;\n const code = await send(finalEvent);\n const status = SendStatus.fromHttpCode(code);\n\n if (status === SendStatus.RateLimit) {\n // TODO: Handle rate limits and maintain a queue. For now, we require SDK\n // implementors to override this method and handle it themselves.\n }\n\n if (afterSend) {\n afterSend(finalEvent, status);\n }\n\n return status;\n }\n}\n"]} |
+2
-2
| { | ||
| "name": "@sentry/core", | ||
| "version": "0.5.3", | ||
| "version": "0.5.4", | ||
| "description": "Base implementation for all Sentry JavaScript SDKs", | ||
@@ -18,3 +18,3 @@ "repository": "git://github.com/getsentry/raven-js.git", | ||
| "dependencies": { | ||
| "@sentry/shim": "0.5.3" | ||
| "@sentry/shim": "0.5.4" | ||
| }, | ||
@@ -21,0 +21,0 @@ "devDependencies": { |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
89816
0.92%1135
0.53%+ Added
- Removed
Updated