From 81e0b6c402e950c90f7ed715ee8a32df3220ff59 Mon Sep 17 00:00:00 2001 From: Dominik Chrastecky Date: Fri, 18 Feb 2022 20:12:19 +0100 Subject: [PATCH 1/5] docs: update php compatibility matrix table --- website/docs/sdks/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/docs/sdks/index.md b/website/docs/sdks/index.md index 14ba30fd973..023b6c93d4f 100644 --- a/website/docs/sdks/index.md +++ b/website/docs/sdks/index.md @@ -52,8 +52,8 @@ If you see an item marked with a ❌ that you would find useful, feel free to re | Capability | [Java](/sdks/java_sdk) | [Node.js](/sdks/node_sdk) | [Go](/sdks/go_sdk) | [Python](/sdks/python_sdk) | [Ruby](/sdks/ruby_sdk) | [.NET](/sdks/dot_net_sdk) | [PHP](/sdks/php_sdk) | [Rust](https://github.com/unleash/unleash-client-rust) | [Unleash Proxy](unleash-proxy.md) | |---------------------------------------------------------------------------------------------------|:----------------------:|:-------------------------:|:------------------:|:--------------------------:|:----------------------:|:-------------------------:|:--------------------:|:------------------------------------------------------:|:----------------------------------------:| | **Category: Initialization** | | | | | | | | | | -| Async initialization | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | N/A | -| Can block until synchronized | ✅ | ✅ | ⭕ | ⭕ | ⭕ | ✅ | ⭕ | ⭕ | N/A | +| Async initialization | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | N/A | +| Can block until synchronized | ✅ | ✅ | ⭕ | ⭕ | ⭕ | ✅ | ✅ | ⭕ | N/A | | Default refresh interval | 10s | 15s | 15s | 15s | 15s | 30s | 30s | 15s | 5s | | Default metrics interval | 60s | 60s | 60s | 60s | 60s | 60s | 30s | 15s | 30s | | Context provider | ✅ | N/A | N/A | N/A | N/A | ✅ | ✅ | N/A | N/A | @@ -97,8 +97,8 @@ If you see an item marked with a ❌ that you would find useful, feel free to re | Basic usage metrics (yes/no) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | [Impression data](../advanced/impression-data.md) | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | N/A | | **Category: Bootstrap (beta)** | | | | | | | | | | -| Bootstrap from file | ✅ | ✅ | ⭕ | ⭕ | ✅ | ⭕ | ⭕ | ⭕ | ✅ | -| Custom Bootstrap implementation | ✅ | ✅ | ⭕ | ⭕ | ✅ | ⭕ | ⭕ | ⭕ | ✅ | +| Bootstrap from file | ✅ | ✅ | ⭕ | ⭕ | ✅ | ⭕ | ✅ | ⭕ | ✅ | +| Custom Bootstrap implementation | ✅ | ✅ | ⭕ | ⭕ | ✅ | ⭕ | ✅ | ⭕ | ✅ | ## Community SDKs ❤️ {#community-sdks} From 6de5fdb56565f1e7ba84531641085190d660ebdb Mon Sep 17 00:00:00 2001 From: sighphyre Date: Wed, 2 Mar 2022 13:44:46 +0200 Subject: [PATCH 2/5] feat: allow startup to load client tokens from env var --- src/lib/create-config.test.ts | 113 ++++++++++++++++++++- src/lib/create-config.ts | 50 +++++---- website/docs/deploy/configuring-unleash.md | 2 +- 3 files changed, 141 insertions(+), 24 deletions(-) diff --git a/src/lib/create-config.test.ts b/src/lib/create-config.test.ts index ac4852213fa..92eba02babc 100644 --- a/src/lib/create-config.test.ts +++ b/src/lib/create-config.test.ts @@ -18,7 +18,7 @@ test('should create default config', async () => { expect(config).toMatchSnapshot(); }); -test('should add initApiToken from options', async () => { +test('should add initApiToken for admin token from options', async () => { const token = { environment: '*', project: '*', @@ -52,7 +52,41 @@ test('should add initApiToken from options', async () => { ); }); -test('should add initApiToken from env var', async () => { +test('should add initApiToken for client token from options', async () => { + const token = { + environment: 'development', + project: 'default', + secret: 'default:development.some-random-string', + type: ApiTokenType.CLIENT, + username: 'admin', + }; + const config = createConfig({ + db: { + host: 'localhost', + port: 4242, + user: 'unleash', + password: 'password', + database: 'unleash_db', + }, + server: { + port: 4242, + }, + authentication: { + initApiTokens: [token], + }, + }); + + expect(config.authentication.initApiTokens).toHaveLength(1); + expect(config.authentication.initApiTokens[0].environment).toBe( + token.environment, + ); + expect(config.authentication.initApiTokens[0].project).toBe(token.project); + expect(config.authentication.initApiTokens[0].type).toBe( + ApiTokenType.CLIENT, + ); +}); + +test('should add initApiToken for admin token from env var', async () => { process.env.INIT_ADMIN_API_TOKENS = '*:*.some-token1, *:*.some-token2'; const config = createConfig({ @@ -81,7 +115,7 @@ test('should add initApiToken from env var', async () => { delete process.env.INIT_ADMIN_API_TOKENS; }); -test('should validate initApiToken from env var', async () => { +test('should validate initApiToken for admin token from env var', async () => { process.env.INIT_ADMIN_API_TOKENS = 'invalidProject:*:some-token1'; expect(() => createConfig({})).toThrow( @@ -91,8 +125,19 @@ test('should validate initApiToken from env var', async () => { delete process.env.INIT_ADMIN_API_TOKENS; }); +test('should validate initApiToken for client token from env var', async () => { + process.env.INIT_CLIENT_API_TOKENS = '*:*:some-token1'; + + expect(() => createConfig({})).toThrow( + 'Client token cannot be scoped to all environments', + ); + + delete process.env.INIT_CLIENT_API_TOKENS; +}); + test('should merge initApiToken from options and env vars', async () => { process.env.INIT_ADMIN_API_TOKENS = '*:*.some-token1, *:*.some-token2'; + process.env.INIT_CLIENT_API_TOKENS = 'default:development.some-token1'; const token = { environment: '*', project: '*', @@ -116,6 +161,66 @@ test('should merge initApiToken from options and env vars', async () => { }, }); - expect(config.authentication.initApiTokens).toHaveLength(3); + expect(config.authentication.initApiTokens).toHaveLength(4); + delete process.env.INIT_CLIENT_API_TOKENS; delete process.env.INIT_ADMIN_API_TOKENS; }); + +test('should add initApiToken for client token from env var', async () => { + process.env.INIT_CLIENT_API_TOKENS = + 'default:development.some-token1, default:development.some-token2'; + + const config = createConfig({ + db: { + host: 'localhost', + port: 4242, + user: 'unleash', + password: 'password', + database: 'unleash_db', + }, + server: { + port: 4242, + }, + }); + + expect(config.authentication.initApiTokens).toHaveLength(2); + expect(config.authentication.initApiTokens[0].environment).toBe( + 'development', + ); + expect(config.authentication.initApiTokens[0].project).toBe('default'); + expect(config.authentication.initApiTokens[0].type).toBe( + ApiTokenType.CLIENT, + ); + expect(config.authentication.initApiTokens[0].secret).toBe( + 'default:development.some-token1', + ); + + delete process.env.INIT_CLIENT_API_TOKENS; +}); + +test('should handle cases where no env var specified for tokens', async () => { + const token = { + environment: '*', + project: '*', + secret: '*:*.some-random-string', + type: ApiTokenType.ADMIN, + username: 'admin', + }; + const config = createConfig({ + db: { + host: 'localhost', + port: 4242, + user: 'unleash', + password: 'password', + database: 'unleash_db', + }, + server: { + port: 4242, + }, + authentication: { + initApiTokens: [token], + }, + }); + + expect(config.authentication.initApiTokens).toHaveLength(1); +}); diff --git a/src/lib/create-config.ts b/src/lib/create-config.ts index 0c558ab9e45..91c6d1223e7 100644 --- a/src/lib/create-config.ts +++ b/src/lib/create-config.ts @@ -182,27 +182,39 @@ const formatServerOptions = ( }; }; -const loadInitApiTokens = () => { - if (process.env.INIT_ADMIN_API_TOKENS) { - const initApiTokens = process.env.INIT_ADMIN_API_TOKENS.split(/,\s?/); - const tokens = initApiTokens.map((secret) => { - const [project = '*', rest] = secret.split(':'); - const [environment = '*'] = rest.split('.'); - const token = { - createdAt: undefined, - project, - environment, - secret, - type: ApiTokenType.ADMIN, - username: 'admin', - }; - validateApiToken(token); - return token; - }); - return tokens; - } else { +const loadTokensFromString = (tokenString: String, tokenType: ApiTokenType) => { + if (!tokenString) { return []; } + const initApiTokens = tokenString.split(/,\s?/); + const tokens = initApiTokens.map((secret) => { + const [project = '*', rest] = secret.split(':'); + const [environment = '*'] = rest.split('.'); + const token = { + createdAt: undefined, + project, + environment, + secret, + type: tokenType, + username: 'admin', + }; + validateApiToken(token); + return token; + }); + return tokens; +}; + +const loadInitApiTokens = () => { + return [ + ...loadTokensFromString( + process.env.INIT_ADMIN_API_TOKENS, + ApiTokenType.ADMIN, + ), + ...loadTokensFromString( + process.env.INIT_CLIENT_API_TOKENS, + ApiTokenType.CLIENT, + ), + ]; }; export function createConfig(options: IUnleashOptions): IUnleashConfig { diff --git a/website/docs/deploy/configuring-unleash.md b/website/docs/deploy/configuring-unleash.md index 13107615619..7ebf98e207b 100644 --- a/website/docs/deploy/configuring-unleash.md +++ b/website/docs/deploy/configuring-unleash.md @@ -89,7 +89,7 @@ unleash.start(unleashOptions); ``` The tokens can be of any API token type. Note that _admin_ tokens **must** target all environments and projects (i.e. use `'*'` for `environments` and `project` and start the secret with `*:*.`). - You can also use the environment variable `INIT_ADMIN_API_TOKENS` to create API tokens on startup. This variable should be set to a comma-separated list of API tokens to initialize (for instance `*:*.some-random-string, *:*.some-other-token`). With the environment variable, all tokens will be created as admin tokens and Unleash will assign a username automatically. + You can also use the environment variables `INIT_ADMIN_API_TOKENS` or `INIT_CLIENT_API_TOKENS` to create API admin tokens on startup. Both variables require a comma-separated list of API tokens to initialize (for instance `*:*.some-random-string, *:*.some-other-token`). The tokens found in `INIT_ADMIN_API_TOKENS` and `INIT_CLIENT_API_TOKENS` will be created as admin and client tokens respectively and Unleash will assign a username automatically. - **databaseUrl** - (_deprecated_) the postgres database url to connect to. Only used if _db_ object is not specified, and overrides the _db_ object and any environment variables that change parts of it (like `DATABASE_SSL`). Should include username/password. This value may also be set via the `DATABASE_URL` environment variable. Alternatively, if you would like to read the database url from a file, you may set the `DATABASE_URL_FILE` environment variable with the full file path. The contents of the file must be the database url exactly. - **db** - The database configuration object taking the following properties: - _user_ - the database username (`DATABASE_USERNAME`) From 010a699a1962ff63ef6224a689e3db328aa7bc59 Mon Sep 17 00:00:00 2001 From: sighphyre Date: Wed, 2 Mar 2022 14:09:50 +0200 Subject: [PATCH 3/5] Update website/docs/deploy/configuring-unleash.md Co-authored-by: Thomas Heartman --- website/docs/deploy/configuring-unleash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/deploy/configuring-unleash.md b/website/docs/deploy/configuring-unleash.md index 7ebf98e207b..700811097d5 100644 --- a/website/docs/deploy/configuring-unleash.md +++ b/website/docs/deploy/configuring-unleash.md @@ -89,7 +89,7 @@ unleash.start(unleashOptions); ``` The tokens can be of any API token type. Note that _admin_ tokens **must** target all environments and projects (i.e. use `'*'` for `environments` and `project` and start the secret with `*:*.`). - You can also use the environment variables `INIT_ADMIN_API_TOKENS` or `INIT_CLIENT_API_TOKENS` to create API admin tokens on startup. Both variables require a comma-separated list of API tokens to initialize (for instance `*:*.some-random-string, *:*.some-other-token`). The tokens found in `INIT_ADMIN_API_TOKENS` and `INIT_CLIENT_API_TOKENS` will be created as admin and client tokens respectively and Unleash will assign a username automatically. + You can also use the environment variables `INIT_ADMIN_API_TOKENS` or `INIT_CLIENT_API_TOKENS` to create API admin or client tokens on startup. Both variables require a comma-separated list of API tokens to initialize (for instance `*:*.some-random-string, *:*.some-other-token`). The tokens found in `INIT_ADMIN_API_TOKENS` and `INIT_CLIENT_API_TOKENS` will be created as admin and client tokens respectively and Unleash will assign a username automatically. - **databaseUrl** - (_deprecated_) the postgres database url to connect to. Only used if _db_ object is not specified, and overrides the _db_ object and any environment variables that change parts of it (like `DATABASE_SSL`). Should include username/password. This value may also be set via the `DATABASE_URL` environment variable. Alternatively, if you would like to read the database url from a file, you may set the `DATABASE_URL_FILE` environment variable with the full file path. The contents of the file must be the database url exactly. - **db** - The database configuration object taking the following properties: - _user_ - the database username (`DATABASE_USERNAME`) From 2623fb17c45760f50a9f1b796bddf48f9cd727ae Mon Sep 17 00:00:00 2001 From: Dominik Chrastecky Date: Mon, 7 Mar 2022 12:44:37 +0100 Subject: [PATCH 4/5] Mark custom headers - function as supported in PHP SDK --- website/docs/sdks/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/sdks/index.md b/website/docs/sdks/index.md index d8b05ff5a19..f2e37a96bcc 100644 --- a/website/docs/sdks/index.md +++ b/website/docs/sdks/index.md @@ -63,7 +63,7 @@ If you see an item marked with a ❌ that you would find useful, feel free to re | Toggle Query: `project_name` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | N/A | ⭕ | | | **Category: Custom Headers** | | | | | | | | | | | static | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⭕ | N/A | -| function | ✅ | ✅ | ⭕ | ✅ | ⭕ | ✅ | ⭕ | ⭕ | N/A | +| function | ✅ | ✅ | ⭕ | ✅ | ⭕ | ✅ | ✅ | ⭕ | N/A | | **Category: Built-in strategies** | | | | | | | | | | | [Standard](../user_guide/activation_strategy#standard) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | | [Gradual rollout](../user_guide/activation_strategy#gradual-rollout) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | From 5a19f1b878de7ae66a0793205af89dc12197dd92 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 7 Mar 2022 20:39:20 +0000 Subject: [PATCH 5/5] chore(deps): update typescript-eslint monorepo to v5.14.0 --- package.json | 4 +-- yarn.lock | 96 ++++++++++++++++++++++++++-------------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index fe6c19f24e8..059132fea16 100644 --- a/package.json +++ b/package.json @@ -134,8 +134,8 @@ "@types/supertest": "2.0.11", "@types/type-is": "1.6.3", "@types/uuid": "8.3.4", - "@typescript-eslint/eslint-plugin": "5.13.0", - "@typescript-eslint/parser": "5.13.0", + "@typescript-eslint/eslint-plugin": "5.14.0", + "@typescript-eslint/parser": "5.14.0", "copyfiles": "2.4.1", "coveralls": "3.1.1", "del-cli": "4.0.1", diff --git a/yarn.lock b/yarn.lock index e6920e3e97d..aa7774d0f95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1215,14 +1215,14 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.13.0.tgz#2809052b85911ced9c54a60dac10e515e9114497" - integrity sha512-vLktb2Uec81fxm/cfz2Hd6QaWOs8qdmVAZXLdOBX6JFJDhf6oDZpMzZ4/LZ6SFM/5DgDcxIMIvy3F+O9yZBuiQ== - dependencies: - "@typescript-eslint/scope-manager" "5.13.0" - "@typescript-eslint/type-utils" "5.13.0" - "@typescript-eslint/utils" "5.13.0" +"@typescript-eslint/eslint-plugin@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz#5119b67152356231a0e24b998035288a9cd21335" + integrity sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w== + dependencies: + "@typescript-eslint/scope-manager" "5.14.0" + "@typescript-eslint/type-utils" "5.14.0" + "@typescript-eslint/utils" "5.14.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -1230,69 +1230,69 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/parser@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.13.0.tgz#0394ed8f2f849273c0bf4b811994d177112ced5c" - integrity sha512-GdrU4GvBE29tm2RqWOM0P5QfCtgCyN4hXICj/X9ibKED16136l9ZpoJvCL5pSKtmJzA+NRDzQ312wWMejCVVfg== +"@typescript-eslint/parser@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.14.0.tgz#7c79f898aa3cff0ceee6f1d34eeed0f034fb9ef3" + integrity sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw== dependencies: - "@typescript-eslint/scope-manager" "5.13.0" - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/typescript-estree" "5.13.0" + "@typescript-eslint/scope-manager" "5.14.0" + "@typescript-eslint/types" "5.14.0" + "@typescript-eslint/typescript-estree" "5.14.0" debug "^4.3.2" -"@typescript-eslint/scope-manager@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.13.0.tgz#cf6aff61ca497cb19f0397eea8444a58f46156b6" - integrity sha512-T4N8UvKYDSfVYdmJq7g2IPJYCRzwtp74KyDZytkR4OL3NRupvswvmJQJ4CX5tDSurW2cvCc1Ia1qM7d0jpa7IA== +"@typescript-eslint/scope-manager@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz#ea518962b42db8ed0a55152ea959c218cb53ca7b" + integrity sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw== dependencies: - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/visitor-keys" "5.13.0" + "@typescript-eslint/types" "5.14.0" + "@typescript-eslint/visitor-keys" "5.14.0" -"@typescript-eslint/type-utils@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.13.0.tgz#b0efd45c85b7bab1125c97b752cab3a86c7b615d" - integrity sha512-/nz7qFizaBM1SuqAKb7GLkcNn2buRdDgZraXlkhz+vUGiN1NZ9LzkA595tHHeduAiS2MsHqMNhE2zNzGdw43Yg== +"@typescript-eslint/type-utils@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz#711f08105860b12988454e91df433567205a8f0b" + integrity sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw== dependencies: - "@typescript-eslint/utils" "5.13.0" + "@typescript-eslint/utils" "5.14.0" debug "^4.3.2" tsutils "^3.21.0" -"@typescript-eslint/types@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.13.0.tgz#da1de4ae905b1b9ff682cab0bed6b2e3be9c04e5" - integrity sha512-LmE/KO6DUy0nFY/OoQU0XelnmDt+V8lPQhh8MOVa7Y5k2gGRd6U9Kp3wAjhB4OHg57tUO0nOnwYQhRRyEAyOyg== +"@typescript-eslint/types@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.14.0.tgz#96317cf116cea4befabc0defef371a1013f8ab11" + integrity sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw== -"@typescript-eslint/typescript-estree@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.13.0.tgz#b37c07b748ff030a3e93d87c842714e020b78141" - integrity sha512-Q9cQow0DeLjnp5DuEDjLZ6JIkwGx3oYZe+BfcNuw/POhtpcxMTy18Icl6BJqTSd+3ftsrfuVb7mNHRZf7xiaNA== +"@typescript-eslint/typescript-estree@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz#78b7f7385d5b6f2748aacea5c9b7f6ae62058314" + integrity sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA== dependencies: - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/visitor-keys" "5.13.0" + "@typescript-eslint/types" "5.14.0" + "@typescript-eslint/visitor-keys" "5.14.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.13.0.tgz#2328feca700eb02837298339a2e49c46b41bd0af" - integrity sha512-+9oHlPWYNl6AwwoEt5TQryEHwiKRVjz7Vk6kaBeD3/kwHE5YqTGHtm/JZY8Bo9ITOeKutFaXnBlMgSATMJALUQ== +"@typescript-eslint/utils@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.14.0.tgz#6c8bc4f384298cbbb32b3629ba7415f9f80dc8c4" + integrity sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.13.0" - "@typescript-eslint/types" "5.13.0" - "@typescript-eslint/typescript-estree" "5.13.0" + "@typescript-eslint/scope-manager" "5.14.0" + "@typescript-eslint/types" "5.14.0" + "@typescript-eslint/typescript-estree" "5.14.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.13.0.tgz#f45ff55bcce16403b221ac9240fbeeae4764f0fd" - integrity sha512-HLKEAS/qA1V7d9EzcpLFykTePmOQqOFim8oCvhY3pZgQ8Hi38hYpHd9e5GN6nQBFQNecNhws5wkS9Y5XIO0s/g== +"@typescript-eslint/visitor-keys@5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz#1927005b3434ccd0d3ae1b2ecf60e65943c36986" + integrity sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw== dependencies: - "@typescript-eslint/types" "5.13.0" + "@typescript-eslint/types" "5.14.0" eslint-visitor-keys "^3.0.0" abab@^2.0.3, abab@^2.0.5: