From 29bb2f70cc85c100baef66268a2fce5d886d1730 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Tue, 7 Jun 2022 13:11:09 -0700 Subject: [PATCH 01/10] Use new `KeyValueCache` and friends from `@apollo/utils.keyvaluecache` (#6522) Migrate caching dependencies away from `apollo-server-caching` which will no longer be actively developed as of AS v3.9.0. AS will now use `@apollo/utils.keyvaluecache` and support the use of `keyv` caches via a `KeyvAdapter` exported by `@apollo/utils.keyvadapter`. --- .prettierignore | 2 + CHANGELOG.md | 5 +- cspell-dict.txt | 2 + docs/source/api/apollo-server.mdx | 4 +- package-lock.json | 182 ++++++++++++++++-- packages/apollo-datasource-rest/package.json | 2 +- .../apollo-datasource-rest/src/HTTPCache.ts | 2 +- .../src/__tests__/HTTPCache.test.ts | 13 +- .../src/__tests__/MapKeyValueCache.ts | 7 +- packages/apollo-datasource-rest/tsconfig.json | 1 - packages/apollo-datasource/package.json | 2 +- packages/apollo-datasource/src/index.ts | 2 +- packages/apollo-datasource/tsconfig.json | 4 +- .../package.json | 1 + .../src/index.ts | 2 +- .../tsconfig.json | 4 +- .../apollo-server-cache-redis/package.json | 2 +- .../src/BaseRedisCache.ts | 2 +- .../apollo-server-cache-redis/tsconfig.json | 4 +- packages/apollo-server-core/package.json | 4 +- .../apollo-server-core/src/ApolloServer.ts | 20 +- .../src/__tests__/documentStore.test.ts | 9 +- .../src/__tests__/runQuery.test.ts | 8 +- .../apollo-server-core/src/graphqlOptions.ts | 2 +- .../apollo-server-core/src/requestPipeline.ts | 5 +- packages/apollo-server-core/src/types.ts | 2 +- .../src/utils/pluginTestHarness.ts | 2 +- packages/apollo-server-core/tsconfig.json | 1 - .../src/ApolloServer.ts | 58 +++++- .../package.json | 2 +- .../src/ApolloServerPluginResponseCache.ts | 5 +- .../tsconfig.json | 1 - packages/apollo-server-types/package.json | 2 +- packages/apollo-server-types/src/index.ts | 2 +- packages/apollo-server-types/tsconfig.json | 4 +- 35 files changed, 286 insertions(+), 84 deletions(-) diff --git a/.prettierignore b/.prettierignore index 75c879f900e..667548ca807 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,3 +10,5 @@ docs/.cache/ # Don't format generated files! **/generated/** + +.volta diff --git a/CHANGELOG.md b/CHANGELOG.md index ad909c31bfb..e8be3244870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,11 @@ The version headers in this history reflect the versions of Apollo Server itself - [`@apollo/gateway`](https://github.com/apollographql/federation/blob/HEAD/gateway-js/CHANGELOG.md) - [`@apollo/federation`](https://github.com/apollographql/federation/blob/HEAD/federation-js/CHANGELOG.md) + ## vNEXT +- Remove internal dependency on `apollo-server-caching`, switch over to `@apollo/utils.keyvaluecache`. This PR specifically also introduces Keyv as an unbounded cache solution, but will replace with our own simple implementation in a follow-up PR targeting this minor version release. [PR #6522](https://github.com/apollographql/apollo-server/pull/6522) + ## v3.8.2 - `apollo-server-core`: Fix usage reporting plugin "willResolveField called after stopTiming!" error caused by a race condition related to null bubbling. [Issue #4472](https://github.com/apollographql/apollo-server/issues/4472) [PR #6398](https://github.com/apollographql/apollo-server/pull/6398) @@ -92,7 +95,7 @@ The version headers in this history reflect the versions of Apollo Server itself new ApolloServer({ documentStore: new InMemoryLRUCache({ maxSize: Math.pow(2, 20) * approximateDocumentStoreMiB, - sizeCalculator: InMemoryLRUCache.jsonBytesSizeCalculator, + sizeCalculator: InMemoryLRUCache.sizeCalculator, }), ...moreOptions, }) diff --git a/cspell-dict.txt b/cspell-dict.txt index f7d02e67caa..8bc102f3b5d 100644 --- a/cspell-dict.txt +++ b/cspell-dict.txt @@ -79,6 +79,8 @@ iteratees josephg jsdelivr keyv +keyvadapter +keyvaluecache KHTML Kubernetes linearizability diff --git a/docs/source/api/apollo-server.mdx b/docs/source/api/apollo-server.mdx index 076fddfe2d1..544f313176f 100644 --- a/docs/source/api/apollo-server.mdx +++ b/docs/source/api/apollo-server.mdx @@ -209,12 +209,12 @@ To use `InMemoryLRUCache` but change its size to an amount `approximateDocumentS
```typescript -import { InMemoryLRUCache } from 'apollo-server-caching'; +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; import type { DocumentNode } from 'graphql'; new ApolloServer({ documentStore: new InMemoryLRUCache({ maxSize: Math.pow(2, 20) * approximateDocumentStoreMiB, - sizeCalculator: InMemoryLRUCache.jsonBytesSizeCalculator, + sizeCalculation: InMemoryLRUCache.sizeCalculation, }), // ... }) diff --git a/package-lock.json b/package-lock.json index 511c4889e1f..0b1e6b826eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -209,6 +209,46 @@ "graphql": "14.x || 15.x || 16.x" } }, + "node_modules/@apollo/utils.keyvadapter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.keyvadapter/-/utils.keyvadapter-1.0.1.tgz", + "integrity": "sha512-o8u9w33txkxRzEAdvkZ3myGp0D9ShZqJZOB2bCQMcKs+IlXyedxAV1dlPirijFW0UiLYJ6V82vJNacrTejT38A==", + "dependencies": { + "@apollo/utils.keyvaluecache": "^1.0.1", + "keyv": "^4.2.8" + } + }, + "node_modules/@apollo/utils.keyvadapter/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/@apollo/utils.keyvadapter/node_modules/keyv": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", + "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", + "dependencies": { + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + }, + "node_modules/@apollo/utils.keyvaluecache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", + "integrity": "sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA==", + "dependencies": { + "@apollo/utils.logger": "^1.0.0", + "lru-cache": "^7.10.1" + } + }, + "node_modules/@apollo/utils.keyvaluecache/node_modules/lru-cache": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.10.1.tgz", + "integrity": "sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A==", + "engines": { + "node": ">=12" + } + }, "node_modules/@apollo/utils.logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-1.0.0.tgz", @@ -6687,6 +6727,11 @@ "integrity": "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==", "dev": true }, + "node_modules/@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" + }, "node_modules/@types/json-stable-stringify": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz", @@ -8753,6 +8798,23 @@ "dev": true, "license": "MIT" }, + "node_modules/compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "dependencies": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/compress-brotli/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -21258,7 +21320,7 @@ "version": "3.3.1", "license": "MIT", "dependencies": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-env": "file:../apollo-server-env" }, "engines": { @@ -21269,8 +21331,8 @@ "version": "3.6.0", "license": "MIT", "dependencies": { + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-datasource": "file:../apollo-datasource", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "apollo-server-errors": "file:../apollo-server-errors", "http-cache-semantics": "^4.1.0" @@ -21328,6 +21390,7 @@ "version": "3.3.1", "license": "MIT", "dependencies": { + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "memcached": "^2.2.2" @@ -21340,7 +21403,7 @@ "version": "3.3.1", "license": "MIT", "dependencies": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-env": "file:../apollo-server-env", "dataloader": "^2.0.0", "ioredis": "^4.17.3" @@ -21392,6 +21455,8 @@ "version": "3.8.2", "license": "MIT", "dependencies": { + "@apollo/utils.keyvadapter": "^1.0.1", + "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "@apollo/utils.usagereporting": "^1.0.0", "@apollographql/apollo-tools": "^0.5.3", @@ -21401,7 +21466,6 @@ "@josephg/resolvable": "^1.0.0", "apollo-datasource": "file:../apollo-datasource", "apollo-reporting-protobuf": "file:../apollo-reporting-protobuf", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "apollo-server-errors": "file:../apollo-server-errors", "apollo-server-plugin-base": "file:../apollo-server-plugin-base", @@ -21409,6 +21473,7 @@ "async-retry": "^1.2.1", "fast-json-stable-stringify": "^2.1.0", "graphql-tag": "^2.11.0", + "keyv": "^4.3.0", "loglevel": "^1.6.8", "lru-cache": "^6.0.0", "sha.js": "^2.4.11", @@ -21422,6 +21487,20 @@ "graphql": "^15.3.0 || ^16.0.0" } }, + "packages/apollo-server-core/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "packages/apollo-server-core/node_modules/keyv": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", + "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", + "dependencies": { + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + }, "packages/apollo-server-core/node_modules/uuid": { "version": "8.3.2", "license": "MIT", @@ -21643,7 +21722,7 @@ "version": "3.6.0", "license": "MIT", "dependencies": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-plugin-base": "file:../apollo-server-plugin-base", "apollo-server-types": "file:../apollo-server-types" }, @@ -21658,9 +21737,9 @@ "version": "3.6.0", "license": "MIT", "dependencies": { + "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "apollo-reporting-protobuf": "file:../apollo-reporting-protobuf", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env" }, "engines": { @@ -21735,6 +21814,47 @@ "integrity": "sha512-R2iZgXB+vTEx+B+N2mME0SP61+iEt+5fM26bYBvubyZflKed1VH2YiPLIl44nrahIph5JsTIvi/CeUsveJRZkg==", "requires": {} }, + "@apollo/utils.keyvadapter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.keyvadapter/-/utils.keyvadapter-1.0.1.tgz", + "integrity": "sha512-o8u9w33txkxRzEAdvkZ3myGp0D9ShZqJZOB2bCQMcKs+IlXyedxAV1dlPirijFW0UiLYJ6V82vJNacrTejT38A==", + "requires": { + "@apollo/utils.keyvaluecache": "^1.0.1", + "keyv": "^4.2.8" + }, + "dependencies": { + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "keyv": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", + "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", + "requires": { + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + } + } + }, + "@apollo/utils.keyvaluecache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", + "integrity": "sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA==", + "requires": { + "@apollo/utils.logger": "^1.0.0", + "lru-cache": "^7.10.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.10.1.tgz", + "integrity": "sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A==" + } + } + }, "@apollo/utils.logger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-1.0.0.tgz", @@ -26728,6 +26848,11 @@ "integrity": "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==", "dev": true }, + "@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" + }, "@types/json-stable-stringify": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz", @@ -27229,15 +27354,15 @@ "apollo-datasource": { "version": "file:packages/apollo-datasource", "requires": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-env": "file:../apollo-server-env" } }, "apollo-datasource-rest": { "version": "file:packages/apollo-datasource-rest", "requires": { + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-datasource": "file:../apollo-datasource", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "apollo-server-errors": "file:../apollo-server-errors", "http-cache-semantics": "^4.1.0" @@ -27272,6 +27397,7 @@ "apollo-server-cache-memcached": { "version": "file:packages/apollo-server-cache-memcached", "requires": { + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "memcached": "^2.2.2" @@ -27280,7 +27406,7 @@ "apollo-server-cache-redis": { "version": "file:packages/apollo-server-cache-redis", "requires": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-env": "file:../apollo-server-env", "dataloader": "^2.0.0", "ioredis": "^4.17.3" @@ -27311,6 +27437,8 @@ "apollo-server-core": { "version": "file:packages/apollo-server-core", "requires": { + "@apollo/utils.keyvadapter": "^1.0.1", + "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "@apollo/utils.usagereporting": "^1.0.0", "@apollographql/apollo-tools": "^0.5.3", @@ -27320,7 +27448,6 @@ "@josephg/resolvable": "^1.0.0", "apollo-datasource": "file:../apollo-datasource", "apollo-reporting-protobuf": "file:../apollo-reporting-protobuf", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "apollo-server-errors": "file:../apollo-server-errors", "apollo-server-plugin-base": "file:../apollo-server-plugin-base", @@ -27328,6 +27455,7 @@ "async-retry": "^1.2.1", "fast-json-stable-stringify": "^2.1.0", "graphql-tag": "^2.11.0", + "keyv": "^4.3.0", "loglevel": "^1.6.8", "lru-cache": "^6.0.0", "sha.js": "^2.4.11", @@ -27335,6 +27463,20 @@ "whatwg-mimetype": "^3.0.0" }, "dependencies": { + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "keyv": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", + "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", + "requires": { + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + }, "uuid": { "version": "8.3.2" }, @@ -27467,7 +27609,7 @@ "apollo-server-plugin-response-cache": { "version": "file:packages/apollo-server-plugin-response-cache", "requires": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-plugin-base": "file:../apollo-server-plugin-base", "apollo-server-types": "file:../apollo-server-types" } @@ -27475,9 +27617,9 @@ "apollo-server-types": { "version": "file:packages/apollo-server-types", "requires": { + "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "apollo-reporting-protobuf": "file:../apollo-reporting-protobuf", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env" } }, @@ -28501,6 +28643,22 @@ "version": "1.3.0", "dev": true }, + "compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "requires": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "dependencies": { + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + } + } + }, "concat-map": { "version": "0.0.1", "dev": true diff --git a/packages/apollo-datasource-rest/package.json b/packages/apollo-datasource-rest/package.json index e6d0bc08eaf..4abe67ca4d4 100644 --- a/packages/apollo-datasource-rest/package.json +++ b/packages/apollo-datasource-rest/package.json @@ -18,8 +18,8 @@ "node": ">=12.0" }, "dependencies": { + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-datasource": "file:../apollo-datasource", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "apollo-server-errors": "file:../apollo-server-errors", "http-cache-semantics": "^4.1.0" diff --git a/packages/apollo-datasource-rest/src/HTTPCache.ts b/packages/apollo-datasource-rest/src/HTTPCache.ts index d04cb37a0ec..a16e7513cfb 100644 --- a/packages/apollo-datasource-rest/src/HTTPCache.ts +++ b/packages/apollo-datasource-rest/src/HTTPCache.ts @@ -6,7 +6,7 @@ import { KeyValueCache, InMemoryLRUCache, PrefixingKeyValueCache, -} from 'apollo-server-caching'; +} from '@apollo/utils.keyvaluecache'; import type { CacheOptions } from './RESTDataSource'; export class HTTPCache { diff --git a/packages/apollo-datasource-rest/src/__tests__/HTTPCache.test.ts b/packages/apollo-datasource-rest/src/__tests__/HTTPCache.test.ts index aa20192c32f..7a8677dd0bd 100644 --- a/packages/apollo-datasource-rest/src/__tests__/HTTPCache.test.ts +++ b/packages/apollo-datasource-rest/src/__tests__/HTTPCache.test.ts @@ -352,8 +352,11 @@ describe('HTTPCache', () => { await httpCache.fetch(new Request('https://api.example.com/people/1')); - expect(storeSet.mock.calls[0][2]).toEqual({ ttl: 30 }); - + expect(storeSet).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + { ttl: 30 }, + ); storeSet.mockRestore(); }); @@ -367,7 +370,11 @@ describe('HTTPCache', () => { await httpCache.fetch(new Request('https://api.example.com/people/1')); - expect(storeSet.mock.calls[0][2]).toEqual({ ttl: 60 }); + expect(storeSet).toHaveBeenCalledWith( + expect.any(String), + expect.any(String), + { ttl: 60 }, + ); storeSet.mockRestore(); }); diff --git a/packages/apollo-datasource-rest/src/__tests__/MapKeyValueCache.ts b/packages/apollo-datasource-rest/src/__tests__/MapKeyValueCache.ts index 9e88a2fa48d..96b96e2605e 100644 --- a/packages/apollo-datasource-rest/src/__tests__/MapKeyValueCache.ts +++ b/packages/apollo-datasource-rest/src/__tests__/MapKeyValueCache.ts @@ -1,14 +1,11 @@ -import type { - KeyValueCache, - KeyValueCacheSetOptions, -} from 'apollo-server-caching'; +import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; export class MapKeyValueCache implements KeyValueCache { store = new Map(); async get(key: string) { return this.store.get(key); } - async set(key: string, value: V, _?: KeyValueCacheSetOptions) { + async set(key: string, value: V) { this.store.set(key, value); } async delete(key: string) { diff --git a/packages/apollo-datasource-rest/tsconfig.json b/packages/apollo-datasource-rest/tsconfig.json index 83c0c7fe9c3..e53836dcde3 100644 --- a/packages/apollo-datasource-rest/tsconfig.json +++ b/packages/apollo-datasource-rest/tsconfig.json @@ -8,7 +8,6 @@ "exclude": ["**/__tests__"], "references": [ { "path": "../apollo-datasource" }, - { "path": "../apollo-server-caching" }, { "path": "../apollo-server-errors" }, ] } diff --git a/packages/apollo-datasource/package.json b/packages/apollo-datasource/package.json index 224f7036da9..cbd9cd0f7d4 100644 --- a/packages/apollo-datasource/package.json +++ b/packages/apollo-datasource/package.json @@ -18,7 +18,7 @@ "node": ">=12.0" }, "dependencies": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-env": "file:../apollo-server-env" } } diff --git a/packages/apollo-datasource/src/index.ts b/packages/apollo-datasource/src/index.ts index 424dbd4402f..e11c6370b69 100644 --- a/packages/apollo-datasource/src/index.ts +++ b/packages/apollo-datasource/src/index.ts @@ -1,4 +1,4 @@ -import type { KeyValueCache } from 'apollo-server-caching'; +import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; export interface DataSourceConfig { context: TContext; diff --git a/packages/apollo-datasource/tsconfig.json b/packages/apollo-datasource/tsconfig.json index dab7afbdc99..98e3dc7fa93 100644 --- a/packages/apollo-datasource/tsconfig.json +++ b/packages/apollo-datasource/tsconfig.json @@ -6,7 +6,5 @@ }, "include": ["src/**/*"], "exclude": ["**/__tests__"], - "references": [ - { "path": "../apollo-server-caching" }, - ] + "references": [] } diff --git a/packages/apollo-server-cache-memcached/package.json b/packages/apollo-server-cache-memcached/package.json index 98b9470c015..29302cc4caa 100644 --- a/packages/apollo-server-cache-memcached/package.json +++ b/packages/apollo-server-cache-memcached/package.json @@ -18,6 +18,7 @@ "node": ">=12.0" }, "dependencies": { + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "memcached": "^2.2.2" diff --git a/packages/apollo-server-cache-memcached/src/index.ts b/packages/apollo-server-cache-memcached/src/index.ts index cf66cdb82fa..cec2d9899c3 100644 --- a/packages/apollo-server-cache-memcached/src/index.ts +++ b/packages/apollo-server-cache-memcached/src/index.ts @@ -1,7 +1,7 @@ import type { KeyValueCache, KeyValueCacheSetOptions, -} from 'apollo-server-caching'; +} from '@apollo/utils.keyvaluecache'; import Memcached from 'memcached'; import { promisify } from 'util'; diff --git a/packages/apollo-server-cache-memcached/tsconfig.json b/packages/apollo-server-cache-memcached/tsconfig.json index dab7afbdc99..98e3dc7fa93 100644 --- a/packages/apollo-server-cache-memcached/tsconfig.json +++ b/packages/apollo-server-cache-memcached/tsconfig.json @@ -6,7 +6,5 @@ }, "include": ["src/**/*"], "exclude": ["**/__tests__"], - "references": [ - { "path": "../apollo-server-caching" }, - ] + "references": [] } diff --git a/packages/apollo-server-cache-redis/package.json b/packages/apollo-server-cache-redis/package.json index 87682ae3262..647241d458e 100644 --- a/packages/apollo-server-cache-redis/package.json +++ b/packages/apollo-server-cache-redis/package.json @@ -18,7 +18,7 @@ "node": ">=12.0" }, "dependencies": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-env": "file:../apollo-server-env", "dataloader": "^2.0.0", "ioredis": "^4.17.3" diff --git a/packages/apollo-server-cache-redis/src/BaseRedisCache.ts b/packages/apollo-server-cache-redis/src/BaseRedisCache.ts index bd66e9ca1d8..9b375894cbd 100644 --- a/packages/apollo-server-cache-redis/src/BaseRedisCache.ts +++ b/packages/apollo-server-cache-redis/src/BaseRedisCache.ts @@ -1,7 +1,7 @@ import type { KeyValueCache, KeyValueCacheSetOptions, -} from 'apollo-server-caching'; +} from '@apollo/utils.keyvaluecache'; import DataLoader from 'dataloader'; interface BaseRedisClient { diff --git a/packages/apollo-server-cache-redis/tsconfig.json b/packages/apollo-server-cache-redis/tsconfig.json index dab7afbdc99..98e3dc7fa93 100644 --- a/packages/apollo-server-cache-redis/tsconfig.json +++ b/packages/apollo-server-cache-redis/tsconfig.json @@ -6,7 +6,5 @@ }, "include": ["src/**/*"], "exclude": ["**/__tests__"], - "references": [ - { "path": "../apollo-server-caching" }, - ] + "references": [] } diff --git a/packages/apollo-server-core/package.json b/packages/apollo-server-core/package.json index 998ab523171..c3704e5c397 100644 --- a/packages/apollo-server-core/package.json +++ b/packages/apollo-server-core/package.json @@ -25,6 +25,8 @@ "node": ">=12.0" }, "dependencies": { + "@apollo/utils.keyvadapter": "^1.0.1", + "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "@apollo/utils.usagereporting": "^1.0.0", "@apollographql/apollo-tools": "^0.5.3", @@ -34,7 +36,6 @@ "@josephg/resolvable": "^1.0.0", "apollo-datasource": "file:../apollo-datasource", "apollo-reporting-protobuf": "file:../apollo-reporting-protobuf", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env", "apollo-server-errors": "file:../apollo-server-errors", "apollo-server-plugin-base": "file:../apollo-server-plugin-base", @@ -42,6 +43,7 @@ "async-retry": "^1.2.1", "fast-json-stable-stringify": "^2.1.0", "graphql-tag": "^2.11.0", + "keyv": "^4.3.0", "loglevel": "^1.6.8", "lru-cache": "^6.0.0", "sha.js": "^2.4.11", diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index 18ae8a1bd9f..bc7a0c9e025 100644 --- a/packages/apollo-server-core/src/ApolloServer.ts +++ b/packages/apollo-server-core/src/ApolloServer.ts @@ -14,7 +14,7 @@ import resolvable, { Resolvable } from '@josephg/resolvable'; import { InMemoryLRUCache, PrefixingKeyValueCache, -} from 'apollo-server-caching'; +} from '@apollo/utils.keyvaluecache'; import type { ApolloServerPlugin, GraphQLServiceContext, @@ -60,6 +60,8 @@ import { InternalPluginId, pluginIsInternal } from './internalPlugin'; import { newCachePolicy } from './cachePolicy'; import { GatewayIsTooOldError, SchemaManager } from './utils/schemaManager'; import * as uuid from 'uuid'; +import { KeyvAdapter } from '@apollo/utils.keyvadapter'; +import Keyv from 'keyv'; const NoIntrospection = (context: ValidationContext) => ({ Field(node: FieldDefinitionNode) { @@ -709,7 +711,7 @@ export class ApolloServerBase< // random prefix each time we get a new schema. documentStore: this.config.documentStore === undefined - ? this.initializeDocumentStore() + ? new KeyvAdapter(new Keyv()) : this.config.documentStore === null ? null : new PrefixingKeyValueCache( @@ -906,20 +908,6 @@ export class ApolloServerBase< } } - private initializeDocumentStore(): InMemoryLRUCache { - return new InMemoryLRUCache({ - // Create ~about~ a 30MiB InMemoryLRUCache. This is less than precise - // since the technique to calculate the size of a DocumentNode is - // only using JSON.stringify on the DocumentNode (and thus doesn't account - // for unicode characters, etc.), but it should do a reasonable job at - // providing a caching document store for most operations. - // - // If you want to tweak the max size, pass in your own documentStore. - maxSize: Math.pow(2, 20) * 30, - sizeCalculator: InMemoryLRUCache.jsonBytesSizeCalculator, - }); - } - // This function is used by the integrations to generate the graphQLOptions // from an object containing the request and other integration specific // options diff --git a/packages/apollo-server-core/src/__tests__/documentStore.test.ts b/packages/apollo-server-core/src/__tests__/documentStore.test.ts index 319b6775393..4f3f76cdc53 100644 --- a/packages/apollo-server-core/src/__tests__/documentStore.test.ts +++ b/packages/apollo-server-core/src/__tests__/documentStore.test.ts @@ -2,7 +2,8 @@ import gql from 'graphql-tag'; import type { DocumentNode } from 'graphql'; import { ApolloServerBase } from '../ApolloServer'; -import { InMemoryLRUCache } from 'apollo-server-caching'; +import { KeyvAdapter } from '@apollo/utils.keyvadapter'; +import assert from 'assert'; const typeDefs = gql` type Query { @@ -51,12 +52,12 @@ describe('ApolloServerBase documentStore', () => { await server.start(); const options = await server.graphQLServerOptions(); - const embeddedStore = options.documentStore as any; - expect(embeddedStore).toBeInstanceOf(InMemoryLRUCache); + const embeddedStore = options.documentStore; + assert(embeddedStore); + expect(embeddedStore).toBeInstanceOf(KeyvAdapter); await server.executeOperation(operations.simple.op); - expect(await embeddedStore.getTotalSize()).toBe(403); expect(await embeddedStore.get(operations.simple.hash)).toMatchObject( documentNodeMatcher, ); diff --git a/packages/apollo-server-core/src/__tests__/runQuery.test.ts b/packages/apollo-server-core/src/__tests__/runQuery.test.ts index ee6595cb5d8..7336d64fc92 100644 --- a/packages/apollo-server-core/src/__tests__/runQuery.test.ts +++ b/packages/apollo-server-core/src/__tests__/runQuery.test.ts @@ -28,7 +28,7 @@ import type { GraphQLRequestListenerValidationDidEnd, GraphQLRequestContext, } from 'apollo-server-plugin-base'; -import { InMemoryLRUCache } from 'apollo-server-caching'; +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; import { newCachePolicy } from '../cachePolicy'; // This is a temporary kludge to ensure we preserve runQuery behavior with the @@ -1157,12 +1157,12 @@ describe('runQuery', () => { // size of the two smaller queries. All three of these queries will never // fit into this cache, so we'll roll through them all. const maxSize = - InMemoryLRUCache.jsonBytesSizeCalculator(parse(querySmall1)) + - InMemoryLRUCache.jsonBytesSizeCalculator(parse(querySmall2)); + InMemoryLRUCache.sizeCalculation(parse(querySmall1)) + + InMemoryLRUCache.sizeCalculation(parse(querySmall2)); const documentStore = new InMemoryLRUCache({ maxSize, - sizeCalculator: InMemoryLRUCache.jsonBytesSizeCalculator, + sizeCalculation: InMemoryLRUCache.sizeCalculation, }); await runRequest({ plugins, documentStore, queryString: querySmall1 }); diff --git a/packages/apollo-server-core/src/graphqlOptions.ts b/packages/apollo-server-core/src/graphqlOptions.ts index 499c6d63c75..039b51ed710 100644 --- a/packages/apollo-server-core/src/graphqlOptions.ts +++ b/packages/apollo-server-core/src/graphqlOptions.ts @@ -7,7 +7,7 @@ import type { GraphQLFormattedError, ParseOptions, } from 'graphql'; -import type { KeyValueCache } from 'apollo-server-caching'; +import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; import type { DataSource } from 'apollo-datasource'; import type { ApolloServerPlugin } from 'apollo-server-plugin-base'; import type { diff --git a/packages/apollo-server-core/src/requestPipeline.ts b/packages/apollo-server-core/src/requestPipeline.ts index 4c2a40fb0ec..ab6ded805ef 100644 --- a/packages/apollo-server-core/src/requestPipeline.ts +++ b/packages/apollo-server-core/src/requestPipeline.ts @@ -53,7 +53,10 @@ import type { } from 'apollo-server-plugin-base'; import { Dispatcher } from './utils/dispatcher'; -import { KeyValueCache, PrefixingKeyValueCache } from 'apollo-server-caching'; +import { + KeyValueCache, + PrefixingKeyValueCache, +} from '@apollo/utils.keyvaluecache'; export { GraphQLRequest, GraphQLResponse, GraphQLRequestContext }; diff --git a/packages/apollo-server-core/src/types.ts b/packages/apollo-server-core/src/types.ts index 16228ac6de3..db3fa2244b2 100644 --- a/packages/apollo-server-core/src/types.ts +++ b/packages/apollo-server-core/src/types.ts @@ -18,7 +18,7 @@ import type { GraphQLSchemaModule } from '@apollographql/apollo-tools'; export type { GraphQLSchemaModule }; -import type { KeyValueCache } from 'apollo-server-caching'; +import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; export type { KeyValueCache }; export type Context = T; diff --git a/packages/apollo-server-core/src/utils/pluginTestHarness.ts b/packages/apollo-server-core/src/utils/pluginTestHarness.ts index d44203ce785..24b0ea90060 100644 --- a/packages/apollo-server-core/src/utils/pluginTestHarness.ts +++ b/packages/apollo-server-core/src/utils/pluginTestHarness.ts @@ -23,7 +23,7 @@ import type { GraphQLRequestExecutionListener, GraphQLServerListener, } from 'apollo-server-plugin-base'; -import { InMemoryLRUCache } from 'apollo-server-caching'; +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; import { Dispatcher } from './dispatcher'; import { getOperationAST, parse, validate as graphqlValidate } from 'graphql'; import { newCachePolicy } from '../cachePolicy'; diff --git a/packages/apollo-server-core/tsconfig.json b/packages/apollo-server-core/tsconfig.json index 6f7f9635a2a..0f7c94862f0 100644 --- a/packages/apollo-server-core/tsconfig.json +++ b/packages/apollo-server-core/tsconfig.json @@ -8,7 +8,6 @@ "exclude": ["**/__tests__"], "references": [ { "path": "../apollo-datasource" }, - { "path": "../apollo-server-caching" }, { "path": "../apollo-server-errors" }, { "path": "../apollo-server-plugin-base" }, { "path": "../apollo-server-types" }, diff --git a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts index f210f08b4c6..6ba585f4bb9 100644 --- a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts +++ b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts @@ -58,7 +58,10 @@ import resolvable, { Resolvable } from '@josephg/resolvable'; import FakeTimers from '@sinonjs/fake-timers'; import type { AddressInfo } from 'net'; import request, { Response } from 'supertest'; -import { InMemoryLRUCache } from 'apollo-server-caching'; +import { + type KeyValueCache, + InMemoryLRUCache, +} from '@apollo/utils.keyvaluecache'; const quietLogger = loglevel.getLogger('quiet'); quietLogger.setLevel(loglevel.levels.WARN); @@ -2251,11 +2254,10 @@ export function testApolloServer( describe('Response caching', () => { let clock: FakeTimers.InstalledClock; beforeAll(() => { - // These tests use the default InMemoryLRUCache, which is backed by the - // lru-cache npm module, whose maxAge feature is based on `Date.now()` - // (no setTimeout or anything like that). So we want to use fake timers - // just for Date. (Faking all the timer methods messes up things like a - // setImmediate in ApolloServerPluginDrainHttpServer.) + // The ApolloServerPluginResponseCache uses Date.now() to derive the + // "age" header, so we want to use fake timers just for Date. (Faking + // all the timer methods messes up things like a setImmediate in + // ApolloServerPluginDrainHttpServer.) clock = FakeTimers.install({ toFake: ['Date'] }); }); @@ -2264,6 +2266,44 @@ export function testApolloServer( }); it('basic caching', async () => { + class TTLTestingCache implements KeyValueCache { + private fakeTime = 0; + constructor( + private cache: Map< + string, + { value: string; deadline: number | null } + > = new Map(), + ) {} + + async get(key: string) { + const entry = this.cache.get(key); + if (!entry) return undefined; + if (entry.deadline && entry.deadline <= this.fakeTime) { + await this.delete(key); + return undefined; + } + return entry.value; + } + + async set( + key: string, + value: string, + { ttl }: { ttl: number | null } = { ttl: null }, + ) { + this.cache.set(key, { + value, + deadline: ttl ? this.fakeTime + ttl * 1000 : null, + }); + } + + async delete(key: string) { + this.cache.delete(key); + } + + advanceTime(ms: number) { + this.fakeTime += ms; + } + } const typeDefs = gql` type Query { cached: String @cacheControl(maxAge: 10) @@ -2319,9 +2359,12 @@ export function testApolloServer( }; }); + const fakeTTLCache = new TTLTestingCache(); + const { url: uri } = await createApolloServer({ typeDefs, resolvers, + cache: fakeTTLCache, plugins: [ ApolloServerPluginResponseCache({ sessionId: (requestContext: GraphQLRequestContext) => { @@ -2445,6 +2488,7 @@ export function testApolloServer( } // Cache hit partway to ttl. + fakeTTLCache.advanceTime(5 * 1000); clock.tick(5 * 1000); { const result = await fetch(); @@ -2456,6 +2500,7 @@ export function testApolloServer( } // Cache miss after ttl. + fakeTTLCache.advanceTime(6 * 1000); clock.tick(6 * 1000); { const result = await fetch(); @@ -2733,6 +2778,7 @@ export function testApolloServer( } // Let's expire the cache, and run again, not writing to the cache. + fakeTTLCache.advanceTime(15 * 1000); clock.tick(15 * 1000); { const result = await doFetch({ diff --git a/packages/apollo-server-plugin-response-cache/package.json b/packages/apollo-server-plugin-response-cache/package.json index 6b431a59d4a..ddb20941c3f 100644 --- a/packages/apollo-server-plugin-response-cache/package.json +++ b/packages/apollo-server-plugin-response-cache/package.json @@ -20,7 +20,7 @@ "node": ">=12.0" }, "dependencies": { - "apollo-server-caching": "file:../apollo-server-caching", + "@apollo/utils.keyvaluecache": "^1.0.1", "apollo-server-plugin-base": "file:../apollo-server-plugin-base", "apollo-server-types": "file:../apollo-server-types" }, diff --git a/packages/apollo-server-plugin-response-cache/src/ApolloServerPluginResponseCache.ts b/packages/apollo-server-plugin-response-cache/src/ApolloServerPluginResponseCache.ts index 71da54b6fc4..45009f88c65 100644 --- a/packages/apollo-server-plugin-response-cache/src/ApolloServerPluginResponseCache.ts +++ b/packages/apollo-server-plugin-response-cache/src/ApolloServerPluginResponseCache.ts @@ -8,7 +8,10 @@ import type { CacheHint, ValueOrPromise, } from 'apollo-server-types'; -import { KeyValueCache, PrefixingKeyValueCache } from 'apollo-server-caching'; +import { + KeyValueCache, + PrefixingKeyValueCache, +} from '@apollo/utils.keyvaluecache'; import { CacheScope } from 'apollo-server-types'; // XXX This should use createSHA from apollo-server-core in order to work on diff --git a/packages/apollo-server-plugin-response-cache/tsconfig.json b/packages/apollo-server-plugin-response-cache/tsconfig.json index 5c4502fa2c5..f6504a7fb5c 100644 --- a/packages/apollo-server-plugin-response-cache/tsconfig.json +++ b/packages/apollo-server-plugin-response-cache/tsconfig.json @@ -8,7 +8,6 @@ "exclude": ["**/__tests__"], "references": [ { "path": "../apollo-server-plugin-base" }, - { "path": "../apollo-server-caching" }, { "path": "../apollo-server-types" }, ] } diff --git a/packages/apollo-server-types/package.json b/packages/apollo-server-types/package.json index 38572f2ac18..796fc207f5b 100644 --- a/packages/apollo-server-types/package.json +++ b/packages/apollo-server-types/package.json @@ -11,9 +11,9 @@ "node": ">=12.0" }, "dependencies": { + "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "apollo-reporting-protobuf": "file:../apollo-reporting-protobuf", - "apollo-server-caching": "file:../apollo-server-caching", "apollo-server-env": "file:../apollo-server-env" }, "peerDependencies": { diff --git a/packages/apollo-server-types/src/index.ts b/packages/apollo-server-types/src/index.ts index 48f0745de8f..cea8ab2d08c 100644 --- a/packages/apollo-server-types/src/index.ts +++ b/packages/apollo-server-types/src/index.ts @@ -12,7 +12,7 @@ import type { } from 'graphql'; // This seems like it could live in this package too. -import type { KeyValueCache } from 'apollo-server-caching'; +import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; import type { Trace } from 'apollo-reporting-protobuf'; import type { Logger } from '@apollo/utils.logger'; diff --git a/packages/apollo-server-types/tsconfig.json b/packages/apollo-server-types/tsconfig.json index 4adeddc00e9..98e3dc7fa93 100644 --- a/packages/apollo-server-types/tsconfig.json +++ b/packages/apollo-server-types/tsconfig.json @@ -6,7 +6,5 @@ }, "include": ["src/**/*"], "exclude": ["**/__tests__"], - "references": [ - { "path": "../apollo-server-caching/" }, - ] + "references": [] } From 67d9036bdd7a8e0122c6c77a68d48a28e0fad904 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Tue, 7 Jun 2022 15:35:38 -0700 Subject: [PATCH 02/10] Implement simple `UnboundedCache` (#6535) This introduces a simple Map-backed, unbounded, in-memory cache which implements TTLs. This lets us remove the dependency on keyv and @apollo/utils.keyvadapter for a thing that we're going to actively tell people not to use anyway. --- CHANGELOG.md | 1 + package-lock.json | 123 ------------------ packages/apollo-server-core/package.json | 2 - .../apollo-server-core/src/ApolloServer.ts | 5 +- .../src/__tests__/UnboundedCache.test.ts | 35 +++++ .../src/__tests__/documentStore.test.ts | 4 +- .../src/utils/UnboundedCache.ts | 35 +++++ 7 files changed, 75 insertions(+), 130 deletions(-) create mode 100644 packages/apollo-server-core/src/__tests__/UnboundedCache.test.ts create mode 100644 packages/apollo-server-core/src/utils/UnboundedCache.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index e8be3244870..e1dd0811d9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The version headers in this history reflect the versions of Apollo Server itself ## vNEXT - Remove internal dependency on `apollo-server-caching`, switch over to `@apollo/utils.keyvaluecache`. This PR specifically also introduces Keyv as an unbounded cache solution, but will replace with our own simple implementation in a follow-up PR targeting this minor version release. [PR #6522](https://github.com/apollographql/apollo-server/pull/6522) +- Remove dependency on `keyv`/`@apollo/utils.keyvadapter` in favor of a simple `Map`-backed cache which implements TTL [PR #6535](https://github.com/apollographql/apollo-server/pull/6535) ## v3.8.2 diff --git a/package-lock.json b/package-lock.json index 0b1e6b826eb..341316ef204 100644 --- a/package-lock.json +++ b/package-lock.json @@ -209,29 +209,6 @@ "graphql": "14.x || 15.x || 16.x" } }, - "node_modules/@apollo/utils.keyvadapter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.keyvadapter/-/utils.keyvadapter-1.0.1.tgz", - "integrity": "sha512-o8u9w33txkxRzEAdvkZ3myGp0D9ShZqJZOB2bCQMcKs+IlXyedxAV1dlPirijFW0UiLYJ6V82vJNacrTejT38A==", - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "keyv": "^4.2.8" - } - }, - "node_modules/@apollo/utils.keyvadapter/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/@apollo/utils.keyvadapter/node_modules/keyv": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", - "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", - "dependencies": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" - } - }, "node_modules/@apollo/utils.keyvaluecache": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", @@ -6727,11 +6704,6 @@ "integrity": "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==", "dev": true }, - "node_modules/@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" - }, "node_modules/@types/json-stable-stringify": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz", @@ -8798,23 +8770,6 @@ "dev": true, "license": "MIT" }, - "node_modules/compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dependencies": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/compress-brotli/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -21455,7 +21410,6 @@ "version": "3.8.2", "license": "MIT", "dependencies": { - "@apollo/utils.keyvadapter": "^1.0.1", "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "@apollo/utils.usagereporting": "^1.0.0", @@ -21473,7 +21427,6 @@ "async-retry": "^1.2.1", "fast-json-stable-stringify": "^2.1.0", "graphql-tag": "^2.11.0", - "keyv": "^4.3.0", "loglevel": "^1.6.8", "lru-cache": "^6.0.0", "sha.js": "^2.4.11", @@ -21487,20 +21440,6 @@ "graphql": "^15.3.0 || ^16.0.0" } }, - "packages/apollo-server-core/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "packages/apollo-server-core/node_modules/keyv": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", - "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", - "dependencies": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" - } - }, "packages/apollo-server-core/node_modules/uuid": { "version": "8.3.2", "license": "MIT", @@ -21814,31 +21753,6 @@ "integrity": "sha512-R2iZgXB+vTEx+B+N2mME0SP61+iEt+5fM26bYBvubyZflKed1VH2YiPLIl44nrahIph5JsTIvi/CeUsveJRZkg==", "requires": {} }, - "@apollo/utils.keyvadapter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.keyvadapter/-/utils.keyvadapter-1.0.1.tgz", - "integrity": "sha512-o8u9w33txkxRzEAdvkZ3myGp0D9ShZqJZOB2bCQMcKs+IlXyedxAV1dlPirijFW0UiLYJ6V82vJNacrTejT38A==", - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "keyv": "^4.2.8" - }, - "dependencies": { - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "keyv": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", - "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", - "requires": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" - } - } - } - }, "@apollo/utils.keyvaluecache": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", @@ -26848,11 +26762,6 @@ "integrity": "sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==", "dev": true }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" - }, "@types/json-stable-stringify": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz", @@ -27437,7 +27346,6 @@ "apollo-server-core": { "version": "file:packages/apollo-server-core", "requires": { - "@apollo/utils.keyvadapter": "^1.0.1", "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "@apollo/utils.usagereporting": "^1.0.0", @@ -27455,7 +27363,6 @@ "async-retry": "^1.2.1", "fast-json-stable-stringify": "^2.1.0", "graphql-tag": "^2.11.0", - "keyv": "^4.3.0", "loglevel": "^1.6.8", "lru-cache": "^6.0.0", "sha.js": "^2.4.11", @@ -27463,20 +27370,6 @@ "whatwg-mimetype": "^3.0.0" }, "dependencies": { - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "keyv": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", - "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", - "requires": { - "compress-brotli": "^1.3.8", - "json-buffer": "3.0.1" - } - }, "uuid": { "version": "8.3.2" }, @@ -28643,22 +28536,6 @@ "version": "1.3.0", "dev": true }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "dependencies": { - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - } - } - }, "concat-map": { "version": "0.0.1", "dev": true diff --git a/packages/apollo-server-core/package.json b/packages/apollo-server-core/package.json index c3704e5c397..0e925a4a3d7 100644 --- a/packages/apollo-server-core/package.json +++ b/packages/apollo-server-core/package.json @@ -25,7 +25,6 @@ "node": ">=12.0" }, "dependencies": { - "@apollo/utils.keyvadapter": "^1.0.1", "@apollo/utils.keyvaluecache": "^1.0.1", "@apollo/utils.logger": "^1.0.0", "@apollo/utils.usagereporting": "^1.0.0", @@ -43,7 +42,6 @@ "async-retry": "^1.2.1", "fast-json-stable-stringify": "^2.1.0", "graphql-tag": "^2.11.0", - "keyv": "^4.3.0", "loglevel": "^1.6.8", "lru-cache": "^6.0.0", "sha.js": "^2.4.11", diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index bc7a0c9e025..1736f53a828 100644 --- a/packages/apollo-server-core/src/ApolloServer.ts +++ b/packages/apollo-server-core/src/ApolloServer.ts @@ -60,8 +60,7 @@ import { InternalPluginId, pluginIsInternal } from './internalPlugin'; import { newCachePolicy } from './cachePolicy'; import { GatewayIsTooOldError, SchemaManager } from './utils/schemaManager'; import * as uuid from 'uuid'; -import { KeyvAdapter } from '@apollo/utils.keyvadapter'; -import Keyv from 'keyv'; +import { UnboundedCache } from './utils/UnboundedCache'; const NoIntrospection = (context: ValidationContext) => ({ Field(node: FieldDefinitionNode) { @@ -711,7 +710,7 @@ export class ApolloServerBase< // random prefix each time we get a new schema. documentStore: this.config.documentStore === undefined - ? new KeyvAdapter(new Keyv()) + ? new UnboundedCache() : this.config.documentStore === null ? null : new PrefixingKeyValueCache( diff --git a/packages/apollo-server-core/src/__tests__/UnboundedCache.test.ts b/packages/apollo-server-core/src/__tests__/UnboundedCache.test.ts new file mode 100644 index 00000000000..cee09643d50 --- /dev/null +++ b/packages/apollo-server-core/src/__tests__/UnboundedCache.test.ts @@ -0,0 +1,35 @@ +import { UnboundedCache } from '../utils/UnboundedCache'; + +describe('UnboundedCache', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + afterAll(() => { + jest.useRealTimers(); + }); + + it('basic get, set, delete', async () => { + const cache = new UnboundedCache(); + + await cache.set('key', 'value'); + expect(await cache.get('key')).toBe('value'); + + await cache.delete('key'); + expect(await cache.get('key')).toBeUndefined(); + }); + + it('get with ttl', async () => { + const cache = new UnboundedCache(); + + // 1s, or 1000ms + await cache.set('key', 'value', { ttl: 1 }); + + // check that it's there at 999ms + jest.advanceTimersByTime(999); + expect(await cache.get('key')).toBe('value'); + + // expire + jest.advanceTimersByTime(1); + expect(await cache.get('key')).toBeUndefined(); + }); +}); diff --git a/packages/apollo-server-core/src/__tests__/documentStore.test.ts b/packages/apollo-server-core/src/__tests__/documentStore.test.ts index 4f3f76cdc53..4570f1c89a9 100644 --- a/packages/apollo-server-core/src/__tests__/documentStore.test.ts +++ b/packages/apollo-server-core/src/__tests__/documentStore.test.ts @@ -2,8 +2,8 @@ import gql from 'graphql-tag'; import type { DocumentNode } from 'graphql'; import { ApolloServerBase } from '../ApolloServer'; -import { KeyvAdapter } from '@apollo/utils.keyvadapter'; import assert from 'assert'; +import { UnboundedCache } from '../utils/UnboundedCache'; const typeDefs = gql` type Query { @@ -54,7 +54,7 @@ describe('ApolloServerBase documentStore', () => { const options = await server.graphQLServerOptions(); const embeddedStore = options.documentStore; assert(embeddedStore); - expect(embeddedStore).toBeInstanceOf(KeyvAdapter); + expect(embeddedStore).toBeInstanceOf(UnboundedCache); await server.executeOperation(operations.simple.op); diff --git a/packages/apollo-server-core/src/utils/UnboundedCache.ts b/packages/apollo-server-core/src/utils/UnboundedCache.ts new file mode 100644 index 00000000000..5da7eadd2f4 --- /dev/null +++ b/packages/apollo-server-core/src/utils/UnboundedCache.ts @@ -0,0 +1,35 @@ +import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; + +export class UnboundedCache implements KeyValueCache { + constructor( + private cache: Map< + string, + { value: T; deadline: number | null } + > = new Map(), + ) {} + + async get(key: string) { + const entry = this.cache.get(key); + if (!entry) return undefined; + if (entry.deadline && entry.deadline <= Date.now()) { + await this.delete(key); + return undefined; + } + return entry.value; + } + + async set( + key: string, + value: T, + { ttl }: { ttl: number | null } = { ttl: null }, + ) { + this.cache.set(key, { + value, + deadline: ttl ? Date.now() + ttl * 1000 : null, + }); + } + + async delete(key: string) { + this.cache.delete(key); + } +} From f66fddc6043740a67ac01ba7ec491fc5c7ac3c1e Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Tue, 7 Jun 2022 17:54:18 -0700 Subject: [PATCH 03/10] Add `cache: "bounded"` configuration option (#6536) This commit introduces the `cache: "bounded"` option. AS3 has an unbounded cache by default, which means that a malicious client can take an open-ended amount of memory in the cache, crashing the server. Rather than breaking what has been the status quo since the beginning of the project, we've chosen to add an opt-in option in order to use a bounded cache with very little configuration. Similar to `csrfPrevention`, we've updated all examples in our docs to use this `bounded` option. This option will go away in AS4 when a bounded cache becomes the default. --- CHANGELOG.md | 1 + docs/source/api/apollo-server.mdx | 21 ++++++ docs/source/api/plugin/cache-control.md | 2 + docs/source/api/plugin/drain-http-server.mdx | 1 + docs/source/api/plugin/inline-trace.md | 2 + docs/source/api/plugin/landing-pages.md | 10 ++- docs/source/api/plugin/schema-reporting.md | 1 + docs/source/api/plugin/usage-reporting.md | 2 + docs/source/builtin-plugins.md | 1 + docs/source/data/data-sources.mdx | 1 + docs/source/data/errors.mdx | 5 ++ docs/source/data/file-uploads.mdx | 2 + docs/source/data/resolvers.mdx | 15 +++- docs/source/data/subscriptions.mdx | 3 + docs/source/deployment/azure-functions.mdx | 7 +- docs/source/deployment/gcp-functions.mdx | 2 + docs/source/deployment/lambda.md | 8 +- docs/source/getting-started.mdx | 1 + docs/source/integrations/middleware.mdx | 47 ++++++++++-- docs/source/integrations/plugins.md | 1 + docs/source/monitoring/health-checks.md | 3 +- docs/source/monitoring/metrics.md | 8 +- docs/source/performance/apq.md | 8 ++ docs/source/proxy-configuration.md | 1 + docs/source/schema/creating-directives.mdx | 6 +- docs/source/schema/custom-scalars.md | 21 ++++-- docs/source/schema/unions-interfaces.md | 1 + docs/source/security/authentication.md | 4 +- docs/source/security/cors.mdx | 2 + docs/source/security/terminating-ssl.mdx | 7 +- .../apollo-server-core/src/ApolloServer.ts | 6 +- packages/apollo-server-core/src/types.ts | 2 +- .../src/ApolloServer.ts | 73 ++++++++----------- 33 files changed, 205 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1dd0811d9a..d5d8aa2233f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ The version headers in this history reflect the versions of Apollo Server itself - Remove internal dependency on `apollo-server-caching`, switch over to `@apollo/utils.keyvaluecache`. This PR specifically also introduces Keyv as an unbounded cache solution, but will replace with our own simple implementation in a follow-up PR targeting this minor version release. [PR #6522](https://github.com/apollographql/apollo-server/pull/6522) - Remove dependency on `keyv`/`@apollo/utils.keyvadapter` in favor of a simple `Map`-backed cache which implements TTL [PR #6535](https://github.com/apollographql/apollo-server/pull/6535) +- Add `cache: "bounded"` configuration option, allowing users to opt into bounded request cache (recommended) [PR #6536](https://github.com/apollographql/apollo-server/pull/6536) ## v3.8.2 diff --git a/docs/source/api/apollo-server.mdx b/docs/source/api/apollo-server.mdx index 544f313176f..3cc6fd38110 100644 --- a/docs/source/api/apollo-server.mdx +++ b/docs/source/api/apollo-server.mdx @@ -20,6 +20,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, // highly recommended + cache: 'bounded', }); ``` @@ -228,6 +229,25 @@ Available in Apollo Server v3.4.0 and later. + + + +##### `cache` + +`KeyValueCache | "bounded"` + + + +A `KeyValueCache` which Apollo Server uses for a number of features like APQs and full response caching. This cache is also provided to DataSources and plugins. + +By default, the cache is unbounded. We don't recommend this, since a malicious client can run your server out of memory and cause it to crash by filling it with APQs. + +If you don't want to configure your own cache, you should set `cache: "bounded"`. The bounded cache is an [`InMemoryLRUCache`](https://www.npmjs.com/package/@apollo/utils.keyvaluecache) with a default size of roughly 30MiB. + +FIXME: link to new cache backend page + + + @@ -726,6 +746,7 @@ async function startApolloServer() { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); diff --git a/docs/source/api/plugin/cache-control.md b/docs/source/api/plugin/cache-control.md index 31e85398e68..e21cbedef6c 100644 --- a/docs/source/api/plugin/cache-control.md +++ b/docs/source/api/plugin/cache-control.md @@ -21,6 +21,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginCacheControl({ // Cache everything for 1 second by default. @@ -42,6 +43,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ApolloServerPluginCacheControlDisabled()], }); ``` diff --git a/docs/source/api/plugin/drain-http-server.mdx b/docs/source/api/plugin/drain-http-server.mdx index d7c7f3d1e5b..261dc0ad2e8 100644 --- a/docs/source/api/plugin/drain-http-server.mdx +++ b/docs/source/api/plugin/drain-http-server.mdx @@ -39,6 +39,7 @@ async function startApolloServer() { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); diff --git a/docs/source/api/plugin/inline-trace.md b/docs/source/api/plugin/inline-trace.md index 3ed2615b17d..43e8a12c083 100644 --- a/docs/source/api/plugin/inline-trace.md +++ b/docs/source/api/plugin/inline-trace.md @@ -21,6 +21,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginInlineTrace({ rewriteError: (err) => err.message.match(SENSITIVE_REGEX) ? null : err, @@ -39,6 +40,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ApolloServerPluginInlineTraceDisabled()], }); ``` diff --git a/docs/source/api/plugin/landing-pages.md b/docs/source/api/plugin/landing-pages.md index 25d1e23a839..c4595cb8674 100644 --- a/docs/source/api/plugin/landing-pages.md +++ b/docs/source/api/plugin/landing-pages.md @@ -29,17 +29,19 @@ To configure these default plugins while still using same `NODE_ENV`-based logic ```js import { ApolloServer } from "apollo-server"; -import { ApolloServerPluginLandingPageLocalDefault, - ApolloServerPluginLandingPageProductionDefault +import { + ApolloServerPluginLandingPageLocalDefault, + ApolloServerPluginLandingPageProductionDefault } from "apollo-server-core"; const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ // Install a landing page plugin based on NODE_ENV - process.env.NODE_ENV === 'production' + process.env.NODE_ENV === "production" ? ApolloServerPluginLandingPageProductionDefault({ graphRef: "my-graph-id@my-graph-variant", footer: false, @@ -428,6 +430,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginLandingPageGraphQLPlayground(), ], @@ -512,6 +515,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginLandingPageDisabled(), ], diff --git a/docs/source/api/plugin/schema-reporting.md b/docs/source/api/plugin/schema-reporting.md index 10d3a5d521f..80547bcc647 100644 --- a/docs/source/api/plugin/schema-reporting.md +++ b/docs/source/api/plugin/schema-reporting.md @@ -23,6 +23,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginSchemaReporting(), ], diff --git a/docs/source/api/plugin/usage-reporting.md b/docs/source/api/plugin/usage-reporting.md index 7ae01520b7b..edc82631a2d 100644 --- a/docs/source/api/plugin/usage-reporting.md +++ b/docs/source/api/plugin/usage-reporting.md @@ -25,6 +25,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginUsageReporting({ fieldLevelInstrumentation: 0.5, @@ -454,6 +455,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ApolloServerPluginUsageReportingDisabled()], }); ``` diff --git a/docs/source/builtin-plugins.md b/docs/source/builtin-plugins.md index 1cb2c7ef176..de66fa819bd 100644 --- a/docs/source/builtin-plugins.md +++ b/docs/source/builtin-plugins.md @@ -31,6 +31,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ // Sets a non-default option on the usage reporting plugin ApolloServerPluginUsageReporting({ diff --git a/docs/source/data/data-sources.mdx b/docs/source/data/data-sources.mdx index 672bcdec87a..10104a5857c 100644 --- a/docs/source/data/data-sources.mdx +++ b/docs/source/data/data-sources.mdx @@ -55,6 +55,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", dataSources: () => { return { moviesAPI: new MoviesAPI(), diff --git a/docs/source/data/errors.mdx b/docs/source/data/errors.mdx index 44ddbc28c3d..babf00169c1 100644 --- a/docs/source/data/errors.mdx +++ b/docs/source/data/errors.mdx @@ -343,6 +343,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", formatError: (err) => { // Don't give the specific errors to the client. if (err.message.startsWith('Database Error: ')) { @@ -398,6 +399,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginUsageReporting({ rewriteError(err) { @@ -429,6 +431,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginUsageReporting({ rewriteError(err) { @@ -467,6 +470,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginUsageReporting({ rewriteError(err) { @@ -512,6 +516,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [setHttpPlugin], }); ``` diff --git a/docs/source/data/file-uploads.mdx b/docs/source/data/file-uploads.mdx index 79c3e60f5b3..4fdf60debe4 100644 --- a/docs/source/data/file-uploads.mdx +++ b/docs/source/data/file-uploads.mdx @@ -79,6 +79,7 @@ async function startServer() { resolvers, // Using graphql-upload without CSRF prevention is very insecure. csrfPrevention: true, + cache: 'bounded', }); await server.start(); @@ -181,6 +182,7 @@ const start = async () => { resolvers, // Using graphql-upload without CSRF prevention is very insecure. csrfPrevention: true, + cache: 'bounded', }); // Start Apollo Server diff --git a/docs/source/data/resolvers.mdx b/docs/source/data/resolvers.mdx index 3ae46b62ab1..3e5344db43b 100644 --- a/docs/source/data/resolvers.mdx +++ b/docs/source/data/resolvers.mdx @@ -145,7 +145,12 @@ const resolvers = { // Pass schema definition and resolvers to the // ApolloServer constructor -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); // Launch the server server.listen().then(({ url }) => { @@ -323,7 +328,12 @@ const resolvers = { // Pass schema definition and resolvers to the // ApolloServer constructor -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); // Launch the server server.listen().then(({ url }) => { @@ -388,6 +398,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', context: ({ req }) => ({ authScope: getScope(req.headers.authorization) }) diff --git a/docs/source/data/subscriptions.mdx b/docs/source/data/subscriptions.mdx index cf22ea95702..7628b542430 100644 --- a/docs/source/data/subscriptions.mdx +++ b/docs/source/data/subscriptions.mdx @@ -82,6 +82,7 @@ To run both an Express app _and_ a separate WebSocket server for subscriptions, const server = new ApolloServer({ schema, csrfPrevention: true, + cache: "bounded", }); ``` @@ -108,6 +109,7 @@ To run both an Express app _and_ a separate WebSocket server for subscriptions, const server = new ApolloServer({ schema, csrfPrevention: true, + cache: "bounded", plugins: [ // Proper shutdown for the HTTP server. ApolloServerPluginDrainHttpServer({ httpServer }), @@ -168,6 +170,7 @@ const serverCleanup = useServer({ schema }, wsServer); const server = new ApolloServer({ schema, csrfPrevention: true, + cache: "bounded", plugins: [ // Proper shutdown for the HTTP server. ApolloServerPluginDrainHttpServer({ httpServer }), diff --git a/docs/source/deployment/azure-functions.mdx b/docs/source/deployment/azure-functions.mdx index c54e4f47fc6..66aa5de6d6a 100644 --- a/docs/source/deployment/azure-functions.mdx +++ b/docs/source/deployment/azure-functions.mdx @@ -95,7 +95,12 @@ const resolvers = { }; // Create our server. -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); exports.graphqlHandler = server.createHandler(); ``` diff --git a/docs/source/deployment/gcp-functions.mdx b/docs/source/deployment/gcp-functions.mdx index 09693d8e25d..17e06ad027e 100644 --- a/docs/source/deployment/gcp-functions.mdx +++ b/docs/source/deployment/gcp-functions.mdx @@ -27,6 +27,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', }); exports.handler = server.createHandler(); @@ -164,6 +165,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', context: ({ req, res }) => ({ headers: req.headers, req, diff --git a/docs/source/deployment/lambda.md b/docs/source/deployment/lambda.md index 2e2c0011823..a6550ec0aed 100644 --- a/docs/source/deployment/lambda.md +++ b/docs/source/deployment/lambda.md @@ -50,7 +50,12 @@ const resolvers = { }, }; -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); exports.graphqlHandler = server.createHandler(); ``` @@ -211,6 +216,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', context: ({ event, context, express }) => ({ headers: event.headers, functionName: context.functionName, diff --git a/docs/source/getting-started.mdx b/docs/source/getting-started.mdx index 6f9a96ee406..1562ca8f4fe 100644 --- a/docs/source/getting-started.mdx +++ b/docs/source/getting-started.mdx @@ -152,6 +152,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', }); // The `listen` method launches a web server. diff --git a/docs/source/integrations/middleware.mdx b/docs/source/integrations/middleware.mdx index ef9003a9121..b9a4eab6a49 100644 --- a/docs/source/integrations/middleware.mdx +++ b/docs/source/integrations/middleware.mdx @@ -130,7 +130,12 @@ Let's say our `apollo-server` implementation uses the following code: import { ApolloServer } from "apollo-server"; async function startApolloServer(typeDefs, resolvers) { - const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); + const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: "bounded", + }); const { url } = await server.listen(); console.log(`🚀 Server ready at ${url}`); } @@ -166,6 +171,7 @@ async function startApolloServer(typeDefs, resolvers) { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); @@ -228,7 +234,12 @@ npm install apollo-server graphql import { ApolloServer } from 'apollo-server'; async function startApolloServer(typeDefs, resolvers) { - const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); + const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', + }); const { url } = await server.listen(); console.log(`🚀 Server ready at ${url}`); } @@ -267,6 +278,7 @@ async function startApolloServer(typeDefs, resolvers) { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); await server.start(); @@ -326,6 +338,7 @@ async function startApolloServer(typeDefs, resolvers) { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ fastifyAppClosePlugin(app), ApolloServerPluginDrainHttpServer({ httpServer: app.server }), @@ -377,6 +390,7 @@ async function startApolloServer(typeDefs, resolvers) { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ApolloServerPluginStopHapiServer({ hapiServer: app })], }); @@ -423,6 +437,7 @@ async function startApolloServer(typeDefs, resolvers) { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); @@ -466,7 +481,12 @@ npm install apollo-server-micro micro graphql ```ts title="index.ts" import { ApolloServer } from 'apollo-server-micro'; -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); module.exports = server.start().then(() => server.createHandler()); ``` @@ -503,7 +523,12 @@ npm install apollo-server-lambda graphql ```ts title="index.ts" import { ApolloServer } from 'apollo-server-lambda'; -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); exports.handler = server.createHandler(); ``` @@ -529,7 +554,12 @@ npm install apollo-server-cloud-functions graphql ```ts title="index.ts" import { ApolloServer } from 'apollo-server-cloud-functions'; -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); exports.handler = server.createHandler(); ``` @@ -554,7 +584,12 @@ npm install apollo-server-azure-functions graphql ```ts title="index.ts" import { ApolloServer } from 'apollo-server-azure-functions'; -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); exports.handler = server.createHandler(); ``` diff --git a/docs/source/integrations/plugins.md b/docs/source/integrations/plugins.md index 547caafc255..02aed5bf63d 100644 --- a/docs/source/integrations/plugins.md +++ b/docs/source/integrations/plugins.md @@ -207,6 +207,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', // You can import plugins or define them in-line, as shown: plugins: [ diff --git a/docs/source/monitoring/health-checks.md b/docs/source/monitoring/health-checks.md index b4a3a9929b6..a9d46903e4a 100644 --- a/docs/source/monitoring/health-checks.md +++ b/docs/source/monitoring/health-checks.md @@ -29,7 +29,7 @@ You can pass a string `healthCheckPath` to the `ApolloServer` constructor to cha If you'd like the health check to do more than just "always return success", you can pass an async function `onHealthCheck` function to the `ApolloServer` constructor. If defined, this `onHealthCheck` async function should return if the server is deemed _ready_ or `throw` if there is an error. Returning (resolving the `Promise`) will result in an HTTP status code of 200, which is generally desired by most health-check tooling (e.g. Kubernetes, AWS, etc.), while `throw`ing (rejecting the `Promise`) will result in an HTTP status code of 503. -```js {10-17} +```js {10-18} import { ApolloServer, gql } from 'apollo-server'; // Undefined for brevity. @@ -40,6 +40,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', async onHealthCheck() { if (everythingLooksHealthy()) { return; diff --git a/docs/source/monitoring/metrics.md b/docs/source/monitoring/metrics.md index 9dda6ba0554..321c4878843 100644 --- a/docs/source/monitoring/metrics.md +++ b/docs/source/monitoring/metrics.md @@ -55,7 +55,7 @@ version in the [`ApolloClient` constructor](https://www.apollographql.com/docs/r For more advanced cases, or to use headers other than the default headers, pass a `generateClientInfo` function into the [usage reporting plugin](../api/plugin/usage-reporting/): -```js {9-24} +```js {10-25} const { ApolloServer } = require("apollo-server"); const { ApolloServerPluginUsageReporting } = require("apollo-server-core"); @@ -63,6 +63,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: "bounded", plugins: [ ApolloServerPluginUsageReporting({ generateClientInfo: ({ @@ -71,8 +72,8 @@ const server = new ApolloServer({ const headers = request.http && request.http.headers; if(headers) { return { - clientName: headers['apollographql-client-name'], - clientVersion: headers['apollographql-client-version'], + clientName: headers["apollographql-client-name"], + clientVersion: headers["apollographql-client-version"], }; } else { return { @@ -126,6 +127,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ myPlugin ] diff --git a/docs/source/performance/apq.md b/docs/source/performance/apq.md index 56248efbeec..dd528f8b2de 100644 --- a/docs/source/performance/apq.md +++ b/docs/source/performance/apq.md @@ -134,6 +134,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', // The max age is calculated in seconds plugins: [ApolloServerPluginCacheControl({ defaultMaxAge: 5 })], }); @@ -206,6 +207,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', // highlight-start persistedQueries: { cache: new MemcachedCache( @@ -231,6 +233,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', // highlight-start persistedQueries: { cache: new BaseRedisCache({ @@ -257,6 +260,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', // highlight-start persistedQueries: { cache: new BaseRedisCache({ @@ -288,6 +292,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', // highlight-start persistedQueries: { cache: new BaseRedisCache({ @@ -318,6 +323,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', persistedQueries: { // highlight-start ttl: 900, // 15 minutes @@ -333,6 +339,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', persistedQueries: { ttl: null, // highlight-line }, @@ -350,6 +357,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', persistedQueries: false, // highlight-line }); ``` diff --git a/docs/source/proxy-configuration.md b/docs/source/proxy-configuration.md index dccced5aad8..c5cee22349f 100644 --- a/docs/source/proxy-configuration.md +++ b/docs/source/proxy-configuration.md @@ -38,6 +38,7 @@ const server = new ApolloServer({ typesDefs, resolvers, csrfPrevention: true, + cache: 'bounded', }); ``` diff --git a/docs/source/schema/creating-directives.mdx b/docs/source/schema/creating-directives.mdx index 776c68b8764..e7ea3f452ba 100644 --- a/docs/source/schema/creating-directives.mdx +++ b/docs/source/schema/creating-directives.mdx @@ -338,7 +338,11 @@ let schema = makeExecutableSchema({ schema = upperDirectiveTransformer(schema, 'upper'); // Provide the schema to the ApolloServer constructor -const server = new ApolloServer({schema, csrfPrevention: true}); +const server = new ApolloServer({ + schema, + csrfPrevention: true, + cache: 'bounded', +}); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); diff --git a/docs/source/schema/custom-scalars.md b/docs/source/schema/custom-scalars.md index b55b8b80028..ff24b59907f 100644 --- a/docs/source/schema/custom-scalars.md +++ b/docs/source/schema/custom-scalars.md @@ -116,6 +116,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', }); ``` @@ -139,10 +140,10 @@ const typeDefs = gql` // Validation function for checking "oddness" function oddValue(value) { - if (typeof value === "number" && Number.isInteger(value) && value % 2 !== 0) { + if (typeof value === 'number' && Number.isInteger(value) && value % 2 !== 0) { return value; } - throw new UserInputError("Provided value is not an odd integer"); + throw new UserInputError('Provided value is not an odd integer'); } const resolvers = { @@ -155,7 +156,7 @@ const resolvers = { if (ast.kind === Kind.INT) { return oddValue(parseInt(ast.value, 10)); } - throw new UserInputError("Provided value is not an odd integer"); + throw new UserInputError('Provided value is not an odd integer'); }, }), Query: { @@ -165,7 +166,12 @@ const resolvers = { } }; -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`) @@ -207,7 +213,12 @@ const resolvers = { // ...other resolvers... }; -const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', +}); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`) diff --git a/docs/source/schema/unions-interfaces.md b/docs/source/schema/unions-interfaces.md index 762e4482a37..6685c4bb2dc 100644 --- a/docs/source/schema/unions-interfaces.md +++ b/docs/source/schema/unions-interfaces.md @@ -132,6 +132,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', }); server.listen().then(({ url }) => { diff --git a/docs/source/security/authentication.md b/docs/source/security/authentication.md index f3a07969ddd..0dcf124aa0a 100644 --- a/docs/source/security/authentication.md +++ b/docs/source/security/authentication.md @@ -21,6 +21,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', context: ({ req }) => { // Note: This example uses the `req` argument to access headers, // but the arguments received by `context` vary by integration. @@ -229,7 +230,8 @@ One way of implementing the `@auth` directive is by constructing your schema usi new ApolloServer({ schema: makeExecutableSchema({ typeDefs, resolvers, schemaTransforms }), csrfPrevention: true, -}) + cache: 'bounded', +}); ``` ### Outside of GraphQL diff --git a/docs/source/security/cors.mdx b/docs/source/security/cors.mdx index 3af40701e36..4cc05158053 100644 --- a/docs/source/security/cors.mdx +++ b/docs/source/security/cors.mdx @@ -99,6 +99,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, // see below for more about this + cache: "bounded", cors: { origin: ["https://www.your-app.example", "https://studio.apollographql.com"] }, @@ -145,6 +146,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, // see below for more about this + cache: "bounded", cors: { origin: yourOrigin, credentials: true diff --git a/docs/source/security/terminating-ssl.mdx b/docs/source/security/terminating-ssl.mdx index 1b4bc4130b2..98d706d240a 100644 --- a/docs/source/security/terminating-ssl.mdx +++ b/docs/source/security/terminating-ssl.mdx @@ -30,7 +30,12 @@ async function startApolloServer() { const environment = process.env.NODE_ENV || 'production'; const config = configurations[environment]; - const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true }); + const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: 'bounded', + }); await server.start(); const app = express(); diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index 1736f53a828..154cdef924e 100644 --- a/packages/apollo-server-core/src/ApolloServer.ts +++ b/packages/apollo-server-core/src/ApolloServer.ts @@ -261,10 +261,14 @@ export class ApolloServerBase< : noIntro; } - if (!requestOptions.cache) { + if (requestOptions.cache === 'bounded') { requestOptions.cache = new InMemoryLRUCache(); } + if (!requestOptions.cache) { + requestOptions.cache = new UnboundedCache(); + } + if (requestOptions.persistedQueries !== false) { const { cache: apqCache = requestOptions.cache!, ...apqOtherOptions } = requestOptions.persistedQueries || Object.create(null); diff --git a/packages/apollo-server-core/src/types.ts b/packages/apollo-server-core/src/types.ts index db3fa2244b2..37a0825da41 100644 --- a/packages/apollo-server-core/src/types.ts +++ b/packages/apollo-server-core/src/types.ts @@ -40,7 +40,6 @@ type BaseConfig = Pick< | 'formatResponse' | 'fieldResolver' | 'dataSources' - | 'cache' | 'logger' | 'allowBatchedHttpRequests' >; @@ -110,6 +109,7 @@ export interface Config extends BaseConfig { nodeEnv?: string; documentStore?: DocumentStore | null; csrfPrevention?: CSRFPreventionOptions | boolean; + cache?: KeyValueCache | 'bounded'; } export interface CSRFPreventionOptions { diff --git a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts index 6ba585f4bb9..90aedbaef29 100644 --- a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts +++ b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts @@ -59,8 +59,8 @@ import FakeTimers from '@sinonjs/fake-timers'; import type { AddressInfo } from 'net'; import request, { Response } from 'supertest'; import { - type KeyValueCache, InMemoryLRUCache, + type KeyValueCache, } from '@apollo/utils.keyvaluecache'; const quietLogger = loglevel.getLogger('quiet'); @@ -2265,45 +2265,38 @@ export function testApolloServer( clock.uninstall(); }); - it('basic caching', async () => { - class TTLTestingCache implements KeyValueCache { - private fakeTime = 0; - constructor( - private cache: Map< - string, - { value: string; deadline: number | null } - > = new Map(), - ) {} - - async get(key: string) { - const entry = this.cache.get(key); - if (!entry) return undefined; - if (entry.deadline && entry.deadline <= this.fakeTime) { - await this.delete(key); - return undefined; - } - return entry.value; - } + it('uses an unbounded cache by default', async () => { + const server = new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + }); - async set( - key: string, - value: string, - { ttl }: { ttl: number | null } = { ttl: null }, - ) { - this.cache.set(key, { - value, - deadline: ttl ? this.fakeTime + ttl * 1000 : null, - }); - } + // This could be an instanceof check but we don't really want to export + // the `UnboundedCache` class from `apollo-server-core` + expect(server['requestOptions'].cache!.constructor.name).toBe( + 'UnboundedCache', + ); + }); - async delete(key: string) { - this.cache.delete(key); - } + it('uses a bounded cache', async () => { + const server = new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + cache: 'bounded', + }); - advanceTime(ms: number) { - this.fakeTime += ms; - } - } + expect(server['requestOptions'].cache).toBeInstanceOf(InMemoryLRUCache); + }); + + it('uses a custom cache', async () => { + const customCache = {} as KeyValueCache; + const server = new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + cache: customCache, + }); + + expect(server['requestOptions'].cache).toBe(customCache); + }); + + it('basic caching', async () => { const typeDefs = gql` type Query { cached: String @cacheControl(maxAge: 10) @@ -2359,12 +2352,9 @@ export function testApolloServer( }; }); - const fakeTTLCache = new TTLTestingCache(); - const { url: uri } = await createApolloServer({ typeDefs, resolvers, - cache: fakeTTLCache, plugins: [ ApolloServerPluginResponseCache({ sessionId: (requestContext: GraphQLRequestContext) => { @@ -2488,7 +2478,6 @@ export function testApolloServer( } // Cache hit partway to ttl. - fakeTTLCache.advanceTime(5 * 1000); clock.tick(5 * 1000); { const result = await fetch(); @@ -2500,7 +2489,6 @@ export function testApolloServer( } // Cache miss after ttl. - fakeTTLCache.advanceTime(6 * 1000); clock.tick(6 * 1000); { const result = await fetch(); @@ -2778,7 +2766,6 @@ export function testApolloServer( } // Let's expire the cache, and run again, not writing to the cache. - fakeTTLCache.advanceTime(15 * 1000); clock.tick(15 * 1000); { const result = await doFetch({ From 999adf5c778b2e48c48bbd8b6f78ebb808a63b4c Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Wed, 8 Jun 2022 13:38:50 -0700 Subject: [PATCH 04/10] Remove caching packages (#6541) Remove apollo-server-caching, apollo-server-cache-redis, and apollo-server-cache-memcached packages. We will continue to offer bugfixes for these packages as needed but don't intend to continue active development on them. Our recommendation going forward will be to use the keyv package along with our KeyvAdapter from the @apollo/utils.keyvadapter package. Docs updates to come in a following PR (but coupled with this release). The KeyValueCache interface and InMemoryLRUCache wrapper around lru-cache (as well as a few useful cache wrappers like PrefixingKeyValueCache) will continue to exist in the @apollo/utils.keyvaluecache package. It's worth mentioning that InMemoryLRUCache is on a newer major version of lru-cache which doesn't permit the unbounded behavior which we've had by default. In AS 3.9 you can opt into the bounded cache, and in AS4 it will be the default. --- .codesandbox/ci.json | 3 - CHANGELOG.md | 1 + package-lock.json | 330 +----------------- package.json | 7 - .../apollo-server-cache-memcached/.npmignore | 7 - .../apollo-server-cache-memcached/README.md | 26 -- .../jest.config.js | 3 - .../package.json | 26 -- .../src/__tests__/Memcached.test.ts | 19 - .../src/__tests__/tsconfig.json | 7 - .../src/index.ts | 58 --- .../tsconfig.json | 10 - packages/apollo-server-cache-redis/.npmignore | 7 - packages/apollo-server-cache-redis/README.md | 86 ----- .../apollo-server-cache-redis/jest.config.js | 3 - .../apollo-server-cache-redis/package.json | 26 -- .../src/BaseRedisCache.ts | 112 ------ .../src/RedisCache.ts | 8 - .../src/RedisClusterCache.ts | 21 -- .../src/__tests__/BaseRedisCache.test.ts | 41 --- .../src/__tests__/RedisCache.test.ts | 18 - .../src/__tests__/RedisClusterCache.test.ts | 18 - .../src/__tests__/mockIoredis.ts | 51 --- .../src/__tests__/tsconfig.json | 7 - .../apollo-server-cache-redis/src/index.ts | 3 - .../apollo-server-cache-redis/tsconfig.json | 10 - packages/apollo-server-caching/.gitignore | 1 - packages/apollo-server-caching/.npmignore | 7 - packages/apollo-server-caching/README.md | 52 --- packages/apollo-server-caching/jest.config.js | 3 - packages/apollo-server-caching/package.json | 23 -- .../src/InMemoryLRUCache.ts | 60 ---- .../src/KeyValueCache.ts | 14 - .../src/PrefixingKeyValueCache.ts | 25 -- .../src/__tests__/InMemoryLRUCache.test.ts | 15 - .../__tests__/PrefixingKeyValueCache.test.ts | 14 - .../src/__tests__/tsconfig.json | 7 - packages/apollo-server-caching/src/index.ts | 4 - .../apollo-server-caching/src/testsuite.ts | 56 --- packages/apollo-server-caching/tsconfig.json | 9 - renovate.json5 | 9 - tsconfig.build.json | 3 - tsconfig.test.json | 3 - 43 files changed, 11 insertions(+), 1202 deletions(-) delete mode 100644 packages/apollo-server-cache-memcached/.npmignore delete mode 100644 packages/apollo-server-cache-memcached/README.md delete mode 100644 packages/apollo-server-cache-memcached/jest.config.js delete mode 100644 packages/apollo-server-cache-memcached/package.json delete mode 100644 packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts delete mode 100644 packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json delete mode 100644 packages/apollo-server-cache-memcached/src/index.ts delete mode 100644 packages/apollo-server-cache-memcached/tsconfig.json delete mode 100644 packages/apollo-server-cache-redis/.npmignore delete mode 100644 packages/apollo-server-cache-redis/README.md delete mode 100644 packages/apollo-server-cache-redis/jest.config.js delete mode 100644 packages/apollo-server-cache-redis/package.json delete mode 100644 packages/apollo-server-cache-redis/src/BaseRedisCache.ts delete mode 100644 packages/apollo-server-cache-redis/src/RedisCache.ts delete mode 100644 packages/apollo-server-cache-redis/src/RedisClusterCache.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/tsconfig.json delete mode 100644 packages/apollo-server-cache-redis/src/index.ts delete mode 100644 packages/apollo-server-cache-redis/tsconfig.json delete mode 100644 packages/apollo-server-caching/.gitignore delete mode 100644 packages/apollo-server-caching/.npmignore delete mode 100644 packages/apollo-server-caching/README.md delete mode 100644 packages/apollo-server-caching/jest.config.js delete mode 100644 packages/apollo-server-caching/package.json delete mode 100644 packages/apollo-server-caching/src/InMemoryLRUCache.ts delete mode 100644 packages/apollo-server-caching/src/KeyValueCache.ts delete mode 100644 packages/apollo-server-caching/src/PrefixingKeyValueCache.ts delete mode 100644 packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts delete mode 100644 packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts delete mode 100644 packages/apollo-server-caching/src/__tests__/tsconfig.json delete mode 100644 packages/apollo-server-caching/src/index.ts delete mode 100644 packages/apollo-server-caching/src/testsuite.ts delete mode 100644 packages/apollo-server-caching/tsconfig.json diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json index 49367b08ed7..9d317c61a26 100644 --- a/.codesandbox/ci.json +++ b/.codesandbox/ci.json @@ -6,9 +6,6 @@ "packages/apollo-reporting-protobuf", "packages/apollo-server", "packages/apollo-server-azure-functions", - "packages/apollo-server-cache-memcached", - "packages/apollo-server-cache-redis", - "packages/apollo-server-caching", "packages/apollo-server-cloud-functions", "packages/apollo-server-cloudflare", "packages/apollo-server-core", diff --git a/CHANGELOG.md b/CHANGELOG.md index d5d8aa2233f..f6b2bbce0e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The version headers in this history reflect the versions of Apollo Server itself - Remove internal dependency on `apollo-server-caching`, switch over to `@apollo/utils.keyvaluecache`. This PR specifically also introduces Keyv as an unbounded cache solution, but will replace with our own simple implementation in a follow-up PR targeting this minor version release. [PR #6522](https://github.com/apollographql/apollo-server/pull/6522) - Remove dependency on `keyv`/`@apollo/utils.keyvadapter` in favor of a simple `Map`-backed cache which implements TTL [PR #6535](https://github.com/apollographql/apollo-server/pull/6535) - Add `cache: "bounded"` configuration option, allowing users to opt into bounded request cache (recommended) [PR #6536](https://github.com/apollographql/apollo-server/pull/6536) +- Remove `apollo-server-caching` and `apollo-server-cache-*` packages [PR #6541](https://github.com/apollographql/apollo-server/pull/6541) ## v3.8.2 diff --git a/package-lock.json b/package-lock.json index 341316ef204..1d76f99ec70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,9 +14,6 @@ "apollo-reporting-protobuf": "file:packages/apollo-reporting-protobuf", "apollo-server": "file:packages/apollo-server", "apollo-server-azure-functions": "file:packages/apollo-server-azure-functions", - "apollo-server-cache-memcached": "file:packages/apollo-server-cache-memcached", - "apollo-server-cache-redis": "file:packages/apollo-server-cache-redis", - "apollo-server-caching": "file:packages/apollo-server-caching", "apollo-server-cloud-functions": "file:packages/apollo-server-cloud-functions", "apollo-server-cloudflare": "file:packages/apollo-server-cloudflare", "apollo-server-core": "file:packages/apollo-server-core", @@ -54,14 +51,12 @@ "@types/express-serve-static-core": "4.17.29", "@types/fast-json-stable-stringify": "2.0.0", "@types/hapi__hapi": "20.0.12", - "@types/ioredis": "4.28.10", "@types/jest": "28.1.1", "@types/koa-router": "7.4.4", "@types/lodash": "4.14.182", "@types/lodash.sumby": "4.6.7", "@types/lodash.xorby": "4.7.7", "@types/lru-cache": "5.1.1", - "@types/memcached": "2.2.7", "@types/micro": "7.3.7", "@types/node": "12.20.55", "@types/node-fetch": "2.6.1", @@ -88,7 +83,6 @@ "form-data": "4.0.0", "graphql": "15.8.0", "graphql-tag": "2.12.6", - "ioredis": "4.28.5", "jest": "28.1.1", "jest-config": "28.1.1", "jest-junit": "13.2.0", @@ -98,7 +92,6 @@ "koa-router": "10.1.1", "lerna": "4.0.0", "lodash.sumby": "4.6.0", - "memcached-mock": "0.1.0", "mock-req": "0.2.0", "nock": "13.2.7", "node-fetch": "2.6.7", @@ -6655,15 +6648,6 @@ "version": "1.8.0", "license": "MIT" }, - "node_modules/@types/ioredis": { - "version": "4.28.10", - "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", - "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -6794,15 +6778,6 @@ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", "dev": true }, - "node_modules/@types/memcached": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.7.tgz", - "integrity": "sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/micro": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/@types/micro/-/micro-7.3.7.tgz", @@ -7312,18 +7287,6 @@ "resolved": "packages/apollo-server-azure-functions", "link": true }, - "node_modules/apollo-server-cache-memcached": { - "resolved": "packages/apollo-server-cache-memcached", - "link": true - }, - "node_modules/apollo-server-cache-redis": { - "resolved": "packages/apollo-server-cache-redis", - "link": true - }, - "node_modules/apollo-server-caching": { - "resolved": "packages/apollo-server-caching", - "link": true - }, "node_modules/apollo-server-cloud-functions": { "resolved": "packages/apollo-server-cloud-functions", "link": true @@ -8602,13 +8565,6 @@ "mimic-response": "^1.0.0" } }, - "node_modules/cluster-key-slot": { - "version": "1.1.0", - "license": "APACHE-2.0", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cmd-shim": { "version": "4.1.0", "dev": true, @@ -8840,10 +8796,6 @@ "node": ">= 0.10.0" } }, - "node_modules/connection-parse": { - "version": "0.0.7", - "license": "MIT" - }, "node_modules/console-control-strings": { "version": "1.1.0", "dev": true, @@ -9737,7 +9689,8 @@ "node_modules/dataloader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", - "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==", + "dev": true }, "node_modules/date-fns": { "version": "1.30.1", @@ -9889,13 +9842,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/denque": { - "version": "1.5.0", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "1.1.2", "license": "MIT", @@ -11841,14 +11787,6 @@ "dev": true, "license": "ISC" }, - "node_modules/hashring": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -12326,52 +12264,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ioredis": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", - "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", - "dependencies": { - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.1", - "denque": "^1.1.0", - "lodash.defaults": "^4.2.0", - "lodash.flatten": "^4.4.0", - "lodash.isarguments": "^3.1.0", - "p-map": "^2.1.0", - "redis-commands": "1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ioredis/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/ioredis/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/ip": { "version": "1.1.5", "dev": true, @@ -12944,18 +12836,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jackpot": { - "version": "0.0.6", - "dependencies": { - "retry": "0.6.0" - } - }, - "node_modules/jackpot/node_modules/retry": { - "version": "0.6.0", - "engines": { - "node": "*" - } - }, "node_modules/jest": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.1.tgz", @@ -15824,14 +15704,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "license": "MIT" - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -15844,11 +15716,6 @@ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", "dev": true }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -16317,19 +16184,6 @@ "node": ">= 0.6" } }, - "node_modules/memcached": { - "version": "2.2.2", - "license": "MIT", - "dependencies": { - "hashring": "3.2.x", - "jackpot": ">=0.0.6" - } - }, - "node_modules/memcached-mock": { - "version": "0.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/memorizer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/memorizer/-/memorizer-1.0.1.tgz", @@ -17521,6 +17375,7 @@ }, "node_modules/p-map": { "version": "2.1.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -18635,27 +18490,6 @@ "node": ">=8" } }, - "node_modules/redis-commands": { - "version": "1.7.0", - "license": "MIT" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -19313,9 +19147,6 @@ "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", "dev": true }, - "node_modules/simple-lru-cache": { - "version": "0.0.2" - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -19599,10 +19430,6 @@ "node": ">=8" } }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "license": "MIT" - }, "node_modules/statuses": { "version": "1.5.0", "license": "MIT", @@ -21343,6 +21170,7 @@ }, "packages/apollo-server-cache-memcached": { "version": "3.3.1", + "extraneous": true, "license": "MIT", "dependencies": { "@apollo/utils.keyvaluecache": "^1.0.1", @@ -21356,6 +21184,7 @@ }, "packages/apollo-server-cache-redis": { "version": "3.3.1", + "extraneous": true, "license": "MIT", "dependencies": { "@apollo/utils.keyvaluecache": "^1.0.1", @@ -21369,6 +21198,7 @@ }, "packages/apollo-server-caching": { "version": "3.3.0", + "extraneous": true, "license": "MIT", "dependencies": { "lru-cache": "^6.0.0" @@ -26713,15 +26543,6 @@ "@types/http-errors": { "version": "1.8.0" }, - "@types/ioredis": { - "version": "4.28.10", - "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", - "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -26847,15 +26668,6 @@ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", "dev": true }, - "@types/memcached": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.7.tgz", - "integrity": "sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/micro": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/@types/micro/-/micro-7.3.7.tgz", @@ -27303,30 +27115,6 @@ "apollo-server-types": "file:../apollo-server-types" } }, - "apollo-server-cache-memcached": { - "version": "file:packages/apollo-server-cache-memcached", - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-caching": "file:../apollo-server-caching", - "apollo-server-env": "file:../apollo-server-env", - "memcached": "^2.2.2" - } - }, - "apollo-server-cache-redis": { - "version": "file:packages/apollo-server-cache-redis", - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-env": "file:../apollo-server-env", - "dataloader": "^2.0.0", - "ioredis": "^4.17.3" - } - }, - "apollo-server-caching": { - "version": "file:packages/apollo-server-caching", - "requires": { - "lru-cache": "^6.0.0" - } - }, "apollo-server-cloud-functions": { "version": "file:packages/apollo-server-cloud-functions", "requires": { @@ -28408,9 +28196,6 @@ "mimic-response": "^1.0.0" } }, - "cluster-key-slot": { - "version": "1.1.0" - }, "cmd-shim": { "version": "4.1.0", "dev": true, @@ -28593,9 +28378,6 @@ "utils-merge": "1.0.1" } }, - "connection-parse": { - "version": "0.0.7" - }, "console-control-strings": { "version": "1.1.0", "dev": true @@ -29230,7 +29012,8 @@ "dataloader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", - "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==", + "dev": true }, "date-fns": { "version": "1.30.1", @@ -29336,9 +29119,6 @@ "delegates": { "version": "1.0.0" }, - "denque": { - "version": "1.5.0" - }, "depd": { "version": "1.1.2" }, @@ -30726,13 +30506,6 @@ "version": "2.0.1", "dev": true }, - "hashring": { - "version": "3.2.0", - "requires": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -31059,39 +30832,6 @@ "loose-envify": "^1.0.0" } }, - "ioredis": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", - "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", - "requires": { - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.1", - "denque": "^1.1.0", - "lodash.defaults": "^4.2.0", - "lodash.flatten": "^4.4.0", - "lodash.isarguments": "^3.1.0", - "p-map": "^2.1.0", - "redis-commands": "1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, "ip": { "version": "1.1.5", "dev": true @@ -31478,17 +31218,6 @@ "version": "1.2.2", "dev": true }, - "jackpot": { - "version": "0.0.6", - "requires": { - "retry": "0.6.0" - }, - "dependencies": { - "retry": { - "version": "0.6.0" - } - } - }, "jest": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.1.tgz", @@ -33648,12 +33377,6 @@ "version": "3.0.0", "dev": true }, - "lodash.defaults": { - "version": "4.2.0" - }, - "lodash.flatten": { - "version": "4.4.0" - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -33666,11 +33389,6 @@ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -34030,17 +33748,6 @@ "media-typer": { "version": "0.3.0" }, - "memcached": { - "version": "2.2.2", - "requires": { - "hashring": "3.2.x", - "jackpot": ">=0.0.6" - } - }, - "memcached-mock": { - "version": "0.1.0", - "dev": true - }, "memorizer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/memorizer/-/memorizer-1.0.1.tgz", @@ -34871,7 +34578,8 @@ } }, "p-map": { - "version": "2.1.0" + "version": "2.1.0", + "dev": true }, "p-map-series": { "version": "2.1.0", @@ -35662,18 +35370,6 @@ "strip-indent": "^3.0.0" } }, - "redis-commands": { - "version": "1.7.0" - }, - "redis-errors": { - "version": "1.2.0" - }, - "redis-parser": { - "version": "3.0.0", - "requires": { - "redis-errors": "^1.0.0" - } - }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -36154,9 +35850,6 @@ "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", "dev": true }, - "simple-lru-cache": { - "version": "0.0.2" - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -36371,9 +36064,6 @@ } } }, - "standard-as-callback": { - "version": "2.1.0" - }, "statuses": { "version": "1.5.0" }, diff --git a/package.json b/package.json index bf88b8e841d..f25e71831c9 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,6 @@ "apollo-reporting-protobuf": "file:packages/apollo-reporting-protobuf", "apollo-server": "file:packages/apollo-server", "apollo-server-azure-functions": "file:packages/apollo-server-azure-functions", - "apollo-server-cache-memcached": "file:packages/apollo-server-cache-memcached", - "apollo-server-cache-redis": "file:packages/apollo-server-cache-redis", - "apollo-server-caching": "file:packages/apollo-server-caching", "apollo-server-cloud-functions": "file:packages/apollo-server-cloud-functions", "apollo-server-cloudflare": "file:packages/apollo-server-cloudflare", "apollo-server-core": "file:packages/apollo-server-core", @@ -75,14 +72,12 @@ "@types/express-serve-static-core": "4.17.29", "@types/fast-json-stable-stringify": "2.0.0", "@types/hapi__hapi": "20.0.12", - "@types/ioredis": "4.28.10", "@types/jest": "28.1.1", "@types/koa-router": "7.4.4", "@types/lodash": "4.14.182", "@types/lodash.sumby": "4.6.7", "@types/lodash.xorby": "4.7.7", "@types/lru-cache": "5.1.1", - "@types/memcached": "2.2.7", "@types/micro": "7.3.7", "@types/node": "12.20.55", "@types/node-fetch": "2.6.1", @@ -109,7 +104,6 @@ "form-data": "4.0.0", "graphql": "15.8.0", "graphql-tag": "2.12.6", - "ioredis": "4.28.5", "jest": "28.1.1", "jest-config": "28.1.1", "jest-junit": "13.2.0", @@ -119,7 +113,6 @@ "koa-router": "10.1.1", "lerna": "4.0.0", "lodash.sumby": "4.6.0", - "memcached-mock": "0.1.0", "mock-req": "0.2.0", "nock": "13.2.7", "node-fetch": "2.6.7", diff --git a/packages/apollo-server-cache-memcached/.npmignore b/packages/apollo-server-cache-memcached/.npmignore deleted file mode 100644 index 311075fe3ea..00000000000 --- a/packages/apollo-server-cache-memcached/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -* -!src/**/* -src/**/__tests__/** -!dist/**/* -dist/**/__tests__/** -!package.json -!README.md diff --git a/packages/apollo-server-cache-memcached/README.md b/packages/apollo-server-cache-memcached/README.md deleted file mode 100644 index ee8f936d665..00000000000 --- a/packages/apollo-server-cache-memcached/README.md +++ /dev/null @@ -1,26 +0,0 @@ -## MemcachedCache - -[![npm version](https://badge.fury.io/js/apollo-server-cache-memcached.svg)](https://badge.fury.io/js/apollo-server-cache-memcached) -[![Build Status](https://circleci.com/gh/apollographql/apollo-server/tree/main.svg?style=svg)](https://circleci.com/gh/apollographql/apollo-server) - -This package exports an implementation of `KeyValueCache` that allows using Memcached as a backing store for resource caching in [Data Sources](https://www.apollographql.com/docs/apollo-server/v2/features/data-sources.html). - -## Usage - -```js -const { MemcachedCache } = require('apollo-server-cache-memcached'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new MemcachedCache( - ['memcached-server-1', 'memcached-server-2', 'memcached-server-3'], - { retries: 10, retry: 10000 }, // Options - ), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -For documentation of the options you can pass to the underlying memcached client, look [here](https://github.com/3rd-Eden/memcached). diff --git a/packages/apollo-server-cache-memcached/jest.config.js b/packages/apollo-server-cache-memcached/jest.config.js deleted file mode 100644 index a383fbc925f..00000000000 --- a/packages/apollo-server-cache-memcached/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../../jest.config.base'); - -module.exports = Object.assign(Object.create(null), config); diff --git a/packages/apollo-server-cache-memcached/package.json b/packages/apollo-server-cache-memcached/package.json deleted file mode 100644 index 29302cc4caa..00000000000 --- a/packages/apollo-server-cache-memcached/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "apollo-server-cache-memcached", - "version": "3.3.1", - "author": "Apollo ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/apollographql/apollo-server", - "directory": "packages/apollo-server-cache-memcached" - }, - "homepage": "https://github.com/apollographql/apollo-server#readme", - "bugs": { - "url": "https://github.com/apollographql/apollo-server/issues" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "engines": { - "node": ">=12.0" - }, - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-caching": "file:../apollo-server-caching", - "apollo-server-env": "file:../apollo-server-env", - "memcached": "^2.2.2" - } -} diff --git a/packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts b/packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts deleted file mode 100644 index f09945630af..00000000000 --- a/packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -// use mock implementations for underlying databases -jest.mock('memcached', () => require('memcached-mock')); - -import { MemcachedCache } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('Memcached', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new MemcachedCache('localhost'); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json b/packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json deleted file mode 100644 index d7cd9b716cc..00000000000 --- a/packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../../tsconfig.test.base", - "include": ["**/*"], - "references": [ - { "path": "../../" }, - ] -} diff --git a/packages/apollo-server-cache-memcached/src/index.ts b/packages/apollo-server-cache-memcached/src/index.ts deleted file mode 100644 index cec2d9899c3..00000000000 --- a/packages/apollo-server-cache-memcached/src/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { - KeyValueCache, - KeyValueCacheSetOptions, -} from '@apollo/utils.keyvaluecache'; -import Memcached from 'memcached'; -import { promisify } from 'util'; - -export class MemcachedCache implements KeyValueCache { - // TODO: Replace any with proper promisified type - readonly client: any; - readonly defaultSetOptions: KeyValueCacheSetOptions = { - ttl: 300, - }; - - constructor(serverLocation: Memcached.Location, options?: Memcached.options) { - const client = new Memcached(serverLocation, options); - // promisify client calls for convenience - client.del = promisify(client.del).bind(client); - client.get = promisify(client.get).bind(client); - client.set = promisify(client.set).bind(client); - client.flush = promisify(client.flush).bind(client); - - this.client = client; - } - - async set( - key: string, - value: string, - options?: KeyValueCacheSetOptions, - ): Promise { - const { ttl } = Object.assign({}, this.defaultSetOptions, options); - if (typeof ttl === 'number') { - await this.client.set(key, value, ttl); - } else { - // In Memcached, zero indicates no specific expiration time. Of course, - // it may be purged from the cache for other reasons as deemed necessary. - await this.client.set(key, value, 0); - } - } - - async get(key: string): Promise { - return await this.client.get(key); - } - - async delete(key: string): Promise { - return await this.client.del(key); - } - - // Drops all data from Memcached. This should only be used by test suites --- - // production code should never drop all data from an end user cache. - async flush(): Promise { - await this.client.flush(); - } - - async close(): Promise { - this.client.end(); - } -} diff --git a/packages/apollo-server-cache-memcached/tsconfig.json b/packages/apollo-server-cache-memcached/tsconfig.json deleted file mode 100644 index 98e3dc7fa93..00000000000 --- a/packages/apollo-server-cache-memcached/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"], - "references": [] -} diff --git a/packages/apollo-server-cache-redis/.npmignore b/packages/apollo-server-cache-redis/.npmignore deleted file mode 100644 index 311075fe3ea..00000000000 --- a/packages/apollo-server-cache-redis/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -* -!src/**/* -src/**/__tests__/** -!dist/**/* -dist/**/__tests__/** -!package.json -!README.md diff --git a/packages/apollo-server-cache-redis/README.md b/packages/apollo-server-cache-redis/README.md deleted file mode 100644 index 5185648e778..00000000000 --- a/packages/apollo-server-cache-redis/README.md +++ /dev/null @@ -1,86 +0,0 @@ -## RedisCache - -[![npm version](https://badge.fury.io/js/apollo-server-cache-redis.svg)](https://badge.fury.io/js/apollo-server-cache-redis) -[![Build Status](https://circleci.com/gh/apollographql/apollo-server/tree/main.svg?style=svg)](https://circleci.com/gh/apollographql/apollo-server) - -This package exports an implementation of `KeyValueCache` that allows using Redis as a backing store for resource caching in [Data Sources](https://www.apollographql.com/docs/apollo-server/data/data-sources). - -It currently supports a single instance of Redis, [Cluster](http://redis.io/topics/cluster-tutorial) and [Sentinel](http://redis.io/topics/sentinel). - -## Usage - -This package is built to be compatible with the [ioredis](https://www.npmjs.com/package/ioredis) Redis client. The recommended usage is to use the `BaseRedisCache` class which takes either a `client` option (a client that talks to a single server) or a `noMgetClient` option (a client that talks to Redis Cluster). (The difference is that ioredis [only supports the `mget` multi-get command in non-cluster mode](https://github.com/luin/ioredis/issues/811), so using `noMgetClient` tells `BaseRedisCache` to use parallel `get` commands instead.) - -You may also use the older `RedisCache` and `RedisClusterCache` classes, which allow you to pass the ioredis constructor arguments directly to the cache class's constructor. -### Single instance - -```js -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new BaseRedisCache({ - client: new Redis({ - host: 'redis-server', - }), - }), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -### Sentinels - -```js -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new BaseRedisCache({ - client: new Redis({ - sentinels: [{ - host: 'sentinel-host-01', - port: 26379 - }], - password: 'my_password', - name: 'service_name', - }), - }), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -### Cluster - -```js -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new BaseRedisCache({ - noMgetClient: new Redis.Cluster( - [{ - host: 'redis-node-01-host', - // Options are passed through to the Redis cluster client - }], - { - // Redis cluster client options - } - ), - }), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -For documentation of the options you can pass to the underlying redis client, look [here](https://github.com/luin/ioredis). diff --git a/packages/apollo-server-cache-redis/jest.config.js b/packages/apollo-server-cache-redis/jest.config.js deleted file mode 100644 index a383fbc925f..00000000000 --- a/packages/apollo-server-cache-redis/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../../jest.config.base'); - -module.exports = Object.assign(Object.create(null), config); diff --git a/packages/apollo-server-cache-redis/package.json b/packages/apollo-server-cache-redis/package.json deleted file mode 100644 index 647241d458e..00000000000 --- a/packages/apollo-server-cache-redis/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "apollo-server-cache-redis", - "version": "3.3.1", - "author": "Apollo ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/apollographql/apollo-server", - "directory": "packages/apollo-server-cache-redis" - }, - "homepage": "https://github.com/apollographql/apollo-server#readme", - "bugs": { - "url": "https://github.com/apollographql/apollo-server/issues" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "engines": { - "node": ">=12.0" - }, - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-env": "file:../apollo-server-env", - "dataloader": "^2.0.0", - "ioredis": "^4.17.3" - } -} diff --git a/packages/apollo-server-cache-redis/src/BaseRedisCache.ts b/packages/apollo-server-cache-redis/src/BaseRedisCache.ts deleted file mode 100644 index 9b375894cbd..00000000000 --- a/packages/apollo-server-cache-redis/src/BaseRedisCache.ts +++ /dev/null @@ -1,112 +0,0 @@ -import type { - KeyValueCache, - KeyValueCacheSetOptions, -} from '@apollo/utils.keyvaluecache'; -import DataLoader from 'dataloader'; - -interface BaseRedisClient { - set: ( - key: string, - value: string, - option?: string, - optionValue?: number, - ) => Promise; - flushdb: () => Promise; - del: (key: string) => Promise; - quit: () => Promise; -} - -export interface RedisClient extends BaseRedisClient { - mget: (...key: Array) => Promise>; -} - -export interface RedisNoMgetClient extends BaseRedisClient { - get: (key: string) => Promise; -} - -/** - * Provide exactly one of the options `client` and `noMgetClient`. `client` is - * a client that supports the `mget` multiple-get command. - * - * ioredis does not support `mget` for cluster mode (see - * https://github.com/luin/ioredis/issues/811), so if you're using cluster mode, - * pass `noMgetClient` instead, which has a `get` method instead of `mget`; - * this package will issue parallel `get` commands instead of a single `mget` - * command if `noMgetClient` is provided. - */ -export interface BaseRedisCacheOptions { - client?: RedisClient; - noMgetClient?: RedisNoMgetClient; -} - -export class BaseRedisCache implements KeyValueCache { - readonly client: BaseRedisClient; - readonly defaultSetOptions: KeyValueCacheSetOptions = { - ttl: 300, - }; - - private loader: DataLoader; - - constructor(options: BaseRedisCacheOptions) { - const { client, noMgetClient } = options; - if (client && noMgetClient) { - throw Error('You may only provide one of `client` and `noMgetClient`'); - } else if (client) { - this.client = client; - this.loader = new DataLoader((keys) => client.mget(...keys), { - cache: false, - }); - } else if (noMgetClient) { - this.client = noMgetClient; - this.loader = new DataLoader( - (keys) => - Promise.all( - keys.map((key) => noMgetClient.get(key).catch(() => null)), - ), - { - cache: false, - }, - ); - } else { - throw Error('You must provide `client` or `noMgetClient`'); - } - } - - async set( - key: string, - value: string, - options?: KeyValueCacheSetOptions, - ): Promise { - const { ttl } = Object.assign({}, this.defaultSetOptions, options); - if (typeof ttl === 'number') { - await this.client.set(key, value, 'EX', ttl); - } else { - // We'll leave out the EXpiration when no value is specified. Of course, - // it may be purged from the cache for other reasons as deemed necessary. - await this.client.set(key, value); - } - } - - async get(key: string): Promise { - const reply = await this.loader.load(key); - if (reply !== null) { - return reply; - } - return; - } - - async delete(key: string): Promise { - return (await this.client.del(key)) > 0; - } - - // Drops all data from Redis. This should only be used by test suites --- - // production code should never drop all data from an end user Redis cache! - async flush(): Promise { - await this.client.flushdb(); - } - - async close(): Promise { - await this.client.quit(); - return; - } -} diff --git a/packages/apollo-server-cache-redis/src/RedisCache.ts b/packages/apollo-server-cache-redis/src/RedisCache.ts deleted file mode 100644 index d7642f9320a..00000000000 --- a/packages/apollo-server-cache-redis/src/RedisCache.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Redis, { RedisOptions } from 'ioredis'; -import { BaseRedisCache } from './BaseRedisCache'; - -export class RedisCache extends BaseRedisCache { - constructor(options?: RedisOptions) { - super({ client: new Redis(options) }); - } -} diff --git a/packages/apollo-server-cache-redis/src/RedisClusterCache.ts b/packages/apollo-server-cache-redis/src/RedisClusterCache.ts deleted file mode 100644 index 46633bfb78c..00000000000 --- a/packages/apollo-server-cache-redis/src/RedisClusterCache.ts +++ /dev/null @@ -1,21 +0,0 @@ -import Redis, { - ClusterOptions, - ClusterNode, - Redis as RedisInstance, -} from 'ioredis'; -import { BaseRedisCache } from './BaseRedisCache'; - -export class RedisClusterCache extends BaseRedisCache { - private readonly clusterClient: Redis.Cluster; - - constructor(nodes: ClusterNode[], options?: ClusterOptions) { - const clusterClient = new Redis.Cluster(nodes, options); - super({ noMgetClient: clusterClient }); - this.clusterClient = clusterClient; - } - - override async flush(): Promise { - const masters = this.clusterClient.nodes('master') || []; - await Promise.all(masters.map((node: RedisInstance) => node.flushdb())); - } -} diff --git a/packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts b/packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts deleted file mode 100644 index 5ed84a00172..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { BaseRedisCache, RedisClient } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('BaseRedisCache', () => { - it('run apollo-server-caching test suite', async () => { - const store: { [key: string]: string } = {}; - const timeouts: NodeJS.Timer[] = []; - const testRedisClient: RedisClient = { - set: jest.fn( - (key: string, value: string, option?: string, ttl?: number) => { - store[key] = value; - if (option === 'EX' && ttl) { - timeouts.push(setTimeout(() => delete store[key], ttl * 1000)); - } - return Promise.resolve(); - }, - ), - mget: jest.fn((...keys) => - Promise.resolve(keys.map((key: string) => store[key])), - ), - flushdb: jest.fn(() => Promise.resolve()), - del: jest.fn((key: string) => { - const keysDeleted = store.hasOwnProperty(key) ? 1 : 0; - delete store[key]; - return Promise.resolve(keysDeleted); - }), - quit: jest.fn(() => Promise.resolve()), - }; - const cache = new BaseRedisCache({ client: testRedisClient }); - const clock = FakeTimers.install(); - - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - timeouts.forEach((t) => clearTimeout(t)); - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts b/packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts deleted file mode 100644 index 5b8aae4e74e..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -jest.mock('ioredis', () => require('./mockIoredis')); - -import { RedisCache } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('Redis', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new RedisCache(); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts b/packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts deleted file mode 100644 index d65a67563d1..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -jest.mock('ioredis', () => require('./mockIoredis')); - -import { RedisClusterCache } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('Redis', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new RedisClusterCache([{ host: 'localhost' }]); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts b/packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts deleted file mode 100644 index f2169b18b3d..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts +++ /dev/null @@ -1,51 +0,0 @@ -class Redis { - private keyValue = new Map< - string, - { value: string; ttl: number | undefined } - >(); - private timeouts = new Set(); - - async del(key: string) { - const keysDeleted = this.keyValue.has(key) ? 1 : 0; - this.keyValue.delete(key); - return keysDeleted; - } - - async get(key: string) { - return this.keyValue.get(key)?.value; - } - - async mget(...keys: string[]) { - return keys.map((key) => this.keyValue.get(key)?.value); - } - - async set(key: string, value: string, _: string, ttl: number | undefined) { - this.keyValue.set(key, { - value, - ttl, - }); - if (ttl) { - const timeout = setTimeout(() => { - this.timeouts.delete(timeout); - this.del(key); - }, ttl * 1000); - this.timeouts.add(timeout); - } - return true; - } - - nodes() { - return []; - } - - async flushdb() {} - - async quit() { - this.timeouts.forEach((t) => clearTimeout(t)); - } -} - -// Use the same mock as Redis.Cluster. -(Redis as any).Cluster = Redis; - -export default Redis; diff --git a/packages/apollo-server-cache-redis/src/__tests__/tsconfig.json b/packages/apollo-server-cache-redis/src/__tests__/tsconfig.json deleted file mode 100644 index d7cd9b716cc..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../../tsconfig.test.base", - "include": ["**/*"], - "references": [ - { "path": "../../" }, - ] -} diff --git a/packages/apollo-server-cache-redis/src/index.ts b/packages/apollo-server-cache-redis/src/index.ts deleted file mode 100644 index 34782f2d488..00000000000 --- a/packages/apollo-server-cache-redis/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { RedisCache } from './RedisCache'; -export { RedisClusterCache } from './RedisClusterCache'; -export { RedisClient, BaseRedisCache } from './BaseRedisCache'; diff --git a/packages/apollo-server-cache-redis/tsconfig.json b/packages/apollo-server-cache-redis/tsconfig.json deleted file mode 100644 index 98e3dc7fa93..00000000000 --- a/packages/apollo-server-cache-redis/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"], - "references": [] -} diff --git a/packages/apollo-server-caching/.gitignore b/packages/apollo-server-caching/.gitignore deleted file mode 100644 index 723ef36f4e4..00000000000 --- a/packages/apollo-server-caching/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea \ No newline at end of file diff --git a/packages/apollo-server-caching/.npmignore b/packages/apollo-server-caching/.npmignore deleted file mode 100644 index 311075fe3ea..00000000000 --- a/packages/apollo-server-caching/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -* -!src/**/* -src/**/__tests__/** -!dist/**/* -dist/**/__tests__/** -!package.json -!README.md diff --git a/packages/apollo-server-caching/README.md b/packages/apollo-server-caching/README.md deleted file mode 100644 index 3017726ec76..00000000000 --- a/packages/apollo-server-caching/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# apollo-server-caching - -[![npm version](https://badge.fury.io/js/apollo-server-caching.svg)](https://badge.fury.io/js/apollo-server-caching) -[![Build Status](https://circleci.com/gh/apollographql/apollo-server/tree/main.svg?style=svg)](https://circleci.com/gh/apollographql/apollo-server) - -## Implementing your own Cache - -Internally, Apollo Server uses the `KeyValueCache` interface to provide a caching store for the Data Sources. An in-memory LRU cache is used by default, and we provide connectors for [Memcached](../apollo-server-cache-memcached)/[Redis](../apollo-server-cache-redis) backends. - -Built with extensibility in mind, you can also implement your own cache to use with Apollo Server, in a way that best suits your application needs. It needs to implement the following interface that can be exported from `apollo-server-caching`: - -```typescript -export interface KeyValueCache { - get(key: string): Promise; - set(key: string, value: string, options?: { ttl?: number }): Promise; -} -``` - -> The `ttl` value for the `set` method's `options` is specified in __seconds__. - -## Testing cache implementations - -### Test helpers - -`apollo-server-caching` exports a function that you can run within a test suite to validate your implementation. It throws on failure. If you want to test expiration, then mock out `Date` and `setTimeout` (probably with `@sinonjs/fake-timers`) and pass a `tick` can be called to advance the fake time. (If you don't pass `tick`, it won't test expiration.) Other than that, it has no dependencies and can work in any test system and shouldn't require any particular build configuration to use from jest. Here's an example of how to use it with jest: - -```typescript -// ../__tests__/YourKeyValueCache.test.ts - -import YourKeyValueCache from '../src/YourKeyValueCache'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('YourKeyValueCache', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new YourKeyValueCache(); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); -``` - -For more details, consult the [source for `apollo-server-caching`](./src/testsuite.ts). - -### Running tests - -Run tests with `jest --verbose` diff --git a/packages/apollo-server-caching/jest.config.js b/packages/apollo-server-caching/jest.config.js deleted file mode 100644 index a383fbc925f..00000000000 --- a/packages/apollo-server-caching/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../../jest.config.base'); - -module.exports = Object.assign(Object.create(null), config); diff --git a/packages/apollo-server-caching/package.json b/packages/apollo-server-caching/package.json deleted file mode 100644 index b365a34fadc..00000000000 --- a/packages/apollo-server-caching/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "apollo-server-caching", - "version": "3.3.0", - "author": "Apollo ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/apollographql/apollo-server", - "directory": "packages/apollo-server-caching" - }, - "homepage": "https://github.com/apollographql/apollo-server#readme", - "bugs": { - "url": "https://github.com/apollographql/apollo-server/issues" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "engines": { - "node": ">=12.0" - }, - "dependencies": { - "lru-cache": "^6.0.0" - } -} diff --git a/packages/apollo-server-caching/src/InMemoryLRUCache.ts b/packages/apollo-server-caching/src/InMemoryLRUCache.ts deleted file mode 100644 index fe6fa55ea3a..00000000000 --- a/packages/apollo-server-caching/src/InMemoryLRUCache.ts +++ /dev/null @@ -1,60 +0,0 @@ -import LRUCache from 'lru-cache'; -import type { KeyValueCache } from './KeyValueCache'; - -function defaultLengthCalculation(item: any) { - if (Array.isArray(item) || typeof item === 'string') { - return item.length; - } - - // Go with the lru-cache default "naive" size, in lieu anything better: - // https://github.com/isaacs/node-lru-cache/blob/a71be6cd/index.js#L17 - return 1; -} - -export class InMemoryLRUCache implements KeyValueCache { - private store: LRUCache; - - // TODO: Define reasonable default max size of the cache - constructor({ - maxSize = Infinity, - sizeCalculator = defaultLengthCalculation, - onDispose, - }: { - maxSize?: number; - sizeCalculator?: (value: V, key: string) => number; - onDispose?: (key: string, value: V) => void; - } = {}) { - this.store = new LRUCache({ - max: maxSize, - length: sizeCalculator, - dispose: onDispose, - }); - } - - async get(key: string) { - return this.store.get(key); - } - async set(key: string, value: V, options?: { ttl?: number }) { - const maxAge = options?.ttl && options.ttl * 1000; - this.store.set(key, value, maxAge); - } - async delete(key: string) { - this.store.del(key); - } - - // Drops all data from the cache. This should only be used by test suites --- - // production code should never drop all data from an end user cache. - async flush(): Promise { - this.store.reset(); - } - async getTotalSize() { - return this.store.length; - } - - // This is a size calculator based on the number of bytes in a JSON - // encoding of the stored object. It happens to be what ApolloServer - // uses for its default DocumentStore and may be helpful to others as well. - static jsonBytesSizeCalculator(obj: T): number { - return Buffer.byteLength(JSON.stringify(obj), 'utf8'); - } -} diff --git a/packages/apollo-server-caching/src/KeyValueCache.ts b/packages/apollo-server-caching/src/KeyValueCache.ts deleted file mode 100644 index a9f5f81fcd5..00000000000 --- a/packages/apollo-server-caching/src/KeyValueCache.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** Options for {@link KeyValueCache.set} */ -export interface KeyValueCacheSetOptions { - /** - * Specified in **seconds**, the time-to-live (TTL) value limits the lifespan - * of the data being stored in the cache. - */ - ttl?: number | null; -} - -export interface KeyValueCache { - get(key: string): Promise; - set(key: string, value: V, options?: KeyValueCacheSetOptions): Promise; - delete(key: string): Promise; -} diff --git a/packages/apollo-server-caching/src/PrefixingKeyValueCache.ts b/packages/apollo-server-caching/src/PrefixingKeyValueCache.ts deleted file mode 100644 index 956e47dcf8d..00000000000 --- a/packages/apollo-server-caching/src/PrefixingKeyValueCache.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { KeyValueCache, KeyValueCacheSetOptions } from './KeyValueCache'; - -// PrefixingKeyValueCache wraps another cache and adds a prefix to all keys used -// by all operations. This allows multiple features to share the same -// underlying cache without conflicts. -// -// Note that PrefixingKeyValueCache explicitly does not implement methods like -// flush() that aren't part of KeyValueCache, even though most KeyValueCache -// implementations also have a flush() method. Most implementations of flush() -// send a simple command that wipes the entire backend cache system, which -// wouldn't support "only wipe the part of the cache with this prefix", so -// trying to provide a flush() method here could be confusingly dangerous. -export class PrefixingKeyValueCache implements KeyValueCache { - constructor(private wrapped: KeyValueCache, private prefix: string) {} - - get(key: string) { - return this.wrapped.get(this.prefix + key); - } - set(key: string, value: V, options?: KeyValueCacheSetOptions) { - return this.wrapped.set(this.prefix + key, value, options); - } - delete(key: string) { - return this.wrapped.delete(this.prefix + key); - } -} diff --git a/packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts b/packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts deleted file mode 100644 index 69128f9d3e5..00000000000 --- a/packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { InMemoryLRUCache } from '../InMemoryLRUCache'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('InMemoryLRUCache', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new InMemoryLRUCache(); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - } - }); -}); diff --git a/packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts b/packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts deleted file mode 100644 index ffdb95d9951..00000000000 --- a/packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { InMemoryLRUCache } from '../InMemoryLRUCache'; -import { PrefixingKeyValueCache } from '../PrefixingKeyValueCache'; - -describe('PrefixingKeyValueCache', () => { - it('prefixes', async () => { - const inner = new InMemoryLRUCache(); - const prefixing = new PrefixingKeyValueCache(inner, 'prefix:'); - await prefixing.set('foo', 'bar'); - expect(await prefixing.get('foo')).toBe('bar'); - expect(await inner.get('prefix:foo')).toBe('bar'); - await prefixing.delete('foo'); - expect(await prefixing.get('foo')).toBe(undefined); - }); -}); diff --git a/packages/apollo-server-caching/src/__tests__/tsconfig.json b/packages/apollo-server-caching/src/__tests__/tsconfig.json deleted file mode 100644 index d7cd9b716cc..00000000000 --- a/packages/apollo-server-caching/src/__tests__/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../../tsconfig.test.base", - "include": ["**/*"], - "references": [ - { "path": "../../" }, - ] -} diff --git a/packages/apollo-server-caching/src/index.ts b/packages/apollo-server-caching/src/index.ts deleted file mode 100644 index f2bd0641a51..00000000000 --- a/packages/apollo-server-caching/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { KeyValueCache, KeyValueCacheSetOptions } from './KeyValueCache'; -export { InMemoryLRUCache } from './InMemoryLRUCache'; -export { PrefixingKeyValueCache } from './PrefixingKeyValueCache'; -export { runKeyValueCacheTests } from './testsuite'; diff --git a/packages/apollo-server-caching/src/testsuite.ts b/packages/apollo-server-caching/src/testsuite.ts deleted file mode 100644 index e1b68184837..00000000000 --- a/packages/apollo-server-caching/src/testsuite.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { KeyValueCache } from './KeyValueCache'; - -/** - * runKeyValueCacheTests is a function you can call from a test that exercises - * the given KeyValueCache. It throws on failure. If you want to test - * expiration, then mock out `Date` and `setTimeout` (probably with - * `@sinonjs/fake-timers`) and pass a `tick` that can be called to advance the - * fake time. (If you don't pass `tick`, it won't test expiration.) Other than - * that, it has no dependencies and can work in any test system and shouldn't - * require any particular build configuration to use from jest. See the - * README.md for an example of how to use this with jest. - */ -export async function runKeyValueCacheTests( - keyValueCache: KeyValueCache, - tick?: (ms: number) => void, -) { - // can do a basic get and set - await keyValueCache.set('hello', 'world'); - assertEqual(await keyValueCache.get('hello'), 'world'); - assertEqual(await keyValueCache.get('missing'), undefined); - - // can do a basic set and delete - await keyValueCache.set('hello2', 'world'); - assertEqual(await keyValueCache.get('hello2'), 'world'); - await keyValueCache.delete('hello2'); - assertEqual(await keyValueCache.get('hello2'), undefined); - - if (tick) { - // is able to expire keys based on ttl - await keyValueCache.set('short', 's', { ttl: 1 }); - await keyValueCache.set('long', 'l', { ttl: 5 }); - assertEqual(await keyValueCache.get('short'), 's'); - assertEqual(await keyValueCache.get('long'), 'l'); - tick(1500); - assertEqual(await keyValueCache.get('short'), undefined); - assertEqual(await keyValueCache.get('long'), 'l'); - tick(4000); - assertEqual(await keyValueCache.get('short'), undefined); - assertEqual(await keyValueCache.get('long'), undefined); - - // does not expire when ttl is null - await keyValueCache.set('forever', 'yours', { ttl: null }); - assertEqual(await keyValueCache.get('forever'), 'yours'); - tick(1500); - assertEqual(await keyValueCache.get('forever'), 'yours'); - tick(4000); - assertEqual(await keyValueCache.get('forever'), 'yours'); - } -} - -function assertEqual(actual: T, expected: T) { - if (actual === expected) { - return; - } - throw Error(`Expected ${actual} to equal ${expected}`); -} diff --git a/packages/apollo-server-caching/tsconfig.json b/packages/apollo-server-caching/tsconfig.json deleted file mode 100644 index d653fae6503..00000000000 --- a/packages/apollo-server-caching/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"] -} diff --git a/renovate.json5 b/renovate.json5 index 282ed047294..97635e91587 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -65,15 +65,6 @@ matchBaseBranches: ["main"], allowedVersions: "5.x" }, - // On version-4 we no longer are maintaining specific Redis cache bindings - // (instead we use the Keyv project). So we're not going to make the - // backwards-incompatible v4->v5 upgrade to this Redis library on - // apollo-server-cache-redis in AS3. - { - matchPackageNames: ["ioredis", "@types/ioredis"], - matchBaseBranches: ["main"], - allowedVersions: "4.x" - }, // We've transitioned from lerna to changesets on version-4. We don't need // to take the major upgrade on main. (Plus we can't because it drops Node // 12 support.) diff --git a/tsconfig.build.json b/tsconfig.build.json index 4a081a38182..661bf0efe0f 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -9,9 +9,6 @@ { "path": "./packages/apollo-datasource-rest" }, { "path": "./packages/apollo-server" }, { "path": "./packages/apollo-server-azure-functions" }, - { "path": "./packages/apollo-server-cache-memcached" }, - { "path": "./packages/apollo-server-cache-redis" }, - { "path": "./packages/apollo-server-caching" }, { "path": "./packages/apollo-server-cloud-functions" }, { "path": "./packages/apollo-server-cloudflare" }, { "path": "./packages/apollo-server-core" }, diff --git a/tsconfig.test.json b/tsconfig.test.json index 00f758fc67f..a81b43f1ba3 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -8,9 +8,6 @@ { "path": "./packages/apollo-datasource-rest/src/__tests__/" }, { "path": "./packages/apollo-server/src/__tests__/" }, { "path": "./packages/apollo-server-azure-functions/src/__tests__/" }, - { "path": "./packages/apollo-server-cache-memcached/src/__tests__/" }, - { "path": "./packages/apollo-server-cache-redis/src/__tests__/" }, - { "path": "./packages/apollo-server-caching/src/__tests__/" }, { "path": "./packages/apollo-server-cloud-functions/src/__tests__/" }, { "path": "./packages/apollo-server-core/src/__tests__/" }, { "path": "./packages/apollo-server-core/src/plugin/cacheControl/__tests__/" }, From ac8f9bf65805093574d35ae09f5e43c6a4019e2b Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Wed, 8 Jun 2022 13:39:52 -0700 Subject: [PATCH 05/10] Warn on unconfigured `cache` (#6545) Issue a warning in production mode if neither the cache nor the APQ cache (persistedQueries.cache) are configured. We've provided a simple path to using a bounded cache via: #6536 The current default for AS3 is an unbounded in memory cache, which is susceptible to a DOS attack since APQs can fill up the server's memory with no limit. This warning provides an actionable recommendation to update their configuration in order to prevent this. --- CHANGELOG.md | 1 + .../apollo-server-core/src/ApolloServer.ts | 14 ++++ .../src/__tests__/ApolloServer.test.ts | 2 + .../src/__tests__/ApolloServer.test.ts | 2 + .../src/__tests__/ApolloServer.test.ts | 2 + .../src/ApolloServer.ts | 69 +++++++++++++++++++ .../src/__tests__/ApolloServer.test.ts | 2 + 7 files changed, 92 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6b2bbce0e3..f30147dca13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The version headers in this history reflect the versions of Apollo Server itself - Remove dependency on `keyv`/`@apollo/utils.keyvadapter` in favor of a simple `Map`-backed cache which implements TTL [PR #6535](https://github.com/apollographql/apollo-server/pull/6535) - Add `cache: "bounded"` configuration option, allowing users to opt into bounded request cache (recommended) [PR #6536](https://github.com/apollographql/apollo-server/pull/6536) - Remove `apollo-server-caching` and `apollo-server-cache-*` packages [PR #6541](https://github.com/apollographql/apollo-server/pull/6541) +- Warn when APQ cache is unbounded in production (which is default) [PR #6545](https://github.com/apollographql/apollo-server/pull/6545) ## v3.8.2 diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index 154cdef924e..5b527783a25 100644 --- a/packages/apollo-server-core/src/ApolloServer.ts +++ b/packages/apollo-server-core/src/ApolloServer.ts @@ -267,6 +267,20 @@ export class ApolloServerBase< if (!requestOptions.cache) { requestOptions.cache = new UnboundedCache(); + + if ( + !isDev && + (requestOptions.persistedQueries === undefined || + (requestOptions.persistedQueries && + !requestOptions.persistedQueries.cache)) + ) { + this.logger.warn( + 'Persisted queries are enabled and are using an unbounded cache. Your server' + + ' is vulnerable to denial of service attacks via memory exhaustion. ' + + 'Set `cache: "bounded"` or `persistedQueries: false` in your ApolloServer ' + + 'constructor, or see FIXME:DOCS for other alternatives.', + ); + } } if (requestOptions.persistedQueries !== false) { diff --git a/packages/apollo-server-express/src/__tests__/ApolloServer.test.ts b/packages/apollo-server-express/src/__tests__/ApolloServer.test.ts index 1ab2d827175..aee3bcfd5ae 100644 --- a/packages/apollo-server-express/src/__tests__/ApolloServer.test.ts +++ b/packages/apollo-server-express/src/__tests__/ApolloServer.test.ts @@ -327,6 +327,7 @@ describe('apollo-server-express', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -356,6 +357,7 @@ describe('apollo-server-express', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); diff --git a/packages/apollo-server-fastify/src/__tests__/ApolloServer.test.ts b/packages/apollo-server-fastify/src/__tests__/ApolloServer.test.ts index d4069f51501..e7ecf681e49 100644 --- a/packages/apollo-server-fastify/src/__tests__/ApolloServer.test.ts +++ b/packages/apollo-server-fastify/src/__tests__/ApolloServer.test.ts @@ -346,6 +346,7 @@ describe('apollo-server-fastify', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -375,6 +376,7 @@ describe('apollo-server-fastify', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); diff --git a/packages/apollo-server-hapi/src/__tests__/ApolloServer.test.ts b/packages/apollo-server-hapi/src/__tests__/ApolloServer.test.ts index c1363b16837..bed25612708 100644 --- a/packages/apollo-server-hapi/src/__tests__/ApolloServer.test.ts +++ b/packages/apollo-server-hapi/src/__tests__/ApolloServer.test.ts @@ -350,6 +350,7 @@ describe('non-integration tests', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -379,6 +380,7 @@ describe('non-integration tests', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); diff --git a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts index 90aedbaef29..bcfea09861f 100644 --- a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts +++ b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts @@ -268,6 +268,7 @@ export function testApolloServer( schema, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -287,6 +288,7 @@ export function testApolloServer( introspection: true, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -1730,6 +1732,7 @@ export function testApolloServer( }, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -1760,6 +1763,7 @@ export function testApolloServer( }, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -2296,6 +2300,71 @@ export function testApolloServer( expect(server['requestOptions'].cache).toBe(customCache); }); + it("warns in production mode when cache isn't configured and APQ isn't disabled", () => { + const mockLogger = { + warn: jest.fn(), + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + }; + + new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + nodeEnv: 'production', + logger: mockLogger, + }); + + expect(mockLogger.warn).toHaveBeenCalledWith( + expect.stringMatching( + /Persisted queries are enabled and are using an unbounded cache/, + ), + ); + }); + + it("doesn't warn about cache configuration if: not production mode, cache configured, APQ disabled, or APQ cache configured", () => { + const mockLogger = { + warn: jest.fn(), + debug: jest.fn(), + error: jest.fn(), + info: jest.fn(), + }; + + // dev mode + new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + nodeEnv: 'development', + logger: mockLogger, + }); + + // cache configured + new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + nodeEnv: 'production', + logger: mockLogger, + cache: 'bounded', + }); + + // APQ disabled + new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + nodeEnv: 'development', + logger: mockLogger, + persistedQueries: false, + }); + + // APQ cache configured + new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + nodeEnv: 'development', + logger: mockLogger, + persistedQueries: { + cache: {} as KeyValueCache, + }, + }); + + expect(mockLogger.warn).not.toHaveBeenCalled(); + }); + it('basic caching', async () => { const typeDefs = gql` type Query { diff --git a/packages/apollo-server-koa/src/__tests__/ApolloServer.test.ts b/packages/apollo-server-koa/src/__tests__/ApolloServer.test.ts index 49ca8df0cb3..65e213c5f78 100644 --- a/packages/apollo-server-koa/src/__tests__/ApolloServer.test.ts +++ b/packages/apollo-server-koa/src/__tests__/ApolloServer.test.ts @@ -316,6 +316,7 @@ describe('apollo-server-koa', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -345,6 +346,7 @@ describe('apollo-server-koa', () => { }, }, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); From 549070e4d710a31d23a57c120c83219bffa38968 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Wed, 8 Jun 2022 16:34:01 -0700 Subject: [PATCH 06/10] Reinstate bounded documentStore (#6548) --- packages/apollo-server-core/src/ApolloServer.ts | 2 +- .../apollo-server-core/src/__tests__/documentStore.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index 5b527783a25..90c6388b5bb 100644 --- a/packages/apollo-server-core/src/ApolloServer.ts +++ b/packages/apollo-server-core/src/ApolloServer.ts @@ -728,7 +728,7 @@ export class ApolloServerBase< // random prefix each time we get a new schema. documentStore: this.config.documentStore === undefined - ? new UnboundedCache() + ? new InMemoryLRUCache() : this.config.documentStore === null ? null : new PrefixingKeyValueCache( diff --git a/packages/apollo-server-core/src/__tests__/documentStore.test.ts b/packages/apollo-server-core/src/__tests__/documentStore.test.ts index 4570f1c89a9..d65a96b298c 100644 --- a/packages/apollo-server-core/src/__tests__/documentStore.test.ts +++ b/packages/apollo-server-core/src/__tests__/documentStore.test.ts @@ -3,7 +3,7 @@ import type { DocumentNode } from 'graphql'; import { ApolloServerBase } from '../ApolloServer'; import assert from 'assert'; -import { UnboundedCache } from '../utils/UnboundedCache'; +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; const typeDefs = gql` type Query { @@ -54,7 +54,7 @@ describe('ApolloServerBase documentStore', () => { const options = await server.graphQLServerOptions(); const embeddedStore = options.documentStore; assert(embeddedStore); - expect(embeddedStore).toBeInstanceOf(UnboundedCache); + expect(embeddedStore).toBeInstanceOf(InMemoryLRUCache); await server.executeOperation(operations.simple.op); From b6fda1bc268b6ac872b20e4d1bf61a8ade366aeb Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Mon, 13 Jun 2022 13:49:55 -0700 Subject: [PATCH 07/10] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f30147dca13..c31a9dfa9ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The version headers in this history reflect the versions of Apollo Server itself - Add `cache: "bounded"` configuration option, allowing users to opt into bounded request cache (recommended) [PR #6536](https://github.com/apollographql/apollo-server/pull/6536) - Remove `apollo-server-caching` and `apollo-server-cache-*` packages [PR #6541](https://github.com/apollographql/apollo-server/pull/6541) - Warn when APQ cache is unbounded in production (which is default) [PR #6545](https://github.com/apollographql/apollo-server/pull/6545) +- Await `parsingDidEnd` `Promise`. Note from @trevor-scheer: I don't think this resolves the issue it intended to. See [Issue #6567](https://github.com/apollographql/apollo-server/pull/6567) for details. [PR #6559](https://github.com/apollographql/apollo-server/pull/6559) ## v3.8.2 From 9387cba42eb8f1773c93a8b659998795031f24b5 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Tue, 14 Jun 2022 16:40:33 -0700 Subject: [PATCH 08/10] Update caching docs (#6547) Add new page for configuring Apollo Server's cache. Include details on how to use `InMemoryCache` as well as `Keyv` + `KeyvAdapter`. Add information about the new `cache: "bounded"` option and the associated risks. Update other cache-related docs to point to the new cache-backends page when appropriate. Co-authored-by: Rose M Koron <32436232+rkoron007@users.noreply.github.com> Co-authored-by: Stephen Barlow --- cspell-dict.txt | 1 + docs/source/api/apollo-server.mdx | 5 +- docs/source/config.json | 1 + docs/source/data/data-sources.mdx | 59 +- docs/source/integrations/middleware.mdx | 2 +- docs/source/performance/apq.md | 134 +- docs/source/performance/cache-backends.mdx | 204 +++ docs/source/performance/caching.md | 8 +- package-lock.json | 1526 ++++++++++------- .../apollo-server-core/src/ApolloServer.ts | 2 +- 10 files changed, 1088 insertions(+), 854 deletions(-) create mode 100644 docs/source/performance/cache-backends.mdx diff --git a/cspell-dict.txt b/cspell-dict.txt index 8bc102f3b5d..384fc8a874d 100644 --- a/cspell-dict.txt +++ b/cspell-dict.txt @@ -89,6 +89,7 @@ Loftis loglevel Luca MAXAGE +memjs mget Mget microrouter diff --git a/docs/source/api/apollo-server.mdx b/docs/source/api/apollo-server.mdx index 3cc6fd38110..4bcbe4307d0 100644 --- a/docs/source/api/apollo-server.mdx +++ b/docs/source/api/apollo-server.mdx @@ -203,7 +203,7 @@ A key-value cache that Apollo Server uses to store previously encountered GraphQ Whenever Apollo Server receives an incoming operation, it checks whether that exact operation is present in its `documentStore`. If it's present, Apollo Server can safely skip parsing and validating the operation, thereby improving performance. -The default `documentStore` is an [`InMemoryLRUCache`](https://github.com/apollographql/apollo-server/blob/main/packages/apollo-server-caching/src/InMemoryLRUCache.ts) with an approximate size of 30MiB. This is usually sufficient unless the server processes a large number of unique operations. Provide this option if you want to change the cache size or store the cache information in an alternate location. +The default `documentStore` is an [`InMemoryLRUCache`](https://github.com/apollographql/apollo-utils/blob/main/packages/keyValueCache/src/InMemoryLRUCache.ts) with an approximate size of 30MiB. This is usually sufficient unless the server processes a large number of unique operations. Provide this option if you want to change the cache size or store the cache information in an alternate location. To use `InMemoryLRUCache` but change its size to an amount `approximateDocumentStoreMiB`: @@ -244,7 +244,8 @@ By default, the cache is unbounded. We don't recommend this, since a malicious c If you don't want to configure your own cache, you should set `cache: "bounded"`. The bounded cache is an [`InMemoryLRUCache`](https://www.npmjs.com/package/@apollo/utils.keyvaluecache) with a default size of roughly 30MiB. -FIXME: link to new cache backend page +To learn more about configuring Apollo Server's cache, see [Configuring cache backends](../performance/cache-backends). + diff --git a/docs/source/config.json b/docs/source/config.json index edd3c5e62bc..08372024076 100644 --- a/docs/source/config.json +++ b/docs/source/config.json @@ -40,6 +40,7 @@ }, "Performance": { "Caching": "/performance/caching", + "Cache backends": "/performance/cache-backends", "Automatic persisted queries": "/performance/apq" }, "Security": { diff --git a/docs/source/data/data-sources.mdx b/docs/source/data/data-sources.mdx index 10104a5857c..d29ac3b4d3d 100644 --- a/docs/source/data/data-sources.mdx +++ b/docs/source/data/data-sources.mdx @@ -89,66 +89,17 @@ const resolvers = { ## Caching -By default, data source implementations use Apollo Server's [`InMemoryLRUCache`](https://github.com/apollographql/apollo-server/blob/0aa0e4b20ef97576ce92733698a7842b61d8280e/packages/apollo-server-caching/src/InMemoryLRUCache.ts#L14) to store the results of past fetches. +By default, data source implementations use Apollo Server's in-memory cache to store the results of past fetches. -When you initialize Apollo Server, you can provide its constructor a _different_ cache object that implements the [`KeyValueCache` interface](https://github.com/apollographql/apollo-server/blob/0aa0e4b20ef97576ce92733698a7842b61d8280e/packages/apollo-server-caching/src/KeyValueCache.ts#L10-L14). This enables you to back your cache with shared stores like Memcached or Redis. +When you initialize Apollo Server, you can provide its constructor a _different_ cache object that implements the [`KeyValueCache` interface](https://github.com/apollographql/apollo-utils/tree/main/packages/keyValueCache#keyvaluecache-interface). This enables you to back your cache with shared stores like Memcached or Redis. -### Using Memcached/Redis as a cache storage backend +### Using an external cache backend When running multiple instances of your server, you should use a shared cache backend. This enables one server instance to use the cached result from _another_ instance. -Apollo Server supports using [Memcached](https://memcached.org/) or [Redis](https://redis.io/) as cache stores via the [`apollo-server-cache-memcached`](https://www.npmjs.com/package/apollo-server-cache-memcached) and [`apollo-server-cache-redis`](https://www.npmjs.com/package/apollo-server-cache-redis) packages. You can specify which one to use by creating an instance and passing it into the `ApolloServer` constructor. - -#### Memcached - -```js -const { MemcachedCache } = require('apollo-server-cache-memcached'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - csrfPrevention: true, - cache: new MemcachedCache( - ['memcached-server-1', 'memcached-server-2', 'memcached-server-3'], - { retries: 10, retry: 10000 }, // Options - ), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -For the options you can pass to the underlying Memcached client, [see the documentation](https://github.com/3rd-Eden/memcached). - -#### Redis - -```js title="Redis" -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - csrfPrevention: true, - cache: new BaseRedisCache({ - client: new Redis({ - host: 'redis-server', - }), - }), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -For the options you can pass to the underlying Redis client, [see the documentation](https://github.com/luin/ioredis). - -### Implementing your own cache backend - -You can create your own implementation of the [`KeyValueCache` interface](https://github.com/apollographql/apollo-server/blob/0aa0e4b20ef97576ce92733698a7842b61d8280e/packages/apollo-server-caching/src/KeyValueCache.ts#L10-L14) to connect to other caching data stores, or to optimize for your application's query characteristics. - -For more information, see the README in for [apollo-server-caching](https://www.npmjs.com/package/apollo-server-caching). +Apollo Server supports using [Memcached](https://memcached.org/), [Redis](https://redis.io/), or other cache backends via the [`keyv`](https://www.npmjs.com/package/keyv) package. For examples, see [Configuring external caching](../performance/cache-backends#configuring-external-caching). +You can also choose to implement your own cache backend. For more information, see [Implementing your own cache backend](../performance/cache-backends#implementing-your-own-cache-backend). ## `RESTDataSource` reference diff --git a/docs/source/integrations/middleware.mdx b/docs/source/integrations/middleware.mdx index b9a4eab6a49..cbb1d848e8a 100644 --- a/docs/source/integrations/middleware.mdx +++ b/docs/source/integrations/middleware.mdx @@ -204,7 +204,7 @@ All Apollo Server packages depend on `apollo-server-core`, which contains the co All Apollo Server packages (and `apollo-server-core`) are published to npm with the same version number, even if certain packages have no changes for a particular version. This makes it more straightforward to discuss a particular version of Apollo Server without needing to specify a package name. -Certain support libraries (such as `apollo-server-caching`, `apollo-server-types`, and `apollo-server-plugin-base`) use their own versioning and are published only when they change or one of their dependencies changes. +Certain support libraries (such as `apollo-server-types` and `apollo-server-plugin-base`) use their own versioning and are published only when they change or one of their dependencies changes. ### Common options diff --git a/docs/source/performance/apq.md b/docs/source/performance/apq.md index dd528f8b2de..77716866504 100644 --- a/docs/source/performance/apq.md +++ b/docs/source/performance/apq.md @@ -182,135 +182,9 @@ How exactly this works depends on exactly which CDN you chose. Configure your CD By default, Apollo Server stores its APQ registry within its local in-memory cache. If you provide a different `cache` as a top-level option to the `ApolloServer` constructor, Apollo Server uses that cache instead. -You can also designate a cache _specifically_ for the APQ registry. To do so, provide an instance of your preferred cache class to the `ApolloServer` constructor as a `cache` option nested inside the `persistedQueries` options object. The following backing data stores are supported: +You can also designate a cache _specifically_ for the APQ registry. To do so, provide an instance of your preferred cache class to the `ApolloServer` constructor as a `cache` option nested within the `persistedQueries` options object. The `persistedQueries.cache` option is a [`KeyValueCache`](https://github.com/apollographql/apollo-utils/tree/main/packages/keyValueCache#keyvaluecache-interface), which accepts the same configuration options as Apollo Server's `cache` object (also a `KeyValueCache`). -| Data store | Class name | Library | -|---|---|---| -| Local in-memory cache (default) | `InMemoryLRUCache` | [`apollo-server-caching`](https://npm.im/apollo-server-caching) | -| Memcached | `MemcachedCache` | [`apollo-server-cache-memcached`](https://npm.im/apollo-server-cache-memcached) | -| Redis (single instance or Sentinel) | `RedisCache` | [`apollo-server-cache-redis`](https://npm.im/apollo-server-cache-redis) | -| Redis Cluster | `RedisClusterCache`| [`apollo-server-cache-redis`](https://npm.im/apollo-server-cache-redis)| - -Examples for supported data stores are provided below. - -### Memcached - -```shell -$ npm install apollo-server-cache-memcached -``` - -```javascript -const { MemcachedCache } = require('apollo-server-cache-memcached'); -const { ApolloServer } = require('apollo-server'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - csrfPrevention: true, - cache: 'bounded', - // highlight-start - persistedQueries: { - cache: new MemcachedCache( - ['memcached-1.local', 'memcached-2.local', 'memcached-3.local'], - { retries: 10, retry: 10000 }, // Options - ), - }, - // highlight-end -}); -``` - -### Redis (single instance) - -```shell -$ npm install apollo-server-cache-redis ioredis -``` - -```javascript -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - csrfPrevention: true, - cache: 'bounded', - // highlight-start - persistedQueries: { - cache: new BaseRedisCache({ - client: new Redis({ - host: 'redis-server', - }), - }), - }, - // highlight-end -}); -``` - -### Redis (Sentinel) - -```shell -$ npm install apollo-server-cache-redis ioredis -``` - -```javascript -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - csrfPrevention: true, - cache: 'bounded', - // highlight-start - persistedQueries: { - cache: new BaseRedisCache({ - client: new Redis({ - sentinels: [{ - host: 'sentinel-host-01', - port: 26379 - }], - password: 'my_password', - name: 'service_name', - }), - }), - }, - // highlight-end -}); -``` - -### Redis Cluster - -```shell -$ npm install apollo-server-cache-redis ioredis -``` - -```javascript -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - csrfPrevention: true, - cache: 'bounded', - // highlight-start - persistedQueries: { - cache: new BaseRedisCache({ - // Note that this uses the "noMgetClient" option rather than "client", - // which avoids using the mget command which doesn't work in cluster mode. - noMgetClient: new Redis.Cluster( - [{ - host: 'redis-node-01-host', - }], - { - // Other Redis cluster client options - } - ), - }), - }, - // highlight-end -}); -``` +To learn how to configure the in-memory cache, set up an external cache, or write your own cache implementation, see [Configuring cache backends](./cache-backends). ## Adjusting cache time-to-live (TTL) @@ -318,7 +192,7 @@ The cache time-to-live (TTL) value determines how long a registered APQ remains Apollo Server's default in-memory store does not specify a TTL for APQ (an APQ remains cached until it is overwritten by the cache's standard eviction policy). For all other [supported stores](#cache-configuration), the default TTL is 300 seconds. You can override or disable this value by setting the `ttl` attribute of the `persistedQueries` option, in seconds: -```javascript +```ts const server = new ApolloServer({ typeDefs, resolvers, @@ -334,7 +208,7 @@ const server = new ApolloServer({ To disable TTL entirely, specify `null` for the value of `ttl`: -```javascript +```ts const server = new ApolloServer({ typeDefs, resolvers, diff --git a/docs/source/performance/cache-backends.mdx b/docs/source/performance/cache-backends.mdx new file mode 100644 index 00000000000..69a283c971e --- /dev/null +++ b/docs/source/performance/cache-backends.mdx @@ -0,0 +1,204 @@ +--- +title: Configuring cache backends +description: How to configure Apollo Server's cache +--- + +> ⚠️ **New in Apollo Server 3.9:** We _strongly recommend_ that all users pass `cache: "bounded"` or configure their cache in a manner that isn't unbounded (which is current default behavior). This protects your server from attacks that exhaust available memory, causing a DOS. See [Ensuring a bounded cache](#ensuring-a-bounded-cache) immediately below for more details. + +Many Apollo Server features take advantage of a cache backend (these features include [automatic persisted queries](./performance/apq), the [response cache plugin](./performance/caching#caching-with-responsecacheplugin-advanced), and [`RESTDataSource`](./data/data-sources#restdatasource-reference)). Apollo Server uses an in-memory cache by default, but you can configure it to use a different backend, such as Redis or Memcached. + +You can specify a cache backend by passing a `cache` option to the `ApolloServer` constructor. Your specified cache backend must implement the [`KeyValueCache`](https://github.com/apollographql/apollo-utils/tree/main/packages/keyValueCache#keyvaluecache-interface) interface from the `@apollo/utils.keyvaluecache` package. + +There are many cache backend implementations to choose from, including several implementations provided by Apollo. For example, Apollo maintains an implementation of `InMemoryLRUCache` in the `@apollo/utils.keyvaluecache` package. Apollo also provides a wrapper class for the [`keyv` package](https://www.npmjs.com/package/keyv) (which implements several cache backends) named [`KeyvAdapter`](https://github.com/apollographql/apollo-utils/tree/main/packages/keyvAdapter#keyvadapter-class) in the `@apollo/utils.keyvadapter` package. + +## Ensuring a bounded cache + +Unfortunately, the default configuration of Apollo Server exposes you to denial of service attacks. +This is because APQs are enabled by default and the default cache in Apollo Server 3 is unbounded, meaning an attacker can exhaust your memory and crash your server. The default cache in Apollo Server 4 will be bounded; **we recommend opting in to that behavior by providing the `cache: "bounded"` option to your Apollo Server constructor or configuring the `cache` yourself.** Alternatively, you can disable APQs by passing `persistedQueries: false` or configure the APQ cache separately by passing a `KeyValueCache` to `persistedQueries: { cache }`. + +## Configuring in-memory caching + +**Apollo Server's default caching features use an unbounded cache, which is not safe for production use.** If you want to configure the in-memory cache, Apollo provides the [`InMemoryLRUCache`](https://github.com/apollographql/apollo-utils/tree/main/packages/keyValueCache#inmemorylrucache) class from the `@apollo/utils.keyvaluecache` package. + +The `InMemoryLRUCache` class is a wrapper around the `lru-cache` package and has a default maximum of approximately 30MiB of memory. You can configure an instance of `InMemoryLRUCache` with the same options as found in the `lru-cache` package, see the [`lru-cache` documentation](https://www.npmjs.com/package/lru-cache) for more details. You can use Apollo's `InMemoryLRUCache` by passing it to the `cache` option of the `ApolloServer` constructor like so: + +```ts +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; + +const server = new ApolloServer({ + cache: new InMemoryLRUCache(), +}); +``` +> The equivalent of this is provided out-of-the-box by Apollo Server 3.9+ by passing `cache: "bounded"` and doesn't require you to install the `@apollo/utils.keyvaluecache` package. + +In this example, we've increased the default size and provided a default TTL. For more information on these configuration options, see the [`lru-cache` documentation`](https://www.npmjs.com/package/lru-cache). +```ts +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; + +const server = new ApolloServer({ + // ... + cache: new InMemoryLRUCache({ + // ~100MiB + maxSize: Math.pow(2, 20) * 100, + // 5 minutes (in milliseconds) + ttl: 300_000, + }), +}); +``` + +## Configuring external caching + +Apollo no longer maintains any caching backends directly. Instead, we recommend using the [`keyv`](https://www.npmjs.com/package/keyv) package along with the [`KeyvAdapter`](https://github.com/apollographql/apollo-utils/tree/main/packages/keyvAdapter#keyvadapter-class) class provided by the `@apollo/utils.keyvadapter` package. `KeyvAdapter` simply wraps a `Keyv` instance and implements the `KeyValueCache` interface which is required by Apollo Server. You can use the `KeyvAdapter` class to wrap a `Keyv` instance and provide it to the `cache` option of the `ApolloServer` constructor like so: + +1. Install the required packages +```bash +npm install keyv @keyv/redis @apollo/utils.keyvadapter +``` + +2. Configure the Apollo Server `cache` +```ts +import Keyv from 'keyv'; +import { KeyvAdapter } from '@apollo/utils.keyvadapter'; + +const server = new ApolloServer({ + // ..., + cache: new KeyvAdapter(new Keyv('redis://localhost:6379')), +}); +``` + +## Implementing your own cache backend + +If your requirements are specialized or you'd prefer to implement your own cache backend, you can implement the `KeyValueCache` interface and pass it to the `ApolloServer` constructor directly. + +The `KeyValueCache` interface is shown below: +```ts +interface KeyValueCache { + get(key: string): Promise; + // ttl is specified in seconds + set(key: string, value: V, options?: { ttl?: number | null }): Promise; + delete(key: string): Promise; +} +``` + +## Configuring Redis + +The `@keyv/redis` package uses the `ioredis` package under the hood. The second +options argument is passed through to the `ioredis.Redis` constructor. See the +[`ioredis` docs](https://github.com/luin/ioredis#connect-to-redis) for a list of +available options. + +Start by installing the required packages: +``` +npm install keyv @keyv/redis @apollo/utils.keyvadapter +``` + +### Single instance +```ts +import Keyv from "keyv"; +import { KeyvAdapter } from "@apollo/utils.keyvadapter"; + +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: new KeyvAdapter(new Keyv("redis://user:pass@localhost:6379")), +}); + +### Redis Sentinel +```ts +import Keyv from "keyv"; +import { KeyvAdapter } from "@apollo/utils.keyvadapter"; + +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: new KeyvAdapter( + new Keyv("redis://user:pass@localhost:6379", { + sentinels: [ + { host: "localhost", port: 26379 }, + { host: "localhost", port: 26380 }, + ], + }) + ), +}); +``` + +### Redis Cluster + +The `@keyv/redis` package doesn't support `ioredis.Cluster` out of the box. +Instead, we can create our own `ioredis.Cluster` instance and pass that to +`keyv` as the `store` object. See the [`ioredis.Cluster` +docs](https://github.com/luin/ioredis#cluster) for a list of available options. + +Start by installing the packages we'll need: +``` +npm install keyv @keyv/redis ioredis @apollo/utils.keyvadapter +``` + +```ts +import Keyv from "keyv"; +import KeyvRedis from "@keyv/redis"; +import Redis from "ioredis"; +import { KeyvAdapter } from "@apollo/utils.keyvadapter"; + +const cluster = new Redis.Cluster([ + { host: "localhost", port: 26379 }, + { host: "localhost", port: 26380 }, +]); + +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: new KeyvAdapter(new Keyv({ store: new KeyvRedis(cluster) }), { + disableBatchReads: true, + }), +}); +``` + +> Note the `disableBatchReads` option. This disables batching which isn't +supported by `ioredis.Cluster`. + +## Configuring Memcache + +The `@keyv/memcache` package uses the `memjs` package under the hood. Its second +options argument is passed to `memjs.Client.create()`. See the [`memjs` +docs](https://memjs.netlify.app/#section-3) for a list of available options. + +Start by installing the required packages: +``` +npm install keyv @keyv/memcache @apollo/utils.keyvadapter +``` + +```ts +import Keyv from "keyv"; +import KeyvMemcache from "@keyv/memcache"; +import { KeyvAdapter } from "@apollo/utils.keyvadapter"; + +// servers is a comma-separated list of strings +const servers = [ + "user:pass@localhost:11211", + "user:pass@localhost:11222" +].join(","); + +const memcache = new KeyvMemcache(servers, { + retries: 10, + expires: 60, +}); + +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + cache: new KeyvAdapter(new Keyv({ store: memcache })), +}); +``` + +## Legacy caching implementation + +Versions of Apollo Server prior to 3.9 use the `apollo-server-caching` package to implement caching. The `apollo-server-caching` package is no longer maintained, and we do not recommend using it. The `KeyValueCache` interface has been moved and is now in the `@apollo/utils.keyvaluecache` package. + +The `InMemoryLRUCache` class has also moved to the `@apollo/utils.keyvaluecache` package. The `InMemoryLRUCache` class now uses version 7 of `lru-cache`, accepting different configuration options and no longer allowing a cache to be unbounded. + +The `apollo-server-cache-redis` and `apollo-server-cache-memcached` packages are no longer receiving updates; we recommend using `keyv` instead, as shown above. diff --git a/docs/source/performance/caching.md b/docs/source/performance/caching.md index c4b2b3e4cf5..e362c3de3f7 100644 --- a/docs/source/performance/caching.md +++ b/docs/source/performance/caching.md @@ -404,7 +404,7 @@ const server = new ApolloServer({ ``` ## Caching with `responseCachePlugin` (advanced) -You can cache Apollo Server query responses in stores like Redis, Memcached, or Apollo Server's in-memory cache. +You can cache Apollo Server query responses in stores like Redis, Memcached, or Apollo Server's in-memory cache. For more information, see [Configuring cache backends](./cache-backends). ### In-memory cache setup @@ -421,15 +421,15 @@ const server = new ApolloServer({ On initialization, this plugin automatically begins caching responses according to [field settings](#in-your-schema-static). -The plugin uses the same in-memory LRU cache as Apollo Server's other features. For environments with multiple server instances, you might instead want to use a shared cache backend, such as [Memcached or Redis](#memcachedredis-setup). +The plugin uses the same in-memory LRU cache as Apollo Server's other features. For environments with multiple server instances, you might instead want to use a shared cache backend, such as [Memcached or Redis](./cache-backends#configuring-external-caching). >In addition to the [`Cache-Control` HTTP header](#caching-with-a-cdn), the `responseCachePlugin` also sets the `Age` HTTP header to the number of seconds the returned value has been in the cache. ### Memcached/Redis setup -See [Using Memcached/Redis as a cache storage backend](../data/data-sources/#using-memcachedredis-as-a-cache-storage-backend). +See [Configuring external caching](./cache-backends#configuring-external-caching). -> You can also [implement your own cache backend](../data/data-sources/#implementing-your-own-cache-backend). +> You can also [implement your own cache backend](./cache-backends#implementing-your-own-cache-backend). ### Identifying users for `PRIVATE` responses diff --git a/package-lock.json b/package-lock.json index 1d76f99ec70..2ce170318eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -187,8 +187,9 @@ } }, "node_modules/@apollo/protobufjs/node_modules/@types/node": { - "version": "10.17.59", - "license": "MIT" + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, "node_modules/@apollo/utils.dropunuseddefinitions": { "version": "1.1.0", @@ -548,9 +549,10 @@ } }, "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -706,9 +708,9 @@ } }, "node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -731,9 +733,9 @@ } }, "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -781,9 +783,9 @@ } }, "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -1063,9 +1065,9 @@ } }, "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -1713,9 +1715,9 @@ } }, "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1725,9 +1727,9 @@ } }, "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -1758,9 +1760,10 @@ } }, "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -2125,9 +2128,9 @@ } }, "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/@fastify/accepts": { @@ -2279,9 +2282,9 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -2294,13 +2297,14 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" } }, "node_modules/@graphql-codegen/cli/node_modules/minimatch": { @@ -2328,9 +2332,9 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/rxjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.4.tgz", - "integrity": "sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "dev": true, "dependencies": { "tslib": "^2.1.0" @@ -2367,9 +2371,9 @@ "dev": true }, "node_modules/@graphql-codegen/cli/node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -2385,9 +2389,9 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true, "engines": { "node": ">=12" @@ -2948,9 +2952,9 @@ "dev": true }, "node_modules/@graphql-tools/prisma-loader/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3642,9 +3646,9 @@ } }, "node_modules/@jest/core/node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", "dev": true }, "node_modules/@jest/core/node_modules/color-convert": { @@ -4277,9 +4281,10 @@ } }, "node_modules/@lerna/add/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4337,9 +4342,10 @@ } }, "node_modules/@lerna/bootstrap/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4405,9 +4411,10 @@ } }, "node_modules/@lerna/child-process/node_modules/chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4528,9 +4535,10 @@ } }, "node_modules/@lerna/collect-uncommitted/node_modules/chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4659,9 +4667,10 @@ } }, "node_modules/@lerna/conventional-commits/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4742,9 +4751,10 @@ } }, "node_modules/@lerna/create/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4926,9 +4936,10 @@ } }, "node_modules/@lerna/has-npm-version/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5098,9 +5109,10 @@ } }, "node_modules/@lerna/listable/node_modules/chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5331,9 +5343,10 @@ } }, "node_modules/@lerna/package-graph/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5356,9 +5369,10 @@ } }, "node_modules/@lerna/prerelease-id-from-version/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5511,9 +5525,10 @@ } }, "node_modules/@lerna/publish/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5801,9 +5816,10 @@ } }, "node_modules/@lerna/version/node_modules/chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5854,9 +5870,10 @@ } }, "node_modules/@lerna/version/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5963,9 +5980,10 @@ } }, "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6091,9 +6109,10 @@ } }, "node_modules/@npmcli/run-script/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7035,9 +7054,9 @@ } }, "node_modules/@wry/context/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/@wry/equality": { @@ -7053,9 +7072,9 @@ } }, "node_modules/@wry/equality/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/@wry/trie": { @@ -7071,9 +7090,9 @@ } }, "node_modules/@wry/trie/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/abbrev": { @@ -7126,9 +7145,10 @@ } }, "node_modules/agent-base/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -7160,9 +7180,10 @@ } }, "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -7517,8 +7538,9 @@ } }, "node_modules/avvio/node_modules/debug": { - "version": "4.3.1", - "license": "MIT", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -7599,9 +7621,9 @@ } }, "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -8231,9 +8253,10 @@ } }, "node_modules/camel-case/node_modules/tslib": { - "version": "2.2.0", - "dev": true, - "license": "0BSD" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "node_modules/camelcase": { "version": "5.3.1", @@ -8287,9 +8310,9 @@ } }, "node_modules/capital-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/caseless": { @@ -8349,9 +8372,9 @@ } }, "node_modules/change-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/char-regex": { @@ -8483,7 +8506,7 @@ "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "dependencies": { "number-is-nan": "^1.0.0" @@ -8525,11 +8548,12 @@ } }, "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -8813,9 +8837,9 @@ } }, "node_modules/constant-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/content-disposition": { @@ -8904,9 +8928,10 @@ } }, "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8927,12 +8952,13 @@ } }, "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" }, @@ -8991,9 +9017,10 @@ } }, "node_modules/conventional-changelog-core/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9553,9 +9580,9 @@ "dev": true }, "node_modules/cspell/node_modules/commander": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", + "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", "dev": true, "engines": { "node": "^12.20.0 || >=14" @@ -9873,9 +9900,10 @@ } }, "node_modules/detect-indent": { - "version": "6.0.0", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9938,9 +9966,9 @@ } }, "node_modules/dot-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/dot-prop": { @@ -10235,12 +10263,15 @@ } }, "node_modules/execa/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/exit": { @@ -10681,7 +10712,7 @@ "node_modules/fast-url-parser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, "node_modules/fastify": { @@ -11456,15 +11487,15 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -11486,6 +11517,18 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -11654,9 +11697,9 @@ } }, "node_modules/graphql-tag/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/graphql-ws": { "version": "5.5.5", @@ -11798,9 +11841,9 @@ } }, "node_modules/header-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/hexoid": { @@ -11854,11 +11897,12 @@ "license": "BSD-2-Clause" }, "node_modules/http-errors": { - "version": "1.7.2", - "license": "MIT", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", + "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" @@ -11867,6 +11911,11 @@ "node": ">= 0.6" } }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, @@ -11881,9 +11930,10 @@ } }, "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -11928,9 +11978,10 @@ } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -12136,9 +12187,10 @@ } }, "node_modules/init-package-json/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12187,9 +12239,10 @@ } }, "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12226,11 +12279,12 @@ } }, "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -12351,9 +12405,10 @@ } }, "node_modules/is-core-module": { - "version": "2.3.0", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, - "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -12450,9 +12505,9 @@ } }, "node_modules/is-lower-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/is-negative-zero": { @@ -12651,9 +12706,9 @@ } }, "node_modules/is-upper-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/is-utf8": { @@ -13161,9 +13216,9 @@ } }, "node_modules/jest-cli/node_modules/yargs": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", - "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -14561,9 +14616,9 @@ } }, "node_modules/jest-util/node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", "dev": true }, "node_modules/jest-util/node_modules/color-convert": { @@ -15195,9 +15250,10 @@ } }, "node_modules/koa-router/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -15210,45 +15266,21 @@ } } }, - "node_modules/koa-router/node_modules/http-errors": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-router/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, "node_modules/koa-router/node_modules/ms": { "version": "2.1.2", "dev": true, "license": "MIT" }, "node_modules/koa-router/node_modules/path-to-regexp": { - "version": "6.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/koa-router/node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true }, "node_modules/koa/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -15340,9 +15372,10 @@ } }, "node_modules/libnpmaccess/node_modules/npm-registry-fetch": { - "version": "10.1.1", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0", "make-fetch-happen": "^8.0.9", @@ -15372,9 +15405,10 @@ } }, "node_modules/libnpmpublish/node_modules/hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -15383,12 +15417,13 @@ } }, "node_modules/libnpmpublish/node_modules/normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" }, @@ -15397,9 +15432,10 @@ } }, "node_modules/libnpmpublish/node_modules/npm-registry-fetch": { - "version": "10.1.1", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0", "make-fetch-happen": "^8.0.9", @@ -15414,9 +15450,10 @@ } }, "node_modules/libnpmpublish/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -15517,7 +15554,7 @@ "node_modules/listr-update-renderer/node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15526,7 +15563,7 @@ "node_modules/listr-update-renderer/node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "dependencies": { "ansi-styles": "^2.2.1", @@ -15542,7 +15579,7 @@ "node_modules/listr-update-renderer/node_modules/figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5", @@ -15555,7 +15592,7 @@ "node_modules/listr-update-renderer/node_modules/indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "dev": true, "engines": { "node": ">=4" @@ -15564,7 +15601,7 @@ "node_modules/listr-update-renderer/node_modules/log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", "dev": true, "dependencies": { "chalk": "^1.0.0" @@ -15600,7 +15637,7 @@ "node_modules/listr-verbose-renderer/node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "dependencies": { "restore-cursor": "^2.0.0" @@ -15612,7 +15649,7 @@ "node_modules/listr-verbose-renderer/node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" @@ -15633,7 +15670,7 @@ "node_modules/listr-verbose-renderer/node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "dependencies": { "mimic-fn": "^1.0.0" @@ -15645,7 +15682,7 @@ "node_modules/listr-verbose-renderer/node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "dependencies": { "onetime": "^2.0.0", @@ -15822,9 +15859,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -15900,9 +15937,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { "node": ">=4" @@ -15911,7 +15948,7 @@ "node_modules/log-update/node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "dependencies": { "restore-cursor": "^2.0.0" @@ -15923,7 +15960,7 @@ "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "engines": { "node": ">=4" @@ -15941,7 +15978,7 @@ "node_modules/log-update/node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "dependencies": { "mimic-fn": "^1.0.0" @@ -15953,7 +15990,7 @@ "node_modules/log-update/node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "dependencies": { "onetime": "^2.0.0", @@ -16058,15 +16095,16 @@ } }, "node_modules/lower-case-first/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/lower-case/node_modules/tslib": { - "version": "2.2.0", - "dev": true, - "license": "0BSD" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "node_modules/lowercase-keys": { "version": "1.0.1", @@ -16167,9 +16205,10 @@ } }, "node_modules/map-obj": { - "version": "4.2.1", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -16215,9 +16254,10 @@ } }, "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16226,12 +16266,13 @@ } }, "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" }, @@ -16240,9 +16281,10 @@ } }, "node_modules/meow/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16368,9 +16410,10 @@ } }, "node_modules/mime": { - "version": "2.5.2", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -16434,9 +16477,10 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "dev": true, - "license": "MIT" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "node_modules/minimist-options": { "version": "4.1.0", @@ -16452,9 +16496,10 @@ } }, "node_modules/minipass": { - "version": "3.1.3", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -16544,11 +16589,12 @@ } }, "node_modules/mkdirp": { - "version": "0.5.5", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "license": "MIT", "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -16676,9 +16722,10 @@ } }, "node_modules/no-case/node_modules/tslib": { - "version": "2.2.0", - "dev": true, - "license": "0BSD" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "node_modules/nock": { "version": "13.2.7", @@ -16821,18 +16868,39 @@ "rimraf": "bin.js" } }, + "node_modules/node-gyp/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/node-gyp/node_modules/tar": { - "version": "4.4.13", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dev": true, - "license": "ISC", "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" }, "engines": { "node": ">=4.5" @@ -16886,9 +16954,9 @@ } }, "node_modules/normalize-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.0.1.tgz", - "integrity": "sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, "engines": { "node": ">=10" @@ -16917,9 +16985,10 @@ } }, "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16972,9 +17041,10 @@ } }, "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16983,9 +17053,10 @@ } }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -17025,9 +17096,10 @@ } }, "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -17529,9 +17601,10 @@ } }, "node_modules/pacote/node_modules/npm-registry-fetch": { - "version": "10.1.1", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0", "make-fetch-happen": "^8.0.9", @@ -17556,9 +17629,9 @@ } }, "node_modules/param-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/parent-module": { @@ -17629,9 +17702,10 @@ } }, "node_modules/parse-path/node_modules/qs": { - "version": "6.10.1", + "version": "6.10.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", + "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -17671,9 +17745,10 @@ } }, "node_modules/pascal-case/node_modules/tslib": { - "version": "2.2.0", - "dev": true, - "license": "0BSD" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "node_modules/path-case": { "version": "3.0.4", @@ -17686,9 +17761,9 @@ } }, "node_modules/path-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/path-exists": { @@ -18033,8 +18108,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "license": "BSD-3-Clause", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { "node": ">=0.6" } @@ -18051,9 +18127,10 @@ } }, "node_modules/qs-middleware/node_modules/qs": { - "version": "6.4.0", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.1.tgz", + "integrity": "sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } @@ -18261,9 +18338,10 @@ } }, "node_modules/read-package-json/node_modules/hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -18272,12 +18350,13 @@ } }, "node_modules/read-package-json/node_modules/normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" }, @@ -18286,9 +18365,10 @@ } }, "node_modules/read-package-json/node_modules/semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -18703,7 +18783,7 @@ "node_modules/requisition/node_modules/cookie": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.2.4.tgz", - "integrity": "sha1-qMFVqnubLPLE0y68e5oKoojMxr0=", + "integrity": "sha512-wQLxYCPiulwnfcvEZHF8YVj6cxvkpOBFgN1nL3Ukgh+D1+4A1SUKHdxR7h+T9kcuC54mFWoeZdnLT7ZeIC9Emw==", "dev": true, "engines": { "node": ">= 0.6" @@ -19026,9 +19106,9 @@ } }, "node_modules/sentence-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/serve-static": { @@ -19198,9 +19278,9 @@ } }, "node_modules/snake-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/socks": { @@ -19230,9 +19310,10 @@ } }, "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -19290,9 +19371,10 @@ } }, "node_modules/source-map-support": { - "version": "0.5.19", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19369,9 +19451,9 @@ } }, "node_modules/sponge-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/sprintf-js": { @@ -19703,9 +19785,9 @@ "dev": true }, "node_modules/superagent/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.10.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", + "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", "dev": true, "dependencies": { "side-channel": "^1.0.4" @@ -19800,9 +19882,9 @@ } }, "node_modules/swap-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/symbol-observable": { @@ -19827,9 +19909,10 @@ } }, "node_modules/tar": { - "version": "6.1.0", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -19908,11 +19991,15 @@ } }, "node_modules/temp-write/node_modules/is-stream": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terminal-link": { @@ -20016,9 +20103,9 @@ } }, "node_modules/title-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/tmp": { @@ -20087,9 +20174,10 @@ } }, "node_modules/tr46": { - "version": "2.0.2", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, - "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -20127,9 +20215,9 @@ } }, "node_modules/ts-invariant/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/ts-jest": { @@ -20444,7 +20532,7 @@ "node_modules/unixify/node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -20488,15 +20576,15 @@ } }, "node_modules/upper-case-first/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/upper-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/uri-js": { @@ -20664,12 +20752,13 @@ "dev": true }, "node_modules/whatwg-url": { - "version": "8.5.0", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, - "license": "MIT", "dependencies": { "lodash": "^4.7.0", - "tr46": "^2.0.2", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" }, "engines": { @@ -20717,9 +20806,10 @@ } }, "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -20807,11 +20897,12 @@ "license": "MIT" }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -20947,9 +21038,9 @@ } }, "node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", "dev": true, "engines": { "node": ">=8.3.0" @@ -21168,45 +21259,6 @@ "graphql": "^15.3.0 || ^16.0.0" } }, - "packages/apollo-server-cache-memcached": { - "version": "3.3.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-caching": "file:../apollo-server-caching", - "apollo-server-env": "file:../apollo-server-env", - "memcached": "^2.2.2" - }, - "engines": { - "node": ">=12.0" - } - }, - "packages/apollo-server-cache-redis": { - "version": "3.3.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-env": "file:../apollo-server-env", - "dataloader": "^2.0.0", - "ioredis": "^4.17.3" - }, - "engines": { - "node": ">=12.0" - } - }, - "packages/apollo-server-caching": { - "version": "3.3.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12.0" - } - }, "packages/apollo-server-cloud-functions": { "version": "3.8.2", "license": "MIT", @@ -21573,7 +21625,9 @@ }, "dependencies": { "@types/node": { - "version": "10.17.59" + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" } } }, @@ -21842,7 +21896,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -21956,9 +22012,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -21977,9 +22033,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -22019,9 +22075,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -22240,9 +22296,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -22675,15 +22731,15 @@ }, "dependencies": { "@babel/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", "dev": true }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", + "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -22710,7 +22766,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -23051,9 +23109,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -23178,9 +23236,9 @@ "dev": true }, "inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -23193,10 +23251,11 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" } }, "minimatch": { @@ -23215,9 +23274,9 @@ "dev": true }, "rxjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.4.tgz", - "integrity": "sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "dev": true, "requires": { "tslib": "^2.1.0" @@ -23248,9 +23307,9 @@ "dev": true }, "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -23263,9 +23322,9 @@ } }, "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true } } @@ -23775,9 +23834,9 @@ "dev": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -24332,9 +24391,9 @@ } }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", "dev": true }, "color-convert": { @@ -24822,7 +24881,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -24866,7 +24927,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -24910,7 +24973,9 @@ } }, "chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -24991,7 +25056,9 @@ } }, "chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -25081,7 +25148,9 @@ "dev": true }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25124,7 +25193,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25273,7 +25344,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25393,7 +25466,9 @@ } }, "chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -25560,7 +25635,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25576,7 +25653,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25692,7 +25771,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -25897,7 +25978,9 @@ } }, "chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -25927,7 +26010,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26000,7 +26085,9 @@ "dev": true }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26083,7 +26170,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26903,9 +26992,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -26920,9 +27009,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -26937,9 +27026,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -26981,7 +27070,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -27003,7 +27094,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -27427,7 +27520,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -27480,9 +27575,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -27940,7 +28035,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -27976,9 +28073,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -28017,9 +28114,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -28133,7 +28230,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -28166,10 +28263,12 @@ }, "dependencies": { "strip-ansi": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -28394,9 +28493,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -28456,7 +28555,9 @@ } }, "hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -28471,11 +28572,13 @@ } }, "normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } @@ -28511,7 +28614,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -28779,9 +28884,9 @@ "dev": true }, "commander": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", + "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", "dev": true }, "get-stdin": { @@ -29138,7 +29243,9 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-indent": { - "version": "6.0.0", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, "detect-newline": { @@ -29185,9 +29292,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -29388,9 +29495,9 @@ "dev": true }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true } } @@ -29722,7 +29829,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true } } @@ -30284,17 +30391,28 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "glob-parent": { @@ -30426,9 +30544,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, @@ -30517,9 +30635,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -30568,13 +30686,22 @@ "version": "4.1.0" }, "http-errors": { - "version": "1.7.2", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", + "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } } }, "http-proxy-agent": { @@ -30587,7 +30714,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -30617,7 +30746,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -30746,7 +30877,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -30781,7 +30914,9 @@ } }, "chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -30804,10 +30939,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "supports-color": { @@ -30885,7 +31022,9 @@ } }, "is-core-module": { - "version": "2.3.0", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" @@ -30943,9 +31082,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -31071,9 +31210,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -31450,9 +31589,9 @@ } }, "yargs": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", - "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -32504,9 +32643,9 @@ } }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", "dev": true }, "color-convert": { @@ -32965,9 +33104,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -33008,37 +33147,22 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "http-errors": { - "version": "1.8.0", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.4", - "dev": true - }, "ms": { "version": "2.1.2", "dev": true }, "path-to-regexp": { - "version": "6.2.0", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", "dev": true } } @@ -33093,7 +33217,9 @@ }, "dependencies": { "npm-registry-fetch": { - "version": "10.1.1", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", "dev": true, "requires": { "lru-cache": "^6.0.0", @@ -33119,24 +33245,30 @@ }, "dependencies": { "hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "npm-registry-fetch": { - "version": "10.1.1", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", "dev": true, "requires": { "lru-cache": "^6.0.0", @@ -33149,7 +33281,9 @@ } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -33240,13 +33374,13 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -33259,7 +33393,7 @@ "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", @@ -33269,13 +33403,13 @@ "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "dev": true }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", "dev": true, "requires": { "chalk": "^1.0.0" @@ -33304,7 +33438,7 @@ "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -33313,7 +33447,7 @@ "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -33328,7 +33462,7 @@ "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -33337,7 +33471,7 @@ "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", @@ -33479,9 +33613,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -33538,15 +33672,15 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -33555,7 +33689,7 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "mimic-fn": { @@ -33567,7 +33701,7 @@ "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -33576,7 +33710,7 @@ "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", @@ -33645,7 +33779,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -33660,9 +33796,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -33742,7 +33878,9 @@ "dev": true }, "map-obj": { - "version": "4.2.1", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, "media-typer": { @@ -33772,24 +33910,30 @@ }, "dependencies": { "hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -33870,7 +34014,9 @@ } }, "mime": { - "version": "2.5.2", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "mime-db": { @@ -33908,7 +34054,9 @@ } }, "minimist": { - "version": "1.2.5", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minimist-options": { @@ -33921,7 +34069,9 @@ } }, "minipass": { - "version": "3.1.3", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -33982,10 +34132,12 @@ } }, "mkdirp": { - "version": "0.5.5", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "mkdirp-infer-owner": { @@ -34080,7 +34232,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -34193,17 +34347,25 @@ "glob": "^7.1.3" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, "tar": { - "version": "4.4.13", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" } }, "yallist": { @@ -34245,9 +34407,9 @@ "dev": true }, "normalize-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.0.1.tgz", - "integrity": "sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true }, "npm-bundled": { @@ -34265,7 +34427,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -34307,14 +34471,18 @@ }, "dependencies": { "hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -34343,7 +34511,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -34675,7 +34845,9 @@ "dev": true }, "npm-registry-fetch": { - "version": "10.1.1", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", "dev": true, "requires": { "lru-cache": "^6.0.0", @@ -34700,9 +34872,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -34759,7 +34931,9 @@ }, "dependencies": { "qs": { - "version": "6.10.1", + "version": "6.10.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", + "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -34791,7 +34965,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -34807,9 +34983,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -35054,7 +35230,9 @@ "dev": true }, "qs": { - "version": "6.5.2" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" }, "qs-middleware": { "version": "1.0.3", @@ -35064,7 +35242,9 @@ }, "dependencies": { "qs": { - "version": "6.4.0", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.1.tgz", + "integrity": "sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==", "dev": true } } @@ -35198,24 +35378,30 @@ }, "dependencies": { "hosted-git-info": { - "version": "4.0.2", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "normalize-package-data": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", + "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "semver": { - "version": "7.3.5", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -35537,7 +35723,7 @@ "cookie": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.2.4.tgz", - "integrity": "sha1-qMFVqnubLPLE0y68e5oKoojMxr0=", + "integrity": "sha512-wQLxYCPiulwnfcvEZHF8YVj6cxvkpOBFgN1nL3Ukgh+D1+4A1SUKHdxR7h+T9kcuC54mFWoeZdnLT7ZeIC9Emw==", "dev": true } } @@ -35758,9 +35944,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -35885,9 +36071,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -35910,7 +36096,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -35949,7 +36137,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.19", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -36014,9 +36204,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -36265,9 +36455,9 @@ "dev": true }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.10.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz", + "integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -36338,9 +36528,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -36360,7 +36550,9 @@ } }, "tar": { - "version": "6.1.0", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -36420,7 +36612,9 @@ }, "dependencies": { "is-stream": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true } } @@ -36504,9 +36698,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -36555,7 +36749,9 @@ } }, "tr46": { - "version": "2.0.2", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "requires": { "punycode": "^2.1.1" @@ -36581,9 +36777,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -36777,7 +36973,7 @@ "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" @@ -36802,9 +36998,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -36819,9 +37015,9 @@ }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } @@ -36956,11 +37152,13 @@ "dev": true }, "whatwg-url": { - "version": "8.5.0", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "requires": { "lodash": "^4.7.0", - "tr46": "^2.0.2", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, @@ -36996,7 +37194,9 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "is-fullwidth-code-point": { @@ -37052,10 +37252,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -37152,9 +37354,9 @@ } }, "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", "dev": true, "requires": {} }, diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index 90c6388b5bb..871c76127dc 100644 --- a/packages/apollo-server-core/src/ApolloServer.ts +++ b/packages/apollo-server-core/src/ApolloServer.ts @@ -278,7 +278,7 @@ export class ApolloServerBase< 'Persisted queries are enabled and are using an unbounded cache. Your server' + ' is vulnerable to denial of service attacks via memory exhaustion. ' + 'Set `cache: "bounded"` or `persistedQueries: false` in your ApolloServer ' + - 'constructor, or see FIXME:DOCS for other alternatives.', + 'constructor, or see https://go.apollo.dev/s/cache-backends for other alternatives.', ); } } From a640e91d5fe41c644f97ace885542ea5de92f4ec Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Tue, 14 Jun 2022 17:06:40 -0700 Subject: [PATCH 09/10] Finalizing docs fixes, rework CHANGELOG entries Co-authored-by: Rose M Koron <32436232+rkoron007@users.noreply.github.com> --- CHANGELOG.md | 14 ++++++++------ docs/source/api/apollo-server.mdx | 12 ++++++------ docs/source/performance/cache-backends.mdx | 21 +++++++++++++++------ 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c31a9dfa9ab..0faba276ab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,12 +10,14 @@ The version headers in this history reflect the versions of Apollo Server itself ## vNEXT -- Remove internal dependency on `apollo-server-caching`, switch over to `@apollo/utils.keyvaluecache`. This PR specifically also introduces Keyv as an unbounded cache solution, but will replace with our own simple implementation in a follow-up PR targeting this minor version release. [PR #6522](https://github.com/apollographql/apollo-server/pull/6522) -- Remove dependency on `keyv`/`@apollo/utils.keyvadapter` in favor of a simple `Map`-backed cache which implements TTL [PR #6535](https://github.com/apollographql/apollo-server/pull/6535) -- Add `cache: "bounded"` configuration option, allowing users to opt into bounded request cache (recommended) [PR #6536](https://github.com/apollographql/apollo-server/pull/6536) -- Remove `apollo-server-caching` and `apollo-server-cache-*` packages [PR #6541](https://github.com/apollographql/apollo-server/pull/6541) -- Warn when APQ cache is unbounded in production (which is default) [PR #6545](https://github.com/apollographql/apollo-server/pull/6545) -- Await `parsingDidEnd` `Promise`. Note from @trevor-scheer: I don't think this resolves the issue it intended to. See [Issue #6567](https://github.com/apollographql/apollo-server/pull/6567) for details. [PR #6559](https://github.com/apollographql/apollo-server/pull/6559) +- Nothing yet! Stay tuned. + +## v3.9.0 + +- ⚠️ **SECURITY** `apollo-server-core`: The default configuration of Apollo Server is vulnerable to denial of service attacks via memory exhaustion. If you do not currently specify the `cache` option to `new ApolloServer()`, we strongly recommend you specify `cache: 'bounded'`, which replaces the default in-memory unbounded cache with a 30MB in-memory cache, or disable automatic persisted queries with `persistedQueries: null`. Apollo Server now logs a warning in production if you do not configure the cache or disable APQs. See [the docs](https://www.apollographql.com/docs/apollo-server/performance/cache-backends#ensuring-a-bounded-cache) for more details. +- The `apollo-server-caching` package is no longer published. The TypeScript types `KeyValueCache` and `KeyValueCacheSetOptions` and the classes `PrefixingKeyValueCache` and `InMemoryLRUCache` can be imported from `@apollo/utils.keyvaluecache` instead. The first three exports are identical; `InMemoryLRUCache` is based on `lru-cache` v7 instead of v6, and no longer supports creating unbounded caches (which was the default behavior for `apollo-server-caching`'s `InMemoryLRUCache`). [PR #6522](https://github.com/apollographql/apollo-server/pull/6522) +- The `apollo-server-cache-redis` and `apollo-server-cache-memcached` packages are no longer published (though previous versions continue to work). We recommend that users of these packages migrate to `@apollo/utils.keyvadapter`, which lets you connect to Redis, Memcached, or any other backend supported by the [Keyv](https://www.npmjs.com/package/keyv) project. See [the new cache backend docs](https://www.apollographql.com/docs/apollo-server/performance/cache-backends) for more details. [PR #6541](https://github.com/apollographql/apollo-server/pull/6541) +- Avoid unhandled rejection errors if the end hook from a `parsingDidStart` plugin method rejects. [Issue #6567](https://github.com/apollographql/apollo-server/pull/6567) [PR #6559](https://github.com/apollographql/apollo-server/pull/6559) ## v3.8.2 diff --git a/docs/source/api/apollo-server.mdx b/docs/source/api/apollo-server.mdx index 4bcbe4307d0..f46062c2a9c 100644 --- a/docs/source/api/apollo-server.mdx +++ b/docs/source/api/apollo-server.mdx @@ -238,11 +238,11 @@ Available in Apollo Server v3.4.0 and later. -A `KeyValueCache` which Apollo Server uses for a number of features like APQs and full response caching. This cache is also provided to DataSources and plugins. +A `KeyValueCache` which Apollo Server uses for several features, including APQs and full response caching. This cache is also available to Apollo Server's data sources and plugins. -By default, the cache is unbounded. We don't recommend this, since a malicious client can run your server out of memory and cause it to crash by filling it with APQs. +By default, the cache that Apollo Server 3 uses is unbounded. We _strongly recommend_ that all users pass `cache: "bounded"` or configure their cache in a manner that isn't unbounded. This protects your server from attacks that exhaust available memory, causing a DOS. -If you don't want to configure your own cache, you should set `cache: "bounded"`. The bounded cache is an [`InMemoryLRUCache`](https://www.npmjs.com/package/@apollo/utils.keyvaluecache) with a default size of roughly 30MiB. +The default bounded cache is an [`InMemoryLRUCache`](https://www.npmjs.com/package/@apollo/utils.keyvaluecache) with a default size of roughly 30MiB. To learn more about configuring Apollo Server's cache, see [Configuring cache backends](../performance/cache-backends). @@ -450,7 +450,7 @@ The default value is `true`. Set this to `false` to use mocked resolvers only fo ##### `nodeEnv` -`String` +`string` @@ -583,7 +583,7 @@ Returns a `Promise` that resolves to an object containing the following properti ##### `url` -`String` +`string` @@ -796,7 +796,7 @@ async function startApolloServer() { ##### `path` -`String` +`string` diff --git a/docs/source/performance/cache-backends.mdx b/docs/source/performance/cache-backends.mdx index 69a283c971e..e8c05bc44f6 100644 --- a/docs/source/performance/cache-backends.mdx +++ b/docs/source/performance/cache-backends.mdx @@ -5,7 +5,7 @@ description: How to configure Apollo Server's cache > ⚠️ **New in Apollo Server 3.9:** We _strongly recommend_ that all users pass `cache: "bounded"` or configure their cache in a manner that isn't unbounded (which is current default behavior). This protects your server from attacks that exhaust available memory, causing a DOS. See [Ensuring a bounded cache](#ensuring-a-bounded-cache) immediately below for more details. -Many Apollo Server features take advantage of a cache backend (these features include [automatic persisted queries](./performance/apq), the [response cache plugin](./performance/caching#caching-with-responsecacheplugin-advanced), and [`RESTDataSource`](./data/data-sources#restdatasource-reference)). Apollo Server uses an in-memory cache by default, but you can configure it to use a different backend, such as Redis or Memcached. +Many Apollo Server features take advantage of a cache backend (these features include [automatic persisted queries](./apq), the [response cache plugin](./caching#caching-with-responsecacheplugin-advanced), and [`RESTDataSource`](../data/data-sources#restdatasource-reference)). Apollo Server uses an in-memory cache by default, but you can configure it to use a different backend, such as Redis or Memcached. You can specify a cache backend by passing a `cache` option to the `ApolloServer` constructor. Your specified cache backend must implement the [`KeyValueCache`](https://github.com/apollographql/apollo-utils/tree/main/packages/keyValueCache#keyvaluecache-interface) interface from the `@apollo/utils.keyvaluecache` package. @@ -31,7 +31,7 @@ const server = new ApolloServer({ ``` > The equivalent of this is provided out-of-the-box by Apollo Server 3.9+ by passing `cache: "bounded"` and doesn't require you to install the `@apollo/utils.keyvaluecache` package. -In this example, we've increased the default size and provided a default TTL. For more information on these configuration options, see the [`lru-cache` documentation`](https://www.npmjs.com/package/lru-cache). +In this example, we've increased the default size and provided a default TTL. For more information on these configuration options, see the [`lru-cache` documentation](https://www.npmjs.com/package/lru-cache). ```ts import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; @@ -52,7 +52,7 @@ Apollo no longer maintains any caching backends directly. Instead, we recommend 1. Install the required packages ```bash -npm install keyv @keyv/redis @apollo/utils.keyvadapter +npm install keyv @apollo/utils.keyvadapter ``` 2. Configure the Apollo Server `cache` @@ -62,7 +62,7 @@ import { KeyvAdapter } from '@apollo/utils.keyvadapter'; const server = new ApolloServer({ // ..., - cache: new KeyvAdapter(new Keyv('redis://localhost:6379')), + cache: new KeyvAdapter(new Keyv()), // highlight-line }); ``` @@ -101,8 +101,9 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, - cache: new KeyvAdapter(new Keyv("redis://user:pass@localhost:6379")), + cache: new KeyvAdapter(new Keyv("redis://user:pass@localhost:6379")), // highlight-line }); +``` ### Redis Sentinel ```ts @@ -113,6 +114,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + // highlight-start cache: new KeyvAdapter( new Keyv("redis://user:pass@localhost:6379", { sentinels: [ @@ -121,6 +123,7 @@ const server = new ApolloServer({ ], }) ), + // highlight-end }); ``` @@ -142,18 +145,22 @@ import KeyvRedis from "@keyv/redis"; import Redis from "ioredis"; import { KeyvAdapter } from "@apollo/utils.keyvadapter"; +// highlight-start const cluster = new Redis.Cluster([ { host: "localhost", port: 26379 }, { host: "localhost", port: 26380 }, ]); +// highlight-end const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + // highlight-start cache: new KeyvAdapter(new Keyv({ store: new KeyvRedis(cluster) }), { disableBatchReads: true, }), + // highlight-end }); ``` @@ -177,6 +184,7 @@ import KeyvMemcache from "@keyv/memcache"; import { KeyvAdapter } from "@apollo/utils.keyvadapter"; // servers is a comma-separated list of strings +// highlight-start const servers = [ "user:pass@localhost:11211", "user:pass@localhost:11222" @@ -186,12 +194,13 @@ const memcache = new KeyvMemcache(servers, { retries: 10, expires: 60, }); +// highlight-end const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, - cache: new KeyvAdapter(new Keyv({ store: memcache })), + cache: new KeyvAdapter(new Keyv({ store: memcache })), // highlight-line }); ``` From 36ecbb116cef0b8b62b3ee3b557c4db8c975a406 Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Wed, 15 Jun 2022 09:47:46 -0700 Subject: [PATCH 10/10] Release - apollo-datasource-rest@3.6.1 - apollo-datasource@3.3.2 - apollo-server-azure-functions@3.9.0 - apollo-server-cloud-functions@3.9.0 - apollo-server-cloudflare@3.9.0 - apollo-server-core@3.9.0 - apollo-server-express@3.9.0 - apollo-server-fastify@3.9.0 - apollo-server-hapi@3.9.0 - apollo-server-integration-testsuite@3.9.0 - apollo-server-koa@3.9.0 - apollo-server-lambda@3.9.0 - apollo-server-micro@3.9.0 - apollo-server-plugin-base@3.6.1 - apollo-server-plugin-response-cache@3.6.1 - apollo-server-types@3.6.1 - apollo-server@3.9.0 --- packages/apollo-datasource-rest/package.json | 2 +- packages/apollo-datasource/package.json | 2 +- packages/apollo-server-azure-functions/package.json | 2 +- packages/apollo-server-cloud-functions/package.json | 2 +- packages/apollo-server-cloudflare/package.json | 2 +- packages/apollo-server-core/package.json | 2 +- packages/apollo-server-express/package.json | 2 +- packages/apollo-server-fastify/package.json | 2 +- packages/apollo-server-hapi/package.json | 2 +- packages/apollo-server-integration-testsuite/package.json | 2 +- packages/apollo-server-koa/package.json | 2 +- packages/apollo-server-lambda/package.json | 2 +- packages/apollo-server-micro/package.json | 2 +- packages/apollo-server-plugin-base/package.json | 2 +- packages/apollo-server-plugin-response-cache/package.json | 2 +- packages/apollo-server-types/package.json | 2 +- packages/apollo-server/package.json | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/apollo-datasource-rest/package.json b/packages/apollo-datasource-rest/package.json index 4abe67ca4d4..ccf232f22e2 100644 --- a/packages/apollo-datasource-rest/package.json +++ b/packages/apollo-datasource-rest/package.json @@ -1,6 +1,6 @@ { "name": "apollo-datasource-rest", - "version": "3.6.0", + "version": "3.6.1", "author": "Apollo ", "license": "MIT", "repository": { diff --git a/packages/apollo-datasource/package.json b/packages/apollo-datasource/package.json index cbd9cd0f7d4..3cc990af416 100644 --- a/packages/apollo-datasource/package.json +++ b/packages/apollo-datasource/package.json @@ -1,6 +1,6 @@ { "name": "apollo-datasource", - "version": "3.3.1", + "version": "3.3.2", "author": "Apollo ", "license": "MIT", "repository": { diff --git a/packages/apollo-server-azure-functions/package.json b/packages/apollo-server-azure-functions/package.json index 9d1c6d96145..48e339bba27 100644 --- a/packages/apollo-server-azure-functions/package.json +++ b/packages/apollo-server-azure-functions/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-azure-functions", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Azure Functions", "keywords": [ "GraphQL", diff --git a/packages/apollo-server-cloud-functions/package.json b/packages/apollo-server-cloud-functions/package.json index 199a4ec8553..5ac2bbf741e 100644 --- a/packages/apollo-server-cloud-functions/package.json +++ b/packages/apollo-server-cloud-functions/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-cloud-functions", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Google Cloud Functions", "keywords": [ "GraphQL", diff --git a/packages/apollo-server-cloudflare/package.json b/packages/apollo-server-cloudflare/package.json index 8d9a726bda7..ae0e502a7c5 100644 --- a/packages/apollo-server-cloudflare/package.json +++ b/packages/apollo-server-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-cloudflare", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Cloudflare workers", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-core/package.json b/packages/apollo-server-core/package.json index 0e925a4a3d7..c9a57fd6657 100644 --- a/packages/apollo-server-core/package.json +++ b/packages/apollo-server-core/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-core", - "version": "3.8.2", + "version": "3.9.0", "description": "Core engine for Apollo GraphQL server", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-express/package.json b/packages/apollo-server-express/package.json index 1e23683d2ad..7c1ca83588c 100644 --- a/packages/apollo-server-express/package.json +++ b/packages/apollo-server-express/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-express", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Express", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-fastify/package.json b/packages/apollo-server-fastify/package.json index 4e4cfa184ba..598ba795ef5 100644 --- a/packages/apollo-server-fastify/package.json +++ b/packages/apollo-server-fastify/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-fastify", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Fastify", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-hapi/package.json b/packages/apollo-server-hapi/package.json index 589dc3835d2..f5a88e12022 100644 --- a/packages/apollo-server-hapi/package.json +++ b/packages/apollo-server-hapi/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-hapi", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Hapi", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-integration-testsuite/package.json b/packages/apollo-server-integration-testsuite/package.json index fc1df2e65bb..41254147bfc 100644 --- a/packages/apollo-server-integration-testsuite/package.json +++ b/packages/apollo-server-integration-testsuite/package.json @@ -1,7 +1,7 @@ { "name": "apollo-server-integration-testsuite", "private": true, - "version": "3.8.2", + "version": "3.9.0", "description": "Apollo Server Integrations testsuite", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-koa/package.json b/packages/apollo-server-koa/package.json index eaed94c96ab..21df56cc757 100644 --- a/packages/apollo-server-koa/package.json +++ b/packages/apollo-server-koa/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-koa", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Koa", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-lambda/package.json b/packages/apollo-server-lambda/package.json index 8b02107962a..22570aec14f 100644 --- a/packages/apollo-server-lambda/package.json +++ b/packages/apollo-server-lambda/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-lambda", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for AWS Lambda", "keywords": [ "GraphQL", diff --git a/packages/apollo-server-micro/package.json b/packages/apollo-server-micro/package.json index ff93fc3bca7..9929e0aba40 100644 --- a/packages/apollo-server-micro/package.json +++ b/packages/apollo-server-micro/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-micro", - "version": "3.8.2", + "version": "3.9.0", "description": "Production-ready Node.js GraphQL server for Micro", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-plugin-base/package.json b/packages/apollo-server-plugin-base/package.json index b4c2f432d35..1c0abb85214 100644 --- a/packages/apollo-server-plugin-base/package.json +++ b/packages/apollo-server-plugin-base/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-plugin-base", - "version": "3.6.0", + "version": "3.6.1", "description": "Apollo Server plugin base classes", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-plugin-response-cache/package.json b/packages/apollo-server-plugin-response-cache/package.json index ddb20941c3f..197ff253289 100644 --- a/packages/apollo-server-plugin-response-cache/package.json +++ b/packages/apollo-server-plugin-response-cache/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-plugin-response-cache", - "version": "3.6.0", + "version": "3.6.1", "description": "Apollo Server full query response cache", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server-types/package.json b/packages/apollo-server-types/package.json index 796fc207f5b..0a88f88c160 100644 --- a/packages/apollo-server-types/package.json +++ b/packages/apollo-server-types/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server-types", - "version": "3.6.0", + "version": "3.6.1", "description": "Apollo Server shared types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apollo-server/package.json b/packages/apollo-server/package.json index 14a8a1a36e0..abb0bc7c033 100644 --- a/packages/apollo-server/package.json +++ b/packages/apollo-server/package.json @@ -1,6 +1,6 @@ { "name": "apollo-server", - "version": "3.8.2", + "version": "3.9.0", "description": "Production ready GraphQL Server", "author": "Apollo ", "main": "dist/index.js",