Compare commits

...

21 Commits

Author SHA1 Message Date
Jonathan Norris 91ba360d36
feat(multi-provider): Add Track Method Support to Multi-Provider (#1323)
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
2025-07-11 13:39:13 -04:00
github-actions[bot] 0ff5c88135
chore(main): release config-cat-provider 0.7.6 (#1349)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-08 00:22:29 +02:00
renovate[bot] 601e7de199
fix(security): update dependency configcat-common to v9.4.0 (#1348)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 15:44:05 -04:00
renovate[bot] fca83c925c
fix(security): update vulnerability-updates (#1342)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 14:53:58 -04:00
Todd Baert e2404a480f
Update renovate.json
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 14:34:13 -04:00
Todd Baert 6776e9735a
Update renovate.json
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 14:29:19 -04:00
Todd Baert 0a6e44302d
Update renovate.json
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 14:24:19 -04:00
Todd Baert d6c4817948
Update renovate.json
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 13:55:54 -04:00
Todd Baert 1a913b8dba
chore: Update renovate.json
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 13:53:23 -04:00
Todd Baert 1b5ecc0959
chore: fix renovate.json
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 13:50:31 -04:00
Todd Baert 18268f8a21
chore: more renovate troubleshooting
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 13:34:15 -04:00
renovate[bot] ddbde614e9
fix(deps): update dependency @flipt-io/flipt-client-js to v0.2.0 (#1331)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-04 13:27:33 -04:00
renovate[bot] e501475536
fix(deps): update dependency axios to v1.10.0 (#1332)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-04 17:18:48 +00:00
renovate[bot] ea14c71e4d
chore(deps): update libs/shared/flagd-core/spec digest to a367871 (#1328)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-04 17:09:12 +00:00
Todd Baert 6a6d23ba32
chore: troubleshooting
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 13:01:52 -04:00
Todd Baert 82fbf1e042 chore: fix dep version
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 13:00:24 -04:00
renovate[bot] 375193081a
fix(deps): update dependency @aws-sdk/client-ssm to v3.840.0 (#1329)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-04 16:44:03 +00:00
renovate[bot] fbc5023097
chore(config): migrate renovate config (#1327)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-04 11:33:51 -04:00
github-actions[bot] e6766c07e5
chore(main): release flagd-core 1.1.0 (#1156)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-04 11:19:27 -04:00
renovate[bot] 9c0f895af5
chore(deps): update libs/providers/flagd/spec digest to a367871 (#1326)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-04 11:16:50 -04:00
Todd Baert cf9fe09cc1 chore: use dep dashboard
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-07-04 11:12:33 -04:00
27 changed files with 1342 additions and 471 deletions

View File

@ -4,10 +4,10 @@
"libs/providers/flagd": "0.13.3",
"libs/providers/flagd-web": "0.7.3",
"libs/providers/env-var": "0.3.1",
"libs/providers/config-cat": "0.7.5",
"libs/providers/config-cat": "0.7.6",
"libs/providers/launchdarkly-client": "0.3.2",
"libs/providers/go-feature-flag-web": "0.2.6",
"libs/shared/flagd-core": "1.0.0",
"libs/shared/flagd-core": "1.1.0",
"libs/shared/ofrep-core": "1.0.1",
"libs/providers/ofrep": "0.2.1",
"libs/providers/ofrep-web": "0.3.3",

View File

@ -147,50 +147,50 @@
}
},
"node_modules/@aws-sdk/client-ssm": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.826.0.tgz",
"integrity": "sha512-MK4CV6gs8JHSepPhTSu87Ms5eRGKI+tthahbB/h+CHo5yco9wKjKwclg5KXSL+Xp8FwKlf3mQd3PXn5RN54UBQ==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.840.0.tgz",
"integrity": "sha512-INXT6vibxTZM/uIsP2VwvVPe/QT/EthAxI29LdPokkjOtFHDR1S+2mrFE6QkKmsEIutAv+H5EQ6gkpwnSyDX1A==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/core": "3.826.0",
"@aws-sdk/credential-provider-node": "3.826.0",
"@aws-sdk/middleware-host-header": "3.821.0",
"@aws-sdk/middleware-logger": "3.821.0",
"@aws-sdk/middleware-recursion-detection": "3.821.0",
"@aws-sdk/middleware-user-agent": "3.826.0",
"@aws-sdk/region-config-resolver": "3.821.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/util-endpoints": "3.821.0",
"@aws-sdk/util-user-agent-browser": "3.821.0",
"@aws-sdk/util-user-agent-node": "3.826.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/credential-provider-node": "3.840.0",
"@aws-sdk/middleware-host-header": "3.840.0",
"@aws-sdk/middleware-logger": "3.840.0",
"@aws-sdk/middleware-recursion-detection": "3.840.0",
"@aws-sdk/middleware-user-agent": "3.840.0",
"@aws-sdk/region-config-resolver": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@aws-sdk/util-endpoints": "3.840.0",
"@aws-sdk/util-user-agent-browser": "3.840.0",
"@aws-sdk/util-user-agent-node": "3.840.0",
"@smithy/config-resolver": "^4.1.4",
"@smithy/core": "^3.5.3",
"@smithy/core": "^3.6.0",
"@smithy/fetch-http-handler": "^5.0.4",
"@smithy/hash-node": "^4.0.4",
"@smithy/invalid-dependency": "^4.0.4",
"@smithy/middleware-content-length": "^4.0.4",
"@smithy/middleware-endpoint": "^4.1.11",
"@smithy/middleware-retry": "^4.1.12",
"@smithy/middleware-endpoint": "^4.1.13",
"@smithy/middleware-retry": "^4.1.14",
"@smithy/middleware-serde": "^4.0.8",
"@smithy/middleware-stack": "^4.0.4",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/node-http-handler": "^4.0.6",
"@smithy/protocol-http": "^5.1.2",
"@smithy/smithy-client": "^4.4.3",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"@smithy/url-parser": "^4.0.4",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
"@smithy/util-body-length-node": "^4.0.0",
"@smithy/util-defaults-mode-browser": "^4.0.19",
"@smithy/util-defaults-mode-node": "^4.0.19",
"@smithy/util-defaults-mode-browser": "^4.0.21",
"@smithy/util-defaults-mode-node": "^4.0.21",
"@smithy/util-endpoints": "^3.0.6",
"@smithy/util-middleware": "^4.0.4",
"@smithy/util-retry": "^4.0.5",
"@smithy/util-retry": "^4.0.6",
"@smithy/util-utf8": "^4.0.0",
"@smithy/util-waiter": "^4.0.5",
"@smithy/util-waiter": "^4.0.6",
"@types/uuid": "^9.0.1",
"tslib": "^2.6.2",
"uuid": "^9.0.1"
@ -200,47 +200,47 @@
}
},
"node_modules/@aws-sdk/client-sso": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.826.0.tgz",
"integrity": "sha512-/FEKnUC3xPkLL4RuRydwzx+y4b55HIX6qLPbGnyIs+sNmCUyc/62ijtV1Ml+b++YzEF6jWNBsJOxeyZdgrJ3Ig==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.840.0.tgz",
"integrity": "sha512-3Zp+FWN2hhmKdpS0Ragi5V2ZPsZNScE3jlbgoJjzjI/roHZqO+e3/+XFN4TlM0DsPKYJNp+1TAjmhxN6rOnfYA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/core": "3.826.0",
"@aws-sdk/middleware-host-header": "3.821.0",
"@aws-sdk/middleware-logger": "3.821.0",
"@aws-sdk/middleware-recursion-detection": "3.821.0",
"@aws-sdk/middleware-user-agent": "3.826.0",
"@aws-sdk/region-config-resolver": "3.821.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/util-endpoints": "3.821.0",
"@aws-sdk/util-user-agent-browser": "3.821.0",
"@aws-sdk/util-user-agent-node": "3.826.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/middleware-host-header": "3.840.0",
"@aws-sdk/middleware-logger": "3.840.0",
"@aws-sdk/middleware-recursion-detection": "3.840.0",
"@aws-sdk/middleware-user-agent": "3.840.0",
"@aws-sdk/region-config-resolver": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@aws-sdk/util-endpoints": "3.840.0",
"@aws-sdk/util-user-agent-browser": "3.840.0",
"@aws-sdk/util-user-agent-node": "3.840.0",
"@smithy/config-resolver": "^4.1.4",
"@smithy/core": "^3.5.3",
"@smithy/core": "^3.6.0",
"@smithy/fetch-http-handler": "^5.0.4",
"@smithy/hash-node": "^4.0.4",
"@smithy/invalid-dependency": "^4.0.4",
"@smithy/middleware-content-length": "^4.0.4",
"@smithy/middleware-endpoint": "^4.1.11",
"@smithy/middleware-retry": "^4.1.12",
"@smithy/middleware-endpoint": "^4.1.13",
"@smithy/middleware-retry": "^4.1.14",
"@smithy/middleware-serde": "^4.0.8",
"@smithy/middleware-stack": "^4.0.4",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/node-http-handler": "^4.0.6",
"@smithy/protocol-http": "^5.1.2",
"@smithy/smithy-client": "^4.4.3",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"@smithy/url-parser": "^4.0.4",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
"@smithy/util-body-length-node": "^4.0.0",
"@smithy/util-defaults-mode-browser": "^4.0.19",
"@smithy/util-defaults-mode-node": "^4.0.19",
"@smithy/util-defaults-mode-browser": "^4.0.21",
"@smithy/util-defaults-mode-node": "^4.0.21",
"@smithy/util-endpoints": "^3.0.6",
"@smithy/util-middleware": "^4.0.4",
"@smithy/util-retry": "^4.0.5",
"@smithy/util-retry": "^4.0.6",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
},
@ -249,19 +249,19 @@
}
},
"node_modules/@aws-sdk/core": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.826.0.tgz",
"integrity": "sha512-BGbQYzWj3ps+dblq33FY5tz/SsgJCcXX0zjQlSC07tYvU1jHTUvsefphyig+fY38xZ4wdKjbTop+KUmXUYrOXw==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.840.0.tgz",
"integrity": "sha512-x3Zgb39tF1h2XpU+yA4OAAQlW6LVEfXNlSedSYJ7HGKXqA/E9h3rWQVpYfhXXVVsLdYXdNw5KBUkoAoruoZSZA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.821.0",
"@aws-sdk/types": "3.840.0",
"@aws-sdk/xml-builder": "3.821.0",
"@smithy/core": "^3.5.3",
"@smithy/core": "^3.6.0",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/property-provider": "^4.0.4",
"@smithy/protocol-http": "^5.1.2",
"@smithy/signature-v4": "^5.1.2",
"@smithy/smithy-client": "^4.4.3",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
@ -275,13 +275,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-env": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.826.0.tgz",
"integrity": "sha512-DK3pQY8+iKK3MGDdC3uOZQ2psU01obaKlTYhEwNu4VWzgwQL4Vi3sWj4xSWGEK41vqZxiRLq6fOq7ysRI+qEZA==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.840.0.tgz",
"integrity": "sha512-EzF6VcJK7XvQ/G15AVEfJzN2mNXU8fcVpXo4bRyr1S6t2q5zx6UPH/XjDbn18xyUmOq01t+r8gG+TmHEVo18fA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/property-provider": "^4.0.4",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
@ -291,18 +291,18 @@
}
},
"node_modules/@aws-sdk/credential-provider-http": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.826.0.tgz",
"integrity": "sha512-N+IVZBh+yx/9GbMZTKO/gErBi/FYZQtcFRItoLbY+6WU+0cSWyZYfkoeOxHmQV3iX9k65oljERIWUmL9x6OSQg==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.840.0.tgz",
"integrity": "sha512-wbnUiPGLVea6mXbUh04fu+VJmGkQvmToPeTYdHE8eRZq3NRDi3t3WltT+jArLBKD/4NppRpMjf2ju4coMCz91g==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/fetch-http-handler": "^5.0.4",
"@smithy/node-http-handler": "^4.0.6",
"@smithy/property-provider": "^4.0.4",
"@smithy/protocol-http": "^5.1.2",
"@smithy/smithy-client": "^4.4.3",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"@smithy/util-stream": "^4.2.2",
"tslib": "^2.6.2"
@ -312,19 +312,19 @@
}
},
"node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.826.0.tgz",
"integrity": "sha512-g7n+qSklq/Lzjxe2Ke5QFNCgYn26a3ydZnbFIk8QqYin4pzG+qiunaqJjpV3c/EeHMlfK8bBc7MXAylKzGRccQ==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.840.0.tgz",
"integrity": "sha512-7F290BsWydShHb+7InXd+IjJc3mlEIm9I0R57F/Pjl1xZB69MdkhVGCnuETWoBt4g53ktJd6NEjzm/iAhFXFmw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "3.826.0",
"@aws-sdk/credential-provider-env": "3.826.0",
"@aws-sdk/credential-provider-http": "3.826.0",
"@aws-sdk/credential-provider-process": "3.826.0",
"@aws-sdk/credential-provider-sso": "3.826.0",
"@aws-sdk/credential-provider-web-identity": "3.826.0",
"@aws-sdk/nested-clients": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/credential-provider-env": "3.840.0",
"@aws-sdk/credential-provider-http": "3.840.0",
"@aws-sdk/credential-provider-process": "3.840.0",
"@aws-sdk/credential-provider-sso": "3.840.0",
"@aws-sdk/credential-provider-web-identity": "3.840.0",
"@aws-sdk/nested-clients": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/credential-provider-imds": "^4.0.6",
"@smithy/property-provider": "^4.0.4",
"@smithy/shared-ini-file-loader": "^4.0.4",
@ -336,18 +336,18 @@
}
},
"node_modules/@aws-sdk/credential-provider-node": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.826.0.tgz",
"integrity": "sha512-UfIJXxHjmSxH6bea00HBPLkjNI2D04enQA/xNLZvB+4xtzt1/gYdCis1P4/73f5aGVVVB4/zQMobBbnjkrmbQw==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.840.0.tgz",
"integrity": "sha512-KufP8JnxA31wxklLm63evUPSFApGcH8X86z3mv9SRbpCm5ycgWIGVCTXpTOdgq6rPZrwT9pftzv2/b4mV/9clg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.826.0",
"@aws-sdk/credential-provider-http": "3.826.0",
"@aws-sdk/credential-provider-ini": "3.826.0",
"@aws-sdk/credential-provider-process": "3.826.0",
"@aws-sdk/credential-provider-sso": "3.826.0",
"@aws-sdk/credential-provider-web-identity": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/credential-provider-env": "3.840.0",
"@aws-sdk/credential-provider-http": "3.840.0",
"@aws-sdk/credential-provider-ini": "3.840.0",
"@aws-sdk/credential-provider-process": "3.840.0",
"@aws-sdk/credential-provider-sso": "3.840.0",
"@aws-sdk/credential-provider-web-identity": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/credential-provider-imds": "^4.0.6",
"@smithy/property-provider": "^4.0.4",
"@smithy/shared-ini-file-loader": "^4.0.4",
@ -359,13 +359,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-process": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.826.0.tgz",
"integrity": "sha512-kURrc4amu3NLtw1yZw7EoLNEVhmOMRUTs+chaNcmS+ERm3yK0nKjaJzmKahmwlTQTSl3wJ8jjK7x962VPo+zWw==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.840.0.tgz",
"integrity": "sha512-HkDQWHy8tCI4A0Ps2NVtuVYMv9cB4y/IuD/TdOsqeRIAT12h8jDb98BwQPNLAImAOwOWzZJ8Cu0xtSpX7CQhMw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/property-provider": "^4.0.4",
"@smithy/shared-ini-file-loader": "^4.0.4",
"@smithy/types": "^4.3.1",
@ -376,15 +376,15 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.826.0.tgz",
"integrity": "sha512-F19J3zcfoom6OnQ0MyAtvduVKQXPgkz9i5ExSO01J2CzjbyMhCDA99qAjHYe+LwhW+W7P/jzBPd0+uOQ2Nhh9Q==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.840.0.tgz",
"integrity": "sha512-2qgdtdd6R0Z1y0KL8gzzwFUGmhBHSUx4zy85L2XV1CXhpRNwV71SVWJqLDVV5RVWVf9mg50Pm3AWrUC0xb0pcA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/client-sso": "3.826.0",
"@aws-sdk/core": "3.826.0",
"@aws-sdk/token-providers": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/client-sso": "3.840.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/token-providers": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/property-provider": "^4.0.4",
"@smithy/shared-ini-file-loader": "^4.0.4",
"@smithy/types": "^4.3.1",
@ -395,14 +395,14 @@
}
},
"node_modules/@aws-sdk/credential-provider-web-identity": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.826.0.tgz",
"integrity": "sha512-o27GZ6Hy7qhuvMFVUL2eFEpBzf33Jaa/x3u3SHwU0nL7ko7jmbpeF0x4+wmagpI9X2IvVlUxIs0VaQ3YayPLEA==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.840.0.tgz",
"integrity": "sha512-dpEeVXG8uNZSmVXReE4WP0lwoioX2gstk4RnUgrdUE3YaPq8A+hJiVAyc3h+cjDeIqfbsQbZm9qFetKC2LF9dQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "3.826.0",
"@aws-sdk/nested-clients": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/nested-clients": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/property-provider": "^4.0.4",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
@ -412,12 +412,12 @@
}
},
"node_modules/@aws-sdk/middleware-host-header": {
"version": "3.821.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.821.0.tgz",
"integrity": "sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz",
"integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.821.0",
"@aws-sdk/types": "3.840.0",
"@smithy/protocol-http": "^5.1.2",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
@ -427,12 +427,12 @@
}
},
"node_modules/@aws-sdk/middleware-logger": {
"version": "3.821.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.821.0.tgz",
"integrity": "sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz",
"integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.821.0",
"@aws-sdk/types": "3.840.0",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
},
@ -441,12 +441,12 @@
}
},
"node_modules/@aws-sdk/middleware-recursion-detection": {
"version": "3.821.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.821.0.tgz",
"integrity": "sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz",
"integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.821.0",
"@aws-sdk/types": "3.840.0",
"@smithy/protocol-http": "^5.1.2",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
@ -456,15 +456,15 @@
}
},
"node_modules/@aws-sdk/middleware-user-agent": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.826.0.tgz",
"integrity": "sha512-j404+EcfBbtTlAhyObjXbdKwwDXO1pCxHvR5Fw8FXNvp/H330j6YnXgs3SJ6d3bZUwUJ/ztPx2S5AlBbLVLDFw==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.840.0.tgz",
"integrity": "sha512-hiiMf7BP5ZkAFAvWRcK67Mw/g55ar7OCrvrynC92hunx/xhMkrgSLM0EXIZ1oTn3uql9kH/qqGF0nqsK6K555A==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/util-endpoints": "3.821.0",
"@smithy/core": "^3.5.3",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@aws-sdk/util-endpoints": "3.840.0",
"@smithy/core": "^3.6.0",
"@smithy/protocol-http": "^5.1.2",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
@ -474,47 +474,47 @@
}
},
"node_modules/@aws-sdk/nested-clients": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.826.0.tgz",
"integrity": "sha512-p7olPq0uTtHqGuXI1GSc/gzKDvV55PMbLtnmupEDfnY9SoRu+QatbWQ6da9sI1lhOcNmRMgiNQBXFzaUFrG+SQ==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.840.0.tgz",
"integrity": "sha512-LXYYo9+n4hRqnRSIMXLBb+BLz+cEmjMtTudwK1BF6Bn2RfdDv29KuyeDRrPCS3TwKl7ZKmXUmE9n5UuHAPfBpA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
"@aws-sdk/core": "3.826.0",
"@aws-sdk/middleware-host-header": "3.821.0",
"@aws-sdk/middleware-logger": "3.821.0",
"@aws-sdk/middleware-recursion-detection": "3.821.0",
"@aws-sdk/middleware-user-agent": "3.826.0",
"@aws-sdk/region-config-resolver": "3.821.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/util-endpoints": "3.821.0",
"@aws-sdk/util-user-agent-browser": "3.821.0",
"@aws-sdk/util-user-agent-node": "3.826.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/middleware-host-header": "3.840.0",
"@aws-sdk/middleware-logger": "3.840.0",
"@aws-sdk/middleware-recursion-detection": "3.840.0",
"@aws-sdk/middleware-user-agent": "3.840.0",
"@aws-sdk/region-config-resolver": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@aws-sdk/util-endpoints": "3.840.0",
"@aws-sdk/util-user-agent-browser": "3.840.0",
"@aws-sdk/util-user-agent-node": "3.840.0",
"@smithy/config-resolver": "^4.1.4",
"@smithy/core": "^3.5.3",
"@smithy/core": "^3.6.0",
"@smithy/fetch-http-handler": "^5.0.4",
"@smithy/hash-node": "^4.0.4",
"@smithy/invalid-dependency": "^4.0.4",
"@smithy/middleware-content-length": "^4.0.4",
"@smithy/middleware-endpoint": "^4.1.11",
"@smithy/middleware-retry": "^4.1.12",
"@smithy/middleware-endpoint": "^4.1.13",
"@smithy/middleware-retry": "^4.1.14",
"@smithy/middleware-serde": "^4.0.8",
"@smithy/middleware-stack": "^4.0.4",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/node-http-handler": "^4.0.6",
"@smithy/protocol-http": "^5.1.2",
"@smithy/smithy-client": "^4.4.3",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"@smithy/url-parser": "^4.0.4",
"@smithy/util-base64": "^4.0.0",
"@smithy/util-body-length-browser": "^4.0.0",
"@smithy/util-body-length-node": "^4.0.0",
"@smithy/util-defaults-mode-browser": "^4.0.19",
"@smithy/util-defaults-mode-node": "^4.0.19",
"@smithy/util-defaults-mode-browser": "^4.0.21",
"@smithy/util-defaults-mode-node": "^4.0.21",
"@smithy/util-endpoints": "^3.0.6",
"@smithy/util-middleware": "^4.0.4",
"@smithy/util-retry": "^4.0.5",
"@smithy/util-retry": "^4.0.6",
"@smithy/util-utf8": "^4.0.0",
"tslib": "^2.6.2"
},
@ -523,12 +523,12 @@
}
},
"node_modules/@aws-sdk/region-config-resolver": {
"version": "3.821.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.821.0.tgz",
"integrity": "sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz",
"integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.821.0",
"@aws-sdk/types": "3.840.0",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/types": "^4.3.1",
"@smithy/util-config-provider": "^4.0.0",
@ -540,14 +540,14 @@
}
},
"node_modules/@aws-sdk/token-providers": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.826.0.tgz",
"integrity": "sha512-iCOcVAqGPSHtQL8ZBXifZMEcHyUl9wJ8HvLZ5l1ohA/3ZNP+dqEPGi7jfhR5jZKs+xyp2jxByFqfil9PjI9c5A==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.840.0.tgz",
"integrity": "sha512-6BuTOLTXvmgwjK7ve7aTg9JaWFdM5UoMolLVPMyh3wTv9Ufalh8oklxYHUBIxsKkBGO2WiHXytveuxH6tAgTYg==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "3.826.0",
"@aws-sdk/nested-clients": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/core": "3.840.0",
"@aws-sdk/nested-clients": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/property-provider": "^4.0.4",
"@smithy/shared-ini-file-loader": "^4.0.4",
"@smithy/types": "^4.3.1",
@ -558,9 +558,9 @@
}
},
"node_modules/@aws-sdk/types": {
"version": "3.821.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.821.0.tgz",
"integrity": "sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz",
"integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.3.1",
@ -571,12 +571,12 @@
}
},
"node_modules/@aws-sdk/util-endpoints": {
"version": "3.821.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.821.0.tgz",
"integrity": "sha512-Uknt/zUZnLE76zaAAPEayOeF5/4IZ2puTFXvcSCWHsi9m3tqbb9UozlnlVqvCZLCRWfQryZQoG2W4XSS3qgk5A==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.840.0.tgz",
"integrity": "sha512-eqE9ROdg/Kk0rj3poutyRCFauPDXIf/WSvCqFiRDDVi6QOnCv/M0g2XW8/jSvkJlOyaXkNCptapIp6BeeFFGYw==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.821.0",
"@aws-sdk/types": "3.840.0",
"@smithy/types": "^4.3.1",
"@smithy/util-endpoints": "^3.0.6",
"tslib": "^2.6.2"
@ -598,25 +598,25 @@
}
},
"node_modules/@aws-sdk/util-user-agent-browser": {
"version": "3.821.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.821.0.tgz",
"integrity": "sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz",
"integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.821.0",
"@aws-sdk/types": "3.840.0",
"@smithy/types": "^4.3.1",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
}
},
"node_modules/@aws-sdk/util-user-agent-node": {
"version": "3.826.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.826.0.tgz",
"integrity": "sha512-wHw6bZQWIMcFF/8r03aY9Itp6JLBYY4absGGhCDK1dc3tPEfi8NVSdb05a/Oz+g4TVaDdxLo0OQ/OKMS1DFRHQ==",
"version": "3.840.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.840.0.tgz",
"integrity": "sha512-Fy5JUEDQU1tPm2Yw/YqRYYc27W5+QD/J4mYvQvdWjUGZLB5q3eLFMGD35Uc28ZFoGMufPr4OCxK/bRfWROBRHQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/middleware-user-agent": "3.826.0",
"@aws-sdk/types": "3.821.0",
"@aws-sdk/middleware-user-agent": "3.840.0",
"@aws-sdk/types": "3.840.0",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
@ -745,9 +745,9 @@
}
},
"node_modules/@smithy/core": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.5.3.tgz",
"integrity": "sha512-xa5byV9fEguZNofCclv6v9ra0FYh5FATQW/da7FQUVTic94DfrN/NvmKZjrMyzbpqfot9ZjBaO8U1UeTbmSLuA==",
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz",
"integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/middleware-serde": "^4.0.8",
@ -851,12 +851,12 @@
}
},
"node_modules/@smithy/middleware-endpoint": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.11.tgz",
"integrity": "sha512-zDogwtRLzKl58lVS8wPcARevFZNBOOqnmzWWxVe9XiaXU2CADFjvJ9XfNibgkOWs08sxLuSr81NrpY4mgp9OwQ==",
"version": "4.1.13",
"resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz",
"integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/core": "^3.5.3",
"@smithy/core": "^3.6.0",
"@smithy/middleware-serde": "^4.0.8",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/shared-ini-file-loader": "^4.0.4",
@ -870,18 +870,18 @@
}
},
"node_modules/@smithy/middleware-retry": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.12.tgz",
"integrity": "sha512-wvIH70c4e91NtRxdaLZF+mbLZ/HcC6yg7ySKUiufL6ESp6zJUSnJucZ309AvG9nqCFHSRB5I6T3Ez1Q9wCh0Ww==",
"version": "4.1.14",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.14.tgz",
"integrity": "sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/node-config-provider": "^4.1.3",
"@smithy/protocol-http": "^5.1.2",
"@smithy/service-error-classification": "^4.0.5",
"@smithy/smithy-client": "^4.4.3",
"@smithy/service-error-classification": "^4.0.6",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"@smithy/util-middleware": "^4.0.4",
"@smithy/util-retry": "^4.0.5",
"@smithy/util-retry": "^4.0.6",
"tslib": "^2.6.2",
"uuid": "^9.0.1"
},
@ -1001,9 +1001,9 @@
}
},
"node_modules/@smithy/service-error-classification": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.5.tgz",
"integrity": "sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA==",
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz",
"integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/types": "^4.3.1"
@ -1045,13 +1045,13 @@
}
},
"node_modules/@smithy/smithy-client": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.3.tgz",
"integrity": "sha512-xxzNYgA0HD6ETCe5QJubsxP0hQH3QK3kbpJz3QrosBCuIWyEXLR/CO5hFb2OeawEKUxMNhz3a1nuJNN2np2RMA==",
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz",
"integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/core": "^3.5.3",
"@smithy/middleware-endpoint": "^4.1.11",
"@smithy/core": "^3.6.0",
"@smithy/middleware-endpoint": "^4.1.13",
"@smithy/middleware-stack": "^4.0.4",
"@smithy/protocol-http": "^5.1.2",
"@smithy/types": "^4.3.1",
@ -1152,13 +1152,13 @@
}
},
"node_modules/@smithy/util-defaults-mode-browser": {
"version": "4.0.19",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.19.tgz",
"integrity": "sha512-mvLMh87xSmQrV5XqnUYEPoiFFeEGYeAKIDDKdhE2ahqitm8OHM3aSvhqL6rrK6wm1brIk90JhxDf5lf2hbrLbQ==",
"version": "4.0.21",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.21.tgz",
"integrity": "sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/property-provider": "^4.0.4",
"@smithy/smithy-client": "^4.4.3",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
@ -1168,16 +1168,16 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
"version": "4.0.19",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.19.tgz",
"integrity": "sha512-8tYnx+LUfj6m+zkUUIrIQJxPM1xVxfRBvoGHua7R/i6qAxOMjqR6CpEpDwKoIs1o0+hOjGvkKE23CafKL0vJ9w==",
"version": "4.0.21",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.21.tgz",
"integrity": "sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/config-resolver": "^4.1.4",
"@smithy/credential-provider-imds": "^4.0.6",
"@smithy/node-config-provider": "^4.1.3",
"@smithy/property-provider": "^4.0.4",
"@smithy/smithy-client": "^4.4.3",
"@smithy/smithy-client": "^4.4.5",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
},
@ -1225,12 +1225,12 @@
}
},
"node_modules/@smithy/util-retry": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.5.tgz",
"integrity": "sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg==",
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz",
"integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/service-error-classification": "^4.0.5",
"@smithy/service-error-classification": "^4.0.6",
"@smithy/types": "^4.3.1",
"tslib": "^2.6.2"
},
@ -1283,9 +1283,9 @@
}
},
"node_modules/@smithy/util-waiter": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.5.tgz",
"integrity": "sha512-4QvC49HTteI1gfemu0I1syWovJgPvGn7CVUoN9ZFkdvr/cCFkrEL7qNCdx/2eICqDWEGnnr68oMdSIPCLAriSQ==",
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz",
"integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/abort-controller": "^4.0.4",

View File

@ -1,5 +1,12 @@
# Changelog
## [0.7.6](https://github.com/open-feature/js-sdk-contrib/compare/config-cat-provider-v0.7.5...config-cat-provider-v0.7.6) (2025-07-04)
### 🐛 Bug Fixes
* **security:** update dependency configcat-common to v9.4.0 ([#1348](https://github.com/open-feature/js-sdk-contrib/issues/1348)) ([601e7de](https://github.com/open-feature/js-sdk-contrib/commit/601e7de19948bc826778a076f27b46a8cb1fabca))
## [0.7.5](https://github.com/open-feature/js-sdk-contrib/compare/config-cat-provider-v0.7.4...config-cat-provider-v0.7.5) (2025-04-09)

View File

@ -1,12 +1,12 @@
{
"name": "@openfeature/config-cat-provider",
"version": "0.7.5",
"version": "0.7.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openfeature/config-cat-provider",
"version": "0.7.5",
"version": "0.7.6",
"peerDependencies": {
"@openfeature/server-sdk": "^1.13.5",
"configcat-node": "^11.3.1"

View File

@ -1,6 +1,6 @@
{
"name": "@openfeature/config-cat-provider",
"version": "0.7.5",
"version": "0.7.6",
"license": "Apache-2.0",
"scripts": {
"publish-if-not-exists": "cp $NPM_CONFIG_USERCONFIG .npmrc && if [ \"$(npm show $npm_package_name@$npm_package_version version)\" = \"$(npm run current-version -s)\" ]; then echo 'already published, skipping'; else npm publish --access public; fi",
@ -10,6 +10,6 @@
"@openfeature/server-sdk": "^1.13.5",
"configcat-node": "^11.3.1",
"@openfeature/config-cat-core": "0.1.1",
"configcat-common": "9.3.1"
"configcat-common": "9.4.0"
}
}

View File

@ -10,7 +10,7 @@
"@openfeature/web-sdk": "^1.0.0"
},
"dependencies": {
"@openfeature/flagd-core": "1.0.0",
"@openfeature/flagd-core": "1.1.0",
"@connectrpc/connect": "^1.4.0",
"@connectrpc/connect-web": "^1.4.0",
"@bufbuild/protobuf": "^1.2.0"

@ -1 +1 @@
Subproject commit bb2dc2ce32cd50d307cb944f0e021734780260b6
Subproject commit a3678719bf9f62880375ba835ebe1bb7a77de409

View File

@ -9,24 +9,14 @@
"version": "0.1.5",
"license": "Apache-2.0",
"peerDependencies": {
"@flipt-io/flipt-client-js": "^0.0.1 || ^0.0.2 || ^0.0.6",
"@openfeature/web-sdk": "^1.0.0",
"undici": "^5.0.0"
}
},
"node_modules/@fastify/busboy": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
"peer": true,
"engines": {
"node": ">=14"
"@flipt-io/flipt-client-js": "^0.0.1 || ^0.0.2 || ^0.0.6 || ^0.2.0",
"@openfeature/web-sdk": "^1.0.0"
}
},
"node_modules/@flipt-io/flipt-client-js": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/@flipt-io/flipt-client-js/-/flipt-client-js-0.0.6.tgz",
"integrity": "sha512-oTdmjjHS0VJ3xOdh+x8A8Cjbt9jZEJrbsnOZ/KkL0v4cvYZiVDAMA/hbAZw0cYI4Hn0aSa+4plYfua65eb0jcw==",
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@flipt-io/flipt-client-js/-/flipt-client-js-0.2.0.tgz",
"integrity": "sha512-3VIU2pDUyHafp3ahgxHOde81fKP+5hvSm9Q+8hqt9+D7MCIWNvHTLqFo5hc87WSgq3TlR8ILRWfFC18BE1AmeQ==",
"license": "MIT",
"peer": true,
"dependencies": {
@ -132,18 +122,6 @@
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/undici": {
"version": "5.29.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
"peer": true,
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/web-streams-polyfill": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",

View File

@ -10,6 +10,6 @@
},
"peerDependencies": {
"@openfeature/web-sdk": "^1.0.0",
"@flipt-io/flipt-client-js": "^0.0.1 || ^0.0.2 || ^0.0.6"
"@flipt-io/flipt-client-js": "^0.0.1 || ^0.0.2 || ^0.0.6 || ^0.2.0"
}
}

View File

@ -12,7 +12,7 @@
"dependencies": {
"object-hash": "^3.0.0",
"lru-cache": "^11.0.0",
"axios": "1.9.0",
"axios": "1.10.0",
"copy-anything": "^3.0.5"
}
}

View File

@ -6,6 +6,7 @@ the final result. Different evaluation strategies can be defined to control whic
The Multi-Provider is a powerful tool for performing migrations between flag providers, or combining multiple providers into a single
feature flagging interface. For example:
- *Migration*: When migrating between two providers, you can run both in parallel under a unified flagging interface. As flags are added to the
new provider, the Multi-Provider will automatically find and return them, falling back to the old provider if the new provider does not have
- *Multiple Data Sources*: The Multi-Provider allows you to seamlessly combine many sources of flagging data, such as environment variables,
@ -13,7 +14,7 @@ local files, database values and SaaS hosted feature management systems.
## Installation
```
```bash
$ npm install @openfeature/multi-provider-web
```
@ -21,6 +22,7 @@ $ npm install @openfeature/multi-provider-web
> This provider is designed to be used with the [Web SDK](https://openfeature.dev/docs/reference/technologies/client/web/).
## Usage
The Multi-Provider is initialized with an array of providers it should evaluate:
```typescript
@ -28,12 +30,8 @@ import { WebMultiProvider } from '@openfeature/multi-provider-web'
import { OpenFeature } from '@openfeature/web-sdk'
const multiProvider = new WebMultiProvider([
{
provider: new ProviderA()
},
{
provider: new ProviderB()
}
{ provider: new ProviderA() },
{ provider: new ProviderB() }
])
await OpenFeature.setProviderAndWait(multiProvider)
@ -56,18 +54,16 @@ import { WebMultiProvider, FirstSuccessfulStrategy } from '@openfeature/multi-pr
const multiProvider = new WebMultiProvider(
[
{
provider: new ProviderA()
},
{
provider: new ProviderB()
}
{ provider: new ProviderA() },
{ provider: new ProviderB() }
],
new FirstSuccessfulStrategy()
)
```
The Multi-Provider comes with three strategies out of the box:
`FirstMatchStrategy` (default): Evaluates all providers in order and returns the first successful result. Providers that indicate FLAG_NOT_FOUND error will be skipped and the next provider will be evaluated. Any other error will cause the operation to fail and the set of errors to be thrown.
- `FirstMatchStrategy` (default): Evaluates all providers in order and returns the first successful result. Providers that indicate FLAG_NOT_FOUND error will be skipped and the next provider will be evaluated. Any other error will cause the operation to fail and the set of errors to be thrown.
- `FirstSuccessfulStrategy`: Evaluates all providers in order and returns the first successful result. Any error will cause that provider to be skipped.
If no successful result is returned, the set of errors will be thrown.
- `ComparisonStrategy`: Evaluates all providers in parallel. If every provider returns a successful result with the same value, then that result is returned.
@ -83,22 +79,21 @@ import { WebMultiProvider, ComparisonStrategy } from '@openfeature/multi-provide
const providerA = new ProviderA()
const multiProvider = new WebMultiProvider(
[
{
provider: providerA
},
{
provider: new ProviderB()
}
{ provider: providerA },
{ provider: new ProviderB() }
],
new ComparisonStrategy(providerA, (details) => {
console.log("Mismatch detected", details)
})
)
```
The first argument is the "fallback provider" whose value to use in the event that providers do not agree. It should be the same object reference as one of the providers in the list. The second argument is a callback function that will be executed when a mismatch is detected. The callback will be passed an object containing the details of each provider's resolution, including the flag key, the value returned, and any errors that were thrown.
## Custom Strategies
It is also possible to implement your own strategy if the above options do not fit your use case. To do so, create a class which implements the "BaseEvaluationStrategy":
```typescript
export abstract class BaseEvaluationStrategy {
public runMode: 'parallel' | 'sequential' = 'sequential';
@ -111,6 +106,13 @@ export abstract class BaseEvaluationStrategy {
result: ProviderResolutionResult<T>,
): boolean;
abstract shouldTrackWithThisProvider(
strategyContext: StrategyProviderContext,
context: EvaluationContext,
trackingEventName: string,
trackingEventDetails: TrackingEventDetails,
): boolean;
abstract determineFinalResult<T extends FlagValue>(
strategyContext: StrategyEvaluationContext,
context: EvaluationContext,
@ -118,6 +120,7 @@ export abstract class BaseEvaluationStrategy {
): FinalResult<T>;
}
```
The `runMode` property determines whether the list of providers will be evaluated sequentially or in parallel.
The `shouldEvaluateThisProvider` method is called just before a provider is evaluated by the Multi-Provider. If the function returns `false`, then
@ -127,9 +130,81 @@ Check the type definitions for the full list.
The `shouldEvaluateNextProvider` function is called after a provider is evaluated. If it returns `true`, the next provider in the sequence will be called,
otherwise no more providers will be evaluated. It is called with the same data as `shouldEvaluateThisProvider` as well as the details about the evaluation result. This function is not called when the `runMode` is `parallel`.
The `shouldTrackWithThisProvider` method is called before tracking an event with each provider. If the function returns `false`, then
the provider will be skipped for that tracking event. The method includes the tracking event name and details,
allowing for fine-grained control over which providers receive which events. By default, providers in `NOT_READY` or `FATAL` status are skipped.
The `determineFinalResult` function is called after all providers have been called, or the `shouldEvaluateNextProvider` function returned false. It is called
with a list of results from all the individual providers' evaluations. It returns the final decision for evaluation result, or throws an error if needed.
## Tracking Support
The Multi-Provider supports tracking events across multiple providers, allowing you to send analytics events to all configured providers simultaneously.
### Basic Tracking Usage
```typescript
import { WebMultiProvider } from '@openfeature/multi-provider-web'
import { OpenFeature } from '@openfeature/web-sdk'
const multiProvider = new WebMultiProvider([
{ provider: new ProviderA() },
{ provider: new ProviderB() }
])
await OpenFeature.setProviderAndWait(multiProvider)
const client = OpenFeature.getClient()
// Tracked events will be sent to all providers by default
client.track('user-conversion', {
value: 99.99,
currency: 'USD',
conversionType: 'purchase'
})
client.track('page-view', {
page: '/checkout',
source: 'direct'
})
```
### Tracking Behavior
- **Default**: All providers receive tracking calls by default
- **Error Handling**: If one provider fails to track, others continue normally and errors are logged
- **Provider Status**: Providers in `NOT_READY` or `FATAL` status are automatically skipped
- **Optional Method**: Providers without a `track` method are gracefully skipped
### Customizing Tracking with Strategies
You can customize which providers receive tracking calls by overriding the `shouldTrackWithThisProvider` method in your custom strategy:
```typescript
import { BaseEvaluationStrategy, StrategyProviderContext } from '@openfeature/multi-provider-web'
class CustomTrackingStrategy extends BaseEvaluationStrategy {
// Override tracking behavior
shouldTrackWithThisProvider(
strategyContext: StrategyProviderContext,
context: EvaluationContext,
trackingEventName: string,
trackingEventDetails: TrackingEventDetails,
): boolean {
// Only track with the primary provider
if (strategyContext.providerName === 'primary-provider') {
return true;
}
// Skip tracking for analytics events on backup providers
if (trackingEventName.startsWith('analytics.')) {
return false;
}
return super.shouldTrackWithThisProvider(strategyContext, context, trackingEventName, trackingEventDetails);
}
}
```
## Building
Run `nx package providers-multi-provider` to build the library.

View File

@ -8,6 +8,7 @@ import type {
Provider,
ProviderEmittableEvents,
ProviderMetadata,
TrackingEventDetails,
} from '@openfeature/web-sdk';
import {
DefaultLogger,
@ -20,6 +21,7 @@ import {
import { FirstMatchStrategy } from './strategies/FirstMatchStrategy';
import { FirstSuccessfulStrategy } from './strategies/FirstSuccessfulStrategy';
import { ComparisonStrategy } from './strategies/ComparisonStrategy';
import type { BaseEvaluationStrategy } from './strategies/BaseEvaluationStrategy';
class TestProvider implements Provider {
public metadata: ProviderMetadata = {
@ -27,6 +29,7 @@ class TestProvider implements Provider {
};
public events = new OpenFeatureEventEmitter();
public hooks: Hook[] = [];
public track = jest.fn();
constructor(
public resolveBooleanEvaluation = jest.fn().mockReturnValue({ value: false }),
public resolveStringEvaluation = jest.fn().mockReturnValue({ value: 'default' }),
@ -718,5 +721,170 @@ describe('MultiProvider', () => {
});
});
});
describe('tracking', () => {
const context: EvaluationContext = { targetingKey: 'user123' };
const trackingEventDetails: TrackingEventDetails = { value: 100, currency: 'USD' };
it('calls track on all providers by default', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
const multiProvider = new WebMultiProvider([
{ provider: provider1 },
{ provider: provider2 },
{ provider: provider3 },
]);
multiProvider.track('purchase', context, trackingEventDetails);
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider2.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
});
it('skips providers without track method', () => {
const provider1 = new TestProvider();
const provider2 = new InMemoryProvider(); // Doesn't have track method
const provider3 = new TestProvider();
const multiProvider = new WebMultiProvider([
{ provider: provider1 },
{ provider: provider2 },
{ provider: provider3 },
]);
expect(() => multiProvider.track('purchase', context, trackingEventDetails)).not.toThrow();
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
});
it('continues tracking with other providers when one throws an error', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
provider2.track.mockImplementation(() => {
throw new Error('Tracking failed');
});
const mockLogger = { error: jest.fn(), warn: jest.fn(), info: jest.fn(), debug: jest.fn() };
const multiProvider = new WebMultiProvider(
[{ provider: provider1 }, { provider: provider2 }, { provider: provider3 }],
undefined,
mockLogger,
);
expect(() => multiProvider.track('purchase', context, trackingEventDetails)).not.toThrow();
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider2.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(mockLogger.error).toHaveBeenCalledWith(
'Error tracking event "purchase" with provider "TestProvider-2":',
expect.any(Error),
);
});
it('respects strategy shouldTrackWithThisProvider decision', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
// Create a custom strategy that only allows the second provider to track
class MockStrategy extends FirstMatchStrategy {
override shouldTrackWithThisProvider = jest.fn().mockImplementation((strategyContext) => {
return strategyContext.providerName === 'TestProvider-2';
});
}
const mockStrategy = new MockStrategy();
const multiProvider = new WebMultiProvider(
[{ provider: provider1 }, { provider: provider2 }, { provider: provider3 }],
mockStrategy,
);
multiProvider.track('purchase', context, trackingEventDetails);
expect(mockStrategy.shouldTrackWithThisProvider).toHaveBeenCalledTimes(3);
expect(provider1.track).not.toHaveBeenCalled();
expect(provider2.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).not.toHaveBeenCalled();
});
it('does not track with providers in NOT_READY or FATAL status by default', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
const multiProvider = new WebMultiProvider([
{ provider: provider1 },
{ provider: provider2 },
{ provider: provider3 },
]);
// Mock the status tracker to return different statuses
const mockStatusTracker = {
providerStatus: jest.fn().mockImplementation((name) => {
if (name === 'TestProvider-1') return 'NOT_READY';
if (name === 'TestProvider-2') return 'READY';
if (name === 'TestProvider-3') return 'FATAL';
return 'READY'; // Default fallback
}),
};
(multiProvider as any).statusTracker = mockStatusTracker;
multiProvider.track('purchase', context, trackingEventDetails);
expect(provider1.track).not.toHaveBeenCalled();
expect(provider2.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).not.toHaveBeenCalled();
});
it('passes correct strategy context to shouldTrackWithThisProvider', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
class MockStrategy extends FirstMatchStrategy {
override shouldTrackWithThisProvider = jest.fn().mockReturnValue(true);
}
const mockStrategy = new MockStrategy();
const multiProvider = new WebMultiProvider([{ provider: provider1 }, { provider: provider2 }], mockStrategy);
// Mock the status tracker to return READY status
const mockStatusTracker = {
providerStatus: jest.fn().mockReturnValue('READY'),
};
(multiProvider as any).statusTracker = mockStatusTracker;
multiProvider.track('purchase', context, trackingEventDetails);
expect(mockStrategy.shouldTrackWithThisProvider).toHaveBeenCalledWith(
{
provider: provider1,
providerName: 'TestProvider-1',
providerStatus: 'READY',
},
context,
'purchase',
trackingEventDetails,
);
expect(mockStrategy.shouldTrackWithThisProvider).toHaveBeenCalledWith(
{
provider: provider2,
providerName: 'TestProvider-2',
providerStatus: 'READY',
},
context,
'purchase',
trackingEventDetails,
);
});
});
});
});

View File

@ -14,6 +14,7 @@ import type {
EvaluationDetails,
FlagValue,
OpenFeatureError,
TrackingEventDetails,
} from '@openfeature/web-sdk';
import {
DefaultLogger,
@ -144,6 +145,38 @@ export class WebMultiProvider implements Provider {
return this.flagResolutionProxy(flagKey, 'object', defaultValue, context);
}
track(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void {
for (const providerEntry of this.providerEntries) {
if (!providerEntry.provider.track) {
continue;
}
const strategyContext = {
provider: providerEntry.provider,
providerName: providerEntry.name,
providerStatus: this.statusTracker.providerStatus(providerEntry.name),
};
if (
this.evaluationStrategy.shouldTrackWithThisProvider(
strategyContext,
context,
trackingEventName,
trackingEventDetails,
)
) {
try {
providerEntry.provider.track?.(trackingEventName, context, trackingEventDetails);
} catch (error) {
this.logger.error(
`Error tracking event "${trackingEventName}" with provider "${providerEntry.name}":`,
error,
);
}
}
}
}
private flagResolutionProxy<T extends boolean | string | number | JsonValue>(
flagKey: string,
flagType: FlagValueType,

View File

@ -6,6 +6,7 @@ import type {
OpenFeatureError,
Provider,
ResolutionDetails,
TrackingEventDetails,
} from '@openfeature/web-sdk';
import { ProviderStatus } from '@openfeature/web-sdk';
import { ErrorWithCode } from '../errors';
@ -14,11 +15,12 @@ export type StrategyEvaluationContext = {
flagKey: string;
flagType: FlagValueType;
};
export type StrategyPerProviderContext = StrategyEvaluationContext & {
export type StrategyProviderContext = {
provider: Provider;
providerName: string;
providerStatus: ProviderStatus;
};
export type StrategyPerProviderContext = StrategyEvaluationContext & StrategyProviderContext;
type ProviderResolutionResultBase = {
provider: Provider;
@ -70,6 +72,21 @@ export abstract class BaseEvaluationStrategy {
return true;
}
shouldTrackWithThisProvider(
strategyContext: StrategyProviderContext,
context: EvaluationContext,
trackingEventName: string,
trackingEventDetails: TrackingEventDetails,
): boolean {
if (
strategyContext.providerStatus === ProviderStatus.NOT_READY ||
strategyContext.providerStatus === ProviderStatus.FATAL
) {
return false;
}
return true;
}
abstract determineFinalResult<T extends FlagValue>(
strategyContext: StrategyEvaluationContext,
context: EvaluationContext,

View File

@ -6,14 +6,15 @@ the final result. Different evaluation strategies can be defined to control whic
The Multi-Provider is a powerful tool for performing migrations between flag providers, or combining multiple providers into a single
feature flagging interface. For example:
- *Migration*: When migrating between two providers, you can run both in parallel under a unified flagging interface. As flags are added to the
new provider, the Multi-Provider will automatically find and return them, falling back to the old provider if the new provider does not have
- *Multiple Data Sources*: The Multi-Provider allows you to seamlessly combine many sources of flagging data, such as environment variables,
- *Multiple Data Sources*: The Multi-Provider allows you to seamlessly combine many sources of flagging data, such as environment variables,
local files, database values and SaaS hosted feature management systems.
## Installation
```
```bash
$ npm install @openfeature/multi-provider
```
@ -21,6 +22,7 @@ $ npm install @openfeature/multi-provider
> This provider is designed to be used with the [Node.js SDK](https://openfeature.dev/docs/reference/technologies/server/javascript/).
## Usage
The Multi-Provider is initialized with an array of providers it should evaluate:
```typescript
@ -28,12 +30,8 @@ import { MultiProvider } from '@openfeature/multi-provider'
import { OpenFeature } from '@openfeature/server-sdk'
const multiProvider = new MultiProvider([
{
provider: new ProviderA()
},
{
provider: new ProviderB()
}
{ provider: new ProviderA() },
{ provider: new ProviderB() }
])
await OpenFeature.setProviderAndWait(multiProvider)
@ -56,18 +54,16 @@ import { MultiProvider, FirstSuccessfulStrategy } from '@openfeature/multi-provi
const multiProvider = new MultiProvider(
[
{
provider: new ProviderA()
},
{
provider: new ProviderB()
}
{ provider: new ProviderA() },
{ provider: new ProviderB() }
],
new FirstSuccessfulStrategy()
)
```
The Multi-Provider comes with three strategies out of the box:
`FirstMatchStrategy` (default): Evaluates all providers in order and returns the first successful result. Providers that indicate FLAG_NOT_FOUND error will be skipped and the next provider will be evaluated. Any other error will cause the operation to fail and the set of errors to be thrown.
- `FirstMatchStrategy` (default): Evaluates all providers in order and returns the first successful result. Providers that indicate FLAG_NOT_FOUND error will be skipped and the next provider will be evaluated. Any other error will cause the operation to fail and the set of errors to be thrown.
- `FirstSuccessfulStrategy`: Evaluates all providers in order and returns the first successful result. Any error will cause that provider to be skipped.
If no successful result is returned, the set of errors will be thrown.
- `ComparisonStrategy`: Evaluates all providers in parallel. If every provider returns a successful result with the same value, then that result is returned.
@ -83,22 +79,77 @@ import { MultiProvider, ComparisonStrategy } from '@openfeature/multi-provider'
const providerA = new ProviderA()
const multiProvider = new MultiProvider(
[
{
provider: providerA
},
{
provider: new ProviderB()
}
{ provider: providerA },
{ provider: new ProviderB() }
],
new ComparisonStrategy(providerA, (details) => {
console.log("Mismatch detected", details)
})
)
```
The first argument is the "fallback provider" whose value to use in the event that providers do not agree. It should be the same object reference as one of the providers in the list. The second argument is a callback function that will be executed when a mismatch is detected. The callback will be passed an object containing the details of each provider's resolution, including the flag key, the value returned, and any errors that were thrown.
## Tracking Support
The Multi-Provider supports tracking events across multiple providers. When you call the `track` method, it will by default send the tracking event to all underlying providers that implement the `track` method.
```typescript
import { OpenFeature } from '@openfeature/server-sdk'
import { MultiProvider } from '@openfeature/multi-provider'
const multiProvider = new MultiProvider([
{ provider: new ProviderA() },
{ provider: new ProviderB() }
])
await OpenFeature.setProviderAndWait(multiProvider)
const client = OpenFeature.getClient()
// Tracked events will be sent to all providers by default
client.track('purchase', { targetingKey: 'user123' }, { value: 99.99, currency: 'USD' })
```
### Tracking Behavior
- **Default**: All providers receive tracking calls by default
- **Error Handling**: If one provider fails to track, others continue normally and errors are logged
- **Provider Status**: Providers in `NOT_READY` or `FATAL` status are automatically skipped
- **Optional Method**: Providers without a `track` method are gracefully skipped
### Customizing Tracking with Strategies
You can customize which providers receive tracking calls by overriding the `shouldTrackWithThisProvider` method in your custom strategy:
```typescript
import { BaseEvaluationStrategy, StrategyPerProviderContext } from '@openfeature/multi-provider'
class CustomTrackingStrategy extends BaseEvaluationStrategy {
shouldTrackWithThisProvider(
strategyContext: StrategyPerProviderContext,
context: EvaluationContext,
trackingEventName: string,
trackingEventDetails: TrackingEventDetails,
): boolean {
// Only track with the primary provider
if (strategyContext.providerName === 'primary-provider') {
return true;
}
// Skip tracking for analytics events on backup providers
if (trackingEventName.startsWith('analytics.')) {
return false;
}
return super.shouldTrackWithThisProvider(strategyContext, context, trackingEventName, trackingEventDetails);
}
}
```
## Custom Strategies
It is also possible to implement your own strategy if the above options do not fit your use case. To do so, create a class which implements the "BaseEvaluationStrategy":
```typescript
export abstract class BaseEvaluationStrategy {
public runMode: 'parallel' | 'sequential' = 'sequential';
@ -111,6 +162,13 @@ export abstract class BaseEvaluationStrategy {
result: ProviderResolutionResult<T>,
): boolean;
abstract shouldTrackWithThisProvider(
strategyContext: StrategyPerProviderContext,
context: EvaluationContext,
trackingEventName: string,
trackingEventDetails: TrackingEventDetails,
): boolean;
abstract determineFinalResult<T extends FlagValue>(
strategyContext: StrategyEvaluationContext,
context: EvaluationContext,
@ -118,6 +176,7 @@ export abstract class BaseEvaluationStrategy {
): FinalResult<T>;
}
```
The `runMode` property determines whether the list of providers will be evaluated sequentially or in parallel.
The `shouldEvaluateThisProvider` method is called just before a provider is evaluated by the Multi-Provider. If the function returns `false`, then
@ -127,6 +186,8 @@ Check the type definitions for the full list.
The `shouldEvaluateNextProvider` function is called after a provider is evaluated. If it returns `true`, the next provider in the sequence will be called,
otherwise no more providers will be evaluated. It is called with the same data as `shouldEvaluateThisProvider` as well as the details about the evaluation result. This function is not called when the `runMode` is `parallel`.
The `shouldTrackWithThisProvider` method is called before sending a tracking event to each provider. Return `false` to skip tracking with that provider. By default, it only tracks with providers that are in a ready state (not `NOT_READY` or `FATAL`). Override this method to implement custom tracking logic based on the tracking event name, details, or provider characteristics.
The `determineFinalResult` function is called after all providers have been called, or the `shouldEvaluateNextProvider` function returned false. It is called
with a list of results from all the individual providers' evaluations. It returns the final decision for evaluation result, or throws an error if needed.

View File

@ -7,6 +7,7 @@ import type {
Logger,
Provider,
ProviderMetadata,
TrackingEventDetails,
} from '@openfeature/server-sdk';
import {
DefaultLogger,
@ -26,6 +27,8 @@ class TestProvider implements Provider {
};
public events = new OpenFeatureEventEmitter();
public hooks: Hook[] = [];
public track = jest.fn();
constructor(
public resolveBooleanEvaluation = jest.fn().mockResolvedValue({ value: false }),
public resolveStringEvaluation = jest.fn().mockResolvedValue({ value: 'default' }),
@ -769,4 +772,161 @@ describe('MultiProvider', () => {
});
});
});
describe('tracking', () => {
const context: EvaluationContext = { targetingKey: 'user123' };
const trackingEventDetails: TrackingEventDetails = { value: 100, currency: 'USD' };
it('calls track on all providers by default', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
const multiProvider = new MultiProvider([
{ provider: provider1 },
{ provider: provider2 },
{ provider: provider3 },
]);
multiProvider.track('purchase', context, trackingEventDetails);
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider2.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
});
it('skips providers without track method', () => {
const provider1 = new TestProvider();
const provider2 = new InMemoryProvider(); // Doesn't have track method
const provider3 = new TestProvider();
const multiProvider = new MultiProvider([
{ provider: provider1 },
{ provider: provider2 },
{ provider: provider3 },
]);
expect(() => multiProvider.track('purchase', context, trackingEventDetails)).not.toThrow();
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
});
it('continues tracking with other providers when one throws an error', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
provider2.track.mockImplementation(() => {
throw new Error('Tracking failed');
});
const mockLogger = { error: jest.fn(), warn: jest.fn(), info: jest.fn(), debug: jest.fn() };
const multiProvider = new MultiProvider(
[{ provider: provider1 }, { provider: provider2 }, { provider: provider3 }],
undefined,
mockLogger,
);
expect(() => multiProvider.track('purchase', context, trackingEventDetails)).not.toThrow();
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider2.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider3.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(mockLogger.error).toHaveBeenCalledWith(
'Error tracking event "purchase" with provider "TestProvider-2":',
expect.any(Error),
);
});
it('respects strategy shouldTrackWithThisProvider decision', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
const mockStrategy = new FirstMatchStrategy();
mockStrategy.shouldTrackWithThisProvider = jest
.fn()
.mockReturnValueOnce(true) // provider1: should track
.mockReturnValueOnce(false) // provider2: should not track
.mockReturnValueOnce(true); // provider3: should track
const multiProvider = new MultiProvider(
[{ provider: provider1 }, { provider: provider2 }, { provider: provider3 }],
mockStrategy,
);
multiProvider.track('purchase', context, trackingEventDetails);
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider2.track).not.toHaveBeenCalled();
expect(provider3.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(mockStrategy.shouldTrackWithThisProvider).toHaveBeenCalledTimes(3);
expect(mockStrategy.shouldTrackWithThisProvider).toHaveBeenCalledWith(
expect.objectContaining({
provider: provider1,
providerName: 'TestProvider-1',
}),
context,
'purchase',
trackingEventDetails,
);
});
it('does not track with providers in NOT_READY or FATAL status by default', () => {
const provider1 = new TestProvider();
const provider2 = new TestProvider();
const provider3 = new TestProvider();
const multiProvider = new MultiProvider([
{ provider: provider1 },
{ provider: provider2 },
{ provider: provider3 },
]);
// Simulate providers with different statuses
const mockStatusTracker = {
providerStatus: jest
.fn()
.mockReturnValueOnce('READY') // provider1: ready
.mockReturnValueOnce('NOT_READY') // provider2: not ready
.mockReturnValueOnce('FATAL'), // provider3: fatal
};
(multiProvider as any).statusTracker = mockStatusTracker;
multiProvider.track('purchase', context, trackingEventDetails);
expect(provider1.track).toHaveBeenCalledWith('purchase', context, trackingEventDetails);
expect(provider2.track).not.toHaveBeenCalled();
expect(provider3.track).not.toHaveBeenCalled();
});
it('passes correct strategy context to shouldTrackWithThisProvider', () => {
const provider1 = new TestProvider();
const mockStrategy = new FirstMatchStrategy();
mockStrategy.shouldTrackWithThisProvider = jest.fn().mockReturnValue(true);
const multiProvider = new MultiProvider([{ provider: provider1, name: 'custom-name' }], mockStrategy);
// Mock the status tracker to return a proper status
const mockStatusTracker = {
providerStatus: jest.fn().mockReturnValue('READY'),
};
(multiProvider as any).statusTracker = mockStatusTracker;
multiProvider.track('purchase', context, trackingEventDetails);
expect(mockStrategy.shouldTrackWithThisProvider).toHaveBeenCalledWith(
expect.objectContaining({
provider: provider1,
providerName: 'custom-name',
providerStatus: 'READY',
}),
context,
'purchase',
trackingEventDetails,
);
});
});
});

View File

@ -14,6 +14,7 @@ import type {
Provider,
ProviderMetadata,
ResolutionDetails,
TrackingEventDetails,
} from '@openfeature/server-sdk';
import {
DefaultLogger,
@ -311,6 +312,40 @@ export class MultiProvider implements Provider {
];
}
track(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void {
for (const providerEntry of this.providerEntries) {
if (!providerEntry.provider.track) {
continue;
}
const strategyContext = {
provider: providerEntry.provider,
providerName: providerEntry.name,
providerStatus: this.statusTracker.providerStatus(providerEntry.name),
};
if (
this.evaluationStrategy.shouldTrackWithThisProvider(
strategyContext,
context,
trackingEventName,
trackingEventDetails,
)
) {
try {
providerEntry.provider.track?.(trackingEventName, context, trackingEventDetails);
} catch (error) {
// TODO: how should we handle errors?
// Log error but don't throw - tracking shouldn't break application flow
this.logger.error(
`Error tracking event "${trackingEventName}" with provider "${providerEntry.name}":`,
error,
);
}
}
}
}
private getErrorEvaluationDetails<T extends FlagValue>(
flagKey: string,
defaultValue: T,

View File

@ -6,6 +6,7 @@ import type {
OpenFeatureError,
Provider,
ResolutionDetails,
TrackingEventDetails,
} from '@openfeature/server-sdk';
import { ProviderStatus } from '@openfeature/server-sdk';
import { ErrorWithCode } from '../errors';
@ -14,11 +15,12 @@ export type StrategyEvaluationContext = {
flagKey: string;
flagType: FlagValueType;
};
export type StrategyPerProviderContext = StrategyEvaluationContext & {
export type StrategyProviderContext = {
provider: Provider;
providerName: string;
providerStatus: ProviderStatus;
};
export type StrategyPerProviderContext = StrategyEvaluationContext & StrategyProviderContext;
type ProviderResolutionResultBase = {
provider: Provider;
@ -72,6 +74,21 @@ export abstract class BaseEvaluationStrategy {
return true;
}
shouldTrackWithThisProvider(
strategyContext: StrategyProviderContext,
context: EvaluationContext,
trackingEventName: string,
trackingEventDetails: TrackingEventDetails,
): boolean {
if (
strategyContext.providerStatus === ProviderStatus.NOT_READY ||
strategyContext.providerStatus === ProviderStatus.FATAL
) {
return false;
}
return true;
}
abstract determineFinalResult<T extends FlagValue>(
strategyContext: StrategyEvaluationContext,
context: EvaluationContext,

View File

@ -10,7 +10,7 @@ export default {
transform: {
'^.+\\.[tj]s$': 'ts-jest',
},
testEnvironment: 'jsdom',
testEnvironment: 'node', // Use 'node' so we can run msw test server
moduleFileExtensions: ['ts', 'js', 'html'],
setupFiles: ['./jest.polyfills.js'],
};

View File

@ -7,8 +7,13 @@
"": {
"name": "@openfeature/config-cat-core",
"version": "0.1.1",
"license": "Apache-2.0",
"dependencies": {
"configcat-common": "9.4.0",
"configcat-js-ssr": "^8.4.3"
},
"peerDependencies": {
"@openfeature/core": "<=1.6.0"
"@openfeature/core": "^1.6.0"
}
},
"node_modules/@openfeature/core": {
@ -17,6 +22,311 @@
"integrity": "sha512-QYAtwdreZU9Mi/LXLRzXsUA7PhbtT7+UJfRBMIAy6MidZjMgIbNfoh6+MncXb3UocThn0OsYa8WLfWD9q43eCQ==",
"license": "Apache-2.0",
"peer": true
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
"integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/configcat-common": {
"version": "9.4.0",
"resolved": "https://registry.npmjs.org/configcat-common/-/configcat-common-9.4.0.tgz",
"integrity": "sha512-rKFawlrEXY1NQ1jxX5sYXN4fhT4MhfllC1ELd+3k2tY+z1DQju+PoopNra1wyfegLn3Aa0X8l3JpXFFO/gyo0g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.4.1"
}
},
"node_modules/configcat-js-ssr": {
"version": "8.5.0",
"resolved": "https://registry.npmjs.org/configcat-js-ssr/-/configcat-js-ssr-8.5.0.tgz",
"integrity": "sha512-UZdoMEVBZpRlAbpnTMqfZaqs15UFL8++Dfn8zwgbGD5ZdSgGnLGqQXH5wdIZ0+KzBOoLYTR4nsyzCS8j+ZjNog==",
"license": "MIT",
"dependencies": {
"axios": "^1.8.4",
"configcat-common": "9.4.0",
"tslib": "^2.4.1"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
"integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
}
}
}

View File

@ -10,7 +10,7 @@
"@openfeature/core": "^1.6.0"
},
"dependencies": {
"configcat-common": "9.3.1",
"configcat-common": "9.4.0",
"configcat-js-ssr": "^8.4.3"
}
}

View File

@ -1,5 +1,12 @@
# Changelog
## [1.1.0](https://github.com/open-feature/js-sdk-contrib/compare/flagd-core-v1.0.0...flagd-core-v1.1.0) (2025-07-04)
### ✨ New Features
* **flagd:** add flag metadata ([#1151](https://github.com/open-feature/js-sdk-contrib/issues/1151)) ([b1c6d23](https://github.com/open-feature/js-sdk-contrib/commit/b1c6d235565f6cce02519d7c08bb6ad2dd791332))
## [1.0.0](https://github.com/open-feature/js-sdk-contrib/compare/flagd-core-v0.2.5...flagd-core-v1.0.0) (2025-01-07)

View File

@ -1,12 +1,12 @@
{
"name": "@openfeature/flagd-core",
"version": "1.0.0",
"version": "1.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@openfeature/flagd-core",
"version": "1.0.0",
"version": "1.1.0",
"dependencies": {
"ajv": "^8.12.0",
"tslib": "^2.3.0"

View File

@ -1,6 +1,6 @@
{
"name": "@openfeature/flagd-core",
"version": "1.0.0",
"version": "1.1.0",
"license": "Apache-2.0",
"scripts": {
"publish-if-not-exists": "cp $NPM_CONFIG_USERCONFIG .npmrc && if [ \"$(npm show $npm_package_name@$npm_package_version version)\" = \"$(npm run current-version -s)\" ]; then echo 'already published, skipping'; else npm publish --access public; fi",

327
package-lock.json generated
View File

@ -14,7 +14,7 @@
"@connectrpc/connect": "^1.4.0",
"@connectrpc/connect-web": "^1.4.0",
"@flipt-io/flipt": "^1.2.0",
"@flipt-io/flipt-client-js": "^0.0.6",
"@flipt-io/flipt-client-js": "^0.2.0",
"@growthbook/growthbook": "^1.3.1",
"@grpc/grpc-js": "^1.9.13",
"@opentelemetry/api": "^1.3.0",
@ -22,7 +22,8 @@
"@protobuf-ts/runtime-rpc": "^2.9.0",
"@swc/helpers": "0.5.17",
"ajv": "^8.12.0",
"axios": "1.9.0",
"axios": "1.10.0",
"configcat-common": "9.4.0",
"configcat-js-ssr": "^8.4.3",
"configcat-node": "^11.3.1",
"copy-anything": "^3.0.5",
@ -54,7 +55,7 @@
"@opentelemetry/sdk-metrics": "^1.15.0",
"@swc-node/register": "~1.10.0",
"@swc/cli": "~0.7.0",
"@swc/core": "1.11.31",
"@swc/core": "1.12.9",
"@types/assert": "^1.5.6",
"@types/events": "^3.0.0",
"@types/imurmurhash": "^0.1.3",
@ -80,15 +81,18 @@
"jest-fetch-mock": "^3.0.3",
"jest-websocket-mock": "^2.4.0",
"jsonc-eslint-parser": "^2.1.0",
"msw": "2.2.3",
"msw": "2.10.3",
"nx": "20.3.1",
"prettier": "^3.0.3",
"testcontainers": "10.28.0",
"ts-jest": "29.3.4",
"ts-jest": "29.4.0",
"ts-node": "10.9.2",
"typescript": "5.8.3",
"undici": "^5.0.0",
"verdaccio": "^5.0.4"
},
"engines": {
"node": ">=24.0.0"
}
},
"node_modules/@ampproject/remapping": {
@ -2814,6 +2818,17 @@
"statuses": "^2.0.1"
}
},
"node_modules/@bundled-es-modules/tough-cookie": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz",
"integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==",
"dev": true,
"license": "ISC",
"dependencies": {
"@types/tough-cookie": "^4.0.5",
"tough-cookie": "^4.1.4"
}
},
"node_modules/@connectrpc/connect": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-1.6.1.tgz",
@ -3164,9 +3179,9 @@
"license": "MIT"
},
"node_modules/@flipt-io/flipt-client-js": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/@flipt-io/flipt-client-js/-/flipt-client-js-0.0.6.tgz",
"integrity": "sha512-oTdmjjHS0VJ3xOdh+x8A8Cjbt9jZEJrbsnOZ/KkL0v4cvYZiVDAMA/hbAZw0cYI4Hn0aSa+4plYfua65eb0jcw==",
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@flipt-io/flipt-client-js/-/flipt-client-js-0.2.0.tgz",
"integrity": "sha512-3VIU2pDUyHafp3ahgxHOde81fKP+5hvSm9Q+8hqt9+D7MCIWNvHTLqFo5hc87WSgq3TlR8ILRWfFC18BE1AmeQ==",
"license": "MIT",
"dependencies": {
"node-fetch": "^3.3.0"
@ -3299,54 +3314,53 @@
"license": "BSD-3-Clause"
},
"node_modules/@inquirer/confirm": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz",
"integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==",
"version": "5.1.13",
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.13.tgz",
"integrity": "sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@inquirer/core": "^9.1.0",
"@inquirer/type": "^1.5.3"
"@inquirer/core": "^10.1.14",
"@inquirer/type": "^3.0.7"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/core": {
"version": "9.2.1",
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz",
"integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==",
"version": "10.1.14",
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.14.tgz",
"integrity": "sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@inquirer/figures": "^1.0.6",
"@inquirer/type": "^2.0.0",
"@types/mute-stream": "^0.0.4",
"@types/node": "^22.5.5",
"@types/wrap-ansi": "^3.0.0",
"@inquirer/figures": "^1.0.12",
"@inquirer/type": "^3.0.7",
"ansi-escapes": "^4.3.2",
"cli-width": "^4.1.0",
"mute-stream": "^1.0.0",
"mute-stream": "^2.0.0",
"signal-exit": "^4.1.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^6.2.0",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@inquirer/core/node_modules/@inquirer/type": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz",
"integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==",
"dev": true,
"license": "MIT",
"dependencies": {
"mute-stream": "^1.0.0"
},
"engines": {
"node": ">=18"
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/core/node_modules/signal-exit": {
@ -3363,9 +3377,9 @@
}
},
"node_modules/@inquirer/figures": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz",
"integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==",
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz",
"integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==",
"dev": true,
"license": "MIT",
"engines": {
@ -3373,16 +3387,21 @@
}
},
"node_modules/@inquirer/type": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz",
"integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==",
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz",
"integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==",
"dev": true,
"license": "MIT",
"dependencies": {
"mute-stream": "^1.0.0"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@isaacs/cliui": {
@ -3870,20 +3889,10 @@
"url": "https://opencollective.com/js-sdsl"
}
},
"node_modules/@mswjs/cookies": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-1.1.1.tgz",
"integrity": "sha512-W68qOHEjx1iD+4VjQudlx26CPIoxmIAtK4ZCexU0/UJBG6jYhcuyzKJx+Iw8uhBIGd9eba64XgWVgo20it1qwA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@mswjs/interceptors": {
"version": "0.25.16",
"resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.16.tgz",
"integrity": "sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==",
"version": "0.39.2",
"resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.2.tgz",
"integrity": "sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -3891,7 +3900,7 @@
"@open-draft/logger": "^0.3.0",
"@open-draft/until": "^2.0.0",
"is-node-process": "^1.2.0",
"outvariant": "^1.2.1",
"outvariant": "^1.4.3",
"strict-event-emitter": "^0.5.1"
},
"engines": {
@ -6365,15 +6374,15 @@
}
},
"node_modules/@swc/core": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.31.tgz",
"integrity": "sha512-mAby9aUnKRjMEA7v8cVZS9Ah4duoRBnX7X6r5qrhTxErx+68MoY1TPrVwj/66/SWN3Bl+jijqAqoB8Qx0QE34A==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.9.tgz",
"integrity": "sha512-O+LfT2JlVMsIMWG9x+rdxg8GzpzeGtCZQfXV7cKc1PjIKUkLFf1QJ7okuseA4f/9vncu37dQ2ZcRrPKy0Ndd5g==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/counter": "^0.1.3",
"@swc/types": "^0.1.21"
"@swc/types": "^0.1.23"
},
"engines": {
"node": ">=10"
@ -6383,16 +6392,16 @@
"url": "https://opencollective.com/swc"
},
"optionalDependencies": {
"@swc/core-darwin-arm64": "1.11.31",
"@swc/core-darwin-x64": "1.11.31",
"@swc/core-linux-arm-gnueabihf": "1.11.31",
"@swc/core-linux-arm64-gnu": "1.11.31",
"@swc/core-linux-arm64-musl": "1.11.31",
"@swc/core-linux-x64-gnu": "1.11.31",
"@swc/core-linux-x64-musl": "1.11.31",
"@swc/core-win32-arm64-msvc": "1.11.31",
"@swc/core-win32-ia32-msvc": "1.11.31",
"@swc/core-win32-x64-msvc": "1.11.31"
"@swc/core-darwin-arm64": "1.12.9",
"@swc/core-darwin-x64": "1.12.9",
"@swc/core-linux-arm-gnueabihf": "1.12.9",
"@swc/core-linux-arm64-gnu": "1.12.9",
"@swc/core-linux-arm64-musl": "1.12.9",
"@swc/core-linux-x64-gnu": "1.12.9",
"@swc/core-linux-x64-musl": "1.12.9",
"@swc/core-win32-arm64-msvc": "1.12.9",
"@swc/core-win32-ia32-msvc": "1.12.9",
"@swc/core-win32-x64-msvc": "1.12.9"
},
"peerDependencies": {
"@swc/helpers": ">=0.5.17"
@ -6404,9 +6413,9 @@
}
},
"node_modules/@swc/core-darwin-arm64": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.31.tgz",
"integrity": "sha512-NTEaYOts0OGSbJZc0O74xsji+64JrF1stmBii6D5EevWEtrY4wlZhm8SiP/qPrOB+HqtAihxWIukWkP2aSdGSQ==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.9.tgz",
"integrity": "sha512-GACFEp4nD6V+TZNR2JwbMZRHB+Yyvp14FrcmB6UCUYmhuNWjkxi+CLnEvdbuiKyQYv0zA+TRpCHZ+whEs6gwfA==",
"cpu": [
"arm64"
],
@ -6421,9 +6430,9 @@
}
},
"node_modules/@swc/core-darwin-x64": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.31.tgz",
"integrity": "sha512-THSGaSwT96JwXDwuXQ6yFBbn+xDMdyw7OmBpnweAWsh5DhZmQkALEm1DgdQO3+rrE99MkmzwAfclc0UmYro/OA==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.9.tgz",
"integrity": "sha512-hv2kls7Ilkm2EpeJz+I9MCil7pGS3z55ZAgZfxklEuYsxpICycxeH+RNRv4EraggN44ms+FWCjtZFu0LGg2V3g==",
"cpu": [
"x64"
],
@ -6438,9 +6447,9 @@
}
},
"node_modules/@swc/core-linux-arm-gnueabihf": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.31.tgz",
"integrity": "sha512-laKtQFnW7KHgE57Hx32os2SNAogcuIDxYE+3DYIOmDMqD7/1DCfJe6Rln2N9WcOw6HuDbDpyQavIwZNfSAa8vQ==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.9.tgz",
"integrity": "sha512-od9tDPiG+wMU9wKtd6y3nYJdNqgDOyLdgRRcrj1/hrbHoUPOM8wZQZdwQYGarw63iLXGgsw7t5HAF9Yc51ilFA==",
"cpu": [
"arm"
],
@ -6455,9 +6464,9 @@
}
},
"node_modules/@swc/core-linux-arm64-gnu": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.31.tgz",
"integrity": "sha512-T+vGw9aPE1YVyRxRr1n7NAdkbgzBzrXCCJ95xAZc/0+WUwmL77Z+js0J5v1KKTRxw4FvrslNCOXzMWrSLdwPSA==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.9.tgz",
"integrity": "sha512-6qx1ka9LHcLzxIgn2Mros+CZLkHK2TawlXzi/h7DJeNnzi8F1Hw0Yzjp8WimxNCg6s2n+o3jnmin1oXB7gg8rw==",
"cpu": [
"arm64"
],
@ -6472,9 +6481,9 @@
}
},
"node_modules/@swc/core-linux-arm64-musl": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.31.tgz",
"integrity": "sha512-Mztp5NZkyd5MrOAG+kl+QSn0lL4Uawd4CK4J7wm97Hs44N9DHGIG5nOz7Qve1KZo407Y25lTxi/PqzPKHo61zQ==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.9.tgz",
"integrity": "sha512-yghFZWKPVVGbUdqiD7ft23G0JX6YFGDJPz9YbLLAwGuKZ9th3/jlWoQDAw1Naci31LQhVC+oIji6ozihSuwB2A==",
"cpu": [
"arm64"
],
@ -6489,9 +6498,9 @@
}
},
"node_modules/@swc/core-linux-x64-gnu": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.31.tgz",
"integrity": "sha512-DDVE0LZcXOWwOqFU1Xi7gdtiUg3FHA0vbGb3trjWCuI1ZtDZHEQYL4M3/2FjqKZtIwASrDvO96w91okZbXhvMg==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.9.tgz",
"integrity": "sha512-SFUxyhWLZRNL8QmgGNqdi2Q43PNyFVkRZ2zIif30SOGFSxnxcf2JNeSeBgKIGVgaLSuk6xFVVCtJ3KIeaStgRg==",
"cpu": [
"x64"
],
@ -6506,9 +6515,9 @@
}
},
"node_modules/@swc/core-linux-x64-musl": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.31.tgz",
"integrity": "sha512-mJA1MzPPRIfaBUHZi0xJQ4vwL09MNWDeFtxXb0r4Yzpf0v5Lue9ymumcBPmw/h6TKWms+Non4+TDquAsweuKSw==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.9.tgz",
"integrity": "sha512-9FB0wM+6idCGTI20YsBNBg9xSWtkDBymnpaTCsZM3qDc0l4uOpJMqbfWhQvp17x7r/ulZfb2QY8RDvQmCL6AcQ==",
"cpu": [
"x64"
],
@ -6523,9 +6532,9 @@
}
},
"node_modules/@swc/core-win32-arm64-msvc": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.31.tgz",
"integrity": "sha512-RdtakUkNVAb/FFIMw3LnfNdlH1/ep6KgiPDRlmyUfd0WdIQ3OACmeBegEFNFTzi7gEuzy2Yxg4LWf4IUVk8/bg==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.9.tgz",
"integrity": "sha512-zHOusMVbOH9ik5RtRrMiGzLpKwxrPXgXkBm3SbUCa65HAdjV33NZ0/R9Rv1uPESALtEl2tzMYLUxYA5ECFDFhA==",
"cpu": [
"arm64"
],
@ -6540,9 +6549,9 @@
}
},
"node_modules/@swc/core-win32-ia32-msvc": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.31.tgz",
"integrity": "sha512-hErXdCGsg7swWdG1fossuL8542I59xV+all751mYlBoZ8kOghLSKObGQTkBbuNvc0sUKWfWg1X0iBuIhAYar+w==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.9.tgz",
"integrity": "sha512-aWZf0PqE0ot7tCuhAjRkDFf41AzzSQO0x2xRfTbnhpROp57BRJ/N5eee1VULO/UA2PIJRG7GKQky5bSGBYlFug==",
"cpu": [
"ia32"
],
@ -6557,9 +6566,9 @@
}
},
"node_modules/@swc/core-win32-x64-msvc": {
"version": "1.11.31",
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.31.tgz",
"integrity": "sha512-5t7SGjUBMMhF9b5j17ml/f/498kiBJNf4vZFNM421UGUEETdtjPN9jZIuQrowBkoFGJTCVL/ECM4YRtTH30u/A==",
"version": "1.12.9",
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.9.tgz",
"integrity": "sha512-C25fYftXOras3P3anSUeXXIpxmEkdAcsIL9yrr0j1xepTZ/yKwpnQ6g3coj8UXdeJy4GTVlR6+Ow/QiBgZQNOg==",
"cpu": [
"x64"
],
@ -6590,9 +6599,9 @@
}
},
"node_modules/@swc/types": {
"version": "0.1.21",
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz",
"integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==",
"version": "0.1.23",
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz",
"integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@ -6902,16 +6911,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/mute-stream": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz",
"integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/node": {
"version": "22.13.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
@ -7030,13 +7029,6 @@
"integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
"license": "MIT"
},
"node_modules/@types/wrap-ansi": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz",
"integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/yargs": {
"version": "17.0.33",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
@ -9265,9 +9257,9 @@
"license": "MIT"
},
"node_modules/axios": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
"integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
"integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
@ -10724,9 +10716,9 @@
}
},
"node_modules/configcat-common": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/configcat-common/-/configcat-common-9.3.1.tgz",
"integrity": "sha512-yVkIbluksD/kZfVyKjLIOpwLrq3/ZRM7Lwrsz89JmbpQ6VtbnelrTQynSPElTtKjrPRZx56v3IZYk3nWTnnM6A==",
"version": "9.4.0",
"resolved": "https://registry.npmjs.org/configcat-common/-/configcat-common-9.4.0.tgz",
"integrity": "sha512-rKFawlrEXY1NQ1jxX5sYXN4fhT4MhfllC1ELd+3k2tY+z1DQju+PoopNra1wyfegLn3Aa0X8l3JpXFFO/gyo0g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.4.1"
@ -10743,6 +10735,15 @@
"tslib": "^2.4.1"
}
},
"node_modules/configcat-js-ssr/node_modules/configcat-common": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/configcat-common/-/configcat-common-9.3.1.tgz",
"integrity": "sha512-yVkIbluksD/kZfVyKjLIOpwLrq3/ZRM7Lwrsz89JmbpQ6VtbnelrTQynSPElTtKjrPRZx56v3IZYk3nWTnnM6A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.4.1"
}
},
"node_modules/configcat-node": {
"version": "11.3.1",
"resolved": "https://registry.npmjs.org/configcat-node/-/configcat-node-11.3.1.tgz",
@ -10757,6 +10758,15 @@
"node": ">=14"
}
},
"node_modules/configcat-node/node_modules/configcat-common": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/configcat-common/-/configcat-common-9.3.1.tgz",
"integrity": "sha512-yVkIbluksD/kZfVyKjLIOpwLrq3/ZRM7Lwrsz89JmbpQ6VtbnelrTQynSPElTtKjrPRZx56v3IZYk3nWTnnM6A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.4.1"
}
},
"node_modules/confusing-browser-globals": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
@ -16536,29 +16546,30 @@
"license": "MIT"
},
"node_modules/msw": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/msw/-/msw-2.2.3.tgz",
"integrity": "sha512-84CoNCkcJ/EvY8Tv0tD/6HKVd4S5HyGowHjM5W12K8Wgryp4fikqS7IaTOceyQgP5dNedxo2icTLDXo7dkpxCg==",
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/msw/-/msw-2.10.3.tgz",
"integrity": "sha512-rpqW4wIqISJlgDfu3tiqzuWC/d6jofSuMUsBu1rwepzSwX21aQoagsd+fjahJ8sewa6FwlYhu4no+jfGVQm2IA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@bundled-es-modules/cookie": "^2.0.0",
"@bundled-es-modules/cookie": "^2.0.1",
"@bundled-es-modules/statuses": "^1.0.1",
"@inquirer/confirm": "^3.0.0",
"@mswjs/cookies": "^1.1.0",
"@mswjs/interceptors": "^0.25.16",
"@bundled-es-modules/tough-cookie": "^0.1.6",
"@inquirer/confirm": "^5.0.0",
"@mswjs/interceptors": "^0.39.1",
"@open-draft/deferred-promise": "^2.2.0",
"@open-draft/until": "^2.1.0",
"@types/cookie": "^0.6.0",
"@types/statuses": "^2.0.4",
"chalk": "^4.1.2",
"graphql": "^16.8.1",
"headers-polyfill": "^4.0.2",
"is-node-process": "^1.2.0",
"outvariant": "^1.4.2",
"path-to-regexp": "^6.2.0",
"outvariant": "^1.4.3",
"path-to-regexp": "^6.3.0",
"picocolors": "^1.1.1",
"strict-event-emitter": "^0.5.1",
"type-fest": "^4.9.0",
"type-fest": "^4.26.1",
"yargs": "^17.7.2"
},
"bin": {
@ -16568,11 +16579,10 @@
"node": ">=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mswjs"
"url": "https://github.com/sponsors/mswjs"
},
"peerDependencies": {
"typescript": ">= 4.7.x"
"typescript": ">= 4.8.x"
},
"peerDependenciesMeta": {
"typescript": {
@ -16588,9 +16598,9 @@
"license": "MIT"
},
"node_modules/msw/node_modules/type-fest": {
"version": "4.37.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz",
"integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==",
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
@ -16601,13 +16611,13 @@
}
},
"node_modules/mute-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
"integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
"integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
"dev": true,
"license": "ISC",
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
"node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/nan": {
@ -20493,16 +20503,15 @@
}
},
"node_modules/ts-jest": {
"version": "29.3.4",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.4.tgz",
"integrity": "sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==",
"version": "29.4.0",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.0.tgz",
"integrity": "sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"bs-logger": "^0.2.6",
"ejs": "^3.1.10",
"fast-json-stable-stringify": "^2.1.0",
"jest-util": "^29.0.0",
"json5": "^2.2.3",
"lodash.memoize": "^4.1.2",
"make-error": "^1.3.6",
@ -20518,10 +20527,11 @@
},
"peerDependencies": {
"@babel/core": ">=7.0.0-beta.0 <8",
"@jest/transform": "^29.0.0",
"@jest/types": "^29.0.0",
"babel-jest": "^29.0.0",
"jest": "^29.0.0",
"@jest/transform": "^29.0.0 || ^30.0.0",
"@jest/types": "^29.0.0 || ^30.0.0",
"babel-jest": "^29.0.0 || ^30.0.0",
"jest": "^29.0.0 || ^30.0.0",
"jest-util": "^29.0.0 || ^30.0.0",
"typescript": ">=4.3 <6"
},
"peerDependenciesMeta": {
@ -20539,6 +20549,9 @@
},
"esbuild": {
"optional": true
},
"jest-util": {
"optional": true
}
}
},

View File

@ -1,6 +1,9 @@
{
"name": "js-sdk-contrib",
"version": "0.0.0",
"engines": {
"node": ">=24.0.0"
},
"license": "Apache-2.0",
"scripts": {
"generate-hook": "nx generate open-feature hook",
@ -19,7 +22,7 @@
"@connectrpc/connect": "^1.4.0",
"@connectrpc/connect-web": "^1.4.0",
"@flipt-io/flipt": "^1.2.0",
"@flipt-io/flipt-client-js": "^0.0.6",
"@flipt-io/flipt-client-js": "^0.2.0",
"@growthbook/growthbook": "^1.3.1",
"@grpc/grpc-js": "^1.9.13",
"@opentelemetry/api": "^1.3.0",
@ -27,7 +30,8 @@
"@protobuf-ts/runtime-rpc": "^2.9.0",
"@swc/helpers": "0.5.17",
"ajv": "^8.12.0",
"axios": "1.9.0",
"axios": "1.10.0",
"configcat-common": "9.4.0",
"configcat-js-ssr": "^8.4.3",
"configcat-node": "^11.3.1",
"copy-anything": "^3.0.5",
@ -59,7 +63,7 @@
"@opentelemetry/sdk-metrics": "^1.15.0",
"@swc-node/register": "~1.10.0",
"@swc/cli": "~0.7.0",
"@swc/core": "1.11.31",
"@swc/core": "1.12.9",
"@types/assert": "^1.5.6",
"@types/events": "^3.0.0",
"@types/imurmurhash": "^0.1.3",
@ -85,11 +89,11 @@
"jest-fetch-mock": "^3.0.3",
"jest-websocket-mock": "^2.4.0",
"jsonc-eslint-parser": "^2.1.0",
"msw": "2.2.3",
"msw": "2.10.3",
"nx": "20.3.1",
"prettier": "^3.0.3",
"testcontainers": "10.28.0",
"ts-jest": "29.3.4",
"ts-jest": "29.4.0",
"ts-node": "10.9.2",
"typescript": "5.8.3",
"undici": "^5.0.0",

View File

@ -1,35 +1,21 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>open-feature/community-tooling"],
"extends": [
"github>open-feature/community-tooling"
],
"dependencyDashboardApproval": true,
"packageRules": [
{
"matchPackagePatterns": ["^@nx/", "nx"],
"enabled": false
"enabled": false,
"matchPackageNames": ["/^@nx//", "/nx/"]
},
{
"matchPackagePatterns": [
"^@typescript-eslint/",
"^eslint"
],
"groupName": "ESLint"
"groupName": "ESLint",
"matchPackageNames": ["/^@typescript-eslint//", "/^eslint/"]
},
{
"matchPackagePatterns": [
"^@types/"
],
"groupName": "Types"
},
{
"matchUpdateTypes": [
"minor",
"patch",
"pin",
"digest"
],
"matchDepTypes": [
"devDependencies"
],
"automerge": true
"groupName": "Types",
"matchPackageNames": ["/^@types//"]
}
]
}