From 5c01a92effa46cfd9fa9adab329b52d27874974a Mon Sep 17 00:00:00 2001 From: David Leek Date: Thu, 31 Aug 2023 08:43:04 +0200 Subject: [PATCH] feat: port of PoC and setting up --- .gitignore | 2 +- action.yml | 38 +++++++++ package.json | 39 ++------- src/index.ts | 30 +++++++ src/unleash-action.ts | 107 ++++++++++++++++++++++++ yarn.lock | 187 ++++++++++++++++-------------------------- 6 files changed, 253 insertions(+), 150 deletions(-) create mode 100644 action.yml create mode 100644 src/index.ts create mode 100644 src/unleash-action.ts diff --git a/.gitignore b/.gitignore index c6bba59..3ab5f6e 100644 --- a/.gitignore +++ b/.gitignore @@ -89,7 +89,7 @@ out # Nuxt.js build / generate output .nuxt -dist +build # Gatsby files .cache/ diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..63fd156 --- /dev/null +++ b/action.yml @@ -0,0 +1,38 @@ +name: 'Unleash Feature Flags' +description: 'Lets you use the getunleash.io feature flags management solution in GitHub Actions' +inputs: + app-name: + description: 'The application name for the GitHub Action as you want it to appear in Unleash metrics' + type: 'string' + required: true + api-key: + description: 'The frontend API token to use with Unleash' + type: 'string' + required: true + url: + description: 'Url to Unleash proxy or frontend api' + type: 'string' + required: true + environment: + description: 'The environment for which to evaluate the feature flags' + type: 'string' + required: false + default: 'default' + is-enabled: + description: 'Newline-separated list of feature flag names to evaluate' + type: 'string' + required: false + get-variant: + description: 'Newline-separated list of feature flag names to get variants for' + type: 'string' + required: false + context: + description: 'Multiline list of key=value pairs that will be string split on =' + type: 'string' + required: false +outputs: + the-value: + description: 'What we found in the input' +runs: + using: 'node20' + main: 'dist/index.js' \ No newline at end of file diff --git a/package.json b/package.json index e340fee..b600598 100644 --- a/package.json +++ b/package.json @@ -7,46 +7,21 @@ "license": "Apache-2.0", "scripts": { "build": "tsc", - "release": "tsc --outDir dist", + "release": "ncc build src/index.ts --license licenses.txt -o dist", "test": "jest" }, - "jest": { - "automock": false, - "maxWorkers": 4, - "testTimeout": 10000, - "globalSetup": "./scripts/jest-setup.js", - "transform": { - "^.+\\.tsx?$": [ - "@swc/jest" - ] - }, - "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", - "testPathIgnorePatterns": [ - "/dist/", - "/node_modules/" - ], - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "jsx", - "json" - ], - "coveragePathIgnorePatterns": [ - "/node_modules/", - "/dist/" - ] - }, "dependencies": { "@actions/core": "^1.10.0", - "@actions/github": "^5.1.1" + "@actions/github": "^5.1.1", + "@types/node": "^20.5.7", + "node": "^20.5.1", + "node-fetch": "^3.3.2", + "unleash-proxy-client": "^2.5.0" }, "devDependencies": { - "@swc/core": "^1.3.80", - "@swc/jest": "^0.2.29", "@types/jest": "^29.5.4", + "@vercel/ncc": "^0.36.1", "jest": "^29.6.4", - "prettier": "^3.0.3", "typescript": "^5.2.2" } } diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..05cc325 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,30 @@ +import { createUnleashAction } from "./unleash-action"; +import { getInput, getMultilineInput, setOutput } from '@actions/core'; + +const appName = getInput('app-name'); +const url = getInput('url'); +const clientKey = getInput('api-key'); +const environment = getInput('environment'); + +const context: Record = {}; +const contextLines = getMultilineInput('context'); +contextLines?.forEach(l => { + let keyVal = l.split('='); + context[keyVal[0]] = keyVal[1]; +}); + +const features = getMultilineInput('is-enabled'); +const variants = getMultilineInput('get-variant'); + +createUnleashAction({ + url: url, + clientKey: clientKey, + appName: appName, + environment: environment, + context: context, + features: features, + variants: variants, + setResult: setOutput +}).then(() => { + console.log("Done!"); +}); \ No newline at end of file diff --git a/src/unleash-action.ts b/src/unleash-action.ts new file mode 100644 index 0000000..9d43cb5 --- /dev/null +++ b/src/unleash-action.ts @@ -0,0 +1,107 @@ +import { UnleashClient } from "unleash-proxy-client"; +import Metrics from "unleash-proxy-client/build/metrics"; +import fetch from "node-fetch"; + +interface IUnleashActionOptions { + url: string; + clientKey: string; + appName: string; + environment: string; + context: Record; + features?: string[]; + variants?: string[]; + setResult: (name: string, value: any) => void; +} + +export const createUnleashAction = async ( + options: IUnleashActionOptions +): Promise => { + const action = new UnleashAction(options); + await action.run(); + await action.end(); +}; + +export class UnleashAction { + private unleash: UnleashClient; + private metrics: Metrics; + private features: string[]; + private variants: string[]; + private setResult: (name: string, value: any) => void; + + constructor(options: IUnleashActionOptions) { + this.unleash = this.createClient(options); + this.unleash.on("ready", () => { + console.log("Ready!"); + }); + + this.metrics = this.createMetrics(options); + + this.features = options.features || []; + this.variants = options.variants || []; + this.setResult = options.setResult; + } + + async run(): Promise { + console.log("starting."); + await this.unleash.start(); + + console.log("Checking features."); + await this.checkFeatures(); + + console.log("Checking variants."); + await this.checkVariants(); + } + + async end(): Promise { + console.log("Sending metrics."); + await this.metrics.sendMetrics(); + + console.log("Stopping."); + await this.unleash.stop(); + } + + private createClient(options: IUnleashActionOptions): UnleashClient { + return new UnleashClient({ + appName: options.appName, + url: options.url, + clientKey: options.clientKey, + environment: options.environment, + refreshInterval: 0, + metricsInterval: 0, + disableMetrics: true, + }); + } + + private createMetrics(options: IUnleashActionOptions): Metrics { + return new Metrics({ + fetch: fetch, + headerName: "Authorization", + onError: (e) => {}, + appName: options.appName, + url: options.url, + clientKey: options.clientKey, + disableMetrics: false, + metricsInterval: 0, + }); + } + + private async checkFeatures(): Promise { + this.features.forEach((featureName) => { + const isEnabled = this.unleash.isEnabled(featureName); + this.metrics.count(featureName, isEnabled); + this.setResult(featureName, isEnabled); + }); + } + + private async checkVariants(): Promise { + this.variants.forEach((featureName) => { + const variant = this.unleash.getVariant(featureName); + if (variant.name) { + this.metrics.countVariant(featureName, variant.name); + } + this.metrics.count(featureName, variant.enabled); + this.setResult(featureName, variant.enabled); + this.setResult(`${featureName}_variant`, variant.payload?.value); + }); + } +} diff --git a/yarn.lock b/yarn.lock index 3bad211..ac82e88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -384,13 +384,6 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/create-cache-key-function@^27.4.2": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" - integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== - dependencies: - "@jest/types" "^27.5.1" - "@jest/environment@^29.6.4": version "29.6.4" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.4.tgz#78ec2c9f8c8829a37616934ff4fea0c028c79f4f" @@ -525,17 +518,6 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -685,87 +667,6 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@swc/core-darwin-arm64@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.80.tgz#18be1879ffc0a871a7397ccccf8a80278a794d60" - integrity sha512-rhoFTcQMUGfO7IkfOnopPSF6O0/aVJ58B7KueIKbvrMe6YvSfFj9QfObELFjYCcrJZTvUWBhig0QrsfPIiUphA== - -"@swc/core-darwin-x64@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.80.tgz#83413aed20751e836139be0aa2f6f419850bad41" - integrity sha512-0dOLedFpVXe+ugkKHXsqSxMKqvQYfFtibWbrZ7j8wOaErzSGPr0VpyWvepNVb9s046725kPXSw+fsGhqZR8wrw== - -"@swc/core-linux-arm-gnueabihf@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.80.tgz#caa6608103dfce820d071ca59cd52617e0c96804" - integrity sha512-QIjwP3PtDeHBDkwF6+ZZqdUsqAhORbMpxrw2jq3mHe4lQrxBttSFTq018vlMRo2mFEorOvXdadzaD9m+NymPrw== - -"@swc/core-linux-arm64-gnu@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.80.tgz#0ec3962eb196cc5f99b8540f89fafb75366092ce" - integrity sha512-cg8WriIueab58ZwkzXmIACnjSzFLzOBwxlC9k65gPXMNgCjab2YbqEYvAbjBqneuqaao02gW6tad2uhjgYaExw== - -"@swc/core-linux-arm64-musl@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.80.tgz#4c2f58fb10b6d163bf22ab517a3afacd7016d670" - integrity sha512-AhdCQ7QKx5mWrtpaOA1mFRiWWvuiiUtspvo0QSpspDetRKTND1rlf/3UB5+gp0kCeCNUTsVmJWU7fIA9ICZtXA== - -"@swc/core-linux-x64-gnu@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.80.tgz#de94d37953d46ac2321b96c35849beffaed60beb" - integrity sha512-+2e5oni1vOrLIjM5Q2/GIzK/uS2YEtuJqnjPvCK8SciRJsSl8OgVsRvyCDbmKeZNtJ2Q+o/O2AQ2w1qpAJG6jg== - -"@swc/core-linux-x64-musl@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.80.tgz#30e7dd46f30a8027bc6864c10666a98003f715ab" - integrity sha512-8OK9IlI1zpWOm7vIp1iXmZSEzLAwFpqhsGSEhxPavpOx2m54kLFdPcw/Uv3n461f6TCtszIxkGq1kSqBUdfUBA== - -"@swc/core-win32-arm64-msvc@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.80.tgz#cab6e1140c19b3576204da995f6dd719d6bb7417" - integrity sha512-RKhatwiAGlffnF6z2Mm3Ddid0v3KB+uf5m/Gc7N9zO/EUAV0PnHRuYuZSGyqodHmGFC+mK8YrCooFCEmHL9n+w== - -"@swc/core-win32-ia32-msvc@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.80.tgz#3da4715e77c6f1559a3a76cca80fddee9aa100fc" - integrity sha512-3jiiZzU/kaw7k4zUp1yMq1QiUe4wJVtCEXIhf+fKuBsIwm7rdvyK/+PIx5KHnZy4TGQnYczKBRhJA5nuBcrUCQ== - -"@swc/core-win32-x64-msvc@1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.80.tgz#2693dd16176b181f440127c822f7006ffba8d3ad" - integrity sha512-2eZtIoIWQBWqykfms92Zd37lveYOBWQTZjdooBGlsLHtcoQLkNpf1NXmR6TKY0yy8q6Yl3OhPvY+izjmO08MSg== - -"@swc/core@^1.3.80": - version "1.3.80" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.80.tgz#364570b0cd5bba7ff686888558bbfd6423317310" - integrity sha512-yX2xV5I/lYswHHR+44TPvzBgq3/Y8N1YWpTQADYuvSiX3Jxyvemk5Jpx3rRtigYb8WBkWAAf2i5d5ZJ2M7hhgw== - dependencies: - "@swc/types" "^0.1.3" - optionalDependencies: - "@swc/core-darwin-arm64" "1.3.80" - "@swc/core-darwin-x64" "1.3.80" - "@swc/core-linux-arm-gnueabihf" "1.3.80" - "@swc/core-linux-arm64-gnu" "1.3.80" - "@swc/core-linux-arm64-musl" "1.3.80" - "@swc/core-linux-x64-gnu" "1.3.80" - "@swc/core-linux-x64-musl" "1.3.80" - "@swc/core-win32-arm64-msvc" "1.3.80" - "@swc/core-win32-ia32-msvc" "1.3.80" - "@swc/core-win32-x64-msvc" "1.3.80" - -"@swc/jest@^0.2.29": - version "0.2.29" - resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.29.tgz#b27d647ec430c909f9bb567d1df2a47eaa3841f4" - integrity sha512-8reh5RvHBsSikDC3WGCd5ZTd2BXKkyOdK7QwynrCH58jk2cQFhhHhFBg/jvnWZehUQe/EoOImLENc9/DwbBFow== - dependencies: - "@jest/create-cache-key-function" "^27.4.2" - jsonc-parser "^3.2.0" - -"@swc/types@^0.1.3": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.4.tgz#8d647e111dc97a8e2881bf71c2ee2d011698ff10" - integrity sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg== - "@types/babel__core@^7.1.14": version "7.20.1" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" @@ -833,7 +734,7 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/node@*": +"@types/node@*", "@types/node@^20.5.7": version "20.5.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== @@ -848,13 +749,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.24" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" @@ -862,6 +756,11 @@ dependencies: "@types/yargs-parser" "*" +"@vercel/ncc@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.36.1.tgz#d4c01fdbbe909d128d1bf11c7f8b5431654c5b95" + integrity sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw== + ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -1134,6 +1033,11 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + debug@^4.1.0, debug@^4.1.1: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1251,6 +1155,14 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1266,6 +1178,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1858,11 +1777,6 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -1948,6 +1862,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +node-bin-setup@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/node-bin-setup/-/node-bin-setup-1.1.3.tgz#d45d5220e3b2ecc3a94263a56116f727f6c1bb14" + integrity sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -1955,6 +1879,15 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -1965,6 +1898,13 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node@^20.5.1: + version "20.5.1" + resolved "https://registry.yarnpkg.com/node/-/node-20.5.1.tgz#6aac0f0ca6c54ce193975d219ebda4ac456b9944" + integrity sha512-+eCQv0CdKRzBK1eeMfE8VBEHHn+aDMTLEdIQyDobwEZlN2tatpc8ZFvVLbdztB6VbBCItxd2n6rGaj+tgxMLYA== + dependencies: + node-bin-setup "^1.0.0" + normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -2069,11 +2009,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -prettier@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" - integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== - pretty-format@^29.0.0, pretty-format@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7" @@ -2270,6 +2205,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +tiny-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -2317,6 +2257,14 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== +unleash-proxy-client@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/unleash-proxy-client/-/unleash-proxy-client-2.5.0.tgz#0f4f34285bc3223023ca2cf3ef9dabd2132eea9f" + integrity sha512-GWYLcQDW2UVhqAVwZX7jNzD6Lp96UJXEi66r9MiDd/C3Xw7rbTdFziNJAhEZpLNqR7j75+TfZaEYMCMy/k778g== + dependencies: + tiny-emitter "^2.1.0" + uuid "^8.3.2" + update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" @@ -2346,6 +2294,11 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +web-streams-polyfill@^3.0.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"