From 7b5d2365df7a894e74997d0d74a7e557860b1626 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 2 Feb 2026 17:51:49 -0500 Subject: [PATCH 01/22] azure durable functions --- .../src/azure-durable-functions.js | 99 +++++++++++++++++++ .../src/azure-functions.js | 7 ++ .../src/index.js | 22 +++++ .../src/outbound.js | 35 +++++++ packages/dd-trace/src/proxy.js | 1 + 5 files changed, 164 insertions(+) create mode 100644 packages/datadog-instrumentations/src/azure-durable-functions.js create mode 100644 packages/datadog-plugin-azure-durable-functions/src/index.js create mode 100644 packages/datadog-plugin-azure-durable-functions/src/outbound.js diff --git a/packages/datadog-instrumentations/src/azure-durable-functions.js b/packages/datadog-instrumentations/src/azure-durable-functions.js new file mode 100644 index 00000000000..80b557831e5 --- /dev/null +++ b/packages/datadog-instrumentations/src/azure-durable-functions.js @@ -0,0 +1,99 @@ +'use strict' + +const dc = require('dc-polyfill') + +const shimmer = require('../../datadog-shimmer') +const log = require('../../dd-trace/src/log') + +const { + addHook +} = require('./helpers/instrument') + +/** + * @type {import('diagnostics_channel').TracingChannel} + */ +const azureDurableFunctionsChannel = dc.TracingChannel('datadog:azure:durable-functions:invoke') + +addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, (df) => { + /* eslint-disable no-console */ + log.debug('adding durable functions hook') + // TODO implement v3 + const { app } = df + + shimmer.wrap(app, 'orchestration', wrapOrchestrationHandler) + shimmer.wrap(app, 'entity', wrapEntityHandler) + shimmer.wrap(app, 'activity', activityHandler) + + return df +}) + +function wrapOrchestrationHandler (method) { + return function (orchestrationName, arg) { + // argument can either be the handler itself, or options describing the handler + if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { + shimmer.wrap(arg, 'handler', handler => orchestrationHandler(handler, orchestrationName, method.name)) + } else if (typeof arg === 'function') { + shimmer.wrapFunction(arg, handler => orchestrationHandler(handler, orchestrationName, method.name)) + } + return method.apply(this, arguments) + } +} + +function orchestrationHandler (handler, orchestrationName, methodName) { + return function () { + const orchestrationContext = arguments[0] + return azureDurableFunctionsChannel.traceSync( + handler, + { orchestrationContext, methodName, orchestrationName }, + this, ...arguments) + } +} + +function wrapEntityHandler (method) { + return function (entityName, arg) { + if (typeof arg === 'function') { + shimmer.wrapFunction(arg, handler => entityHandler(handler, entityName, method.name)) + } else { + shimmer.wrap(arg, 'handler', handler => entityHandler(handler, entityName, method.name)) + } + return method.apply(this, arguments) + } +} + +function entityHandler (handler, entityName, methodName) { + return function (...args) { + const entityContext = args[0] + return azureDurableFunctionsChannel.traceSync( + handler, + { entityContext, entityName, methodName }, + this, ...args) + } +} + +function activityHandler (method) { + return function (activityName, activityOptions) { + shimmer.wrap(activityOptions, 'handler', handler => { + const isAsync = + handler && handler.constructor && handler.constructor.name === 'AsyncFunction' + + return function (...args) { + const invocationContext = args[1] + + if (isAsync) { + return azureDurableFunctionsChannel.tracePromise( + handler, + // MAYBE get function name from invocation context + { activityName, invocationContext, methodName: method.name }, + this, ...args) + } + // TODO handler might still return a promise even if not declared as async + // maybe put everything under trace promise + return azureDurableFunctionsChannel.traceSync( + handler, + { activityName, invocationContext, methodName: method.name }, + this, ...args) + } + }) + return method.apply(this, arguments) + } +} diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index dc0c7c70ef5..3d50e1a93d3 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -1,6 +1,7 @@ 'use strict' const dc = require('dc-polyfill') +const log = require('../../dd-trace/src/log') const shimmer = require('../../datadog-shimmer') const { addHook, @@ -32,9 +33,15 @@ addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (a // The http methods are overloaded so we need to check which type of argument was passed in order to wrap the handler // The arguments are either an object with a handler property or the handler function itself function wrapHandler (method) { + log.debug('hi from Olivier') return function (name, arg) { + log.debug('hi again from Olivier') + // check if this is either a handlerOptions or the handler itself if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { + // if this is a handlerOptions: first, assign to a variable options const options = arg + + // then, access the handler within that options. trace that handler using a shimmer.wrap(options, 'handler', handler => traceHandler(handler, name, method.name)) } else if (typeof arg === 'function') { const handler = arg diff --git a/packages/datadog-plugin-azure-durable-functions/src/index.js b/packages/datadog-plugin-azure-durable-functions/src/index.js new file mode 100644 index 00000000000..f01a25b8907 --- /dev/null +++ b/packages/datadog-plugin-azure-durable-functions/src/index.js @@ -0,0 +1,22 @@ +'use strict' + +const CompositePlugin = require('../../dd-trace/src/plugins/composite') +const AzureDurableFunctionsOutboundPlugin = require('./outbound') + +class AzureDurableFunctionsPlugin extends CompositePlugin { + static get id () { + return 'azure-durable-functions' + } + + // static get prefix () { + // return 'tracing:apm:azure-durable-functions' + // } + + static get plugins () { + return { + outbound: AzureDurableFunctionsOutboundPlugin, + } + } +} + +module.exports = AzureDurableFunctionsPlugin diff --git a/packages/datadog-plugin-azure-durable-functions/src/outbound.js b/packages/datadog-plugin-azure-durable-functions/src/outbound.js new file mode 100644 index 00000000000..08f074b6484 --- /dev/null +++ b/packages/datadog-plugin-azure-durable-functions/src/outbound.js @@ -0,0 +1,35 @@ +'use strict' + +// const TracingPlugin = require('../dd-trace/src/plugins/tracing') +const OutboundPlugin = require('../../dd-trace/src/plugins/outbound') +const log = require('../../dd-trace/src/log') + +// const spanContexts = new WeakMap() + +// class AzureDurableFunctionsOutboundPlugin extends TracingPlugin { +class AzureDurableFunctionsOutboundPlugin extends OutboundPlugin { + static get id () { return 'azure-durable-functions' } + static get operation () { return 'invoke' } + static get prefix () { return 'tracing:apm:azure-durable-functions:invoke' } + + bindStart (ctx) { + /* eslint-disable no-console */ + + console.log('OLIVIER') + log.debug('logging context:\n') + for (const key in ctx) { + /* eslint-disable-next-line */ + log.debug(`key: ${key}, val: ${ctx[key]}\n`) + } + } + + asyncEnd (ctx) { + super.finish(ctx) + } + + end (ctx) { + super.finish(ctx) + } +} + +module.exports = AzureDurableFunctionsOutboundPlugin diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 80a6fba2f70..69dd18669bc 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -95,6 +95,7 @@ class Tracer extends NoopProxy { * @override */ init (options) { + log.debug('hi from dd-trace - OLIVIER') if (this._initialized) return this this._initialized = true From 2e426b931de12c86cad110b4de728157dc82549e Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 3 Feb 2026 10:55:04 -0500 Subject: [PATCH 02/22] debug logs --- .../datadog-plugin-azure-durable-functions/src/outbound.js | 3 +-- packages/dd-trace/src/proxy.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/datadog-plugin-azure-durable-functions/src/outbound.js b/packages/datadog-plugin-azure-durable-functions/src/outbound.js index 08f074b6484..9521bb38115 100644 --- a/packages/datadog-plugin-azure-durable-functions/src/outbound.js +++ b/packages/datadog-plugin-azure-durable-functions/src/outbound.js @@ -14,8 +14,7 @@ class AzureDurableFunctionsOutboundPlugin extends OutboundPlugin { bindStart (ctx) { /* eslint-disable no-console */ - - console.log('OLIVIER') + log.debug('logging context:\n') for (const key in ctx) { /* eslint-disable-next-line */ diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index 69dd18669bc..f9d0bf943e5 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -95,7 +95,7 @@ class Tracer extends NoopProxy { * @override */ init (options) { - log.debug('hi from dd-trace - OLIVIER') + log.debug('in ddtrace.init') if (this._initialized) return this this._initialized = true From 5a4402edbc2adca56ece4d6bc799321c7f479d62 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 3 Feb 2026 11:12:46 -0500 Subject: [PATCH 03/22] debug logs --- .../src/azure-durable-functions.js | 12 ++++++++++-- .../datadog-instrumentations/src/azure-functions.js | 3 +-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/datadog-instrumentations/src/azure-durable-functions.js b/packages/datadog-instrumentations/src/azure-durable-functions.js index 80b557831e5..ab85ad9f91c 100644 --- a/packages/datadog-instrumentations/src/azure-durable-functions.js +++ b/packages/datadog-instrumentations/src/azure-durable-functions.js @@ -6,7 +6,7 @@ const shimmer = require('../../datadog-shimmer') const log = require('../../dd-trace/src/log') const { - addHook + addHook, } = require('./helpers/instrument') /** @@ -15,7 +15,6 @@ const { const azureDurableFunctionsChannel = dc.TracingChannel('datadog:azure:durable-functions:invoke') addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, (df) => { - /* eslint-disable no-console */ log.debug('adding durable functions hook') // TODO implement v3 const { app } = df @@ -28,6 +27,7 @@ addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, ( }) function wrapOrchestrationHandler (method) { + log.debug('in wrap orchestration handler') return function (orchestrationName, arg) { // argument can either be the handler itself, or options describing the handler if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { @@ -40,7 +40,11 @@ function wrapOrchestrationHandler (method) { } function orchestrationHandler (handler, orchestrationName, methodName) { + log.debug('in orchestration handler. ochestrationName: ', orchestrationName, 'method name: ', methodName) + return function () { + log.debug('in nested orchestration function') + const orchestrationContext = arguments[0] return azureDurableFunctionsChannel.traceSync( handler, @@ -71,7 +75,11 @@ function entityHandler (handler, entityName, methodName) { } function activityHandler (method) { + log.debug('in activity handler. method name:', method.name) + return function (activityName, activityOptions) { + log.debug('in nested activity handler. activity name:', activityName) + shimmer.wrap(activityOptions, 'handler', handler => { const isAsync = handler && handler.constructor && handler.constructor.name === 'AsyncFunction' diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index 3d50e1a93d3..8f6bf97cebc 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -33,9 +33,8 @@ addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (a // The http methods are overloaded so we need to check which type of argument was passed in order to wrap the handler // The arguments are either an object with a handler property or the handler function itself function wrapHandler (method) { - log.debug('hi from Olivier') return function (name, arg) { - log.debug('hi again from Olivier') + log.debug('in sub wrap handler for method: ', method) // check if this is either a handlerOptions or the handler itself if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { // if this is a handlerOptions: first, assign to a variable options From b187a80ab466e3a4b01d78edb51a150297370558 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 3 Feb 2026 14:58:42 -0500 Subject: [PATCH 04/22] debug logs --- .../datadog-instrumentations/src/azure-durable-functions.js | 2 +- packages/datadog-plugin-azure-durable-functions/src/outbound.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/datadog-instrumentations/src/azure-durable-functions.js b/packages/datadog-instrumentations/src/azure-durable-functions.js index ab85ad9f91c..db83031e39d 100644 --- a/packages/datadog-instrumentations/src/azure-durable-functions.js +++ b/packages/datadog-instrumentations/src/azure-durable-functions.js @@ -15,7 +15,7 @@ const { const azureDurableFunctionsChannel = dc.TracingChannel('datadog:azure:durable-functions:invoke') addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, (df) => { - log.debug('adding durable functions hook') + log.debug('adding durable functions hook OLIVIER') // TODO implement v3 const { app } = df diff --git a/packages/datadog-plugin-azure-durable-functions/src/outbound.js b/packages/datadog-plugin-azure-durable-functions/src/outbound.js index 9521bb38115..c38d55e58fb 100644 --- a/packages/datadog-plugin-azure-durable-functions/src/outbound.js +++ b/packages/datadog-plugin-azure-durable-functions/src/outbound.js @@ -14,7 +14,7 @@ class AzureDurableFunctionsOutboundPlugin extends OutboundPlugin { bindStart (ctx) { /* eslint-disable no-console */ - + log.debug('logging context:\n') for (const key in ctx) { /* eslint-disable-next-line */ From d87a3d34c156c77b46d878ad6c4bc753dfdfad90 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 4 Feb 2026 08:52:47 -0500 Subject: [PATCH 05/22] debug logs --- packages/datadog-instrumentations/src/azure-functions.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index 8f6bf97cebc..30254aa4813 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -10,6 +10,7 @@ const { const azureFunctionsChannel = dc.tracingChannel('datadog:azure:functions:invoke') addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (azureFunction) => { + log.debug('adding az functions hook OLIVIER') const { app } = azureFunction // Http triggers @@ -34,7 +35,7 @@ addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (a // The arguments are either an object with a handler property or the handler function itself function wrapHandler (method) { return function (name, arg) { - log.debug('in sub wrap handler for method: ', method) + log.debug('in sub wrap handler for method: ', name) // check if this is either a handlerOptions or the handler itself if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { // if this is a handlerOptions: first, assign to a variable options From 75be9e80c83e7fbf7af70b60ae554035abeed426 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 4 Feb 2026 09:08:55 -0500 Subject: [PATCH 06/22] add durable-functions hook --- packages/datadog-instrumentations/src/helpers/hooks.js | 1 + packages/dd-trace/src/plugins/index.js | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/datadog-instrumentations/src/helpers/hooks.js b/packages/datadog-instrumentations/src/helpers/hooks.js index b981820ad4e..40224736c7a 100644 --- a/packages/datadog-instrumentations/src/helpers/hooks.js +++ b/packages/datadog-instrumentations/src/helpers/hooks.js @@ -8,6 +8,7 @@ module.exports = { '@aws-sdk/smithy-client': () => require('../aws-sdk'), '@azure/event-hubs': () => require('../azure-event-hubs'), '@azure/functions': () => require('../azure-functions'), + 'durable-functions': () => require('../azure-durable-functions'), '@azure/service-bus': () => require('../azure-service-bus'), '@cucumber/cucumber': () => require('../cucumber'), '@playwright/test': () => require('../playwright'), diff --git a/packages/dd-trace/src/plugins/index.js b/packages/dd-trace/src/plugins/index.js index b470dc1b1f0..99ceb6e5103 100644 --- a/packages/dd-trace/src/plugins/index.js +++ b/packages/dd-trace/src/plugins/index.js @@ -6,6 +6,7 @@ const plugins = { get '@aws-sdk/smithy-client' () { return require('../../../datadog-plugin-aws-sdk/src') }, get '@azure/event-hubs' () { return require('../../../datadog-plugin-azure-event-hubs/src') }, get '@azure/functions' () { return require('../../../datadog-plugin-azure-functions/src') }, + get 'durable-functions' () { return require('../../../datadog-plugin-azure-durable-functions/src') }, get '@azure/service-bus' () { return require('../../../datadog-plugin-azure-service-bus/src') }, get '@cucumber/cucumber' () { return require('../../../datadog-plugin-cucumber/src') }, get '@playwright/test' () { return require('../../../datadog-plugin-playwright/src') }, From 34af74718e45f3be70b2a3ca761049a688153700 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 4 Feb 2026 09:26:36 -0500 Subject: [PATCH 07/22] add consistent plugin naming --- .../datadog-instrumentations/src/azure-durable-functions.js | 2 +- .../datadog-plugin-azure-durable-functions/src/outbound.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/datadog-instrumentations/src/azure-durable-functions.js b/packages/datadog-instrumentations/src/azure-durable-functions.js index db83031e39d..d1a2fa1735a 100644 --- a/packages/datadog-instrumentations/src/azure-durable-functions.js +++ b/packages/datadog-instrumentations/src/azure-durable-functions.js @@ -12,7 +12,7 @@ const { /** * @type {import('diagnostics_channel').TracingChannel} */ -const azureDurableFunctionsChannel = dc.TracingChannel('datadog:azure:durable-functions:invoke') +const azureDurableFunctionsChannel = dc.tracingChannel('datadog:azure:durable-functions:invoke') addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, (df) => { log.debug('adding durable functions hook OLIVIER') diff --git a/packages/datadog-plugin-azure-durable-functions/src/outbound.js b/packages/datadog-plugin-azure-durable-functions/src/outbound.js index c38d55e58fb..c0eb3c1537d 100644 --- a/packages/datadog-plugin-azure-durable-functions/src/outbound.js +++ b/packages/datadog-plugin-azure-durable-functions/src/outbound.js @@ -10,11 +10,9 @@ const log = require('../../dd-trace/src/log') class AzureDurableFunctionsOutboundPlugin extends OutboundPlugin { static get id () { return 'azure-durable-functions' } static get operation () { return 'invoke' } - static get prefix () { return 'tracing:apm:azure-durable-functions:invoke' } + static get prefix () { return 'tracing:datadog:azure:durable-functions:invoke' } bindStart (ctx) { - /* eslint-disable no-console */ - log.debug('logging context:\n') for (const key in ctx) { /* eslint-disable-next-line */ From 3f0dfe4c666beff2390f2f6d9da83360d12bdf7c Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 4 Feb 2026 09:32:34 -0500 Subject: [PATCH 08/22] update supported configs --- packages/dd-trace/src/config/supported-configurations.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/dd-trace/src/config/supported-configurations.json b/packages/dd-trace/src/config/supported-configurations.json index 4ee377f4816..96063101503 100644 --- a/packages/dd-trace/src/config/supported-configurations.json +++ b/packages/dd-trace/src/config/supported-configurations.json @@ -241,6 +241,7 @@ "DD_TRACE_AZURE_EVENT_HUBS_ENABLED": ["A"], "DD_TRACE_AZURE_EVENTHUBS_BATCH_LINKS_ENABLED": ["A"], "DD_TRACE_AZURE_FUNCTIONS_ENABLED": ["A"], + "DD_TRACE_AZURE_DURABLE_FUNCTIONS_ENABLED": ["A"], "DD_TRACE_AZURE_SERVICE_BUS_ENABLED": ["A"], "DD_TRACE_AZURE_SERVICEBUS_BATCH_LINKS_ENABLED": ["A"], "DD_TRACE_BAGGAGE_MAX_BYTES": ["A"], From 7dae8724fc0f93b1449d62962e47679100760588 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 4 Feb 2026 12:28:43 -0500 Subject: [PATCH 09/22] add spans --- .../datadog-instrumentations/src/azure-functions.js | 1 - .../src/outbound.js | 12 +++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index 30254aa4813..be426bfd9b6 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -35,7 +35,6 @@ addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (a // The arguments are either an object with a handler property or the handler function itself function wrapHandler (method) { return function (name, arg) { - log.debug('in sub wrap handler for method: ', name) // check if this is either a handlerOptions or the handler itself if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { // if this is a handlerOptions: first, assign to a variable options diff --git a/packages/datadog-plugin-azure-durable-functions/src/outbound.js b/packages/datadog-plugin-azure-durable-functions/src/outbound.js index c0eb3c1537d..38e17743bf9 100644 --- a/packages/datadog-plugin-azure-durable-functions/src/outbound.js +++ b/packages/datadog-plugin-azure-durable-functions/src/outbound.js @@ -13,11 +13,13 @@ class AzureDurableFunctionsOutboundPlugin extends OutboundPlugin { static get prefix () { return 'tracing:datadog:azure:durable-functions:invoke' } bindStart (ctx) { - log.debug('logging context:\n') - for (const key in ctx) { - /* eslint-disable-next-line */ - log.debug(`key: ${key}, val: ${ctx[key]}\n`) - } + log.debug('in durable-functions plugin for method: %s', ctx.methodName) + // const span = + this.startSpan(this.operationName(), { + meta: { + component: 'azure-durable-functions', + }, + }) } asyncEnd (ctx) { From f251956f7a2a8f639c9a2801be337c1430a2be6e Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 9 Feb 2026 14:12:55 -0600 Subject: [PATCH 10/22] add entity instrumentation --- .../src/azure-durable-functions.js | 65 ++++--------------- .../src/azure-functions.js | 2 - .../src/index.js | 51 +++++++++++---- .../src/outbound.js | 34 ---------- .../service-naming/schemas/v0/serverless.js | 4 ++ .../service-naming/schemas/v1/serverless.js | 4 ++ 6 files changed, 60 insertions(+), 100 deletions(-) delete mode 100644 packages/datadog-plugin-azure-durable-functions/src/outbound.js diff --git a/packages/datadog-instrumentations/src/azure-durable-functions.js b/packages/datadog-instrumentations/src/azure-durable-functions.js index d1a2fa1735a..0fbe9d27f3f 100644 --- a/packages/datadog-instrumentations/src/azure-durable-functions.js +++ b/packages/datadog-instrumentations/src/azure-durable-functions.js @@ -3,7 +3,6 @@ const dc = require('dc-polyfill') const shimmer = require('../../datadog-shimmer') -const log = require('../../dd-trace/src/log') const { addHook, @@ -15,48 +14,18 @@ const { const azureDurableFunctionsChannel = dc.tracingChannel('datadog:azure:durable-functions:invoke') addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, (df) => { - log.debug('adding durable functions hook OLIVIER') - // TODO implement v3 const { app } = df - shimmer.wrap(app, 'orchestration', wrapOrchestrationHandler) - shimmer.wrap(app, 'entity', wrapEntityHandler) + shimmer.wrap(app, 'entity', entityWrapper) shimmer.wrap(app, 'activity', activityHandler) return df }) -function wrapOrchestrationHandler (method) { - log.debug('in wrap orchestration handler') - return function (orchestrationName, arg) { - // argument can either be the handler itself, or options describing the handler - if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { - shimmer.wrap(arg, 'handler', handler => orchestrationHandler(handler, orchestrationName, method.name)) - } else if (typeof arg === 'function') { - shimmer.wrapFunction(arg, handler => orchestrationHandler(handler, orchestrationName, method.name)) - } - return method.apply(this, arguments) - } -} - -function orchestrationHandler (handler, orchestrationName, methodName) { - log.debug('in orchestration handler. ochestrationName: ', orchestrationName, 'method name: ', methodName) - - return function () { - log.debug('in nested orchestration function') - - const orchestrationContext = arguments[0] - return azureDurableFunctionsChannel.traceSync( - handler, - { orchestrationContext, methodName, orchestrationName }, - this, ...arguments) - } -} - -function wrapEntityHandler (method) { +function entityWrapper (method) { return function (entityName, arg) { if (typeof arg === 'function') { - shimmer.wrapFunction(arg, handler => entityHandler(handler, entityName, method.name)) + arguments[1] = shimmer.wrapFunction(arg, handler => entityHandler(handler, entityName, method.name)) } else { shimmer.wrap(arg, 'handler', handler => entityHandler(handler, entityName, method.name)) } @@ -65,41 +34,33 @@ function wrapEntityHandler (method) { } function entityHandler (handler, entityName, methodName) { - return function (...args) { - const entityContext = args[0] + return function () { return azureDurableFunctionsChannel.traceSync( handler, - { entityContext, entityName, methodName }, - this, ...args) + { trigger: 'Entity', functionName: entityName }, + this, ...arguments) } } function activityHandler (method) { - log.debug('in activity handler. method name:', method.name) - return function (activityName, activityOptions) { - log.debug('in nested activity handler. activity name:', activityName) - shimmer.wrap(activityOptions, 'handler', handler => { const isAsync = handler && handler.constructor && handler.constructor.name === 'AsyncFunction' - return function (...args) { - const invocationContext = args[1] - + return function () { if (isAsync) { return azureDurableFunctionsChannel.tracePromise( handler, - // MAYBE get function name from invocation context - { activityName, invocationContext, methodName: method.name }, - this, ...args) + { trigger: 'Activity', functionName: activityName }, + this, ...arguments) } - // TODO handler might still return a promise even if not declared as async - // maybe put everything under trace promise + // handler might still return a promise even if not declared as async + // MAYBE put everything under trace promise return azureDurableFunctionsChannel.traceSync( handler, - { activityName, invocationContext, methodName: method.name }, - this, ...args) + { trigger: 'Activity', functionName: activityName }, + this, ...arguments) } }) return method.apply(this, arguments) diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index be426bfd9b6..5bc0d91a2c0 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -1,7 +1,6 @@ 'use strict' const dc = require('dc-polyfill') -const log = require('../../dd-trace/src/log') const shimmer = require('../../datadog-shimmer') const { addHook, @@ -10,7 +9,6 @@ const { const azureFunctionsChannel = dc.tracingChannel('datadog:azure:functions:invoke') addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (azureFunction) => { - log.debug('adding az functions hook OLIVIER') const { app } = azureFunction // Http triggers diff --git a/packages/datadog-plugin-azure-durable-functions/src/index.js b/packages/datadog-plugin-azure-durable-functions/src/index.js index f01a25b8907..951f70d98f9 100644 --- a/packages/datadog-plugin-azure-durable-functions/src/index.js +++ b/packages/datadog-plugin-azure-durable-functions/src/index.js @@ -1,21 +1,48 @@ 'use strict' -const CompositePlugin = require('../../dd-trace/src/plugins/composite') -const AzureDurableFunctionsOutboundPlugin = require('./outbound') +const TracingPlugin = require('../../dd-trace/src/plugins/tracing') +const log = require('../../dd-trace/src/log') -class AzureDurableFunctionsPlugin extends CompositePlugin { - static get id () { - return 'azure-durable-functions' +class AzureDurableFunctionsPlugin extends TracingPlugin { + static get id () { return 'azure-durable-functions' } + static get operation () { return 'invoke' } + static get prefix () { return 'tracing:datadog:azure:durable-functions:invoke' } + static get type () { return 'serverless' } + static get kind () { return 'server' } + + bindStart (ctx) { + log.debug('in durable-functions plugin for method: %s. ctx:\n%o ', ctx.methodName, ctx) + // Object.entries(ctx).forEach(([key, value]) => { + // log.debug('{ %s: %o }', key, value) + // }) + // const span = + + // const opName = this.operationName() + // console.log('opname in azdurable:', opName) + + const span = this.startSpan(this.operationName(), { + kind: 'internal', + + meta: { + component: 'azure-durable-functions', + 'aas.function.name': ctx.functionName, + 'aas.function.trigger': ctx.trigger, + 'resource.name': `${ctx.trigger} ${ctx.functionName}`, + }, + }, ctx) + + ctx.span = span + return ctx.currentStore } - // static get prefix () { - // return 'tracing:apm:azure-durable-functions' - // } + asyncEnd (ctx) { + log.debug('async end in durable-functions plugin for method: %s', ctx.methodName) + super.finish(ctx) + } - static get plugins () { - return { - outbound: AzureDurableFunctionsOutboundPlugin, - } + end (ctx) { + log.debug('end in durable-functions plugin for method: %s', ctx.methodName) + super.finish(ctx) } } diff --git a/packages/datadog-plugin-azure-durable-functions/src/outbound.js b/packages/datadog-plugin-azure-durable-functions/src/outbound.js deleted file mode 100644 index 38e17743bf9..00000000000 --- a/packages/datadog-plugin-azure-durable-functions/src/outbound.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict' - -// const TracingPlugin = require('../dd-trace/src/plugins/tracing') -const OutboundPlugin = require('../../dd-trace/src/plugins/outbound') -const log = require('../../dd-trace/src/log') - -// const spanContexts = new WeakMap() - -// class AzureDurableFunctionsOutboundPlugin extends TracingPlugin { -class AzureDurableFunctionsOutboundPlugin extends OutboundPlugin { - static get id () { return 'azure-durable-functions' } - static get operation () { return 'invoke' } - static get prefix () { return 'tracing:datadog:azure:durable-functions:invoke' } - - bindStart (ctx) { - log.debug('in durable-functions plugin for method: %s', ctx.methodName) - // const span = - this.startSpan(this.operationName(), { - meta: { - component: 'azure-durable-functions', - }, - }) - } - - asyncEnd (ctx) { - super.finish(ctx) - } - - end (ctx) { - super.finish(ctx) - } -} - -module.exports = AzureDurableFunctionsOutboundPlugin diff --git a/packages/dd-trace/src/service-naming/schemas/v0/serverless.js b/packages/dd-trace/src/service-naming/schemas/v0/serverless.js index 3c7d422b361..2058e6cb422 100644 --- a/packages/dd-trace/src/service-naming/schemas/v0/serverless.js +++ b/packages/dd-trace/src/service-naming/schemas/v0/serverless.js @@ -8,6 +8,10 @@ const serverless = { opName: () => 'azure.functions.invoke', serviceName: identityService, }, + 'azure-durable-functions': { + opName: () => 'azure.durable-functions.invoke', + serviceName: identityService, + }, }, } diff --git a/packages/dd-trace/src/service-naming/schemas/v1/serverless.js b/packages/dd-trace/src/service-naming/schemas/v1/serverless.js index 3c7d422b361..2058e6cb422 100644 --- a/packages/dd-trace/src/service-naming/schemas/v1/serverless.js +++ b/packages/dd-trace/src/service-naming/schemas/v1/serverless.js @@ -8,6 +8,10 @@ const serverless = { opName: () => 'azure.functions.invoke', serviceName: identityService, }, + 'azure-durable-functions': { + opName: () => 'azure.durable-functions.invoke', + serviceName: identityService, + }, }, } From 055c3312ebd30e05033947ffa8e1f442caa4e39d Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 9 Feb 2026 14:16:28 -0600 Subject: [PATCH 11/22] remove debug logs --- .../src/index.js | 12 ------------ packages/dd-trace/src/proxy.js | 1 - 2 files changed, 13 deletions(-) diff --git a/packages/datadog-plugin-azure-durable-functions/src/index.js b/packages/datadog-plugin-azure-durable-functions/src/index.js index 951f70d98f9..4517007c80b 100644 --- a/packages/datadog-plugin-azure-durable-functions/src/index.js +++ b/packages/datadog-plugin-azure-durable-functions/src/index.js @@ -1,7 +1,6 @@ 'use strict' const TracingPlugin = require('../../dd-trace/src/plugins/tracing') -const log = require('../../dd-trace/src/log') class AzureDurableFunctionsPlugin extends TracingPlugin { static get id () { return 'azure-durable-functions' } @@ -11,15 +10,6 @@ class AzureDurableFunctionsPlugin extends TracingPlugin { static get kind () { return 'server' } bindStart (ctx) { - log.debug('in durable-functions plugin for method: %s. ctx:\n%o ', ctx.methodName, ctx) - // Object.entries(ctx).forEach(([key, value]) => { - // log.debug('{ %s: %o }', key, value) - // }) - // const span = - - // const opName = this.operationName() - // console.log('opname in azdurable:', opName) - const span = this.startSpan(this.operationName(), { kind: 'internal', @@ -36,12 +26,10 @@ class AzureDurableFunctionsPlugin extends TracingPlugin { } asyncEnd (ctx) { - log.debug('async end in durable-functions plugin for method: %s', ctx.methodName) super.finish(ctx) } end (ctx) { - log.debug('end in durable-functions plugin for method: %s', ctx.methodName) super.finish(ctx) } } diff --git a/packages/dd-trace/src/proxy.js b/packages/dd-trace/src/proxy.js index f9d0bf943e5..80a6fba2f70 100644 --- a/packages/dd-trace/src/proxy.js +++ b/packages/dd-trace/src/proxy.js @@ -95,7 +95,6 @@ class Tracer extends NoopProxy { * @override */ init (options) { - log.debug('in ddtrace.init') if (this._initialized) return this this._initialized = true From a6654cd829378904735d294fdc97c2006ead9bb1 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Fri, 13 Feb 2026 14:31:23 -0500 Subject: [PATCH 12/22] tests --- package.json | 2 +- .../src/azure-durable-functions.js | 26 ++-- .../src/azure-functions.js | 4 - .../src/index.js | 18 ++- .../test/fixtures/host.json | 14 ++ .../test/fixtures/local.settings.json | 8 ++ .../test/fixtures/package.json | 9 ++ .../test/integration-test/client.spec.js | 135 ++++++++++++++++++ .../test/integration-test/server.js | 67 +++++++++ .../integration-test/http-test/client.spec.js | 2 +- .../test/plugins/versions/package.json | 2 + 11 files changed, 267 insertions(+), 20 deletions(-) create mode 100644 packages/datadog-plugin-azure-durable-functions/test/fixtures/host.json create mode 100644 packages/datadog-plugin-azure-durable-functions/test/fixtures/local.settings.json create mode 100644 packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json create mode 100644 packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js create mode 100644 packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js diff --git a/package.json b/package.json index 8d929763ff6..c350890d369 100644 --- a/package.json +++ b/package.json @@ -171,6 +171,7 @@ "glob": "^10.4.5", "globals": "^17.2.0", "graphql": "*", + "husky": "^9.1.7", "jszip": "^3.10.1", "mocha": "^11.6.0", "mocha-junit-reporter": "^2.2.1", @@ -190,7 +191,6 @@ "typescript": "^5.9.2", "workerpool": "^10.0.0", "yaml": "^2.8.0", - "husky": "^9.1.7", "yarn-deduplicate": "^6.0.2" } } diff --git a/packages/datadog-instrumentations/src/azure-durable-functions.js b/packages/datadog-instrumentations/src/azure-durable-functions.js index 0fbe9d27f3f..800f3222363 100644 --- a/packages/datadog-instrumentations/src/azure-durable-functions.js +++ b/packages/datadog-instrumentations/src/azure-durable-functions.js @@ -1,7 +1,6 @@ 'use strict' const dc = require('dc-polyfill') - const shimmer = require('../../datadog-shimmer') const { @@ -24,20 +23,27 @@ addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, ( function entityWrapper (method) { return function (entityName, arg) { + // because this method is overloaded, the second argument can either be an object + // with the handler or the handler itself. So first we figure which type it is + if (typeof arg === 'function') { + // if a function, this is the handler we want to wrap and trace arguments[1] = shimmer.wrapFunction(arg, handler => entityHandler(handler, entityName, method.name)) } else { + // if an object, access the handler then trace it shimmer.wrap(arg, 'handler', handler => entityHandler(handler, entityName, method.name)) } + return method.apply(this, arguments) } } function entityHandler (handler, entityName, methodName) { return function () { + const entityContext = arguments[0] return azureDurableFunctionsChannel.traceSync( handler, - { trigger: 'Entity', functionName: entityName }, + { trigger: 'Entity', functionName: entityName, operationName: entityContext?.df?.operationName }, this, ...arguments) } } @@ -49,18 +55,16 @@ function activityHandler (method) { handler && handler.constructor && handler.constructor.name === 'AsyncFunction' return function () { - if (isAsync) { - return azureDurableFunctionsChannel.tracePromise( + // use tracePromise if this is an async handler. otherwise, use traceSync + return isAsync + ? azureDurableFunctionsChannel.tracePromise( + handler, + { trigger: 'Activity', functionName: activityName }, + this, ...arguments) + : azureDurableFunctionsChannel.traceSync( handler, { trigger: 'Activity', functionName: activityName }, this, ...arguments) - } - // handler might still return a promise even if not declared as async - // MAYBE put everything under trace promise - return azureDurableFunctionsChannel.traceSync( - handler, - { trigger: 'Activity', functionName: activityName }, - this, ...arguments) } }) return method.apply(this, arguments) diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index 5bc0d91a2c0..dc0c7c70ef5 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -33,12 +33,8 @@ addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (a // The arguments are either an object with a handler property or the handler function itself function wrapHandler (method) { return function (name, arg) { - // check if this is either a handlerOptions or the handler itself if (arg !== null && typeof arg === 'object' && arg.hasOwnProperty('handler')) { - // if this is a handlerOptions: first, assign to a variable options const options = arg - - // then, access the handler within that options. trace that handler using a shimmer.wrap(options, 'handler', handler => traceHandler(handler, name, method.name)) } else if (typeof arg === 'function') { const handler = arg diff --git a/packages/datadog-plugin-azure-durable-functions/src/index.js b/packages/datadog-plugin-azure-durable-functions/src/index.js index 4517007c80b..d87ae1507e0 100644 --- a/packages/datadog-plugin-azure-durable-functions/src/index.js +++ b/packages/datadog-plugin-azure-durable-functions/src/index.js @@ -12,24 +12,36 @@ class AzureDurableFunctionsPlugin extends TracingPlugin { bindStart (ctx) { const span = this.startSpan(this.operationName(), { kind: 'internal', + type: 'serverless', meta: { - component: 'azure-durable-functions', + component: 'azure-functions', 'aas.function.name': ctx.functionName, 'aas.function.trigger': ctx.trigger, 'resource.name': `${ctx.trigger} ${ctx.functionName}`, }, }, ctx) + // in the case of entity functions, operationName should be available + if (ctx.operationName) { + span.setTag('aas.function.operation', ctx.operationName) + span.setTag('resource.name', `${ctx.trigger} ${ctx.functionName} ${ctx.operationName}` + ) + } + ctx.span = span return ctx.currentStore } - asyncEnd (ctx) { + end (ctx) { + // We only want to run finish here if this is a synchronous operation + // Only synchronous operations would have `result` or `error` on `end` + // So we skip operations that dont + if (!ctx.hasOwnProperty('result') && !ctx.hasOwnProperty('error')) return super.finish(ctx) } - end (ctx) { + asyncEnd (ctx) { super.finish(ctx) } } diff --git a/packages/datadog-plugin-azure-durable-functions/test/fixtures/host.json b/packages/datadog-plugin-azure-durable-functions/test/fixtures/host.json new file mode 100644 index 00000000000..bb083360934 --- /dev/null +++ b/packages/datadog-plugin-azure-durable-functions/test/fixtures/host.json @@ -0,0 +1,14 @@ +{ + "version": "2.0", + "extensionBundle": { + "id": "Microsoft.Azure.Functions.ExtensionBundle", + "version": "[4.0.0, 4.28.0)" + }, + "extensions": { + "durableTask": { + "storageProvider": { + "type": "AzureStorage" + } + } + } +} diff --git a/packages/datadog-plugin-azure-durable-functions/test/fixtures/local.settings.json b/packages/datadog-plugin-azure-durable-functions/test/fixtures/local.settings.json new file mode 100644 index 00000000000..eda4dc397ad --- /dev/null +++ b/packages/datadog-plugin-azure-durable-functions/test/fixtures/local.settings.json @@ -0,0 +1,8 @@ +{ + "IsEncrypted": false, + "Values": { + "FUNCTIONS_WORKER_RUNTIME": "node", + "AzureWebJobsFeatureFlags": "EnableWorkerIndexing", + "AzureWebJobsStorage": "UseDevelopmentStorage=true" + } +} diff --git a/packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json b/packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json new file mode 100644 index 00000000000..9ee2aab563e --- /dev/null +++ b/packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json @@ -0,0 +1,9 @@ +{ + "name": "azure-durable-functions-tests", + "version": "1.0.0", + "description": "", + "main": "./server.js", + "scripts": { + "start": "func start" + } +} diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js new file mode 100644 index 00000000000..53cc67dc310 --- /dev/null +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js @@ -0,0 +1,135 @@ +'use strict' + +const assert = require('node:assert/strict') + +const { spawn } = require('child_process') +const { describe, it } = require('mocha') +const { + FakeAgent, + hookFile, + sandboxCwd, + useSandbox, + curlAndAssertMessage, +} = require('../../../../integration-tests/helpers') +const { withVersions } = require('../../../dd-trace/test/setup/mocha') + +describe('esm', () => { + let agent + let azuriteproc + let funcproc + + withVersions('azure-durable-functions', 'durable-functions', version => { + useSandbox([ + `durable-functions@${version}`, + '@azure/functions', + 'azure-functions-core-tools@4', + 'azurite@3', + ], + false, + ['./packages/datadog-plugin-azure-durable-functions/test/integration-test/*', + './packages/datadog-plugin-azure-durable-functions/test/fixtures/*', + ]) + + beforeEach(async () => { + agent = await new FakeAgent().start(); + [azuriteproc, funcproc] = await spawnPluginIntegrationTestProcs(agent.port) + }) + + afterEach(async () => { + // after each test, kill both processes and wait for them to exit before continuing + + if (funcproc) { + funcproc.kill('SIGINT') + await new Promise(resolve => funcproc.on('exit', resolve)) + } + if (azuriteproc) { + azuriteproc.kill('SIGINT') + await new Promise(resolve => azuriteproc.on('exit', resolve)) + } + await agent.stop() + }) + + it('is instrumented', async () => { + const name = 'jerome' + const increment = 2 + + return await curlAndAssertMessage(agent, `http://127.0.0.1:7071/api/httptest?name=${name}&increment=${increment}`, ({ headers, payload }) => { + // eslint-disable-next-line no-console + console.log('\x1b[36m%s\x1b[0m', 'response headers:', headers) + // eslint-disable-next-line no-console + console.log('\x1b[33m%s\x1b[0m', 'response payload:', payload) + + assert.strictEqual(headers.host, `127.0.0.1:${agent.port}`) + assert.ok(Array.isArray(payload)) + assert.strictEqual(payload.length, 1) + assert.ok(Array.isArray(payload[0])) + assert.ok() + + // assert.strictEqual(payload[0].length, 1) + // assert.strictEqual(payload[0][0].name, 'azure.functions.invoke') + }) + }).timeout(60000) + }) +}) + +/** + * spawns azurite and func start processes + * + * - azurite is spawned first and is used as a local storage for durable functions + * - func start then connects to azurite and runs the durable function locally. + * + */ +async function spawnPluginIntegrationTestProcs (agentPort) { + const cwd = sandboxCwd() + const env = { + NODE_OPTIONS: `--loader=${hookFile}`, + DD_TRACE_AGENT_PORT: agentPort, + DD_TRACE_DISABLED_PLUGINS: 'amqplib,amqp10,rhea,net', + PATH: `${cwd}/node_modules/azure-functions-core-tools/bin:` + + `${cwd}/node_modules/.bin:${process.env.PATH}`, + } + + // callbacks to check logs if azurite and func-start proccesess are ready + const azuriteReadyCondition = (dataString) => { + return dataString.includes('Azurite Table service is successfully listening') + } + + const funcReadyCondition = (dataString) => { + return dataString.toString().includes('Host lock lease acquired by instance') + } + + const options = { cwd, env } + + const azuriteProc = await spawnProc('azurite', ['-s'], options, azuriteReadyCondition) + + const funcProc = await spawnProc('func', ['start'], options, funcReadyCondition) + return [azuriteProc, funcProc] +} + +function spawnProc (command, args, options = {}, readyCondition) { + const proc = spawn(command, args, { ...options, stdio: 'pipe' }) + return new Promise((resolve, reject) => { + proc + .on('error', reject) + .on('exit', code => { + if (code !== 0) { + reject(new Error(`Process exited with status code ${code}.`)) + } + resolve() + }) + + proc.stdout.on('data', data => { + // eslint-disable-next-line no-console + if (!options.silent) console.log(data.toString()) + + if (readyCondition(data.toString())) { + resolve(proc) + } + }) + + proc.stderr.on('data', data => { + // eslint-disable-next-line no-console + if (!options.silent) console.error(data.toString()) + }) + }) +} diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js new file mode 100644 index 00000000000..6070f9341ed --- /dev/null +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js @@ -0,0 +1,67 @@ +'use strict' + +require('dd-trace/init.js') +const { app } = require('@azure/functions') + +const df = require('durable-functions') + +df.app.entity('counter', (context) => { + const current = context.df.getState(() => 0) + + switch (context.df.operationName) { + case 'add_n': { + const n = context.df.getInput() ?? 0 + context.df.setState(current + n) + break + } + case 'get_count': { + context.df.return(current) + break + } + default: + break + } +}) + +df.app.activity('hola', { + handler: async (name, _ctx) => { + return `hola ${name}` + }, +}) + +/** + * Orchestrator: testOrchestrator + * - calls activity + * - updates entity + */ +df.app.orchestration('testOrchestrator', function * (context) { + const input = context.df.getInput() + + // 1) Do work (activity) + const greeting = yield context.df.callActivity('hola', input.name) + + // 2) Update state (entity) + const counterId = new df.EntityId('counter', 'global') + const increment = input.increment + yield context.df.callEntity(counterId, 'add_n', increment) + + // 3) Read state back (entity) + const total = yield context.df.callEntity(counterId, 'get_count') + + return { greeting, total } +}) + +app.http('httptest', { + methods: ['GET'], + extraInputs: [df.input.durableClient()], + + handler: async (req, context) => { + const client = df.getClient(context) + const params = await req.query + const name = params?.name || 'world' + const increment = params?.increment || 1 + + const instanceId = await client.startNew('testOrchestrator', { input: { name, increment } }) + return client.createCheckStatusResponse(req, instanceId) + }, +}) diff --git a/packages/datadog-plugin-azure-functions/test/integration-test/http-test/client.spec.js b/packages/datadog-plugin-azure-functions/test/integration-test/http-test/client.spec.js index 6558ed01765..bdf9ce25f13 100644 --- a/packages/datadog-plugin-azure-functions/test/integration-test/http-test/client.spec.js +++ b/packages/datadog-plugin-azure-functions/test/integration-test/http-test/client.spec.js @@ -70,7 +70,7 @@ describe('esm', () => { async function spawnPluginIntegrationTestProc (cwd, command, args, agentPort, stdioHandler, additionalEnvArgs = {}) { let env = { - NODE_OPTIONS: `--loader=${hookFile} func start`, + NODE_OPTIONS: `--loader=${hookFile}`, DD_TRACE_AGENT_PORT: agentPort, } env = { ...env, ...additionalEnvArgs } diff --git a/packages/dd-trace/test/plugins/versions/package.json b/packages/dd-trace/test/plugins/versions/package.json index c9630ed63bd..e0c71654a0e 100644 --- a/packages/dd-trace/test/plugins/versions/package.json +++ b/packages/dd-trace/test/plugins/versions/package.json @@ -21,6 +21,8 @@ "@aws-sdk/smithy-client": "3.374.0", "@azure/event-hubs": "6.0.2", "@azure/functions": "4.11.0", + "durable-functions": "3.3.0", + "azurite": "3.35.0", "@azure/service-bus": "7.9.5", "@confluentinc/kafka-javascript": "1.8.0", "@cucumber/cucumber": "12.5.0", From 38dad4ce277d98c4cbe0f16cbe78d063a4c3421a Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Fri, 13 Feb 2026 15:52:15 -0500 Subject: [PATCH 13/22] tests pt2 --- .../src/azure-durable-functions.js | 2 +- .../test/integration-test/client.spec.js | 44 +++++++++++-------- .../test/integration-test/server.js | 4 +- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/packages/datadog-instrumentations/src/azure-durable-functions.js b/packages/datadog-instrumentations/src/azure-durable-functions.js index 800f3222363..bbf4a63981d 100644 --- a/packages/datadog-instrumentations/src/azure-durable-functions.js +++ b/packages/datadog-instrumentations/src/azure-durable-functions.js @@ -24,7 +24,7 @@ addHook({ name: 'durable-functions', versions: ['>=3'], patchDefault: false }, ( function entityWrapper (method) { return function (entityName, arg) { // because this method is overloaded, the second argument can either be an object - // with the handler or the handler itself. So first we figure which type it is + // with the handler or the handler itself, so first we figure which type it is if (typeof arg === 'function') { // if a function, this is the handler we want to wrap and trace diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js index 53cc67dc310..9996d401bcb 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js @@ -50,34 +50,42 @@ describe('esm', () => { }) it('is instrumented', async () => { - const name = 'jerome' - const increment = 2 - - return await curlAndAssertMessage(agent, `http://127.0.0.1:7071/api/httptest?name=${name}&increment=${increment}`, ({ headers, payload }) => { - // eslint-disable-next-line no-console - console.log('\x1b[36m%s\x1b[0m', 'response headers:', headers) - // eslint-disable-next-line no-console - console.log('\x1b[33m%s\x1b[0m', 'response payload:', payload) - + return await curlAndAssertMessage(agent, 'http://127.0.0.1:7071/api/httptest', ({ headers, payload }) => { assert.strictEqual(headers.host, `127.0.0.1:${agent.port}`) assert.ok(Array.isArray(payload)) - assert.strictEqual(payload.length, 1) - assert.ok(Array.isArray(payload[0])) - assert.ok() - // assert.strictEqual(payload[0].length, 1) - // assert.strictEqual(payload[0][0].name, 'azure.functions.invoke') + // should expect spans for http.request, activity.hola, entity.counter.add_n, entity.counter.get_count + assert.strictEqual(payload.length, 4) + + for (const maybeArray of payload) { + assert.ok(Array.isArray(maybeArray)) + } + + const [maybeHttpSpan, maybeHolaActivity, maybeAddNEntity, maybeGetCountEntity] = payload + + assert.strictEqual(maybeHttpSpan.length, 2) + assert.strictEqual(maybeHttpSpan[0].resource, 'GET /api/httptest') + + assert.strictEqual(maybeHolaActivity.length, 1) + assert.strictEqual(maybeHolaActivity[0].resource, 'Activity hola') + assert.strictEqual(maybeHolaActivity[0].name, 'azure.durable-functions.invoke') + + assert.strictEqual(maybeAddNEntity.length, 1) + assert.strictEqual(maybeAddNEntity[0].resource, 'Entity Counter add_n') + assert.strictEqual(maybeAddNEntity[0].name, 'azure.durable-functions.invoke') + + assert.strictEqual(maybeGetCountEntity.length, 1) + assert.strictEqual(maybeGetCountEntity[0].resource, 'Entity Counter get_count') + assert.strictEqual(maybeGetCountEntity[0].name, 'azure.durable-functions.invoke') }) }).timeout(60000) }) }) /** - * spawns azurite and func start processes - * + * spawns processes for azurite and func start commands * - azurite is spawned first and is used as a local storage for durable functions - * - func start then connects to azurite and runs the durable function locally. - * + * - func start then connects to azurite and runs the durable function locally */ async function spawnPluginIntegrationTestProcs (agentPort) { const cwd = sandboxCwd() diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js index 6070f9341ed..97a43c43dbf 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js @@ -5,7 +5,7 @@ const { app } = require('@azure/functions') const df = require('durable-functions') -df.app.entity('counter', (context) => { +df.app.entity('Counter', (context) => { const current = context.df.getState(() => 0) switch (context.df.operationName) { @@ -41,7 +41,7 @@ df.app.orchestration('testOrchestrator', function * (context) { const greeting = yield context.df.callActivity('hola', input.name) // 2) Update state (entity) - const counterId = new df.EntityId('counter', 'global') + const counterId = new df.EntityId('Counter', 'global') const increment = input.increment yield context.df.callEntity(counterId, 'add_n', increment) From e24b38bac23e153953f240d04a05f7f38f001b01 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Sat, 14 Feb 2026 22:19:06 -0500 Subject: [PATCH 14/22] add df plugin interface and fix esm issues --- index.d.ts | 7 +++++++ packages/datadog-instrumentations/src/azure-functions.js | 5 +++++ .../test/fixtures/package.json | 2 +- .../test/integration-test/client.spec.js | 1 - .../test/integration-test/{server.js => server.mjs} | 8 +++----- 5 files changed, 16 insertions(+), 7 deletions(-) rename packages/datadog-plugin-azure-durable-functions/test/integration-test/{server.js => server.mjs} (92%) diff --git a/index.d.ts b/index.d.ts index b8359408786..3159e817a6b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -227,6 +227,7 @@ interface Plugins { "azure-event-hubs": tracer.plugins.azure_event_hubs; "azure-functions": tracer.plugins.azure_functions; "azure-service-bus": tracer.plugins.azure_service_bus; + "azure-durable-functions": tracer.plugins.azure_durable_functions "bullmq": tracer.plugins.bullmq; "bunyan": tracer.plugins.bunyan; "cassandra-driver": tracer.plugins.cassandra_driver; @@ -1898,6 +1899,12 @@ declare namespace tracer { */ interface azure_service_bus extends Integration {} + /** + * This plugin automatically instruments the + * durable-functions module + */ + interface azure_durable_functions extends Integration {} + /** * This plugin patches the [bunyan](https://github.com/trentm/node-bunyan) * to automatically inject trace identifiers in log records when the diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index dc0c7c70ef5..b66d1184979 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -6,11 +6,16 @@ const { addHook, } = require('./helpers/instrument') +let alreadyPatched = false + const azureFunctionsChannel = dc.tracingChannel('datadog:azure:functions:invoke') addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (azureFunction) => { const { app } = azureFunction + if (alreadyPatched) return azureFunction + alreadyPatched = true + // Http triggers shimmer.wrap(app, 'deleteRequest', wrapHandler) shimmer.wrap(app, 'http', wrapHandler) diff --git a/packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json b/packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json index 9ee2aab563e..1aaf97e24ed 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json +++ b/packages/datadog-plugin-azure-durable-functions/test/fixtures/package.json @@ -2,7 +2,7 @@ "name": "azure-durable-functions-tests", "version": "1.0.0", "description": "", - "main": "./server.js", + "main": "./server.mjs", "scripts": { "start": "func start" } diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js index 9996d401bcb..d370fa83d5d 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js @@ -37,7 +37,6 @@ describe('esm', () => { afterEach(async () => { // after each test, kill both processes and wait for them to exit before continuing - if (funcproc) { funcproc.kill('SIGINT') await new Promise(resolve => funcproc.on('exit', resolve)) diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.mjs similarity index 92% rename from packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js rename to packages/datadog-plugin-azure-durable-functions/test/integration-test/server.mjs index 97a43c43dbf..9c437c36536 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.js +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.mjs @@ -1,9 +1,7 @@ -'use strict' +import 'dd-trace/init.js' +import { app } from '@azure/functions' -require('dd-trace/init.js') -const { app } = require('@azure/functions') - -const df = require('durable-functions') +import df from 'durable-functions' df.app.entity('Counter', (context) => { const current = context.df.getState(() => 0) From 33246eeb7d1cff1c9f321c1f0977f16c55657120 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Sun, 15 Feb 2026 20:30:09 -0500 Subject: [PATCH 15/22] add azure-durable-function to api.md --- docs/API.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/API.md b/docs/API.md index 8a3512b7cdf..34a979d6fe2 100644 --- a/docs/API.md +++ b/docs/API.md @@ -34,6 +34,7 @@ tracer.use('pg', {
+
@@ -112,6 +113,7 @@ tracer.use('pg', { * [azure-event-hubs](./interfaces/export_.plugins.azure_event_hubs.html) * [azure-functions](./interfaces/export_.plugins.azure_functions.html) * [azure-service-bus](./interfaces/export_.plugins.azure_service_bus.html) +* [azure-durable-functions](./interfaces/export_.plugins.azure_durable_functions.html) * [bullmq](./interfaces/export_.plugins.bullmq.html) * [bunyan](./interfaces/export_.plugins.bunyan.html) * [cassandra-driver](./interfaces/export_.plugins.cassandra_driver.html) From 02c07c49167766c0380e325ab6d0b60ea76203bc Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 17 Feb 2026 17:17:08 -0500 Subject: [PATCH 16/22] add ci --- .github/workflows/serverless.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/serverless.yml b/.github/workflows/serverless.yml index 81d03b2af87..4f2e8a40c93 100644 --- a/.github/workflows/serverless.yml +++ b/.github/workflows/serverless.yml @@ -256,6 +256,23 @@ jobs: with: dd_api_key: ${{ secrets.DD_API_KEY }} + azure-durable-functions: + runs-on: ubuntu-latest + services: + azurite: + image: mcr.microsoft.com/azure-storage/azurite:3.34.0 + ports: + - "127.0.0.1:10000:10000" + - "127.0.0.1:10001:10001" + - "127.0.0.1:10002:10002" + env: + DD_API_KEY: ${{ secrets.DD_API_KEY }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: ./.github/actions/plugins/test + with: + dd_api_key: ${{ secrets.DD_API_KEY }} + google-cloud-pubsub: runs-on: ubuntu-latest services: From cb7654ba5393a03775ec5c0e746c25349e59c756 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 17 Feb 2026 23:24:27 -0500 Subject: [PATCH 17/22] remove azurite proc --- .../test/integration-test/client.spec.js | 52 ++++++------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js index d370fa83d5d..be2b41904c9 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js @@ -15,15 +15,13 @@ const { withVersions } = require('../../../dd-trace/test/setup/mocha') describe('esm', () => { let agent - let azuriteproc - let funcproc + let proc withVersions('azure-durable-functions', 'durable-functions', version => { useSandbox([ `durable-functions@${version}`, '@azure/functions', 'azure-functions-core-tools@4', - 'azurite@3', ], false, ['./packages/datadog-plugin-azure-durable-functions/test/integration-test/*', @@ -31,24 +29,20 @@ describe('esm', () => { ]) beforeEach(async () => { - agent = await new FakeAgent().start(); - [azuriteproc, funcproc] = await spawnPluginIntegrationTestProcs(agent.port) + agent = await new FakeAgent().start() }) afterEach(async () => { - // after each test, kill both processes and wait for them to exit before continuing - if (funcproc) { - funcproc.kill('SIGINT') - await new Promise(resolve => funcproc.on('exit', resolve)) - } - if (azuriteproc) { - azuriteproc.kill('SIGINT') - await new Promise(resolve => azuriteproc.on('exit', resolve)) + // after each test, kill process and wait for exit before continuing + if (proc) { + proc.kill('SIGINT') + await new Promise(resolve => proc.on('exit', resolve)) } await agent.stop() }) it('is instrumented', async () => { + proc = await spawnPluginIntegrationTestProc(agent.port) return await curlAndAssertMessage(agent, 'http://127.0.0.1:7071/api/httptest', ({ headers, payload }) => { assert.strictEqual(headers.host, `127.0.0.1:${agent.port}`) assert.ok(Array.isArray(payload)) @@ -77,43 +71,31 @@ describe('esm', () => { assert.strictEqual(maybeGetCountEntity[0].resource, 'Entity Counter get_count') assert.strictEqual(maybeGetCountEntity[0].name, 'azure.durable-functions.invoke') }) - }).timeout(60000) + }).timeout(60_000) }) }) /** - * spawns processes for azurite and func start commands - * - azurite is spawned first and is used as a local storage for durable functions - * - func start then connects to azurite and runs the durable function locally + * - spawns process for azure func start commands + * - connects to azurite (running in container) + * then runs the durable function locally */ -async function spawnPluginIntegrationTestProcs (agentPort) { +async function spawnPluginIntegrationTestProc (agentPort) { const cwd = sandboxCwd() const env = { NODE_OPTIONS: `--loader=${hookFile}`, DD_TRACE_AGENT_PORT: agentPort, DD_TRACE_DISABLED_PLUGINS: 'amqplib,amqp10,rhea,net', - PATH: `${cwd}/node_modules/azure-functions-core-tools/bin:` + - `${cwd}/node_modules/.bin:${process.env.PATH}`, - } - - // callbacks to check logs if azurite and func-start proccesess are ready - const azuriteReadyCondition = (dataString) => { - return dataString.includes('Azurite Table service is successfully listening') - } - - const funcReadyCondition = (dataString) => { - return dataString.toString().includes('Host lock lease acquired by instance') + PATH: `${cwd}/node_modules/azure-functions-core-tools/bin:${process.env.PATH}`, } const options = { cwd, env } - const azuriteProc = await spawnProc('azurite', ['-s'], options, azuriteReadyCondition) - - const funcProc = await spawnProc('func', ['start'], options, funcReadyCondition) - return [azuriteProc, funcProc] + const proc = await spawnProc('func', ['start'], options) + return proc } -function spawnProc (command, args, options = {}, readyCondition) { +function spawnProc (command, args, options = {}) { const proc = spawn(command, args, { ...options, stdio: 'pipe' }) return new Promise((resolve, reject) => { proc @@ -129,7 +111,7 @@ function spawnProc (command, args, options = {}, readyCondition) { // eslint-disable-next-line no-console if (!options.silent) console.log(data.toString()) - if (readyCondition(data.toString())) { + if (data.toString().includes('Host lock lease acquired by instance')) { resolve(proc) } }) From 06f902da24f2525c8f3eb5120bd6b6944dd98522 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 18 Feb 2026 00:00:45 -0500 Subject: [PATCH 18/22] add envs to ci --- .github/workflows/serverless.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/serverless.yml b/.github/workflows/serverless.yml index 4f2e8a40c93..435c145f94a 100644 --- a/.github/workflows/serverless.yml +++ b/.github/workflows/serverless.yml @@ -266,7 +266,9 @@ jobs: - "127.0.0.1:10001:10001" - "127.0.0.1:10002:10002" env: - DD_API_KEY: ${{ secrets.DD_API_KEY }} + PLUGINS: azure-durable-functions + SERVICES: azurite + steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: ./.github/actions/plugins/test From 101cd10c924be99496d57713902e96bd133148e0 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 23 Feb 2026 15:29:10 +0100 Subject: [PATCH 19/22] remove azurite dep and run yarn --- .../test/plugins/versions/package.json | 1 - yarn.lock | 483 +++++++++--------- 2 files changed, 247 insertions(+), 237 deletions(-) diff --git a/packages/dd-trace/test/plugins/versions/package.json b/packages/dd-trace/test/plugins/versions/package.json index 787f15d3335..21fe9e0883b 100644 --- a/packages/dd-trace/test/plugins/versions/package.json +++ b/packages/dd-trace/test/plugins/versions/package.json @@ -22,7 +22,6 @@ "@azure/event-hubs": "6.0.2", "@azure/functions": "4.11.0", "durable-functions": "3.3.0", - "azurite": "3.35.0", "@azure/service-bus": "7.9.5", "@confluentinc/kafka-javascript": "1.8.0", "@cucumber/cucumber": "12.5.0", diff --git a/yarn.lock b/yarn.lock index 09a53d82416..8baa4281480 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,34 +2,34 @@ # yarn lockfile v1 -"@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.28.6.tgz#72499312ec58b1e2245ba4a4f550c132be4982f7" - integrity sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q== +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: "@babel/helper-validator-identifier" "^7.28.5" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.27.2": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" - integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== +"@babel/compat-data@^7.28.6": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== "@babel/core@^7.23.9": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" - integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helpers" "^7.28.6" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -37,23 +37,23 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" - integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== +"@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== dependencies: - "@babel/parser" "^7.28.5" - "@babel/types" "^7.28.5" + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== +"@babel/helper-compilation-targets@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== dependencies: - "@babel/compat-data" "^7.27.2" + "@babel/compat-data" "^7.28.6" "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -64,29 +64,29 @@ resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== +"@babel/helper-module-imports@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/traverse" "^7.28.6" + "@babel/types" "^7.28.6" -"@babel/helper-module-transforms@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" - integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== +"@babel/helper-module-transforms@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.28.3" + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.6" "@babel/helper-string-parser@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": +"@babel/helper-validator-identifier@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== @@ -96,7 +96,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@^7.28.4", "@babel/helpers@^7.28.6": +"@babel/helpers@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== @@ -104,14 +104,14 @@ "@babel/template" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/parser@^7.23.9", "@babel/parser@^7.28.5", "@babel/parser@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.6.tgz#f01a8885b7fa1e56dd8a155130226cd698ef13fd" - integrity sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ== +"@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== dependencies: - "@babel/types" "^7.28.6" + "@babel/types" "^7.29.0" -"@babel/template@^7.27.2", "@babel/template@^7.28.6": +"@babel/template@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== @@ -120,23 +120,23 @@ "@babel/parser" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" - integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.5" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" debug "^4.3.1" -"@babel/types@^7.27.1", "@babel/types@^7.28.5", "@babel/types@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.6.tgz#c3e9377f1b155005bcc4c46020e7e394e13089df" - integrity sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg== +"@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" @@ -203,16 +203,16 @@ module-details-from-path "^1.0.3" node-gyp-build "^4.5.0" -"@es-joy/jsdoccomment@~0.83.0": - version "0.83.0" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.83.0.tgz#db1eda42d7e10d81e2dbc871459d556897ab8b8f" - integrity sha512-e1MHSEPJ4m35zkBvNT6kcdeH1SvMaJDsPC3Xhfseg3hvF50FUE3f46Yn36jgbrPYYXezlWUQnevv23c+lx2MCA== +"@es-joy/jsdoccomment@~0.84.0": + version "0.84.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz#4d798d33207825dd1d85babbfbacc3a76c3ba634" + integrity sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w== dependencies: "@types/estree" "^1.0.8" - "@typescript-eslint/types" "^8.53.1" + "@typescript-eslint/types" "^8.54.0" comment-parser "1.4.5" esquery "^1.7.0" - jsdoc-type-pratt-parser "~7.1.0" + jsdoc-type-pratt-parser "~7.1.1" "@es-joy/resolve.exports@1.2.0": version "1.2.0" @@ -269,10 +269,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.39.2", "@eslint/js@^9.39.2": - version "9.39.2" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" - integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== +"@eslint/js@9.39.3", "@eslint/js@^9.39.2": + version "9.39.3" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.3.tgz#c6168736c7e0c43ead49654ed06a4bcb3833363d" + integrity sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw== "@eslint/object-schema@^2.1.7": version "2.1.7" @@ -391,9 +391,9 @@ "@octokit/webhooks" "^14.0.0" "@octokit/auth-app@^8.1.2": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-8.1.2.tgz#68f2ce201c525dc678965c50b377963b3bce135f" - integrity sha512-db8VO0PqXxfzI6GdjtgEFHY9tzqUql5xMFXYA12juq8TeTgPAuiiP3zid4h50lwlIP457p5+56PnJOgd2GGBuw== + version "8.2.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-8.2.0.tgz#9e4ce3de1dfbcaefea43f24c8cafa20c179b287c" + integrity sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g== dependencies: "@octokit/auth-oauth-app" "^9.0.3" "@octokit/auth-oauth-user" "^6.0.2" @@ -462,10 +462,10 @@ before-after-hook "^4.0.0" universal-user-agent "^7.0.0" -"@octokit/endpoint@^11.0.2": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.2.tgz#a8d955e053a244938b81d86cd73efd2dcb5ef5af" - integrity sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ== +"@octokit/endpoint@^11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.3.tgz#acf5f7feddde4e12185d5312ee38ff77235d8205" + integrity sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag== dependencies: "@octokit/types" "^16.0.0" universal-user-agent "^7.0.2" @@ -538,9 +538,9 @@ "@octokit/types" "^16.0.0" "@octokit/plugin-retry@^8.0.3": - version "8.0.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz#8b7af9700272df724d12fd6333ead98961d135c6" - integrity sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA== + version "8.1.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz#e25c2fb5e0a09cfe674ef9df75d7ca4fafa16c11" + integrity sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw== dependencies: "@octokit/request-error" "^7.0.2" "@octokit/types" "^16.0.0" @@ -562,14 +562,15 @@ "@octokit/types" "^16.0.0" "@octokit/request@^10.0.6": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.7.tgz#93f619914c523750a85e7888de983e1009eb03f6" - integrity sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA== + version "10.0.8" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.8.tgz#6609a5a38ad6f8ee203d9eb8ac9361d906a4414e" + integrity sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw== dependencies: - "@octokit/endpoint" "^11.0.2" + "@octokit/endpoint" "^11.0.3" "@octokit/request-error" "^7.0.2" "@octokit/types" "^16.0.0" fast-content-type-parse "^3.0.0" + json-with-bigint "^3.5.3" universal-user-agent "^7.0.2" "@octokit/types@^16.0.0": @@ -594,19 +595,19 @@ "@octokit/webhooks-methods" "^6.0.0" "@openfeature/core@^1.8.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@openfeature/core/-/core-1.9.1.tgz#9925a04ed0745e92dd7b3793b35cff1ed89d54c1" - integrity sha512-YySPtH4s/rKKnHRU0xyFGrqMU8XA+OIPNWDrlEFxE6DCVWCIrxE5YpiB94YD2jMFn6SSdA0cwQ8vLkCkl8lm8A== + version "1.9.2" + resolved "https://registry.yarnpkg.com/@openfeature/core/-/core-1.9.2.tgz#ec49e1e0e5d6bd5bf9b13f63ea5e410f7bc823e0" + integrity sha512-0lX0xYTflLrjiYNlareYmdV98xEddR5+PhcuoGvH+BMIqpZ2icAC7us9Uv86KRVqofXvpAUwpP32wgqmtUFs8Q== "@openfeature/server-sdk@~1.20.0": - version "1.20.1" - resolved "https://registry.yarnpkg.com/@openfeature/server-sdk/-/server-sdk-1.20.1.tgz#bd7e2c85ede1958eb64f73e0b97440b99d9fd61c" - integrity sha512-jzz++kblADniuc7hONZ4DlRsoektCMDX5PPHoltn0hYWWw/Zm6sh3f7z5mGUX2XOikWKNVCtUQ3gWsdmIdHHXg== + version "1.20.2" + resolved "https://registry.yarnpkg.com/@openfeature/server-sdk/-/server-sdk-1.20.2.tgz#116371cdad5fd29e55959d09f83b31d03617ae45" + integrity sha512-JaaYhsX4CA/QTIXdQfDpD9zcxew5EHuWxJjL+Ctp3L4FXC2gEAZ3s1DaCJU6aFOF285dJH3zAoeU64EJvxCaAw== "@opentelemetry/api-logs@<1.0.0": - version "0.208.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz#56d3891010a1fa1cf600ba8899ed61b43ace511c" - integrity sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg== + version "0.212.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.212.0.tgz#ec66a0951b84b1f082e13fd8a027b9f9d65a3f7a" + integrity sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg== dependencies: "@opentelemetry/api" "^1.3.0" @@ -708,21 +709,21 @@ type-detect "^4.1.0" "@stylistic/eslint-plugin@^5.7.1": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.7.1.tgz#bb108186a0133071b38be5fa705cd262260be8a8" - integrity sha512-zjTUwIsEfT+k9BmXwq1QEFYsb4afBlsI1AXFyWQBgggMzwBFOuu92pGrE5OFx90IOjNl+lUbQoTG7f8S0PkOdg== + version "5.9.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.9.0.tgz#b7d23ac17dd8a1868eb7ac142f3ba6d627516e2a" + integrity sha512-FqqSkvDMYJReydrMhlugc71M76yLLQWNfmGq+SIlLa7N3kHp8Qq8i2PyWrVNAfjOyOIY+xv9XaaYwvVW7vroMA== dependencies: "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/types" "^8.53.1" + "@typescript-eslint/types" "^8.56.0" eslint-visitor-keys "^4.2.1" espree "^10.4.0" estraverse "^5.3.0" picomatch "^4.0.3" "@types/aws-lambda@^8.10.83": - version "8.10.159" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.159.tgz#0ab559f4519e42732a393b28c21564da9763c5aa" - integrity sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg== + version "8.10.160" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.160.tgz#7a3afdd919d730e4e2be7239d0af5f36a8b0ce1e" + integrity sha512-uoO4QVQNWFPJMh26pXtmtrRfGshPUSpMZGUyUQY20FhfHEElEBOPKgVmFs1z+kbpyBsRs2JnoOPT7++Z4GA9pA== "@types/estree@^1.0.6", "@types/estree@^1.0.8": version "1.0.8" @@ -763,10 +764,10 @@ resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz#49f731d9453f52d64dd79f5a5626c1cf1b81bea4" integrity sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w== -"@typescript-eslint/types@^8.53.1": - version "8.54.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.54.0.tgz#c12d41f67a2e15a8a96fbc5f2d07b17331130889" - integrity sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA== +"@typescript-eslint/types@^8.54.0", "@typescript-eslint/types@^8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.0.tgz#a2444011b9a98ca13d70411d2cbfed5443b3526a" + integrity sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ== "@yarnpkg/lockfile@^1.1.0": version "1.1.0" @@ -791,10 +792,10 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== +acorn@^8.15.0, acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== aggregate-error@^3.0.0: version "3.1.0" @@ -805,9 +806,9 @@ aggregate-error@^3.0.0: indent-string "^4.0.0" ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -956,12 +957,12 @@ available-typed-arrays@^1.0.7: possible-typed-array-names "^1.0.0" axios@^1.13.4: - version "1.13.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.4.tgz#15d109a4817fb82f73aea910d41a2c85606076bc" - integrity sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg== + version "1.13.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" + integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.4" + follow-redirects "^1.15.11" + form-data "^4.0.5" proxy-from-env "^1.1.0" balanced-match@^1.0.0: @@ -969,10 +970,15 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + baseline-browser-mapping@^2.9.0: - version "2.9.6" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz#82de0f7ee5860df86d60daf0d9524ae7227eeee7" - integrity sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg== + version "2.10.0" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" + integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== before-after-hook@^4.0.0: version "4.0.0" @@ -1015,19 +1021,19 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== +brace-expansion@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.3.tgz#6a9c6c268f85b53959ec527aeafe0f7300258eef" + integrity sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA== dependencies: - balanced-match "^1.0.0" + balanced-match "^4.0.2" browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.24.0, browserslist@^4.28.0: +browserslist@^4.24.0, browserslist@^4.28.1: version "4.28.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== @@ -1129,9 +1135,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001759: - version "1.0.30001760" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz#bdd1960fafedf8d5f04ff16e81460506ff9b798f" - integrity sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw== + version "1.0.30001774" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz#0e576b6f374063abcd499d202b9ba1301be29b70" + integrity sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA== chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -1159,9 +1165,9 @@ chokidar@^4.0.1: readdirp "^4.0.1" ci-info@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.1.tgz#355ad571920810b5623e11d40232f443f16f1daa" - integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA== + version "4.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" + integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== cjs-module-lexer@^2.2.0: version "2.2.0" @@ -1278,11 +1284,11 @@ cookie@^0.7.1: integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== core-js-compat@^3.46.0: - version "3.47.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.47.0.tgz#698224bbdbb6f2e3f39decdda4147b161e3772a3" - integrity sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ== + version "3.48.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" + integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== dependencies: - browserslist "^4.28.0" + browserslist "^4.28.1" core-util-is@~1.0.0: version "1.0.3" @@ -1441,9 +1447,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.263: - version "1.5.267" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz#5d84f2df8cdb6bfe7e873706bb21bd4bfb574dc7" - integrity sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw== + version "1.5.302" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz#032a5802b31f7119269959c69fe2015d8dad5edb" + integrity sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg== emoji-regex@^8.0.0: version "8.0.0" @@ -1461,17 +1467,17 @@ encodeurl@^2.0.0: integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== enhanced-resolve@^5.17.1: - version "5.18.4" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz#c22d33055f3952035ce6a144ce092447c525f828" - integrity sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q== + version "5.19.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz#6687446a15e969eaa63c2fa2694510e17ae6d97c" + integrity sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== dependencies: graceful-fs "^4.2.4" - tapable "^2.2.0" + tapable "^2.3.0" es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: - version "1.24.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" - integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + version "1.24.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" + integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== dependencies: array-buffer-byte-length "^1.0.2" arraybuffer.prototype.slice "^1.0.4" @@ -1620,11 +1626,11 @@ eslint-module-utils@^2.12.1: debug "^3.2.7" eslint-plugin-cypress@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-5.2.1.tgz#0ce3fbe694174068403b3c0c2de252896317b97d" - integrity sha512-HTJLbcd7fwJ4agbHinZ4FUIl38bUTJT3BmH8zdgS2V32LETmPqCtWHi3xlgZ2vpX0aW6kQoHCVVqHm8NxZJ9sA== + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-5.4.0.tgz#548ec5e249ee3078f8859b74e295e65e7159cf43" + integrity sha512-XAQYuzMpLWJdFRQorPO3GDx4XHqI362qr1/XIp0N6SNTAa8lyzmpTA26qNRc99I53NnqX9l0SHwbHXX7TAKIkg== dependencies: - globals "^16.2.0" + globals "^17.3.0" eslint-plugin-es-x@^7.8.0: version "7.8.0" @@ -1661,11 +1667,11 @@ eslint-plugin-import@^2.32.0: tsconfig-paths "^3.15.0" eslint-plugin-jsdoc@^62.5.0: - version "62.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.5.0.tgz#c6c466a55cc17072c702a72ae03c227af32257ac" - integrity sha512-D+1haMVDzW/ZMoPwOnsbXCK07rJtsq98Z1v+ApvDKxSzYTTcPgmFc/nyUDCGmxm2cP7g7hszyjYHO7Zodl/43w== + version "62.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.7.0.tgz#a749b0f7358ebdc2c8568230a3b1817706be2657" + integrity sha512-jootujJOIGMkCLN+/WgDFKtaclCt2MEEy9cZ1RyK19Az1JvVI3awbeMXNlJ6y4h8RWIJpcXqmxsu4t9NThYbNw== dependencies: - "@es-joy/jsdoccomment" "~0.83.0" + "@es-joy/jsdoccomment" "~0.84.0" "@es-joy/resolve.exports" "1.2.0" are-docs-informative "^0.0.2" comment-parser "1.4.5" @@ -1676,7 +1682,7 @@ eslint-plugin-jsdoc@^62.5.0: html-entities "^2.6.0" object-deep-merge "^2.0.0" parse-imports-exports "^0.2.4" - semver "^7.7.3" + semver "^7.7.4" spdx-expression-parse "^4.0.0" to-valid-identifier "^1.0.0" @@ -1689,9 +1695,9 @@ eslint-plugin-mocha@^11.2.0: globals "^15.14.0" eslint-plugin-n@^17.23.2: - version "17.23.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz#cd1be342b56771385028d8039d67f11fb9cca5f3" - integrity sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw== + version "17.24.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz#b66fa05f7a6c1ba16768f0921b8974147dddd060" + integrity sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw== dependencies: "@eslint-community/eslint-utils" "^4.5.0" enhanced-resolve "^5.17.1" @@ -1752,15 +1758,15 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint-visitor-keys@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz#b9aa1a74aa48c44b3ae46c1597ce7171246a94a9" - integrity sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q== +eslint-visitor-keys@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== eslint@^9.39.2: - version "9.39.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.2.tgz#cb60e6d16ab234c0f8369a3fe7cc87967faf4b6c" - integrity sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== + version "9.39.3" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.3.tgz#08d63df1533d7743c0907b32a79a7e134e63ee2f" + integrity sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.1" @@ -1768,7 +1774,7 @@ eslint@^9.39.2: "@eslint/config-helpers" "^0.4.2" "@eslint/core" "^0.17.0" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.39.2" + "@eslint/js" "9.39.3" "@eslint/plugin-kit" "^0.4.1" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" @@ -1807,13 +1813,13 @@ espree@^10.0.1, espree@^10.4.0: eslint-visitor-keys "^4.2.1" espree@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-11.1.0.tgz#7d0c82a69f8df670728dba256264b383fbf73e8f" - integrity sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw== + version "11.1.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-11.1.1.tgz#866f6bc9ccccd6f28876b7a6463abb281b9cb847" + integrity sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ== dependencies: - acorn "^8.15.0" + acorn "^8.16.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^5.0.0" + eslint-visitor-keys "^5.0.1" esprima@^4.0.0: version "4.0.1" @@ -1978,7 +1984,7 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -follow-redirects@^1.15.6: +follow-redirects@^1.15.11: version "1.15.11" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== @@ -2006,7 +2012,7 @@ foreground-child@^3.1.0, foreground-child@^3.3.0: cross-spawn "^7.0.6" signal-exit "^4.0.1" -form-data@^4.0.4: +form-data@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== @@ -2113,9 +2119,9 @@ get-symbol-description@^1.1.0: get-intrinsic "^1.2.6" get-tsconfig@^4.8.1: - version "4.13.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.0.tgz#fcdd991e6d22ab9a600f00e91c318707a5d9a0d7" - integrity sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ== + version "4.13.6" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.6.tgz#2fbfda558a98a691a798f123afd95915badce876" + integrity sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw== dependencies: resolve-pkg-maps "^1.0.0" @@ -2160,15 +2166,15 @@ globals@^15.11.0, globals@^15.14.0: resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== -globals@^16.2.0, globals@^16.4.0: +globals@^16.4.0: version "16.5.0" resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== -globals@^17.2.0: - version "17.2.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.2.0.tgz#41d29408d6f5408457d2ef965d29215e3026779f" - integrity sha512-tovnCz/fEq+Ripoq+p/gN1u7l6A7wwkoBT9pRCzTHzsD/LvADIzXZdjmRymh5Ztf0DYC3Rwg5cZRYjxzBmzbWg== +globals@^17.2.0, globals@^17.3.0: + version "17.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-17.3.0.tgz#8b96544c2fa91afada02747cc9731c002a96f3b9" + integrity sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw== globalthis@^1.0.4: version "1.0.4" @@ -2264,7 +2270,7 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-errors@^2.0.0, http-errors@~2.0.1: +http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== @@ -2281,9 +2287,9 @@ husky@^9.1.7: integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== iconv-lite@^0.7.0, iconv-lite@~0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.1.tgz#d4af1d2092f2bb05aab6296e5e7cd286d2f15432" - integrity sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw== + version "0.7.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -2697,10 +2703,10 @@ js-yaml@^4.1.0, js-yaml@^4.1.1: dependencies: argparse "^2.0.1" -jsdoc-type-pratt-parser@~7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.0.tgz#f2d63cbbc3d0d4eaea257eb5f847e8ebc5908dd5" - integrity sha512-SX7q7XyCwzM/MEDCYz0l8GgGbJAACGFII9+WfNYr5SLEKukHWRy2Jk3iWRe7P+lpYJNs7oQ+OSei4JtKGUjd7A== +jsdoc-type-pratt-parser@~7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz#c67be3c812aaf1405bef3e965e8c3db50a5cad1b" + integrity sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA== jsesc@^3.0.2, jsesc@^3.1.0, jsesc@~3.1.0: version "3.1.0" @@ -2727,6 +2733,11 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json-with-bigint@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/json-with-bigint/-/json-with-bigint-3.5.3.tgz#292fe4d3fa941996a02294edf31fa59d8c9054ef" + integrity sha512-QObKu6nxy7NsxqR0VK4rkXnsNr5L9ElJaGEg+ucJ6J7/suoKZ0n+p76cu9aCqowytxEbwYNzvrMerfMkXneF5A== + json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -2890,7 +2901,7 @@ mime-types@^2.1.12, mime-types@~2.1.24: dependencies: mime-db "1.52.0" -mime-types@^3.0.0, mime-types@^3.0.1: +mime-types@^3.0.0, mime-types@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== @@ -2898,18 +2909,18 @@ mime-types@^3.0.0, mime-types@^3.0.1: mime-db "^1.54.0" minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + version "3.1.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.3.tgz#6a5cba9b31f503887018f579c89f81f61162e624" + integrity sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + version "9.0.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.6.tgz#a7e3bccfcb3d78ec1bf8d51c9ba749080237a5c8" + integrity sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ== dependencies: - brace-expansion "^2.0.1" + brace-expansion "^5.0.2" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" @@ -2917,9 +2928,9 @@ minimist@^1.2.0, minimist@^1.2.6: integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== mkdirp@^0.5.6: version "0.5.6" @@ -3219,9 +3230,9 @@ p-limit@^3.0.2, p-limit@^3.1.0: yocto-queue "^0.1.0" p-limit@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-7.2.0.tgz#afcf6b5a86d093660140497dda0e640dd01a7b3b" - integrity sha512-ATHLtwoTNDloHRFFxFJdHnG6n2WUeFjaR8XQMFdKIv0xkXjrER8/iG9iu265jOM95zXHAfv9oTkqhrfbIzosrQ== + version "7.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-7.3.0.tgz#821398d91491c6b6a1340ecd09cdc402a9c8d0ee" + integrity sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw== dependencies: yocto-queue "^1.2.1" @@ -3415,9 +3426,9 @@ punycode@^2.1.0: integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@^6.14.0, qs@^6.14.1: - version "6.14.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.1.tgz#a41d85b9d3902f31d27861790506294881871159" - integrity sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ== + version "6.15.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" + integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== dependencies: side-channel "^1.1.0" @@ -3630,27 +3641,27 @@ semver@^6.0.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.0, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2, semver@^7.7.3: - version "7.7.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" - integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== +semver@^7.5.0, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.2, semver@^7.7.3, semver@^7.7.4: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== send@^1.1.0, send@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" - integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" + integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== dependencies: - debug "^4.3.5" + debug "^4.4.3" encodeurl "^2.0.0" escape-html "^1.0.3" etag "^1.8.1" fresh "^2.0.0" - http-errors "^2.0.0" - mime-types "^3.0.1" + http-errors "^2.0.1" + mime-types "^3.0.2" ms "^2.1.3" on-finished "^2.4.1" range-parser "^1.2.1" - statuses "^2.0.1" + statuses "^2.0.2" serialize-javascript@^6.0.2: version "6.0.2" @@ -3660,9 +3671,9 @@ serialize-javascript@^6.0.2: randombytes "^2.1.0" serve-static@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" - integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" + integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== dependencies: encodeurl "^2.0.0" escape-html "^1.0.3" @@ -3829,16 +3840,16 @@ spdx-expression-parse@^4.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.22" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz#abf5a08a6f5d7279559b669f47f0a43e8f3464ef" - integrity sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ== + version "3.0.23" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz#b069e687b1291a32f126893ed76a27a745ee2133" + integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -statuses@^2.0.1, statuses@~2.0.2: +statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== @@ -3989,7 +4000,7 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -tapable@^2.2.0: +tapable@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== @@ -4180,9 +4191,9 @@ unpipe@~1.0.0: integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz#cfb4358afa08b3d5731a2ecd95eebf4ddef8033e" - integrity sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -4255,9 +4266,9 @@ which-module@^2.0.0: integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-typed-array@^1.1.16, which-typed-array@^1.1.19: - version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + version "1.1.20" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.8" From 57ca81f33da8dfecabbbd50480b25423c8cf750f Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 24 Feb 2026 15:31:06 +0100 Subject: [PATCH 20/22] add asserts on span meta data --- .../test/integration-test/client.spec.js | 35 +++++++++++++++---- .../test/integration-test/server.mjs | 4 +-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js index be2b41904c9..dcfa1faa85a 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js @@ -10,6 +10,7 @@ const { sandboxCwd, useSandbox, curlAndAssertMessage, + assertObjectContains, } = require('../../../../integration-tests/helpers') const { withVersions } = require('../../../dd-trace/test/setup/mocha') @@ -60,16 +61,36 @@ describe('esm', () => { assert.strictEqual(maybeHttpSpan[0].resource, 'GET /api/httptest') assert.strictEqual(maybeHolaActivity.length, 1) - assert.strictEqual(maybeHolaActivity[0].resource, 'Activity hola') - assert.strictEqual(maybeHolaActivity[0].name, 'azure.durable-functions.invoke') + assertObjectContains(maybeHolaActivity[0], { + name: 'azure.durable-functions.invoke', + resource: 'Activity hola', + meta: { + 'aas.function.trigger': 'Activity', + 'aas.function.name': 'hola', + }, + }) assert.strictEqual(maybeAddNEntity.length, 1) - assert.strictEqual(maybeAddNEntity[0].resource, 'Entity Counter add_n') - assert.strictEqual(maybeAddNEntity[0].name, 'azure.durable-functions.invoke') + assertObjectContains(maybeAddNEntity[0], { + name: 'azure.durable-functions.invoke', + resource: 'Entity counter add_n', + meta: { + 'aas.function.trigger': 'Entity', + 'aas.function.name': 'counter', + 'aas.function.operation': 'add_n', + }, + }) assert.strictEqual(maybeGetCountEntity.length, 1) - assert.strictEqual(maybeGetCountEntity[0].resource, 'Entity Counter get_count') - assert.strictEqual(maybeGetCountEntity[0].name, 'azure.durable-functions.invoke') + assertObjectContains(maybeGetCountEntity[0], { + name: 'azure.durable-functions.invoke', + resource: 'Entity counter get_count', + meta: { + 'aas.function.trigger': 'Entity', + 'aas.function.name': 'counter', + 'aas.function.operation': 'get_count', + }, + }) }) }).timeout(60_000) }) @@ -95,7 +116,7 @@ async function spawnPluginIntegrationTestProc (agentPort) { return proc } -function spawnProc (command, args, options = {}) { +function spawnProc(command, args, options = {}) { const proc = spawn(command, args, { ...options, stdio: 'pipe' }) return new Promise((resolve, reject) => { proc diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.mjs b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.mjs index 9c437c36536..8c2279a3ea9 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.mjs +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/server.mjs @@ -3,7 +3,7 @@ import { app } from '@azure/functions' import df from 'durable-functions' -df.app.entity('Counter', (context) => { +df.app.entity('counter', (context) => { const current = context.df.getState(() => 0) switch (context.df.operationName) { @@ -39,7 +39,7 @@ df.app.orchestration('testOrchestrator', function * (context) { const greeting = yield context.df.callActivity('hola', input.name) // 2) Update state (entity) - const counterId = new df.EntityId('Counter', 'global') + const counterId = new df.EntityId('counter', 'global') const increment = input.increment yield context.df.callEntity(counterId, 'add_n', increment) From a2a60ab58f7295e84fd306ba1c72a64f7c6e94b5 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 24 Feb 2026 15:51:23 +0100 Subject: [PATCH 21/22] remove alreadyPatched flag --- packages/datadog-instrumentations/src/azure-functions.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/datadog-instrumentations/src/azure-functions.js b/packages/datadog-instrumentations/src/azure-functions.js index b66d1184979..dc0c7c70ef5 100644 --- a/packages/datadog-instrumentations/src/azure-functions.js +++ b/packages/datadog-instrumentations/src/azure-functions.js @@ -6,16 +6,11 @@ const { addHook, } = require('./helpers/instrument') -let alreadyPatched = false - const azureFunctionsChannel = dc.tracingChannel('datadog:azure:functions:invoke') addHook({ name: '@azure/functions', versions: ['>=4'], patchDefault: false }, (azureFunction) => { const { app } = azureFunction - if (alreadyPatched) return azureFunction - alreadyPatched = true - // Http triggers shimmer.wrap(app, 'deleteRequest', wrapHandler) shimmer.wrap(app, 'http', wrapHandler) From 32d5a5449a9748bfb4b28a89bebebfd7060f8515 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 24 Feb 2026 15:56:56 +0100 Subject: [PATCH 22/22] lint --- .../test/integration-test/client.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js index dcfa1faa85a..d813769a206 100644 --- a/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js +++ b/packages/datadog-plugin-azure-durable-functions/test/integration-test/client.spec.js @@ -116,7 +116,7 @@ async function spawnPluginIntegrationTestProc (agentPort) { return proc } -function spawnProc(command, args, options = {}) { +function spawnProc (command, args, options = {}) { const proc = spawn(command, args, { ...options, stdio: 'pipe' }) return new Promise((resolve, reject) => { proc