Fixing issue with status in auto generated request in Azure Fn (#1046)

This commit is contained in:
Hector Hernandez 2022-12-13 10:30:52 -08:00 коммит произвёл GitHub
Родитель 9909cbd9c3
Коммит a4b6f71dfc
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 315 добавлений и 188 удалений

Просмотреть файл

@ -1,72 +1,104 @@
import { Context, HttpRequest } from "../Library/Functions";
import Logging = require("../Library/Logging");
import TelemetryClient = require("../Library/TelemetryClient");
import { CorrelationContextManager } from "./CorrelationContextManager";
import { CorrelationContext, CorrelationContextManager } from "./CorrelationContextManager";
/** Node.js Azure Functions handle incoming HTTP requests before Application Insights SDK is available,
* this code generate incoming request telemetry and generate correlation context to be used
* by outgoing requests and other telemetry, we rely on hooks provided by Azure Functions
*/
export class AutoCollectAzureFunctions {
export class AzureFunctionsHook {
private _client: TelemetryClient;
private _functionsCoreModule: any;
private _autoGenerateIncomingRequests: boolean;
private _preInvocationHook: any;
constructor(client: TelemetryClient) {
this._client = client;
this._autoGenerateIncomingRequests = false;
try {
this._functionsCoreModule = require('@azure/functions-core');
}
catch (error) {
Logging.info("AutoCollectAzureFunctions failed to load, not running in Azure Functions");
Logging.info("AzureFunctionsHook failed to load, not running in Azure Functions");
return;
}
this._addPreInvocationHook();
}
public enable(isEnabled: boolean) {
if (this._functionsCoreModule) {
if (isEnabled) {
this._addPreInvocationHook();
} else {
this._removePreInvocationHook();
}
}
this._autoGenerateIncomingRequests = isEnabled;
}
public dispose() {
this.enable(false);
this._removePreInvocationHook();
this._functionsCoreModule = undefined;
}
private _addPreInvocationHook() {
// Only add hook once
if (!this._preInvocationHook) {
this._preInvocationHook = this._functionsCoreModule.registerHook('preInvocation', (context: any) => {
const originalCallback = context.functionCallback;
context.functionCallback = async (context: Context, req: HttpRequest) => {
const startTime = Date.now(); // Start trackRequest timer
// Start an AI Correlation Context using the provided Function context
const correlationContext = CorrelationContextManager.startOperation(context, req);
if (correlationContext) {
CorrelationContextManager.wrapCallback(async () => {
originalCallback(context, req);
this._client.trackRequest({
name: context?.req?.method + " " + context.req?.url,
resultCode: context?.res?.status,
success: true,
url: (req as HttpRequest)?.url,
time: new Date(startTime),
duration: Date.now() - startTime,
id: correlationContext.operation?.parentId,
});
this._client.flush();
}, correlationContext)();
}
this._preInvocationHook = this._functionsCoreModule.registerHook('preInvocation', async (preInvocationContext: any) => {
const originalCallback = preInvocationContext.functionCallback;
preInvocationContext.functionCallback = async (ctx: Context, request: HttpRequest) => {
this._propagateContext(ctx, request, originalCallback);
};
});
}
}
private async _propagateContext(ctx: Context, request: HttpRequest, originalCallback: any) {
// Update context to use Azure Functions one
let extractedContext: CorrelationContext = null;
try {
// Start an AI Correlation Context using the provided Function context
extractedContext = CorrelationContextManager.startOperation(ctx, request);
}
catch (err) {
Logging.warn("Failed to propagate context in Azure Functions", err);
originalCallback(ctx, request);
return;
}
if (!extractedContext) {
// Correlation Context could be disabled causing this to be null
Logging.warn("Failed to create context in Azure Functions");
originalCallback(ctx, request);
return;
}
CorrelationContextManager.wrapCallback(async () => {
const startTime = Date.now(); // Start trackRequest timer
originalCallback(ctx, request);
try {
if (this._autoGenerateIncomingRequests) {
let statusCode = 200; //Default
if (ctx.res) {
if (ctx.res.statusCode) {
statusCode = ctx.res.statusCode;
}
else if (ctx.res.status) {
statusCode = ctx.res.status;
}
}
this._client.trackRequest({
name: request.method + " " + request.url,
resultCode: statusCode,
success: statusCode == 200,
url: request.url,
time: new Date(startTime),
duration: Date.now() - startTime,
id: extractedContext.operation?.parentId,
});
this._client.flush();
}
}
catch (err) {
Logging.warn("Error creating automatic incoming request in Azure Functions", err);
}
}, extractedContext)();
}
private _removePreInvocationHook() {
if (this._preInvocationHook) {
this._preInvocationHook.dispose();

Просмотреть файл

@ -150,8 +150,8 @@ export interface IBaseConfig {
*/
enableWebInstrumentation: boolean;
/**
* Enable automatic incoming request tracking and correct correlation when using Azure Functions
*/
* Enable automatic incoming request tracking when running in Azure Functions
*/
enableAutoCollectAzureFunctions: boolean;
/**
* Application Insights resource connection string for web instrumentation and automatic monitoring

Просмотреть файл

@ -1,51 +1,98 @@
import assert = require("assert");
import sinon = require("sinon");
import { TelemetryClient } from "../../applicationinsights";
import { AzureFunctionsHook } from "../../AutoCollection/AzureFunctionsHook";
import { CorrelationContextManager } from "../../AutoCollection/CorrelationContextManager";
import { HttpRequest } from "../../Library/Functions";
import Logging = require("../../Library/Logging");
import { AutoCollectAzureFunctions } from "../../AutoCollection/AzureFunctionsHook";
const testModule = {
registerHook(type: string, hook: any) {
class TestFunctionCore {
public registerCalled: boolean = false;
public hookName: string;
registerHook(name: string, func: any) {
this.registerCalled = true;
this.hookName = name;
}
};
}
describe("AutoCollection/AutoCollectAzureFunctions", () => {
describe("AutoCollection/AzureFunctionsHook", () => {
let sandbox: sinon.SinonSandbox;
let client: TelemetryClient;
it("constructor", () => {
let client = new TelemetryClient("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333");
let auto = new AutoCollectAzureFunctions(client);
assert.equal(auto["_functionsCoreModule"], undefined, "Module is not available so it should be undefined unless running in AzFn env");
before(() => {
client = new TelemetryClient("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333");
sandbox = sinon.sandbox.create();
});
it("enable", () => {
let client = new TelemetryClient("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333");
let auto = new AutoCollectAzureFunctions(client);
auto["_functionsCoreModule"] = testModule;
const addStub = sinon.stub(auto, "_addPreInvocationHook");
const removeStub = sinon.stub(auto, "_removePreInvocationHook");
auto.enable(true);
assert.ok(removeStub.notCalled);
assert.ok(addStub.calledOnce);
afterEach(() => {
sandbox.restore();
CorrelationContextManager.enable(false);
});
it("disable", () => {
let client = new TelemetryClient("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333");
let auto = new AutoCollectAzureFunctions(client);
auto["_functionsCoreModule"] = testModule;
const addStub = sinon.stub(auto, "_addPreInvocationHook");
const removeStub = sinon.stub(auto, "_removePreInvocationHook");
auto.enable(false);
assert.ok(removeStub.calledOnce);
assert.ok(addStub.notCalled);
it("Hook not added if not running in Azure Functions", () => {
const spy = sandbox.spy(Logging, "info");
let hook = new AzureFunctionsHook(client);
assert.equal(hook["_functionsCoreModule"], undefined);
assert.ok(spy.called);
assert.equal(spy.args[0][0], "AzureFunctionsHook failed to load, not running in Azure Functions");
});
it("_addPreInvocationHook", () => {
let client = new TelemetryClient("1aa11111-bbbb-1ccc-8ddd-eeeeffff3333");
let auto = new AutoCollectAzureFunctions(client);
const registerHook = sinon.stub(testModule, "registerHook");
auto["_functionsCoreModule"] = testModule;
auto["_addPreInvocationHook"]();
assert.ok(registerHook.calledOnce);
it("Hook added if running in Azure Functions", () => {
let hook = new AzureFunctionsHook(client);
let testCore = new TestFunctionCore();
hook["_functionsCoreModule"] = testCore;
hook["_addPreInvocationHook"]();
assert.ok(testCore.registerCalled);
assert.equal(testCore.hookName, "preInvocation");
});
it("enable/disable", () => {
let hook = new AzureFunctionsHook(client);
hook.enable(true);
assert.equal(hook["_autoGenerateIncomingRequests"], true);
hook.enable(false);
assert.equal(hook["_autoGenerateIncomingRequests"], false);
});
it("Context propagation", () => {
CorrelationContextManager.enable(true);
let hook = new AzureFunctionsHook(client);
hook.enable(true);
let flushStub = sandbox.stub(hook["_client"], "flush");
let trackRequestSpy = sandbox.stub(hook["_client"], "trackRequest");
let contextSpy = sandbox.spy(CorrelationContextManager, "wrapCallback");
let ctx = {
res: { "status": 400 },
traceContext: {
traceparent: "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01",
tracestate: "",
attributes: {}
}
};
let request: HttpRequest = {
method: "HEAD",
url: "test.com",
headers: { "": "" }
};
let originalCallbackCalled = false;
let originalCallback = () => { originalCallbackCalled = true };
hook["_propagateContext"](ctx as any, request, originalCallback);
assert.ok(contextSpy.called);
assert.ok(originalCallbackCalled);
assert.ok(flushStub.called);
assert.ok(trackRequestSpy.called);
let propagatedContext = contextSpy.args[0][1];
assert.equal(propagatedContext.operation.id, "0af7651916cd43dd8448eb211c80319c");
assert.equal(propagatedContext.operation.name, "HEAD /");
assert.equal(propagatedContext.operation.parentId, "|0af7651916cd43dd8448eb211c80319c.b7ad6b7169203331.");
let incomingRequest = trackRequestSpy.args[0][0];
assert.equal(incomingRequest.id, "|0af7651916cd43dd8448eb211c80319c.b7ad6b7169203331.");
assert.equal(incomingRequest.name, "HEAD test.com");
assert.equal(incomingRequest.resultCode, 400);
assert.equal(incomingRequest.success, false);
assert.equal(incomingRequest.url, "test.com");
});
});

Просмотреть файл

@ -13,7 +13,7 @@ import QuickPulseClient = require("./Library/QuickPulseStateManager");
import { IncomingMessage } from "http";
import { SpanContext } from "@opentelemetry/api";
import { AutoCollectNativePerformance, IDisabledExtendedMetrics } from "./AutoCollection/NativePerformance";
import { AutoCollectAzureFunctions } from "./AutoCollection/AzureFunctionsHook";
import { AzureFunctionsHook } from "./AutoCollection/AzureFunctionsHook";
// We export these imports so that SDK users may use these classes directly.
// They're exposed using "export import" so that types are passed along as expected
@ -85,7 +85,7 @@ let _webSnippet: WebSnippet;
let _nativePerformance: AutoCollectNativePerformance;
let _serverRequests: AutoCollectHttpRequests;
let _clientRequests: AutoCollectHttpDependencies;
let _azureFunctions: AutoCollectAzureFunctions;
let _azureFunctions: AzureFunctionsHook;
let _isStarted = false;
@ -122,7 +122,7 @@ export function setup(setupString?: string) {
if (!_nativePerformance) {
_nativePerformance = new AutoCollectNativePerformance(defaultClient);
}
_azureFunctions = new AutoCollectAzureFunctions(defaultClient);
_azureFunctions = new AzureFunctionsHook(defaultClient);
} else {
Logging.info("The default client is already setup");
}
@ -177,7 +177,7 @@ function _initializeConfig() {
_forceClsHooked = defaultClient.config.enableUseAsyncHooks !== undefined ? defaultClient.config.enableUseAsyncHooks : _forceClsHooked;
_isSnippetInjection = defaultClient.config.enableWebInstrumentation !== undefined ? defaultClient.config.enableWebInstrumentation : _isSnippetInjection;
_isSnippetInjection = defaultClient.config.enableAutoWebSnippetInjection === true ? true : _isSnippetInjection;
_isAzureFunctions = defaultClient.config.enableAutoCollectAzureFunctions !== undefined ? defaultClient.config.enableAutoCollectAzureFunctions : _isPerformance;
_isAzureFunctions = defaultClient.config.enableAutoCollectAzureFunctions !== undefined ? defaultClient.config.enableAutoCollectAzureFunctions : _isAzureFunctions;
const extendedMetricsConfig = AutoCollectNativePerformance.parseEnabled(defaultClient.config.enableAutoCollectExtendedMetrics, defaultClient.config);
_isNativePerformance = extendedMetricsConfig.isEnabled;
_disabledExtendedMetrics = extendedMetricsConfig.disabledMetrics;

280
package-lock.json сгенерированный
Просмотреть файл

@ -457,14 +457,14 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz",
"integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz",
"integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==",
"dev": true,
"dependencies": {
"@typescript-eslint/scope-manager": "5.45.0",
"@typescript-eslint/type-utils": "5.45.0",
"@typescript-eslint/utils": "5.45.0",
"@typescript-eslint/scope-manager": "5.46.1",
"@typescript-eslint/type-utils": "5.46.1",
"@typescript-eslint/utils": "5.46.1",
"debug": "^4.3.4",
"ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0",
@ -490,14 +490,14 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz",
"integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz",
"integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==",
"dev": true,
"dependencies": {
"@typescript-eslint/scope-manager": "5.45.0",
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/typescript-estree": "5.45.0",
"@typescript-eslint/scope-manager": "5.46.1",
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/typescript-estree": "5.46.1",
"debug": "^4.3.4"
},
"engines": {
@ -517,13 +517,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz",
"integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz",
"integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/visitor-keys": "5.45.0"
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/visitor-keys": "5.46.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -534,13 +534,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz",
"integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz",
"integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==",
"dev": true,
"dependencies": {
"@typescript-eslint/typescript-estree": "5.45.0",
"@typescript-eslint/utils": "5.45.0",
"@typescript-eslint/typescript-estree": "5.46.1",
"@typescript-eslint/utils": "5.46.1",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
},
@ -561,9 +561,9 @@
}
},
"node_modules/@typescript-eslint/types": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz",
"integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz",
"integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -574,13 +574,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz",
"integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz",
"integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/visitor-keys": "5.45.0",
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/visitor-keys": "5.46.1",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@ -601,16 +601,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz",
"integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz",
"integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.45.0",
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/typescript-estree": "5.45.0",
"@typescript-eslint/scope-manager": "5.46.1",
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/typescript-estree": "5.46.1",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0",
"semver": "^7.3.7"
@ -627,12 +627,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz",
"integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz",
"integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/types": "5.46.1",
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
@ -1337,9 +1337,9 @@
}
},
"node_modules/es-abstract": {
"version": "1.20.4",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
"integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
"version": "1.20.5",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
"integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
@ -1348,6 +1348,7 @@
"function.prototype.name": "^1.1.5",
"get-intrinsic": "^1.1.3",
"get-symbol-description": "^1.0.0",
"gopd": "^1.0.1",
"has": "^1.0.3",
"has-property-descriptors": "^1.0.0",
"has-symbols": "^1.0.3",
@ -1363,8 +1364,8 @@
"object.assign": "^4.1.4",
"regexp.prototype.flags": "^1.4.3",
"safe-regex-test": "^1.0.0",
"string.prototype.trimend": "^1.0.5",
"string.prototype.trimstart": "^1.0.5",
"string.prototype.trimend": "^1.0.6",
"string.prototype.trimstart": "^1.0.6",
"unbox-primitive": "^1.0.2"
},
"engines": {
@ -1939,9 +1940,9 @@
"dev": true
},
"node_modules/fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz",
"integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==",
"dev": true,
"dependencies": {
"reusify": "^1.0.4"
@ -2058,6 +2059,18 @@
"node": ">= 8"
}
},
"node_modules/fs-minipass/node_modules/minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@ -2207,9 +2220,9 @@
}
},
"node_modules/globals": {
"version": "13.18.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
"integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
"version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@ -3010,9 +3023,9 @@
}
},
"node_modules/minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz",
"integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
@ -3034,6 +3047,18 @@
"node": ">= 8"
}
},
"node_modules/minizlib/node_modules/minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
@ -4070,14 +4095,14 @@
"dev": true
},
"node_modules/tar": {
"version": "6.1.12",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
"integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
"version": "6.1.13",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
"integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
"dev": true,
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minipass": "^4.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
@ -4912,14 +4937,14 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz",
"integrity": "sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz",
"integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==",
"dev": true,
"requires": {
"@typescript-eslint/scope-manager": "5.45.0",
"@typescript-eslint/type-utils": "5.45.0",
"@typescript-eslint/utils": "5.45.0",
"@typescript-eslint/scope-manager": "5.46.1",
"@typescript-eslint/type-utils": "5.46.1",
"@typescript-eslint/utils": "5.46.1",
"debug": "^4.3.4",
"ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0",
@ -4929,53 +4954,53 @@
}
},
"@typescript-eslint/parser": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.0.tgz",
"integrity": "sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz",
"integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==",
"dev": true,
"requires": {
"@typescript-eslint/scope-manager": "5.45.0",
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/typescript-estree": "5.45.0",
"@typescript-eslint/scope-manager": "5.46.1",
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/typescript-estree": "5.46.1",
"debug": "^4.3.4"
}
},
"@typescript-eslint/scope-manager": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz",
"integrity": "sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz",
"integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/visitor-keys": "5.45.0"
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/visitor-keys": "5.46.1"
}
},
"@typescript-eslint/type-utils": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz",
"integrity": "sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz",
"integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==",
"dev": true,
"requires": {
"@typescript-eslint/typescript-estree": "5.45.0",
"@typescript-eslint/utils": "5.45.0",
"@typescript-eslint/typescript-estree": "5.46.1",
"@typescript-eslint/utils": "5.46.1",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
}
},
"@typescript-eslint/types": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.0.tgz",
"integrity": "sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz",
"integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz",
"integrity": "sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz",
"integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/visitor-keys": "5.45.0",
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/visitor-keys": "5.46.1",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@ -4984,28 +5009,28 @@
}
},
"@typescript-eslint/utils": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.0.tgz",
"integrity": "sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz",
"integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.45.0",
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/typescript-estree": "5.45.0",
"@typescript-eslint/scope-manager": "5.46.1",
"@typescript-eslint/types": "5.46.1",
"@typescript-eslint/typescript-estree": "5.46.1",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0",
"semver": "^7.3.7"
}
},
"@typescript-eslint/visitor-keys": {
"version": "5.45.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz",
"integrity": "sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==",
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz",
"integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.45.0",
"@typescript-eslint/types": "5.46.1",
"eslint-visitor-keys": "^3.3.0"
}
},
@ -5535,9 +5560,9 @@
}
},
"es-abstract": {
"version": "1.20.4",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
"integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
"version": "1.20.5",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz",
"integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@ -5546,6 +5571,7 @@
"function.prototype.name": "^1.1.5",
"get-intrinsic": "^1.1.3",
"get-symbol-description": "^1.0.0",
"gopd": "^1.0.1",
"has": "^1.0.3",
"has-property-descriptors": "^1.0.0",
"has-symbols": "^1.0.3",
@ -5561,8 +5587,8 @@
"object.assign": "^4.1.4",
"regexp.prototype.flags": "^1.4.3",
"safe-regex-test": "^1.0.0",
"string.prototype.trimend": "^1.0.5",
"string.prototype.trimstart": "^1.0.5",
"string.prototype.trimend": "^1.0.6",
"string.prototype.trimstart": "^1.0.6",
"unbox-primitive": "^1.0.2"
}
},
@ -5988,9 +6014,9 @@
"dev": true
},
"fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz",
"integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
@ -6083,6 +6109,17 @@
"dev": true,
"requires": {
"minipass": "^3.0.0"
},
"dependencies": {
"minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
}
}
},
"fs.realpath": {
@ -6196,9 +6233,9 @@
}
},
"globals": {
"version": "13.18.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz",
"integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==",
"version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@ -6767,9 +6804,9 @@
"dev": true
},
"minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz",
"integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
@ -6783,6 +6820,17 @@
"requires": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
},
"dependencies": {
"minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
}
}
},
"mkdirp": {
@ -7525,14 +7573,14 @@
}
},
"tar": {
"version": "6.1.12",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz",
"integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==",
"version": "6.1.13",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
"integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
"dev": true,
"requires": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minipass": "^4.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"