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/.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..0faba276ab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,18 @@ 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 +- 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 - `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 +102,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..384fc8a874d 100644 --- a/cspell-dict.txt +++ b/cspell-dict.txt @@ -79,6 +79,8 @@ iteratees josephg jsdelivr keyv +keyvadapter +keyvaluecache KHTML Kubernetes linearizability @@ -87,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 076fddfe2d1..f46062c2a9c 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', }); ``` @@ -202,19 +203,19 @@ 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`:
```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, }), // ... }) @@ -228,6 +229,26 @@ Available in Apollo Server v3.4.0 and later. + + + +##### `cache` + +`KeyValueCache | "bounded"` + + + +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 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. + +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). + + + + @@ -429,7 +450,7 @@ The default value is `true`. Set this to `false` to use mocked resolvers only fo ##### `nodeEnv` -`String` +`string` @@ -562,7 +583,7 @@ Returns a `Promise` that resolves to an object containing the following properti ##### `url` -`String` +`string` @@ -726,6 +747,7 @@ async function startApolloServer() { typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); @@ -774,7 +796,7 @@ async function startApolloServer() { ##### `path` -`String` +`string` 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/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 672bcdec87a..d29ac3b4d3d 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(), @@ -88,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/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..cbb1d848e8a 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 })], }); @@ -198,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 @@ -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..77716866504 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 })], }); @@ -181,131 +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, - // 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, - // 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, - // 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, - // 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) @@ -313,11 +192,12 @@ 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, csrfPrevention: true, + cache: 'bounded', persistedQueries: { // highlight-start ttl: 900, // 15 minutes @@ -328,11 +208,12 @@ const server = new ApolloServer({ To disable TTL entirely, specify `null` for the value of `ttl`: -```javascript +```ts const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', persistedQueries: { ttl: null, // highlight-line }, @@ -350,6 +231,7 @@ const server = new ApolloServer({ typeDefs, resolvers, csrfPrevention: true, + cache: 'bounded', persistedQueries: false, // highlight-line }); ``` diff --git a/docs/source/performance/cache-backends.mdx b/docs/source/performance/cache-backends.mdx new file mode 100644 index 00000000000..e8c05bc44f6 --- /dev/null +++ b/docs/source/performance/cache-backends.mdx @@ -0,0 +1,213 @@ +--- +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](./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. + +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 @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()), // highlight-line +}); +``` + +## 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")), // highlight-line +}); +``` + +### Redis Sentinel +```ts +import Keyv from "keyv"; +import { KeyvAdapter } from "@apollo/utils.keyvadapter"; + +const server = new ApolloServer({ + typeDefs, + resolvers, + csrfPrevention: true, + // highlight-start + cache: new KeyvAdapter( + new Keyv("redis://user:pass@localhost:6379", { + sentinels: [ + { host: "localhost", port: 26379 }, + { host: "localhost", port: 26380 }, + ], + }) + ), + // highlight-end +}); +``` + +### 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"; + +// 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 +}); +``` + +> 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 +// highlight-start +const servers = [ + "user:pass@localhost:11211", + "user:pass@localhost:11222" +].join(","); + +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 })), // highlight-line +}); +``` + +## 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/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/package-lock.json b/package-lock.json index 511c4889e1f..2ce170318eb 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", @@ -194,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", @@ -209,6 +203,23 @@ "graphql": "14.x || 15.x || 16.x" } }, + "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", @@ -538,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" }, @@ -696,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", @@ -721,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", @@ -771,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", @@ -1053,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", @@ -1703,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" @@ -1715,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", @@ -1748,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" }, @@ -2115,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": { @@ -2269,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", @@ -2284,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": { @@ -2318,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" @@ -2357,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", @@ -2375,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" @@ -2938,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" @@ -3632,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": { @@ -4267,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" }, @@ -4327,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" }, @@ -4395,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" @@ -4518,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" @@ -4649,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" }, @@ -4732,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" }, @@ -4916,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" }, @@ -5088,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" @@ -5321,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" }, @@ -5346,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" }, @@ -5501,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" }, @@ -5791,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" @@ -5844,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" }, @@ -5953,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" }, @@ -6081,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" }, @@ -6638,15 +6667,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", @@ -6777,15 +6797,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", @@ -7043,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": { @@ -7061,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": { @@ -7079,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": { @@ -7134,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" }, @@ -7168,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" }, @@ -7295,18 +7308,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 @@ -7537,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" }, @@ -7619,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", @@ -8251,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", @@ -8307,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": { @@ -8369,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": { @@ -8503,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" @@ -8545,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" @@ -8585,13 +8589,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, @@ -8823,10 +8820,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, @@ -8844,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": { @@ -8935,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" }, @@ -8958,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" }, @@ -9022,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" }, @@ -9584,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" @@ -9720,7 +9716,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", @@ -9872,13 +9869,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", @@ -9910,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" } @@ -9975,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": { @@ -10272,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": { @@ -10718,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": { @@ -11493,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" }, @@ -11523,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", @@ -11691,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", @@ -11824,14 +11830,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", @@ -11843,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": { @@ -11899,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" @@ -11912,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, @@ -11926,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" }, @@ -11973,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" }, @@ -12181,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" }, @@ -12232,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" @@ -12271,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" @@ -12309,52 +12318,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, @@ -12442,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" }, @@ -12541,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": { @@ -12742,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": { @@ -12927,18 +12891,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", @@ -13264,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", @@ -14664,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": { @@ -15298,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" }, @@ -15313,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" }, @@ -15443,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", @@ -15475,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" }, @@ -15486,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" }, @@ -15500,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", @@ -15517,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" }, @@ -15620,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" @@ -15629,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", @@ -15645,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", @@ -15658,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" @@ -15667,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" @@ -15703,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" @@ -15715,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" @@ -15736,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" @@ -15748,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", @@ -15807,14 +15741,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", @@ -15827,11 +15753,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", @@ -15938,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", @@ -16016,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" @@ -16027,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" @@ -16039,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" @@ -16057,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" @@ -16069,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", @@ -16174,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", @@ -16283,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" }, @@ -16300,19 +16223,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", @@ -16344,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" }, @@ -16355,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" }, @@ -16369,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" }, @@ -16497,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" }, @@ -16563,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", @@ -16581,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" }, @@ -16673,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" @@ -16805,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", @@ -16950,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" @@ -17015,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" @@ -17046,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" }, @@ -17101,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" }, @@ -17112,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" }, @@ -17154,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" }, @@ -17504,6 +17447,7 @@ }, "node_modules/p-map": { "version": "2.1.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -17657,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", @@ -17684,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": { @@ -17757,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" }, @@ -17799,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", @@ -17814,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": { @@ -18161,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" } @@ -18179,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" } @@ -18389,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" }, @@ -18400,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" }, @@ -18414,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" }, @@ -18618,27 +18570,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", @@ -18852,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" @@ -19175,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": { @@ -19296,9 +19227,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", @@ -19350,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": { @@ -19382,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" }, @@ -19442,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" @@ -19521,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": { @@ -19582,10 +19512,6 @@ "node": ">=8" } }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "license": "MIT" - }, "node_modules/statuses": { "version": "1.5.0", "license": "MIT", @@ -19859,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" @@ -19956,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": { @@ -19983,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", @@ -20064,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": { @@ -20172,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": { @@ -20243,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" }, @@ -20283,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": { @@ -20600,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" @@ -20644,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": { @@ -20820,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": { @@ -20873,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" } @@ -20963,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" @@ -21103,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" @@ -21258,7 +21193,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 +21204,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" @@ -21324,41 +21259,6 @@ "graphql": "^15.3.0 || ^16.0.0" } }, - "packages/apollo-server-cache-memcached": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "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", - "license": "MIT", - "dependencies": { - "apollo-server-caching": "file:../apollo-server-caching", - "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", - "license": "MIT", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12.0" - } - }, "packages/apollo-server-cloud-functions": { "version": "3.8.2", "license": "MIT", @@ -21392,6 +21292,7 @@ "version": "3.8.2", "license": "MIT", "dependencies": { + "@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 +21302,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", @@ -21643,7 +21543,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 +21558,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": { @@ -21725,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==" } } }, @@ -21735,6 +21637,22 @@ "integrity": "sha512-R2iZgXB+vTEx+B+N2mME0SP61+iEt+5fM26bYBvubyZflKed1VH2YiPLIl44nrahIph5JsTIvi/CeUsveJRZkg==", "requires": {} }, + "@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", @@ -21978,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" @@ -22092,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", @@ -22113,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", @@ -22155,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", @@ -22376,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", @@ -22811,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", @@ -22846,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" @@ -23187,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 } } @@ -23314,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", @@ -23329,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": { @@ -23351,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" @@ -23384,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", @@ -23399,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 } } @@ -23911,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" @@ -24468,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": { @@ -24958,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" @@ -25002,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" @@ -25046,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", @@ -25127,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", @@ -25217,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" @@ -25260,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" @@ -25409,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" @@ -25529,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", @@ -25696,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" @@ -25712,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" @@ -25828,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" @@ -26033,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", @@ -26063,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" @@ -26136,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" @@ -26219,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" @@ -26679,15 +26632,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", @@ -26813,15 +26757,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", @@ -27057,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 } } @@ -27074,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 } } @@ -27091,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 } } @@ -27135,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" @@ -27157,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" @@ -27229,15 +27168,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" @@ -27269,29 +27208,6 @@ "apollo-server-types": "file:../apollo-server-types" } }, - "apollo-server-cache-memcached": { - "version": "file:packages/apollo-server-cache-memcached", - "requires": { - "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-server-caching": "file:../apollo-server-caching", - "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": { @@ -27311,6 +27227,7 @@ "apollo-server-core": { "version": "file:packages/apollo-server-core", "requires": { + "@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 +27237,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", @@ -27467,7 +27383,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 +27391,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" } }, @@ -27604,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" } @@ -27657,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", @@ -28117,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 } } @@ -28153,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 } } @@ -28194,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 } } @@ -28310,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" @@ -28343,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" } } } @@ -28373,9 +28295,6 @@ "mimic-response": "^1.0.0" } }, - "cluster-key-slot": { - "version": "1.1.0" - }, "cmd-shim": { "version": "4.1.0", "dev": true, @@ -28558,9 +28477,6 @@ "utils-merge": "1.0.1" } }, - "connection-parse": { - "version": "0.0.7" - }, "console-control-strings": { "version": "1.1.0", "dev": true @@ -28577,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 } } @@ -28639,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" @@ -28654,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" } @@ -28694,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" @@ -28962,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": { @@ -29195,7 +29117,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", @@ -29301,9 +29224,6 @@ "delegates": { "version": "1.0.0" }, - "denque": { - "version": "1.5.0" - }, "depd": { "version": "1.1.2" }, @@ -29323,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": { @@ -29370,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 } } @@ -29573,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 } } @@ -29907,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 } } @@ -30469,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": { @@ -30611,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==" } } }, @@ -30691,13 +30624,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", @@ -30709,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 } } @@ -30760,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": { @@ -30779,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" @@ -30809,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" @@ -30938,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" @@ -30973,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", @@ -30996,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": { @@ -31024,39 +30969,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 @@ -31110,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" @@ -31168,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 } } @@ -31296,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 } } @@ -31443,17 +31357,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", @@ -31686,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", @@ -32740,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": { @@ -33201,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" } @@ -33244,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 } } @@ -33329,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", @@ -33355,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", @@ -33385,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" @@ -33476,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", @@ -33495,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", @@ -33505,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" @@ -33540,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" @@ -33549,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" @@ -33564,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" @@ -33573,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", @@ -33613,12 +33511,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", @@ -33631,11 +33523,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", @@ -33726,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", @@ -33785,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" @@ -33802,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": { @@ -33814,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" @@ -33823,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", @@ -33892,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 } } @@ -33907,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 } } @@ -33989,23 +33878,14 @@ "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": { "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", @@ -34030,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" @@ -34128,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": { @@ -34166,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": { @@ -34179,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" @@ -34240,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": { @@ -34338,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 } } @@ -34451,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": { @@ -34503,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": { @@ -34523,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" @@ -34565,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" @@ -34601,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" @@ -34836,7 +34748,8 @@ } }, "p-map": { - "version": "2.1.0" + "version": "2.1.0", + "dev": true }, "p-map-series": { "version": "2.1.0", @@ -34932,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", @@ -34957,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 } } @@ -35016,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" @@ -35048,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 } } @@ -35064,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 } } @@ -35311,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", @@ -35321,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 } } @@ -35455,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" @@ -35627,18 +35556,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", @@ -35806,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 } } @@ -36027,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 } } @@ -36119,9 +36036,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", @@ -36157,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 } } @@ -36182,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" @@ -36221,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", @@ -36286,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 } } @@ -36336,9 +36254,6 @@ } } }, - "standard-as-callback": { - "version": "2.1.0" - }, "statuses": { "version": "1.5.0" }, @@ -36540,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" @@ -36613,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 } } @@ -36635,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", @@ -36695,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 } } @@ -36779,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 } } @@ -36830,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" @@ -36856,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 } } @@ -37052,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" @@ -37077,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 } } @@ -37094,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 } } @@ -37231,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" } }, @@ -37271,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": { @@ -37327,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" } } } @@ -37427,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/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-datasource-rest/package.json b/packages/apollo-datasource-rest/package.json index e6d0bc08eaf..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": { @@ -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..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": { @@ -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-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-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 98b9470c015..00000000000 --- a/packages/apollo-server-cache-memcached/package.json +++ /dev/null @@ -1,25 +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-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 cf66cdb82fa..00000000000 --- a/packages/apollo-server-cache-memcached/src/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { - KeyValueCache, - KeyValueCacheSetOptions, -} from 'apollo-server-caching'; -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 dab7afbdc99..00000000000 --- a/packages/apollo-server-cache-memcached/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"], - "references": [ - { "path": "../apollo-server-caching" }, - ] -} 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 87682ae3262..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-server-caching": "file:../apollo-server-caching", - "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 bd66e9ca1d8..00000000000 --- a/packages/apollo-server-cache-redis/src/BaseRedisCache.ts +++ /dev/null @@ -1,112 +0,0 @@ -import type { - KeyValueCache, - KeyValueCacheSetOptions, -} from 'apollo-server-caching'; -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 dab7afbdc99..00000000000 --- a/packages/apollo-server-cache-redis/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"], - "references": [ - { "path": "../apollo-server-caching" }, - ] -} 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/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 998ab523171..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", @@ -25,6 +25,7 @@ "node": ">=12.0" }, "dependencies": { + "@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 +35,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", diff --git a/packages/apollo-server-core/src/ApolloServer.ts b/packages/apollo-server-core/src/ApolloServer.ts index 18ae8a1bd9f..871c76127dc 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,7 @@ import { InternalPluginId, pluginIsInternal } from './internalPlugin'; import { newCachePolicy } from './cachePolicy'; import { GatewayIsTooOldError, SchemaManager } from './utils/schemaManager'; import * as uuid from 'uuid'; +import { UnboundedCache } from './utils/UnboundedCache'; const NoIntrospection = (context: ValidationContext) => ({ Field(node: FieldDefinitionNode) { @@ -260,10 +261,28 @@ export class ApolloServerBase< : noIntro; } - if (!requestOptions.cache) { + if (requestOptions.cache === 'bounded') { requestOptions.cache = new InMemoryLRUCache(); } + 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 https://go.apollo.dev/s/cache-backends for other alternatives.', + ); + } + } + if (requestOptions.persistedQueries !== false) { const { cache: apqCache = requestOptions.cache!, ...apqOtherOptions } = requestOptions.persistedQueries || Object.create(null); @@ -709,7 +728,7 @@ export class ApolloServerBase< // random prefix each time we get a new schema. documentStore: this.config.documentStore === undefined - ? this.initializeDocumentStore() + ? new InMemoryLRUCache() : this.config.documentStore === null ? null : new PrefixingKeyValueCache( @@ -906,20 +925,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__/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 319b6775393..d65a96b298c 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 assert from 'assert'; +import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache'; 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; + const embeddedStore = options.documentStore; + assert(embeddedStore); expect(embeddedStore).toBeInstanceOf(InMemoryLRUCache); 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..37a0825da41 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; @@ -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-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); + } +} 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-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-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/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-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/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-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/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-integration-testsuite/src/ApolloServer.ts b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts index f210f08b4c6..bcfea09861f 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 { + InMemoryLRUCache, + type KeyValueCache, +} from '@apollo/utils.keyvaluecache'; const quietLogger = loglevel.getLogger('quiet'); quietLogger.setLevel(loglevel.levels.WARN); @@ -265,6 +268,7 @@ export function testApolloServer( schema, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -284,6 +288,7 @@ export function testApolloServer( introspection: true, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -1727,6 +1732,7 @@ export function testApolloServer( }, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -1757,6 +1763,7 @@ export function testApolloServer( }, stopOnTerminationSignals: false, nodeEnv: 'production', + cache: 'bounded', }); const apolloFetch = createApolloFetch({ uri }); @@ -2251,11 +2258,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'] }); }); @@ -2263,6 +2269,102 @@ export function testApolloServer( clock.uninstall(); }); + it('uses an unbounded cache by default', async () => { + const server = new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + }); + + // 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', + ); + }); + + it('uses a bounded cache', async () => { + const server = new ApolloServerBase({ + typeDefs: `type Query { hello: String }`, + cache: 'bounded', + }); + + 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("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/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-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 }); 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 6b431a59d4a..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", @@ -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..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", @@ -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": [] } 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", 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__/" },