diff --git a/.changeset/shaggy-mugs-wave.md b/.changeset/shaggy-mugs-wave.md new file mode 100644 index 00000000..283b20a6 --- /dev/null +++ b/.changeset/shaggy-mugs-wave.md @@ -0,0 +1,5 @@ +--- +"@khanacademy/wonder-stuff-sentry": major +--- + +Migrate the `KindErrorData` integration to be compatible with @sentry/types@9 diff --git a/.eslintignore b/.eslintignore index 5406f5f2..076646f4 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,5 +4,5 @@ coverage **/*.template **/package.json **/*.md -docs/assets/main.js +docs/** packages/eslint-plugin-khan/demo diff --git a/packages/wonder-stuff-sentry/package.json b/packages/wonder-stuff-sentry/package.json index 59183f91..08461ad5 100644 --- a/packages/wonder-stuff-sentry/package.json +++ b/packages/wonder-stuff-sentry/package.json @@ -27,7 +27,11 @@ "@khanacademy/wonder-stuff-core": "^1.5.4" }, "devDependencies": { - "@khanacademy/ws-dev-build-settings": "^2.0.1" + "@khanacademy/ws-dev-build-settings": "^2.0.1", + "@sentry/core": "9" + }, + "peerDependencies": { + "@sentry/core": "9" }, "browser": { "dist/es/index.js": "./dist/browser/es/index.js", @@ -35,4 +39,4 @@ }, "author": "", "license": "MIT" -} \ No newline at end of file +} diff --git a/packages/wonder-stuff-sentry/src/__tests__/__snapshots__/kind-error-data-integration.test.ts.snap b/packages/wonder-stuff-sentry/src/__tests__/__snapshots__/kind-error-data-integration.test.ts.snap new file mode 100644 index 00000000..424939af --- /dev/null +++ b/packages/wonder-stuff-sentry/src/__tests__/__snapshots__/kind-error-data-integration.test.ts.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`KindErrorData #constructor when not built for production should throw if options are invalid ({ + kindTagName: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-kind', + groupByTagName: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-group-by', + concatenatedMessageTagName: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-concatenated-message' +}) 1`] = `"Invalid options"`; + +exports[`KindErrorData #constructor when not built for production should throw if options are invalid ({ concatenatedMessageTagName: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }) 1`] = `"Invalid options"`; + +exports[`KindErrorData #constructor when not built for production should throw if options are invalid ({ groupByTagName: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }) 1`] = `"Invalid options"`; + +exports[`KindErrorData #constructor when not built for production should throw if options are invalid ({ kindTagName: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }) 1`] = `"Invalid options"`; diff --git a/packages/wonder-stuff-sentry/src/__tests__/kind-error-data.test.ts b/packages/wonder-stuff-sentry/src/__tests__/kind-error-data-integration.test.ts similarity index 69% rename from packages/wonder-stuff-sentry/src/__tests__/kind-error-data.test.ts rename to packages/wonder-stuff-sentry/src/__tests__/kind-error-data-integration.test.ts index af5a3bd7..5f21f101 100644 --- a/packages/wonder-stuff-sentry/src/__tests__/kind-error-data.test.ts +++ b/packages/wonder-stuff-sentry/src/__tests__/kind-error-data-integration.test.ts @@ -1,10 +1,12 @@ import * as CollateSentryData from "../collate-sentry-data"; import {DefaultKindErrorDataOptions} from "../default-kind-error-data-options"; import {EmptySentryData} from "../empty-sentry-data"; -import {KindErrorData} from "../kind-error-data"; +import {kindErrorDataIntegration} from "../kind-error-data-integration"; jest.mock("../collate-sentry-data"); +const mockClient: any = 0; + describe("KindErrorData", () => { const NODE_ENV = process.env.NODE_ENV; afterEach(() => { @@ -33,7 +35,7 @@ describe("KindErrorData", () => { // Arrange // Act - const act = () => new KindErrorData(badOptions); + const act = () => kindErrorDataIntegration(badOptions); // Assert expect(act).toThrowErrorMatchingSnapshot(); @@ -61,7 +63,7 @@ describe("KindErrorData", () => { // Arrange // Act - const act = () => new KindErrorData(badOptions); + const act = () => kindErrorDataIntegration(badOptions); // Assert expect(act).not.toThrowError("Invalid options"); @@ -81,7 +83,7 @@ describe("KindErrorData", () => { const act = new Promise((resolve: any, reject: any) => { try { // Should not resolve! - resolve(new KindErrorData(badOptions)); + resolve(kindErrorDataIntegration(badOptions)); } catch (e: any) { reject(e); } @@ -103,77 +105,7 @@ describe("KindErrorData", () => { }); }); - describe("#setupOnce", () => { - it("should register a global event processor", () => { - // Arrange - const addGlobalEventProcessorMock = jest.fn(); - const underTest = new KindErrorData(); - - // Act - underTest.setupOnce(addGlobalEventProcessorMock, jest.fn()); - - // Assert - expect(addGlobalEventProcessorMock).toHaveBeenCalledWith( - expect.any(Function), - ); - }); - - describe("registered event processor", () => { - it("should return the event if the integration is not returned from the hub", () => { - // Arrange - const addGlobalEventProcessorMock = jest.fn(); - const getHub = () => ({ - getIntegration: () => undefined, - }); - const underTest = new KindErrorData(); - underTest.setupOnce(addGlobalEventProcessorMock, getHub); - const registeredProcessor = - addGlobalEventProcessorMock.mock.calls[0][0]; - const event = { - kind: "event", - event_id: "event-id", - } as const; - - // Act - const result = registeredProcessor(event); - - // Assert - expect(result).toBe(event); - }); - - it("should call enhanceEventWithErrorData", () => { - // Arrange - const underTest = new KindErrorData(); - const addGlobalEventProcessorMock = jest.fn(); - const getHub = () => ({ - getIntegration: jest.fn().mockReturnValue(underTest), - }); - const enhanceSpy = jest - .spyOn(underTest, "enhanceEventWithErrorData") - // @ts-expect-error [FEI-5011] - TS2559 - Type '"ENHANCED"' has no properties in common with type 'SentryEvent'. - .mockReturnValue("ENHANCED"); - underTest.setupOnce(addGlobalEventProcessorMock, getHub); - const registeredProcessor = - addGlobalEventProcessorMock.mock.calls[0][0]; - const event = { - kind: "event", - event_id: "event-id", - } as const; - const hint = { - event_id: "event-id", - } as const; - - // Act - const result = registeredProcessor(event, hint); - - // Assert - expect(enhanceSpy).toHaveBeenCalledWith(event, hint); - expect(result).toBe("ENHANCED"); - }); - }); - }); - - describe("#enhanceEventWithErrorData", () => { + describe("#processEvent", () => { it.each([ null, undefined, @@ -184,7 +116,7 @@ describe("KindErrorData", () => { "should return the event if the original exception (%s) is not an Error", (originalException: any) => { // Arrange - const underTest = new KindErrorData(); + const underTest = kindErrorDataIntegration(); const event = { kind: "event", event_id: "event-id", @@ -195,7 +127,11 @@ describe("KindErrorData", () => { } as const; // Act - const result = underTest.enhanceEventWithErrorData(event, hint); + const result = underTest.processEvent?.( + event, + hint, + mockClient, + ); // Assert expect(result).toBe(event); @@ -204,14 +140,14 @@ describe("KindErrorData", () => { it("should return the event if there is no hint", () => { // Arrange - const underTest = new KindErrorData(); + const underTest = kindErrorDataIntegration(); const event = { kind: "event", event_id: "event-id", } as const; // Act - const result = underTest.enhanceEventWithErrorData(event); + const result = underTest.processEvent?.(event, {}, mockClient); // Assert expect(result).toBe(event); @@ -224,7 +160,7 @@ describe("KindErrorData", () => { groupByTagName: "GROUP", kindTagName: "KIND", } as const; - const underTest = new KindErrorData(options); + const underTest = kindErrorDataIntegration(options); const event = { kind: "event", event_id: "event-id", @@ -238,7 +174,7 @@ describe("KindErrorData", () => { .mockReturnValue(EmptySentryData); // Act - underTest.enhanceEventWithErrorData(event, hint); + underTest.processEvent?.(event, hint, mockClient); // Assert expect(collateSentryDataSpy).toHaveBeenCalledWith( @@ -254,7 +190,7 @@ describe("KindErrorData", () => { groupByTagName: "GROUP", kindTagName: "KIND", } as const; - const underTest = new KindErrorData(options); + const underTest = kindErrorDataIntegration(options); const event = { kind: "event", event_id: "event-id", @@ -290,7 +226,7 @@ describe("KindErrorData", () => { // Act // @ts-expect-error [FEI-5011] - TS2345 - Argument of type '{ readonly kind: "event"; readonly event_id: "event-id"; readonly tags: { readonly tag1: "originalValue1"; readonly tag2: "originalValue2"; }; readonly contexts: { readonly context1: { readonly key1: "originalValue1"; }; readonly context2: { ...; }; }; readonly fingerprint: readonly [...]; }' is not assignable to parameter of type 'SentryEvent'. - const result = underTest.enhanceEventWithErrorData(event, hint); + const result = underTest.processEvent?.(event, hint, mockClient); // Assert expect(result).toStrictEqual({ diff --git a/packages/wonder-stuff-sentry/src/index.ts b/packages/wonder-stuff-sentry/src/index.ts index 1a42e574..e2afdd38 100644 --- a/packages/wonder-stuff-sentry/src/index.ts +++ b/packages/wonder-stuff-sentry/src/index.ts @@ -1,5 +1,5 @@ export {KindSentryError} from "./kind-sentry-error"; -export {KindErrorData} from "./kind-error-data"; +export {kindErrorDataIntegration} from "./kind-error-data"; export type { KindErrorDataOptions, diff --git a/packages/wonder-stuff-sentry/src/kind-error-data-integration.ts b/packages/wonder-stuff-sentry/src/kind-error-data-integration.ts new file mode 100644 index 00000000..9ddf9723 --- /dev/null +++ b/packages/wonder-stuff-sentry/src/kind-error-data-integration.ts @@ -0,0 +1,121 @@ +import {Errors} from "@khanacademy/wonder-stuff-core"; +import {Integration, Event, EventHint} from "@sentry/core"; +import type {KindErrorDataOptions} from "./types"; + +import {collateSentryData} from "./collate-sentry-data"; +import {DefaultKindErrorDataOptions} from "./default-kind-error-data-options"; +import {isTagKeyValid} from "./is-tag-key-valid"; +import {KindSentryError} from "./kind-sentry-error"; + +type InvalidTags = { + invalidKindTag?: string; + invalidGroupByTag?: string; + invalidConcatenatedMessageTag?: string; +}; + +const INTEGRATION_NAME = "KindErrorData"; + +function buildOptionsWithDefaults( + options?: Partial, +): KindErrorDataOptions { + const _options = { + ...DefaultKindErrorDataOptions, + ...options, + }; + + if (process.env.NODE_ENV !== "production") { + // Let's make sure we got valid options. + const invalidTagNames: InvalidTags = {}; + if (!isTagKeyValid(_options.kindTagName)) { + invalidTagNames.invalidKindTag = _options.kindTagName; + } + if (!isTagKeyValid(_options.groupByTagName)) { + invalidTagNames.invalidGroupByTag = _options.groupByTagName; + } + if (!isTagKeyValid(_options.concatenatedMessageTagName)) { + invalidTagNames.invalidConcatenatedMessageTag = + _options.concatenatedMessageTagName; + } + if (Object.keys(invalidTagNames).length) { + throw new KindSentryError("Invalid options", Errors.InvalidInput, { + sentryData: { + contexts: { + invalidTagNames: { + ...invalidTagNames, + }, + }, + }, + }); + } + } + + return _options; +} + +/** + * Attaches extracted information from the Error object to extra field in the Event + */ +function enhanceEventWithErrorData( + options: KindErrorDataOptions, + event: Event, + hint?: EventHint, +): Event { + const maybeError = hint?.originalException; + // We only enhance events of type error. + if (!(maybeError instanceof Error)) { + return event; + } + + // Collate the data we want to collect. + const {tags, contexts, fingerprint} = collateSentryData( + options, + maybeError, + ); + + // Now that we have data, we need to attach it to the event. + /** + * Tags help categorize things. + */ + event.tags = { + ...event.tags, + ...tags, + }; + + /** + * Each context creates a new headed section in the sentry report. + * Useful for grouping specific context together. + * + * We now output all the contexts to the scope. + */ + const updatedContexts = { + ...event.contexts, + ...contexts, + } as const; + /** + * NOTE: If you don't see Sentry serializing the right depth in your + * contexts, increase the `normalizeDepth` option of the Sentry + * configuration; it defaults to 3, which is not always enough. + */ + event.contexts = updatedContexts; + + /** + * Fingerprint helps group like messages that otherwise would not + * get grouped. + */ + event.fingerprint = [...(event.fingerprint ?? []), ...fingerprint]; + + return event; +} + +export function kindErrorDataIntegration( + options?: Partial, +): Integration { + const _options = buildOptionsWithDefaults(options); + + return { + name: INTEGRATION_NAME, + processEvent(event, hint, client) { + return enhanceEventWithErrorData(_options, event, hint); + }, + }; +} diff --git a/packages/wonder-stuff-sentry/src/kind-error-data.ts b/packages/wonder-stuff-sentry/src/kind-error-data.ts deleted file mode 100644 index d2356069..00000000 --- a/packages/wonder-stuff-sentry/src/kind-error-data.ts +++ /dev/null @@ -1,133 +0,0 @@ -import {Errors} from "@khanacademy/wonder-stuff-core"; -import type { - SentryEvent, - SentryEventHint, - SentryEventProcessor, - SentryHub, - SentryIntegration, - KindErrorDataOptions, -} from "./types"; - -import {collateSentryData} from "./collate-sentry-data"; -import {DefaultKindErrorDataOptions} from "./default-kind-error-data-options"; -import {isTagKeyValid} from "./is-tag-key-valid"; -import {KindSentryError} from "./kind-sentry-error"; - -type InvalidTags = { - invalidKindTag?: string; - invalidGroupByTag?: string; - invalidConcatenatedMessageTag?: string; -}; - -export class KindErrorData implements SentryIntegration { - static id = "KindErrorData"; - name: string = KindErrorData.id; - readonly _options: KindErrorDataOptions; - - constructor(options: Partial = Object.freeze({})) { - this._options = { - ...DefaultKindErrorDataOptions, - ...options, - }; - - if (process.env.NODE_ENV !== "production") { - // Let's make sure we got valid options. - const invalidTagNames: InvalidTags = {}; - if (!isTagKeyValid(this._options.kindTagName)) { - invalidTagNames.invalidKindTag = this._options.kindTagName; - } - if (!isTagKeyValid(this._options.groupByTagName)) { - invalidTagNames.invalidGroupByTag = - this._options.groupByTagName; - } - if (!isTagKeyValid(this._options.concatenatedMessageTagName)) { - invalidTagNames.invalidConcatenatedMessageTag = - this._options.concatenatedMessageTagName; - } - if (Object.keys(invalidTagNames).length) { - throw new KindSentryError( - "Invalid options", - Errors.InvalidInput, - { - sentryData: { - contexts: { - invalidTagNames: { - ...invalidTagNames, - }, - }, - }, - }, - ); - } - } - } - - setupOnce( - addGlobalEventProcessor: (callback: SentryEventProcessor) => void, - getCurrentHub: () => SentryHub, - ): void { - addGlobalEventProcessor( - (event: SentryEvent, hint?: SentryEventHint) => { - const self = getCurrentHub().getIntegration(KindErrorData); - if (!self) { - return event; - } - return self.enhanceEventWithErrorData(event, hint); - }, - ); - } - - /** - * Attaches extracted information from the Error object to extra field in the Event - */ - enhanceEventWithErrorData( - event: SentryEvent, - hint?: SentryEventHint, - ): SentryEvent { - const maybeError = hint?.originalException; - // We only enhance events of type error. - if (!(maybeError instanceof Error)) { - return event; - } - - // Collate the data we want to collect. - const {tags, contexts, fingerprint} = collateSentryData( - this._options, - maybeError, - ); - - // Now that we have data, we need to attach it to the event. - /** - * Tags help categorize things. - */ - event.tags = { - ...event.tags, - ...tags, - }; - - /** - * Each context creates a new headed section in the sentry report. - * Useful for grouping specific context together. - * - * We now output all the contexts to the scope. - */ - const updatedContexts = { - ...event.contexts, - ...contexts, - } as const; - /** - * NOTE: If you don't see Sentry serializing the right depth in your - * contexts, increase the `normalizeDepth` option of the Sentry - * configuration; it defaults to 3, which is not always enough. - */ - event.contexts = updatedContexts; - - /** - * Fingerprint helps group like messages that otherwise would not - * get grouped. - */ - event.fingerprint = [...(event.fingerprint ?? []), ...fingerprint]; - - return event; - } -} diff --git a/packages/wonder-stuff-sentry/src/types.ts b/packages/wonder-stuff-sentry/src/types.ts index d92c6a4b..e5b2fcd1 100644 --- a/packages/wonder-stuff-sentry/src/types.ts +++ b/packages/wonder-stuff-sentry/src/types.ts @@ -1,8 +1,5 @@ import type {Metadata} from "@khanacademy/wonder-stuff-core"; -// Copied from https://github.com/Khan/flow-to-typescript-codemod/blob/main/flow.d.ts -type Class = new (...args: any[]) => T; - /** * Tags for a Sentry event. * @@ -93,83 +90,3 @@ export type KindErrorDataOptions = { // TODO(somewhatabstract): Allow configuration of which fields we include // in causal error contexts. }; - -///////////////////////////////////////////// -// -> Sentry-specific types below this point. -// NOTE(somewhatabstract): This is not comprehensive typing. Just the things -// we need to use. -type SentrySeverity = - | "fatal" - | "error" - | "warning" - | "log" - | "info" - | "debug" - | "critical"; - -export interface SentryEvent { - event_id?: string; - message?: string; - timestamp?: number; - start_timestamp?: number; - level?: SentrySeverity; - platform?: string; - logger?: string; - server_name?: string; - release?: string; - dist?: string; - environment?: string; - sdk?: any; - request?: Request; - transaction?: string; - modules?: { - [key: string]: string; - }; - fingerprint?: SentryFingerprint; - exception?: { - values?: Array; - }; - stacktrace?: any; - breadcrumbs?: Array; - contexts?: SentryContexts; - tags?: SentryTags; - extra?: SentryContext; - user?: any; - type?: any; - spans?: Array; - measurements?: any; - debug_meta?: any; -} - -export interface SentryEventHint { - event_id?: string; - captureContext?: any; - syntheticException?: Error | null | undefined; - originalException?: Error | string | null | undefined; - data?: any; -} - -export type SentryEventProcessor = ( - event: SentryEvent, - hint?: SentryEventHint, -) => Promise | SentryEvent | null | undefined; - -export interface SentryHub { - getIntegration( - integration: Class, - ): T | null | undefined; -} - -export interface SentryIntegration { - name: string; - /** - * Sets the integration up only once. - * This takes no options on purpose, options should be passed in the constructor - */ - setupOnce( - addGlobalEventProcessor: (callback: SentryEventProcessor) => void, - getCurrentHub: () => SentryHub, - ): void; -} -// <- Sentry-specific types above this point. -///////////////////////////////////////////// diff --git a/yarn.lock b/yarn.lock index 70fdf2d4..e9ffd2e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2536,6 +2536,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b" integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA== +"@sentry/core@9": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-9.3.0.tgz#d5a1ab7deecd95f86316e658129d3874557cbfd9" + integrity sha512-SxQ4z7wTkfguvYb2ctNEMU9kVAbhl9ymfjhLnrvtygTwL5soLqAKdco/lX/4P9K9Osgb2Dl6urQWRl+AhzKVbQ== + "@sigstore/protobuf-specs@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" @@ -3164,12 +3169,10 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== agentkeepalive@^4.2.1: version "4.3.0" @@ -4197,6 +4200,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cssstyle@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" @@ -5418,11 +5430,11 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" form-data@^3.0.0: @@ -6095,11 +6107,11 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: debug "4" https-proxy-agent@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" - integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "4" human-id@^1.0.2: @@ -9548,11 +9560,11 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks-proxy-agent@^8.0.3: - version "8.0.4" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" - integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - agent-base "^7.1.1" + agent-base "^7.1.2" debug "^4.3.4" socks "^2.8.3" @@ -9565,9 +9577,9 @@ socks@^2.6.2: smart-buffer "^4.2.0" socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0"