diff --git a/.changeset/weak-peaches-count.md b/.changeset/weak-peaches-count.md new file mode 100644 index 00000000000..3222cf2c95b --- /dev/null +++ b/.changeset/weak-peaches-count.md @@ -0,0 +1,77 @@ +--- +'@graphql-tools/batch-execute': major +'@graphql-tools/delegate': major +'@graphql-tools/mock': major +'@graphql-tools/schema': major +'@graphql-tools/stitch': major +'@graphql-tools/utils': major +'@graphql-tools/wrap': major +'@graphql-tools/links': patch +'@graphql-tools/merge': patch +--- + +## Breaking Changes: + +#### Schema Generation and Decoration API (`@graphql-tools/schema`) + +- Resolver validation options should now be set to `error`, `warn` or `ignore` rather than `true` or `false`. In previous versions, some of the validators caused errors to be thrown, while some issued warnings. This changes brings consistency to validator behavior. + +- The `allowResolversNotInSchema` has been renamed to `requireResolversToMatchSchema`, to harmonize the naming convention of all the validators. The default setting of `requireResolversToMatchSchema` is `error`, matching the previous behavior. + +#### Schema Delegation (`delegateToSchema` & `@graphql-tools/delegate`) + +- The `delegateToSchema` return value has matured and been formalized as an `ExternalObject`, in which all errors are integrated into the GraphQL response, preserving their initial path. Those advanced users accessing the result directly will note the change in error handling. This also allows for the deprecation of unnecessary helper functions including `slicedError`, `getErrors`, `getErrorsByPathSegment` functions. Only external errors with missing or invalid paths must still be preserved by annotating the remote object with special properties. The new `getUnpathedErrors` function is therefore necessary for retrieving only these errors. Note also the new `annotateExternalObject` and `mergeExternalObjects` functions, as well as the renaming of `handleResult` to `resolveExternalValue`. + +- Transform types and the `applySchemaTransforms` are now relocated to the `delegate` package; `applyRequestTransforms`/`applyResultTransforms` functions have been deprecated, however, as this functionality has been replaced since v6 by the `Transformer` abstraction. + +- The `transformRequest`/`transformResult` methods are now provided additional `delegationContext` and `transformationContext` arguments -- these were introduced in v6, but previously optional. + +- The `transformSchema` method may wish to create additional delegating resolvers and so it is now provided the `subschemaConfig` and final (non-executable) `transformedSchema` parameters. As in v6, the `transformSchema` is kicked off once to produce the non-executable version, and then, if a wrapping schema is being generated, proxying resolvers are created with access to the (non-executabel) initial result. In v7, the individual `transformSchema` methods also get access to the result of the first run, if necessary, they can create additional wrapping schema proxying resolvers. + +- `applySchemaTransforms` parameters have been updated to match and support the `transformSchema` parameters above. + +#### Remote Schemas & Wrapping (`wrapSchema`, `makeRemoteExecutableSchema`, and `@graphql-tools/wrap`) + +- `wrapSchema` and `generateProxyingResolvers` now only take a single options argument with named properties of type `SubschemaConfig`. The previously possible shorthand version with first argument consisting of a `GraphQLSchema` and second argument representing the transforms should be reworked as a `SubschemaConfig` object. + +- Similarly, the `ICreateProxyingResolverOptions` interface that provides the options for the `createProxyingResolver` property of `SubschemaConfig` options has been adjusted. The `schema` property previously could be set to a `GraphQLSchema` or a `SubschemaConfig` object. This property has been removed in favor of a `subschemaConfig` property that will always be a `SubschemaConfig` object. The `transforms` property has been removed; transforms should be included within the `SubschemaConfig` object.` + +- The format of the wrapping schema has solidified. All non-root fields are expected to use identical resolvers, either `defaultMergedResolver` or a custom equivalent, with root fields doing the hard work of proxying. Support for custom merged resolvers throught `createMergedResolver` has been deprecated, as custom merging resolvers conflicts when using stitching's type merging, where resolvers are expected to be identical across subschemas. + +- The `WrapFields` transform's `wrappingResolver` option has been removed, as this complicates multiple wrapping layers, as well as planned functionality to wrap subscription root fields in potentially multiple layers, as the wrapping resolvers may be different in different layers. Modifying resolvers can still be performed by use of an additional transform such as `TransformRootFields` or `TransformObjectFields`. + +- The `ExtendSchema` transform has been removed, as it is conceptually simpler just to use `stitchSchemas` with one subschema. + +- The `ReplaceFieldsWithFragment`, `AddFragmentsByField`, `AddSelectionSetsByField`, and `AddMergedTypeSelectionSets` transforms has been removed, as they are superseded by the `AddSelectionSets` and `VisitSelectionSets` transforms. The `AddSelectionSets` purposely takes parsed SDL rather than strings, to nudge end users to parse these strings at build time (when possible), rather than at runtime. Parsing of selection set strings can be performed using the `parseSelectionSet` function from `@graphql-tools/utils`. + +#### Schema Stitching (`stitchSchemas` & `@graphql-tools/stitch`) + +- `stitchSchemas`'s `mergeTypes` option is now true by default! This causes the `onTypeConflict` option to be ignored by default. To use `onTypeConflict` to select a specific type instead of simply merging, simply set `mergeTypes` to false. + +- `schemas` argument has been deprecated, use `subschemas`, `typeDefs`, or `types`, depending on what you are stitching. + +- When using batch delegation in type merging, the `argsFromKeys` function is now set only via the `argsFromKeys` property. Previously, if `argsFromKeys` was absent, it could be read from `args`. + +- Support for fragment hints has been removed in favor of selection set hints. + +- `stitchSchemas` now processes all `GraphQLSchema` and `SubschemaConfig` subschema input into new `Subschema` objects, handling schema config directives such aso`@computed` as well as generating the final transformed schema, stored as the `transformedSchema` property, if transforms are used. Signatures of the `onTypeConflict`, `fieldConfigMerger`, and `inputFieldConfigMerger` have been updated to include metadata related to the original and transformed subschemas. Note the property name change for `onTypeConflict` from `schema` to `subschema`. + +#### Mocking (`addMocksToSchema` and `@graphql-tools/mock`) + +- Mocks returning objects with fields set as functions are now operating according to upstream graphql-js convention, i.e. these functions take three arguments, `args`, `context`, and `info` with `parent` available as `this` rather than as the first argument. + +#### Other Utilities (`@graphql-tools/utils`) + +- `filterSchema`'s `fieldFilter` will now filter *all* fields across Object, Interface, and Input types. For the previous Object-only behavior, switch to the `objectFieldFilter` option. +- Unused `fieldNodes` utility functions have been removed. +- Unused `typeContainsSelectionSet` function has been removed, and `typesContainSelectionSet` has been moved to the `stitch` package. +- Unnecessary `Operation` type has been removed in favor of `OperationTypeNode` from upstream graphql-js. +- As above, `applySchemaTransforms`/`applyRequestTransforms`/`applyResultTransforms` have been removed from the `utils` package, as they are implemented elsewhere or no longer necessary. + +## Related Issues + +- proxy all the errors: #1047, #1641 +- better error handling for merges #2016, #2062 +- fix typings #1614 +- disable implicit schema pruning #1817 +- mocks not working for functions #1807 diff --git a/designs/connector-model-diagram.png b/designs/connector-model-diagram.png deleted file mode 100644 index 2cc6aafdb8f..00000000000 Binary files a/designs/connector-model-diagram.png and /dev/null differ diff --git a/designs/connectors.md b/designs/connectors.md deleted file mode 100644 index e565c233bfc..00000000000 --- a/designs/connectors.md +++ /dev/null @@ -1,167 +0,0 @@ -# Connectors and models - -* **Connector:** a layer on top of a database/backend driver that has GraphQL-specific error handling, logging, batching, and/or caching. Only needs to be implemented once for each backend, can be reused in many apps - -* **Model:** a set of functions to fetch data of a certain GraphQL type by using various connectors. Models are usually application-specific. - -This document is intended as a design document for people who want to write connectors for various backends. Its main purpose is to specify what properties connectors should have so they can be easily shared with other people and used in Apollo without any shims. - -This is a draft at the moment, and not the final document. Chances are that the spec will change as we learn about the better ways to build GraphQL servers. It should be pretty close to the final version though, so if you want to get started and build connectors for specific backends, this document is a good starting point. - - -Technically you could write a GraphQL server without connectors and models by writing all your logic directly into the resolvers, but in most cases that's not ideal. Connectors and models are a way of organizing code in a GraphQL server, and you should use them to keep your server modular. If the need arises, you can always write optimized queries directly in your resolvers or models. - -Let's use an example schema, because it's always easier to explain things with examples: -``` -type Author { - id: ID! - name: String - posts: [Post] -} - -type Post { - id: ID! - title: String - text: String - views: Int - author: Author -} - -type Query { - author(id: ID!): Author - searchPosts(titleContains: String): [Post] -} -``` - -In this example, an author has multiple posts, and each post has one author. - -Here's an illustration for how connectors and models would look like for this example if Authors and Posts were stored in MySQL, but view counts in MongoDB: - -![Connectors are database-specific, models are application-specific](connector-model-diagram.png) - - -The Posts model connects to both SQL and MongoDB. Title, text and authorId come from SQL, the view count comes from MongoDB. - - - - -## What is a connector? - -A connector is the piece of code that links a GraphQL server to a specific backend (eg. MySQL, MongoDB, S3, neo4j). Each backend will have its own connector. Apart from connecting the GraphQL server to a backend, connectors should also: - -- Batch requests together whenever it makes sense -- Cache data fetched for the backend to avoid extra requests (at least for the duration of one query) -- Provide a way to log information about data fetched, such as how long the request took, which things were batched together, what was fetched from the cache, how much data was fetched etc. - -Both batching and caching are more important in GraphQL than in traditional endpoints, because one GraphQL query may make many separate calls to the backend to retrieve all the items where a REST endpoint would only retrieve a few items, usually in one query. The separate calls let GraphQL support a wide range of queries, whereas a single REST endpoint typically only allows querying for a narrow set of objects. - - -## What is a model? - -Models are the glue between connectors - which are backend-specific - and GraphQL types - which are app-specific. They are very similar to models in ORMs, such as Rails' Active Record. - -Let's say for example that you have two types, Author and Post, which are both stored in MySQL. Rather than calling the MySQL connector directly from your resolvers, you should create models for Author and Post, which use the MySQL connector. This additional level of abstraction helps separate the data fetching logic from the GraphQL schema, which makes reusing and refactoring it easier. - -In the example schema above, the Authors model would have the following methods: -``` -const Author = { - getById(id); // get an Author by id. -} -``` - -The Posts model would have the following methods: -``` -const Posts = { - getById(id); // get Post by id - getByTitleContains(contains); //get a list of posts that have a word in the title - getByAuthor(authorId); // get list of posts by a certain author - views(postId); // get the number of views for post with ID postId (fetches from MongoDB) -} -``` - -In some cases it may be a good idea for your `getById` (and other) methods to take the list of fields to be fetched as an additional argument. That way the model layer can make sure to fetch only the data required from the backend. This is especially important for types that have large fields which are not always required. - - -## How to use connectors and models in Apollo Server -note: This is a still a draft design document. At the time of writing there are no connectors. As we build connectors, we'll add them to the docs. - -Let's presume a simple mongo connector: -```javascript -// ./connectors/mongodb.js -class MongoDBConnector { - constructor(connection){ - this.connection = connection; - } - closeConnection(){ - this.connection.close(); - } - collection(collectionName){ - // caching, batching and logging could be added here - return connection.collection(connectionName); - } -} - -export default MongoDBConnector -``` - -Connectors and models are easy to use in apollo server: - -Step 1: Import the connector and the DB driver -``` -import MongoDBConnector from './connectors/mongodb'; -import pmongo from 'promised-mongo'; -import knex from 'knex'; -``` - -Step 2: Establish a connection with the DB -``` -const mongoDB = pmongo('username:password@localhost:27017/blog'); -const sqlDB = knex({ dialect: 'sqlite3', connection: { filename: './blog.sqlite' } }); -``` - -Step 3: Create the model -``` -class Author { - constructor(connectorKeys){ - this.connectorKeys = connectorKeys; - } - getById(id, context){ - return context.connectors[this.connectorKeys.db] - .collection('author') - .findOne({ _id: id }); - } -} -``` - -Step 4: Adding models to the context -``` -app.use('/graphql', apolloServer({ - schema: Schema, - context: { - connectors: { - mongo: new MongoDBConnector(mongoDB), - sql: new SqlConnector(sqlDB) - }, - models: { - Author: new Author({ db: 'mongo' }), - Post: new Post({ postDb: 'sql', viewsDb: 'mongo' }), - } - } -}); -``` - -Step 4: Calling models in resolvers -``` -function resolve(author, args, ctx){ - return ctx.models.Author.getById(author.id, ctx); -} -``` - -## FAQ - - -**Question:** Are models the same as GraphQL types? -**Answer:** There will usually be a 1:1 correspondence between types in your schema and the models, so it makes sense to keep them in the same file, or at least in the same folder. The subtle difference is that while the GraphQL schema describes the types and their relationships, the models define which connectors should be used to fetch the actual data for that type. - -**Question:** Can I use \ with Apollo Server? -**Answer:** Yes, you can use an existing ORM if you wish. In that case, the models you use will be your ORM's models, and the connector part will be in the ORM itself. Most ORMs don't implement batching and caching, but in the future there should be connectors that work with various ORMs so developers don't need to worry about batching and caching, and can keep using the ORM of their choice. In the meantime you can always start without batching and caching, and then add it manually where necessary (just as you might write an optimized raw query when using your ORM now). diff --git a/designs/graphql-decorator-spec.md b/designs/graphql-decorator-spec.md deleted file mode 100644 index b56fe3fd20a..00000000000 --- a/designs/graphql-decorator-spec.md +++ /dev/null @@ -1,193 +0,0 @@ -# Draft specification for GraphQL Schema Decorators - -Decorators can be used to modify a GraphQL schema behavior, somewhat similar to directives -which modify the way a GraphQL server executes a query. - -The intent of schema decorators is to make GraphQL schemas more malleable without the need -for modifying the current spec. Decorators don't enable anything that wasn't possible before, -but they make some common patterns much more reusable. - -Decorators can be used for a variety of purposes: -* Adding metadata to the schema -* Authorization -* Argument validation -* Filtering of results -* Logging & profiling -* Error handling -* Backend connectors - -GraphQL schema decorators use the `+` sign to distinguish them from directives, which use the `@` sign and come **after** the thing they're modifying. They could both share the `@sign`, but then decorators would have to come after the thing they decorate, which looks a bit awkward. - -Here is an example of decorators on a schema specified with GraphQL schema language: -``` -+connector(storage: "mongoDB") -+id(fields: ["uuid"]) -type Person { - uuid: String! - name: String! - - +deprecated(reason: "Use the 'name' field instead") - longName: String - friends: [Person] -} - -type RootQuery { - +description(text: "find a person by name") - findPerson(name: String!) - - +adminOnly - +log(type: "adminAccess") - allPersons( - page: Int = 0 - - +validateRange(min: 1, max: 10) - numPages: Int = 1 - ): [Person] -} - -type RootMutation { - +requiresAuthentication - +log(type: "userAccess") - addPerson( - +maxLen(100) - name: String! - ): Int - - +adminOnly - +log(type: "adminAccess") - removePerson(id: Int!): Boolean -} - -schema { - query: RootQuery - mutation: RootMutation -} -``` - -In GraphQL schema language, arguments to decorators follow the same spec as arguments to fields. - -## What decorators do: -Decorators can be selectively applied to: -* The schema -* A specific type (object type, union, interface, input, scalar) -* A specific field -* An argument - -Decorators can modify the behavior of the parts of the schema they are applied to. Sometimes that requires modifying other parts of the schema. For instance, the @validateRange decorator modifies the behavior of the containing field's resolver. - -In general, decorators either add, remove or modify an attribute of the thing they wrap. The most common type of decorator (e.g. @adminOnly, @log, @connector) will wrap one or more field resolvers to alter the execution behavior of the GraphQL schema, but other decorators (e.g. @description) may add attributes to a type, field or argument. It is also possible for a type decorator to add a field to the type (e.g. @id(fields: ["uuid"]) can add the __id field). - - -## Schema decorator API -All decorators must extend the SchemaDecorator class and implement the following interfaces: - -```es6 -class SampleFieldDecorator extends SchemaDecorator { - const tag = 'sample'; // matches +sample in GraphQL schema language - const locations = ['field', 'type', 'interface', 'union']; // where this decorator can be applied - - // the argSignature can be used to check whether a decorator's arguments are valid. - const argSignature = { - type: GraphQLString, - min: GraphQLInt, - max: GraphQLInt - }; - - // the constructor is used to configure things once per server, such as database credentials. - // if the same decorator class is to be used with different configurations, then two instances - // with different prefixes have to be created. - constructor(config, prefix = ''){ - this.config = config; - this.prefix = prefix; - } - - getTag(){ - return this.prefix + tag; - } - - isWellPlaced(locationName){ - return locations.indexOf(locationName) >= 0; - } - - getArgSignature(){ - return argSignature; - } - - // apply returns a function which gets applied to the decorated thing. - apply(){ - - // context says what scope this decorator is being applied to, i.e. 'type', 'schema', 'field' etc. - return (wrappedThing, { schema, type, field, context }) => { - // use this.config ... - // use args - // modify wrappedThing's properties, resolvers, etc. - } - } -} -``` - -When constructing a GraphQL schema from GraphQL schema language with decorators, all decorators need to be specified and given to the schema generation function, otherwise an error will be thrown: - -```es6 -import { Description, Deprecated, Validator } from 'graphql-decorators'; -const shorthandSchema = gql` ... schema here `; - -const availableDecorators = [ new Description(), new Deprecated(), new Validator()]; - -// fictional example, not the actual function signature: -const schema = makeExecutableSchema({ - schema: shorthandSchema, - decorators: availableDecorators -}); -``` - -## Applying decorators to a GraphQL-JS schema - -The use of schema decorators is most immediately obvious in GraphQL schema language, but they can also be applied to a GraphQL-JS schema. You might want to do this to get portable components that can be used across many schemas. Here is an example: - -```es6 -import { Description, DeprecationReason, Validator } from 'graphql-decorators'; -// ... more imports ... -const deprecationReason = new DeprecationReason(); -const description = new Description(); -const validator = new Validator(); - -const schema = new GraphQLSchema({ - query: new GraphQLObjectType({ - name: 'RootQuery', - decorators: [ description.apply({ text: 'This is the root query' }) ], - fields: () => { - getString: { - type: GraphQLString, - decorators: [ deprecationReason.apply({ text: 'This field never did anything useful' })], - resolve(root, {str}){ return str; }, - args: { - str: { - type: GraphQLString, - decorators: [ validator.apply({ type: 'length', min: 1, max: 1000 }) ] - }, - }, - }, - }, - }), -}); -``` - -To apply these decorators, the function `applySchemaDecorators(schema)` has to be called like so: - -```es6 -import { applySchemaDecorators } from '@graphql-tools/stitch'; - -const schema = new GraphQLSchema({ - // schema definition here -}); - -applySchemaDecorators(schema); // applies the decorators to the schema in place. -``` - -Many decorators can be used on the server as well as the client, which means they have to be part of the information returned by the introspection query. However, only the tag and the arguments should be shared with the client, not the configuration. The client will most likely need different configuration. - -Some decorators may need to be server-only, in which case they should not be introspectable by the client. - - -Decorators can be used to add metadata to a GraphQL schema in a way that is portable across different servers and clients. As long as the semantics of a decorator are well-specified, there could be GraphQL-JS, Graphene, Apollo-client, Relay, Sangria, etc. implementations for the same decorator, which given the same decorator tag and arguments will do the same thing on all these different implementations. For example, they could be used to provide optimistic UI in apollo-client and relay with zero additional code: The server version of the decorator modifies a mutation so it updates a specific store, the client version (eg. apollo-client) updates the client cache instead. diff --git a/packages/batch-execute/package.json b/packages/batch-execute/package.json new file mode 100644 index 00000000000..83a939057d0 --- /dev/null +++ b/packages/batch-execute/package.json @@ -0,0 +1,30 @@ +{ + "name": "@graphql-tools/batch-execute", + "version": "6.2.4", + "description": "A set of utils for faster development of GraphQL tools", + "repository": "git@github.com:ardatan/graphql-tools.git", + "license": "MIT", + "sideEffects": false, + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "typings": "dist/index.d.ts", + "typescript": { + "definition": "dist/index.d.ts" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0" + }, + "buildOptions": { + "input": "./src/index.ts" + }, + "dependencies": { + "@graphql-tools/utils": "^6.2.4", + "dataloader": "2.0.0", + "is-promise": "4.0.0", + "tslib": "~2.0.1" + }, + "publishConfig": { + "access": "public", + "directory": "dist" + } +} diff --git a/packages/delegate/src/getBatchingExecutor.ts b/packages/batch-execute/src/createBatchingExecutor.ts similarity index 83% rename from packages/delegate/src/getBatchingExecutor.ts rename to packages/batch-execute/src/createBatchingExecutor.ts index db1b1f4b817..9c3bf4153fc 100644 --- a/packages/delegate/src/getBatchingExecutor.ts +++ b/packages/batch-execute/src/createBatchingExecutor.ts @@ -6,25 +6,22 @@ import DataLoader from 'dataloader'; import { ExecutionResult } from '@graphql-tools/utils'; -import { ExecutionParams, Endpoint } from './types'; -import { memoize2of3 } from './memoize'; +import { ExecutionParams, Executor } from './types'; + import { mergeExecutionParams } from './mergeExecutionParams'; import { splitResult } from './splitResult'; -export const getBatchingExecutor = memoize2of3(function ( - _context: Record, - endpoint: Endpoint, - executor: ({ document, context, variables, info }: ExecutionParams) => ExecutionResult | Promise -) { +export function createBatchingExecutor( + executor: Executor, + dataLoaderOptions?: DataLoader.Options, + extensionsReducer?: (mergedExtensions: Record, executionParams: ExecutionParams) => Record +): Executor { const loader = new DataLoader( - createLoadFn( - executor ?? endpoint.executor, - endpoint.batchingOptions?.extensionsReducer ?? defaultExtensionsReducer - ), - endpoint.batchingOptions?.dataLoaderOptions + createLoadFn(executor, extensionsReducer ?? defaultExtensionsReducer), + dataLoaderOptions ); return (executionParams: ExecutionParams) => loader.load(executionParams); -}); +} function createLoadFn( executor: ({ document, context, variables, info }: ExecutionParams) => ExecutionResult | Promise, diff --git a/packages/batch-execute/src/getBatchingExecutor.ts b/packages/batch-execute/src/getBatchingExecutor.ts new file mode 100644 index 00000000000..c7cf5ab0bf8 --- /dev/null +++ b/packages/batch-execute/src/getBatchingExecutor.ts @@ -0,0 +1,14 @@ +import DataLoader from 'dataloader'; + +import { ExecutionParams, Executor } from './types'; +import { createBatchingExecutor } from './createBatchingExecutor'; +import { memoize2of4 } from './memoize'; + +export const getBatchingExecutor = memoize2of4(function ( + _context: Record = self ?? window ?? global, + executor: Executor, + dataLoaderOptions?: DataLoader.Options, + extensionsReducer?: (mergedExtensions: Record, executionParams: ExecutionParams) => Record +): Executor { + return createBatchingExecutor(executor, dataLoaderOptions, extensionsReducer); +}); diff --git a/packages/batch-execute/src/index.ts b/packages/batch-execute/src/index.ts new file mode 100644 index 00000000000..1a951db92c1 --- /dev/null +++ b/packages/batch-execute/src/index.ts @@ -0,0 +1,2 @@ +export * from './createBatchingExecutor'; +export * from './getBatchingExecutor'; diff --git a/packages/batch-execute/src/memoize.ts b/packages/batch-execute/src/memoize.ts new file mode 100644 index 00000000000..8b963a8ded5 --- /dev/null +++ b/packages/batch-execute/src/memoize.ts @@ -0,0 +1,40 @@ +export function memoize2of4< + T1 extends Record, + T2 extends Record, + T3 extends any, + T4 extends any, + R extends any +>(fn: (A1: T1, A2: T2, A3: T3, A4: T4) => R): (A1: T1, A2: T2, A3: T3, A4: T4) => R { + let cache1: WeakMap>; + + function memoized(a1: T1, a2: T2, a3: T3, a4: T4) { + if (!cache1) { + cache1 = new WeakMap(); + const cache2: WeakMap = new WeakMap(); + cache1.set(a1, cache2); + const newValue = fn(a1, a2, a3, a4); + cache2.set(a2, newValue); + return newValue; + } + + let cache2 = cache1.get(a1); + if (!cache2) { + cache2 = new WeakMap(); + cache1.set(a1, cache2); + const newValue = fn(a1, a2, a3, a4); + cache2.set(a2, newValue); + return newValue; + } + + const cachedValue = cache2.get(a2); + if (cachedValue === undefined) { + const newValue = fn(a1, a2, a3, a4); + cache2.set(a2, newValue); + return newValue; + } + + return cachedValue; + } + + return memoized; +} diff --git a/packages/delegate/src/mergeExecutionParams.ts b/packages/batch-execute/src/mergeExecutionParams.ts similarity index 99% rename from packages/delegate/src/mergeExecutionParams.ts rename to packages/batch-execute/src/mergeExecutionParams.ts index 605a84be92a..3cb1b9fa05f 100644 --- a/packages/delegate/src/mergeExecutionParams.ts +++ b/packages/batch-execute/src/mergeExecutionParams.ts @@ -18,9 +18,10 @@ import { OperationTypeNode, } from 'graphql'; -import { createPrefix } from './prefix'; import { ExecutionParams } from './types'; +import { createPrefix } from './prefix'; + /** * Merge multiple queries into a single query in such a way that query results * can be split and transformed as if they were obtained by running original queries. diff --git a/packages/delegate/src/prefix.ts b/packages/batch-execute/src/prefix.ts similarity index 100% rename from packages/delegate/src/prefix.ts rename to packages/batch-execute/src/prefix.ts diff --git a/packages/delegate/src/splitResult.ts b/packages/batch-execute/src/splitResult.ts similarity index 100% rename from packages/delegate/src/splitResult.ts rename to packages/batch-execute/src/splitResult.ts diff --git a/packages/batch-execute/src/types.ts b/packages/batch-execute/src/types.ts new file mode 100644 index 00000000000..e69289a85bd --- /dev/null +++ b/packages/batch-execute/src/types.ts @@ -0,0 +1,15 @@ +import { DocumentNode, GraphQLResolveInfo } from 'graphql'; + +import { ExecutionResult } from '@graphql-tools/utils'; + +export interface ExecutionParams, TContext = any> { + document: DocumentNode; + variables?: TArgs; + extensions?: Record; + context?: TContext; + info?: GraphQLResolveInfo; +} + +export type Executor = , TArgs = Record, TContext = Record>( + params: ExecutionParams +) => ExecutionResult | Promise>; diff --git a/packages/delegate/package.json b/packages/delegate/package.json index 03a04a3b939..9d25bb64451 100644 --- a/packages/delegate/package.json +++ b/packages/delegate/package.json @@ -18,6 +18,7 @@ "input": "./src/index.ts" }, "dependencies": { + "@graphql-tools/batch-execute": "^6.2.4", "@graphql-tools/schema": "^6.2.4", "@graphql-tools/utils": "^6.2.4", "@ardatan/aggregate-error": "0.0.6", diff --git a/packages/delegate/src/Subschema.ts b/packages/delegate/src/Subschema.ts index 6b09bf45a1e..4d080aa0b57 100644 --- a/packages/delegate/src/Subschema.ts +++ b/packages/delegate/src/Subschema.ts @@ -1,75 +1,33 @@ import { GraphQLSchema } from 'graphql'; -import { Transform, applySchemaTransforms } from '@graphql-tools/utils'; - import { SubschemaConfig, + Transform, MergedTypeConfig, CreateProxyingResolverFn, Subscriber, Executor, - Endpoint, - EndpointBatchingOptions, + BatchingOptions, } from './types'; -import { FIELD_SUBSCHEMA_MAP_SYMBOL, OBJECT_SUBSCHEMA_SYMBOL } from './symbols'; - -export function getSubschema(result: any, responseKey: string): GraphQLSchema | SubschemaConfig { - const subschema = result[FIELD_SUBSCHEMA_MAP_SYMBOL] && result[FIELD_SUBSCHEMA_MAP_SYMBOL][responseKey]; - return subschema || result[OBJECT_SUBSCHEMA_SYMBOL]; -} - -export function setObjectSubschema(result: any, subschema: GraphQLSchema | SubschemaConfig) { - result[OBJECT_SUBSCHEMA_SYMBOL] = subschema; -} - -export function isSubschemaConfig(value: any): value is SubschemaConfig | Subschema { - return Boolean(value.schema && value.permutations === undefined); -} - -export function cloneSubschemaConfig(subschemaConfig: SubschemaConfig): SubschemaConfig { - const newSubschemaConfig = { - ...subschemaConfig, - transforms: subschemaConfig.transforms != null ? [...subschemaConfig.transforms] : undefined, - }; - - if (newSubschemaConfig.merge != null) { - newSubschemaConfig.merge = { ...subschemaConfig.merge }; - Object.keys(newSubschemaConfig.merge).forEach(typeName => { - newSubschemaConfig.merge[typeName] = { ...subschemaConfig.merge[typeName] }; - - const fields = newSubschemaConfig.merge[typeName].fields; - if (fields != null) { - Object.keys(fields).forEach(fieldName => { - fields[fieldName] = { ...fields[fieldName] }; - }); - } - - const computedFields = newSubschemaConfig.merge[typeName].computedFields; - if (computedFields != null) { - Object.keys(computedFields).forEach(fieldName => { - computedFields[fieldName] = { ...computedFields[fieldName] }; - }); - } - }); - } - - return newSubschemaConfig; -} +import { applySchemaTransforms } from './applySchemaTransforms'; export function isSubschema(value: any): value is Subschema { return Boolean(value.transformedSchema); } -export class Subschema { +interface ISubschema extends SubschemaConfig { + transformedSchema: GraphQLSchema; +} + +export class Subschema implements ISubschema { public schema: GraphQLSchema; public rootValue?: Record; public executor?: Executor; public subscriber?: Subscriber; public batch?: boolean; - public batchingOptions?: EndpointBatchingOptions; - public endpoint?: Endpoint; + public batchingOptions?: BatchingOptions; public createProxyingResolver?: CreateProxyingResolverFn; public transforms: Array; @@ -85,11 +43,10 @@ export class Subschema { this.subscriber = config.subscriber; this.batch = config.batch; this.batchingOptions = config.batchingOptions; - this.endpoint = config.endpoint; this.createProxyingResolver = config.createProxyingResolver; this.transforms = config.transforms ?? []; - this.transformedSchema = applySchemaTransforms(this.schema, this.transforms); + this.transformedSchema = applySchemaTransforms(this.schema, config); this.merge = config.merge; } diff --git a/packages/delegate/src/Transformer.ts b/packages/delegate/src/Transformer.ts index 6acee7a480f..59bf49a83ec 100644 --- a/packages/delegate/src/Transformer.ts +++ b/packages/delegate/src/Transformer.ts @@ -1,6 +1,6 @@ -import { Transform, Request, ExecutionResult } from '@graphql-tools/utils'; +import { Request, ExecutionResult } from '@graphql-tools/utils'; -import { DelegationContext, DelegationBinding } from './types'; +import { DelegationContext, DelegationBinding, Transform } from './types'; import { defaultDelegationBinding } from './delegationBindings'; diff --git a/packages/delegate/src/applySchemaTransforms.ts b/packages/delegate/src/applySchemaTransforms.ts new file mode 100644 index 00000000000..4f6dbd84713 --- /dev/null +++ b/packages/delegate/src/applySchemaTransforms.ts @@ -0,0 +1,25 @@ +import { GraphQLSchema } from 'graphql'; + +import { cloneSchema } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from './types'; + +export function applySchemaTransforms( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema +): GraphQLSchema { + const schemaTransforms = subschemaConfig.transforms; + + if (schemaTransforms == null) { + return originalWrappingSchema; + } + + return schemaTransforms.reduce( + (schema: GraphQLSchema, transform: Transform) => + transform.transformSchema != null + ? transform.transformSchema(cloneSchema(schema), subschemaConfig, transformedSchema) + : schema, + originalWrappingSchema + ); +} diff --git a/packages/delegate/src/createMergedResolver.ts b/packages/delegate/src/createMergedResolver.ts deleted file mode 100644 index 535c327e3dd..00000000000 --- a/packages/delegate/src/createMergedResolver.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { GraphQLError } from 'graphql'; - -import { IFieldResolver, getErrors, setErrors, relocatedError, ERROR_SYMBOL } from '@graphql-tools/utils'; - -import { OBJECT_SUBSCHEMA_SYMBOL } from './symbols'; - -import { getSubschema, setObjectSubschema } from './Subschema'; - -import { defaultMergedResolver } from './defaultMergedResolver'; - -import { handleNull } from './results/handleNull'; - -function unwrapResult(parent: any, path: Array): any { - let newParent: any = parent; - const pathLength = path.length; - for (let i = 0; i < pathLength; i++) { - const responseKey = path[i]; - const errors = getErrors(newParent, responseKey); - const subschema = getSubschema(newParent, responseKey); - - const object = newParent[responseKey]; - if (object == null) { - return handleNull(errors); - } - - setErrors( - object, - errors.map(error => relocatedError(error, error.path != null ? error.path.slice(1) : undefined)) - ); - setObjectSubschema(object, subschema); - - newParent = object; - } - - return newParent; -} - -function dehoistResult(parent: any, delimeter = '__gqltf__'): any { - const result = Object.create(null); - - Object.keys(parent).forEach(alias => { - let obj = result; - - const fieldNames = alias.split(delimeter); - const fieldName = fieldNames.pop(); - fieldNames.forEach(key => { - obj = obj[key] = obj[key] || Object.create(null); - }); - obj[fieldName] = parent[alias]; - }); - - result[ERROR_SYMBOL] = parent[ERROR_SYMBOL].map((error: GraphQLError) => { - if (error.path != null) { - const path = error.path.slice(); - const pathSegment = path.shift(); - const expandedPathSegment: Array = (pathSegment as string).split(delimeter); - return relocatedError(error, expandedPathSegment.concat(path)); - } - - return error; - }); - - result[OBJECT_SUBSCHEMA_SYMBOL] = parent[OBJECT_SUBSCHEMA_SYMBOL]; - - return result; -} - -export function createMergedResolver({ - fromPath, - dehoist, - delimeter = '__gqltf__', -}: { - fromPath?: Array; - dehoist?: boolean; - delimeter?: string; -}): IFieldResolver { - const parentErrorResolver: IFieldResolver = (parent, args, context, info) => - parent instanceof Error ? parent : defaultMergedResolver(parent, args, context, info); - - const unwrappingResolver: IFieldResolver = - fromPath != null - ? (parent, args, context, info) => parentErrorResolver(unwrapResult(parent, fromPath), args, context, info) - : parentErrorResolver; - - const dehoistingResolver: IFieldResolver = dehoist - ? (parent, args, context, info) => unwrappingResolver(dehoistResult(parent, delimeter), args, context, info) - : unwrappingResolver; - - const noParentResolver: IFieldResolver = (parent, args, context, info) => - parent ? dehoistingResolver(parent, args, context, info) : {}; - - return noParentResolver; -} diff --git a/packages/delegate/src/defaultMergedResolver.ts b/packages/delegate/src/defaultMergedResolver.ts index a023b1d3090..3e88c1e5ab0 100644 --- a/packages/delegate/src/defaultMergedResolver.ts +++ b/packages/delegate/src/defaultMergedResolver.ts @@ -1,9 +1,10 @@ import { defaultFieldResolver, GraphQLResolveInfo } from 'graphql'; -import { getResponseKeyFromInfo, getErrors } from '@graphql-tools/utils'; +import { getResponseKeyFromInfo } from '@graphql-tools/utils'; -import { handleResult } from './results/handleResult'; -import { getSubschema } from './Subschema'; +import { resolveExternalValue } from './resolveExternalValue'; +import { getSubschema, getUnpathedErrors, isExternalObject } from './externalObjects'; +import { ExternalObject } from './types'; /** * Resolver that knows how to: @@ -12,7 +13,7 @@ import { getSubschema } from './Subschema'; * c) handle external to internal enum coversion */ export function defaultMergedResolver( - parent: Record, + parent: ExternalObject, args: Record, context: Record, info: GraphQLResolveInfo @@ -22,16 +23,16 @@ export function defaultMergedResolver( } const responseKey = getResponseKeyFromInfo(info); - const errors = getErrors(parent, responseKey); // check to see if parent is not a proxied result, i.e. if parent resolver was manually overwritten // See https://github.com/apollographql/graphql-tools/issues/967 - if (!errors) { + if (!isExternalObject(parent)) { return defaultFieldResolver(parent, args, context, info); } - const result = parent[responseKey]; + const data = parent[responseKey]; + const unpathedErrors = getUnpathedErrors(parent); const subschema = getSubschema(parent, responseKey); - return handleResult(result, errors, subschema, context, info); + return resolveExternalValue(data, unpathedErrors, subschema, context, info); } diff --git a/packages/delegate/src/delegateToSchema.ts b/packages/delegate/src/delegateToSchema.ts index bee85d2d4ce..91a32a65871 100644 --- a/packages/delegate/src/delegateToSchema.ts +++ b/packages/delegate/src/delegateToSchema.ts @@ -3,7 +3,6 @@ import { execute, validate, GraphQLSchema, - isSchema, FieldDefinitionNode, getOperationAST, OperationTypeNode, @@ -11,11 +10,16 @@ import { DocumentNode, GraphQLOutputType, GraphQLObjectType, + GraphQLResolveInfo, } from 'graphql'; import isPromise from 'is-promise'; -import { mapAsyncIterator, Transform, ExecutionResult } from '@graphql-tools/utils'; +import AggregateError from '@ardatan/aggregate-error'; + +import { getBatchingExecutor } from '@graphql-tools/batch-execute'; + +import { mapAsyncIterator, ExecutionResult } from '@graphql-tools/utils'; import { IDelegateToSchemaOptions, @@ -23,23 +27,17 @@ import { SubschemaConfig, ExecutionParams, StitchingInfo, - Endpoint, + Transform, + Executor, } from './types'; -import { isSubschemaConfig } from './Subschema'; +import { isSubschemaConfig } from './subschemaConfig'; +import { Subschema } from './Subschema'; import { createRequestFromInfo, getDelegatingOperation } from './createRequest'; import { Transformer } from './Transformer'; +import { memoize2 } from './memoize'; -import AggregateError from '@ardatan/aggregate-error'; -import { getBatchingExecutor } from './getBatchingExecutor'; - -export function delegateToSchema(options: IDelegateToSchemaOptions | GraphQLSchema): any { - if (isSchema(options)) { - throw new Error( - 'Passing positional arguments to delegateToSchema is deprecated. ' + 'Please pass named parameters instead.' - ); - } - +export function delegateToSchema(options: IDelegateToSchemaOptions): any { const { info, operationName, @@ -119,34 +117,12 @@ export function delegateRequest({ targetFieldName = fieldName; } - let targetSchema: GraphQLSchema; - let targetRootValue: Record; - let subschemaConfig: SubschemaConfig; - let endpoint: Endpoint; - - let allTransforms: Array; - - if (isSubschemaConfig(subschemaOrSubschemaConfig)) { - const stitchingInfo: StitchingInfo = info?.schema.extensions?.stitchingInfo; - if (stitchingInfo) { - const processedSubschema = stitchingInfo.transformedSubschemaConfigs.get(subschemaOrSubschemaConfig); - subschemaConfig = processedSubschema != null ? processedSubschema : subschemaOrSubschemaConfig; - } else { - subschemaConfig = subschemaOrSubschemaConfig; - } - targetSchema = subschemaConfig.schema; - allTransforms = subschemaConfig.transforms != null ? subschemaConfig.transforms.concat(transforms) : transforms; - if (subschemaConfig.endpoint != null) { - endpoint = subschemaConfig.endpoint; - } else { - endpoint = subschemaConfig; - } - targetRootValue = rootValue ?? endpoint?.rootValue ?? info?.rootValue; - } else { - targetSchema = subschemaOrSubschemaConfig; - targetRootValue = rootValue ?? info?.rootValue; - allTransforms = transforms; - } + const { targetSchema, targetRootValue, subschemaConfig, allTransforms } = collectTargetParameters( + subschemaOrSubschemaConfig, + rootValue, + info, + transforms + ); const delegationContext = { subschema: subschemaOrSubschemaConfig, @@ -159,7 +135,7 @@ export function delegateRequest({ returnType: returnType ?? info?.returnType ?? getDelegationReturnType(targetSchema, targetOperation, targetFieldName), transforms: allTransforms, - transformedSchema: transformedSchema ?? targetSchema, + transformedSchema: transformedSchema ?? (subschemaConfig as Subschema)?.transformedSchema ?? targetSchema, skipTypeMerging, }; @@ -172,11 +148,17 @@ export function delegateRequest({ } if (targetOperation === 'query' || targetOperation === 'mutation') { - let executor = - endpoint?.executor || createDefaultExecutor(targetSchema, subschemaConfig?.rootValue || targetRootValue); + let executor: Executor = + subschemaConfig?.executor || createDefaultExecutor(targetSchema, subschemaConfig?.rootValue || targetRootValue); - if (endpoint?.batch) { - executor = getBatchingExecutor(context, endpoint, executor); + if (subschemaConfig?.batch) { + const batchingOptions = subschemaConfig?.batchingOptions; + executor = getBatchingExecutor( + context, + executor, + batchingOptions?.dataLoaderOptions, + batchingOptions?.extensionsReducer + ); } const executionResult = executor({ @@ -186,13 +168,15 @@ export function delegateRequest({ }); if (isPromise(executionResult)) { - return executionResult.then(originalResult => transformer.transformResult(originalResult)); + return executionResult.then(originalResult => { + return transformer.transformResult(originalResult); + }); } return transformer.transformResult(executionResult); } const subscriber = - endpoint?.subscriber || createDefaultSubscriber(targetSchema, subschemaConfig?.rootValue || targetRootValue); + subschemaConfig?.subscriber || createDefaultSubscriber(targetSchema, subschemaConfig?.rootValue || targetRootValue); return subscriber({ ...processedRequest, @@ -213,6 +197,42 @@ export function delegateRequest({ }); } +const emptyObject = {}; + +function collectTargetParameters( + subschema: GraphQLSchema | SubschemaConfig, + rootValue: Record, + info: GraphQLResolveInfo, + transforms: Array = [] +): { + targetSchema: GraphQLSchema; + targetRootValue: Record; + subschemaConfig?: SubschemaConfig; + allTransforms: Array; +} { + const stitchingInfo: StitchingInfo = info?.schema.extensions?.stitchingInfo; + + const subschemaOrSubschemaConfig = stitchingInfo?.subschemaMap.get(subschema) ?? subschema; + + if (isSubschemaConfig(subschemaOrSubschemaConfig)) { + return { + targetSchema: subschemaOrSubschemaConfig.schema, + targetRootValue: rootValue ?? subschemaOrSubschemaConfig?.rootValue ?? info?.rootValue ?? emptyObject, + subschemaConfig: subschemaOrSubschemaConfig, + allTransforms: + subschemaOrSubschemaConfig.transforms != null + ? subschemaOrSubschemaConfig.transforms.concat(transforms) + : transforms, + }; + } + + return { + targetSchema: subschemaOrSubschemaConfig, + targetRootValue: rootValue ?? info?.rootValue ?? emptyObject, + allTransforms: transforms, + }; +} + function validateRequest(targetSchema: GraphQLSchema, document: DocumentNode) { const errors = validate(targetSchema, document); if (errors.length > 0) { @@ -225,16 +245,16 @@ function validateRequest(targetSchema: GraphQLSchema, document: DocumentNode) { } } -function createDefaultExecutor(schema: GraphQLSchema, rootValue: Record) { - return ({ document, context, variables, info }: ExecutionParams) => +const createDefaultExecutor = memoize2(function (schema: GraphQLSchema, rootValue: Record): Executor { + return (({ document, context, variables, info }: ExecutionParams) => execute({ schema, document, contextValue: context, variableValues: variables, rootValue: rootValue ?? info?.rootValue, - }); -} + })) as Executor; +}); function createDefaultSubscriber(schema: GraphQLSchema, rootValue: Record) { return ({ document, context, variables, info }: ExecutionParams) => diff --git a/packages/delegate/src/delegationBindings.ts b/packages/delegate/src/delegationBindings.ts index 450db941775..0f49f817b8a 100644 --- a/packages/delegate/src/delegationBindings.ts +++ b/packages/delegate/src/delegationBindings.ts @@ -1,76 +1,42 @@ -import { Transform } from '@graphql-tools/utils'; - -import { StitchingInfo, DelegationContext } from './types'; +import { Transform, StitchingInfo, DelegationContext } from './types'; import AddSelectionSets from './transforms/AddSelectionSets'; import ExpandAbstractTypes from './transforms/ExpandAbstractTypes'; import WrapConcreteTypes from './transforms/WrapConcreteTypes'; import FilterToSchema from './transforms/FilterToSchema'; -import AddFragmentsByField from './transforms/AddFragmentsByField'; import AddTypenameToAbstract from './transforms/AddTypenameToAbstract'; import CheckResultAndHandleErrors from './transforms/CheckResultAndHandleErrors'; import AddArgumentsAsVariables from './transforms/AddArgumentsAsVariables'; export function defaultDelegationBinding(delegationContext: DelegationContext): Array { - const { - subschema: schemaOrSubschemaConfig, - targetSchema, - fieldName, - args, - context, - info, - returnType, - transforms = [], - skipTypeMerging, - } = delegationContext; - const stitchingInfo: StitchingInfo = info?.schema.extensions?.stitchingInfo; - - let transformedSchema = stitchingInfo?.transformedSchemas.get(schemaOrSubschemaConfig); - if (transformedSchema != null) { - delegationContext.transformedSchema = transformedSchema; - } else { - transformedSchema = delegationContext.transformedSchema; - } + let delegationTransforms: Array = [new CheckResultAndHandleErrors()]; - let delegationTransforms: Array = [ - new CheckResultAndHandleErrors(info, fieldName, schemaOrSubschemaConfig, context, returnType, skipTypeMerging), - ]; + const info = delegationContext.info; + const stitchingInfo: StitchingInfo = info?.schema.extensions?.stitchingInfo; if (stitchingInfo != null) { delegationTransforms = delegationTransforms.concat([ - new AddSelectionSets( - info.schema, - returnType, - {}, - stitchingInfo.selectionSetsByField, - stitchingInfo.dynamicSelectionSetsByField - ), - new WrapConcreteTypes(returnType, transformedSchema), - new ExpandAbstractTypes(info.schema, transformedSchema), + new AddSelectionSets({}, stitchingInfo.selectionSetsByField, stitchingInfo.dynamicSelectionSetsByField), + new WrapConcreteTypes(), + new ExpandAbstractTypes(), ]); } else if (info != null) { - delegationTransforms = delegationTransforms.concat([ - new WrapConcreteTypes(returnType, transformedSchema), - new ExpandAbstractTypes(info.schema, transformedSchema), - ]); + delegationTransforms = delegationTransforms.concat([new WrapConcreteTypes(), new ExpandAbstractTypes()]); } else { - delegationTransforms.push(new WrapConcreteTypes(returnType, transformedSchema)); + delegationTransforms.push(new WrapConcreteTypes()); } - delegationTransforms = delegationTransforms.concat(transforms.slice().reverse()); - - if (stitchingInfo != null) { - delegationTransforms.push(new AddFragmentsByField(targetSchema, stitchingInfo.fragmentsByField)); + const transforms = delegationContext.transforms; + if (transforms != null) { + delegationTransforms = delegationTransforms.concat(transforms.slice().reverse()); } + const args = delegationContext.args; if (args != null) { - delegationTransforms.push(new AddArgumentsAsVariables(targetSchema, args)); + delegationTransforms.push(new AddArgumentsAsVariables(args)); } - delegationTransforms = delegationTransforms.concat([ - new FilterToSchema(targetSchema), - new AddTypenameToAbstract(targetSchema), - ]); + delegationTransforms = delegationTransforms.concat([new FilterToSchema(), new AddTypenameToAbstract()]); return delegationTransforms; } diff --git a/packages/delegate/src/externalObjects.ts b/packages/delegate/src/externalObjects.ts new file mode 100644 index 00000000000..56fa8a98c4e --- /dev/null +++ b/packages/delegate/src/externalObjects.ts @@ -0,0 +1,86 @@ +import { GraphQLSchema, GraphQLError, GraphQLObjectType, SelectionSetNode } from 'graphql'; + +import { mergeDeep, relocatedError, GraphQLExecutionContext, collectFields } from '@graphql-tools/utils'; + +import { SubschemaConfig, ExternalObject } from './types'; +import { OBJECT_SUBSCHEMA_SYMBOL, FIELD_SUBSCHEMA_MAP_SYMBOL, UNPATHED_ERRORS_SYMBOL } from './symbols'; + +export function isExternalObject(data: any): data is ExternalObject { + return data[UNPATHED_ERRORS_SYMBOL] !== undefined; +} + +export function annotateExternalObject( + object: any, + errors: Array, + subschema: GraphQLSchema | SubschemaConfig +): ExternalObject { + Object.defineProperties(object, { + [OBJECT_SUBSCHEMA_SYMBOL]: { value: subschema }, + [FIELD_SUBSCHEMA_MAP_SYMBOL]: { value: Object.create(null) }, + [UNPATHED_ERRORS_SYMBOL]: { value: errors }, + }); + return object; +} + +export function getSubschema(object: ExternalObject, responseKey: string): GraphQLSchema | SubschemaConfig { + return object[FIELD_SUBSCHEMA_MAP_SYMBOL][responseKey] ?? object[OBJECT_SUBSCHEMA_SYMBOL]; +} + +export function getUnpathedErrors(object: ExternalObject): Array { + return object[UNPATHED_ERRORS_SYMBOL]; +} + +export function mergeExternalObjects( + schema: GraphQLSchema, + path: Array, + typeName: string, + target: ExternalObject, + sources: Array, + selectionSets: Array +): ExternalObject { + const results: Array = []; + let errors: Array = []; + + sources.forEach((source, index) => { + if (source instanceof GraphQLError || source === null) { + const selectionSet = selectionSets[index]; + const fieldNodes = collectFields( + { + schema, + variableValues: {}, + fragments: {}, + } as GraphQLExecutionContext, + schema.getType(typeName) as GraphQLObjectType, + selectionSet, + Object.create(null), + Object.create(null) + ); + const nullResult = {}; + Object.keys(fieldNodes).forEach(responseKey => { + nullResult[responseKey] = + source instanceof GraphQLError ? relocatedError(source, path.concat([responseKey])) : null; + }); + results.push(nullResult); + } else { + errors = errors.concat(source[UNPATHED_ERRORS_SYMBOL]); + results.push(source); + } + }); + + const fieldSubschemaMap = results.reduce((acc: Record, source: any) => { + const subschema = source[OBJECT_SUBSCHEMA_SYMBOL]; + Object.keys(source).forEach(key => { + acc[key] = subschema; + }); + return acc; + }, {}); + + const result = results.reduce(mergeDeep, target); + result[FIELD_SUBSCHEMA_MAP_SYMBOL] = target[FIELD_SUBSCHEMA_MAP_SYMBOL] + ? Object.assign({}, target[FIELD_SUBSCHEMA_MAP_SYMBOL], fieldSubschemaMap) + : fieldSubschemaMap; + + result[UNPATHED_ERRORS_SYMBOL] = target[UNPATHED_ERRORS_SYMBOL].concat(errors); + + return result; +} diff --git a/packages/delegate/src/results/getFieldsNotInSubschema.ts b/packages/delegate/src/getFieldsNotInSubschema.ts similarity index 95% rename from packages/delegate/src/results/getFieldsNotInSubschema.ts rename to packages/delegate/src/getFieldsNotInSubschema.ts index a1ebb983bd3..c3a2249304a 100644 --- a/packages/delegate/src/results/getFieldsNotInSubschema.ts +++ b/packages/delegate/src/getFieldsNotInSubschema.ts @@ -1,10 +1,10 @@ import { GraphQLSchema, FieldNode, GraphQLObjectType, GraphQLResolveInfo } from 'graphql'; import { collectFields, GraphQLExecutionContext } from '@graphql-tools/utils'; -import { isSubschemaConfig } from '../Subschema'; -import { MergedTypeInfo, SubschemaConfig, StitchingInfo } from '../types'; -import { memoizeInfoAnd2Objects } from '../memoize'; +import { isSubschemaConfig } from './subschemaConfig'; +import { MergedTypeInfo, SubschemaConfig, StitchingInfo } from './types'; +import { memoizeInfoAnd2Objects } from './memoize'; function collectSubFields(info: GraphQLResolveInfo, typeName: string): Record> { let subFieldNodes: Record> = Object.create(null); diff --git a/packages/delegate/src/index.ts b/packages/delegate/src/index.ts index 3770374cb10..cf3f755b8e8 100644 --- a/packages/delegate/src/index.ts +++ b/packages/delegate/src/index.ts @@ -1,10 +1,11 @@ -export { delegateToSchema, delegateRequest } from './delegateToSchema'; -export { createRequestFromInfo, createRequest } from './createRequest'; -export { defaultMergedResolver } from './defaultMergedResolver'; -export { createMergedResolver } from './createMergedResolver'; -export { handleResult } from './results/handleResult'; -export { Subschema, isSubschema, isSubschemaConfig, cloneSubschemaConfig, getSubschema } from './Subschema'; - +export * from './Subschema'; +export * from './applySchemaTransforms'; +export * from './createRequest'; +export * from './defaultMergedResolver'; +export * from './delegateToSchema'; export * from './delegationBindings'; +export * from './externalObjects'; +export * from './resolveExternalValue'; +export * from './subschemaConfig'; export * from './transforms'; export * from './types'; diff --git a/packages/delegate/src/memoize.ts b/packages/delegate/src/memoize.ts index e32108a812c..05e6d3804a1 100644 --- a/packages/delegate/src/memoize.ts +++ b/packages/delegate/src/memoize.ts @@ -211,43 +211,3 @@ export function memoize2, T2 extends Record, - T2 extends Record, - T3 extends any, - R extends any ->(fn: (A1: T1, A2: T2, A3: T3) => R): (A1: T1, A2: T2, A3: T3) => R { - let cache1: WeakMap>; - - function memoized(a1: T1, a2: T2, a3: T3) { - if (!cache1) { - cache1 = new WeakMap(); - const cache2: WeakMap = new WeakMap(); - cache1.set(a1, cache2); - const newValue = fn(a1, a2, a3); - cache2.set(a2, newValue); - return newValue; - } - - let cache2 = cache1.get(a1); - if (!cache2) { - cache2 = new WeakMap(); - cache1.set(a1, cache2); - const newValue = fn(a1, a2, a3); - cache2.set(a2, newValue); - return newValue; - } - - const cachedValue = cache2.get(a2); - if (cachedValue === undefined) { - const newValue = fn(a1, a2, a3); - cache2.set(a2, newValue); - return newValue; - } - - return cachedValue; - } - - return memoized; -} diff --git a/packages/delegate/src/results/mergeFields.ts b/packages/delegate/src/mergeFields.ts similarity index 64% rename from packages/delegate/src/results/mergeFields.ts rename to packages/delegate/src/mergeFields.ts index 25610b13b89..be859c3f21e 100644 --- a/packages/delegate/src/results/mergeFields.ts +++ b/packages/delegate/src/mergeFields.ts @@ -1,27 +1,34 @@ -import { FieldNode, SelectionNode, Kind, GraphQLResolveInfo, SelectionSetNode, GraphQLObjectType } from 'graphql'; +import { + FieldNode, + SelectionNode, + Kind, + GraphQLResolveInfo, + SelectionSetNode, + GraphQLObjectType, + responsePathAsArray, + getNamedType, +} from 'graphql'; import isPromise from 'is-promise'; -import { typesContainSelectionSet } from '@graphql-tools/utils'; - -import { MergedTypeInfo, SubschemaConfig } from '../types'; -import { memoize4, memoize3, memoize2 } from '../memoize'; - -import { mergeProxiedResults } from './mergeProxiedResults'; +import { MergedTypeInfo } from './types'; +import { memoize4, memoize3, memoize2 } from './memoize'; +import { mergeExternalObjects } from './externalObjects'; +import { Subschema } from './Subschema'; const sortSubschemasByProxiability = memoize4(function ( mergedTypeInfo: MergedTypeInfo, - sourceSubschemaOrSourceSubschemas: SubschemaConfig | Array, - targetSubschemas: Array, + sourceSubschemaOrSourceSubschemas: Subschema | Array, + targetSubschemas: Array, fieldNodes: Array ): { - proxiableSubschemas: Array; - nonProxiableSubschemas: Array; + proxiableSubschemas: Array; + nonProxiableSubschemas: Array; } { // 1. calculate if possible to delegate to given subschema - const proxiableSubschemas: Array = []; - const nonProxiableSubschemas: Array = []; + const proxiableSubschemas: Array = []; + const nonProxiableSubschemas: Array = []; targetSubschemas.forEach(t => { const selectionSet = mergedTypeInfo.selectionSets.get(t); @@ -59,9 +66,9 @@ const sortSubschemasByProxiability = memoize4(function ( const buildDelegationPlan = memoize3(function ( mergedTypeInfo: MergedTypeInfo, fieldNodes: Array, - proxiableSubschemas: Array + proxiableSubschemas: Array ): { - delegationMap: Map; + delegationMap: Map; unproxiableFieldNodes: Array; } { const { uniqueFields, nonUniqueFields } = mergedTypeInfo; @@ -69,7 +76,7 @@ const buildDelegationPlan = memoize3(function ( // 2. for each selection: - const delegationMap: Map> = new Map(); + const delegationMap: Map> = new Map(); fieldNodes.forEach(fieldNode => { if (fieldNode.name.value === '__typename') { return; @@ -77,7 +84,7 @@ const buildDelegationPlan = memoize3(function ( // 2a. use uniqueFields map to assign fields to subschema if one of possible subschemas - const uniqueSubschema: SubschemaConfig = uniqueFields[fieldNode.name.value]; + const uniqueSubschema: Subschema = uniqueFields[fieldNode.name.value]; if (uniqueSubschema != null) { if (!proxiableSubschemas.includes(uniqueSubschema)) { unproxiableFieldNodes.push(fieldNode); @@ -97,7 +104,7 @@ const buildDelegationPlan = memoize3(function ( // 2b. use nonUniqueFields to assign to a possible subschema, // preferring one of the subschemas already targets of delegation - let nonUniqueSubschemas: Array = nonUniqueFields[fieldNode.name.value]; + let nonUniqueSubschemas: Array = nonUniqueFields[fieldNode.name.value]; if (nonUniqueSubschemas == null) { unproxiableFieldNodes.push(fieldNode); return; @@ -109,7 +116,7 @@ const buildDelegationPlan = memoize3(function ( return; } - const subschemas: Array = Array.from(delegationMap.keys()); + const subschemas: Array = Array.from(delegationMap.keys()); const existingSubschema = nonUniqueSubschemas.find(s => subschemas.includes(s)); if (existingSubschema != null) { delegationMap.get(existingSubschema).push(fieldNode); @@ -118,7 +125,7 @@ const buildDelegationPlan = memoize3(function ( } }); - const finalDelegationMap: Map = new Map(); + const finalDelegationMap: Map = new Map(); delegationMap.forEach((selections, subschema) => { finalDelegationMap.set(subschema, { @@ -134,9 +141,9 @@ const buildDelegationPlan = memoize3(function ( }); const combineSubschemas = memoize2(function ( - subschemaOrSubschemas: SubschemaConfig | Array, - additionalSubschemas: Array -): Array { + subschemaOrSubschemas: Subschema | Array, + additionalSubschemas: Array +): Array { return Array.isArray(subschemaOrSubschemas) ? subschemaOrSubschemas.concat(additionalSubschemas) : [subschemaOrSubschemas].concat(additionalSubschemas); @@ -147,8 +154,8 @@ export function mergeFields( typeName: string, object: any, fieldNodes: Array, - sourceSubschemaOrSourceSubschemas: SubschemaConfig | Array, - targetSubschemas: Array, + sourceSubschemaOrSourceSubschemas: Subschema | Array, + targetSubschemas: Array, context: Record, info: GraphQLResolveInfo ): any { @@ -170,21 +177,28 @@ export function mergeFields( } let containsPromises = false; - const maybePromises: Promise | any = []; - delegationMap.forEach((selectionSet: SelectionSetNode, s: SubschemaConfig) => { + const resultMap: Map | any, SelectionSetNode> = new Map(); + delegationMap.forEach((selectionSet: SelectionSetNode, s: Subschema) => { const maybePromise = s.merge[typeName].resolve(object, context, info, s, selectionSet); - maybePromises.push(maybePromise); - if (!containsPromises && isPromise(maybePromise)) { + resultMap.set(maybePromise, selectionSet); + if (isPromise(maybePromise)) { containsPromises = true; } }); return containsPromises - ? Promise.all(maybePromises).then(results => + ? Promise.all(resultMap.keys()).then(results => mergeFields( mergedTypeInfo, typeName, - mergeProxiedResults(object, ...results), + mergeExternalObjects( + info.schema, + responsePathAsArray(info.path), + object.__typename, + object, + results, + Array.from(resultMap.values()) + ), unproxiableFieldNodes, combineSubschemas(sourceSubschemaOrSourceSubschemas, proxiableSubschemas), nonProxiableSubschemas, @@ -195,7 +209,14 @@ export function mergeFields( : mergeFields( mergedTypeInfo, typeName, - mergeProxiedResults(object, ...maybePromises), + mergeExternalObjects( + info.schema, + responsePathAsArray(info.path), + object.__typename, + object, + Array.from(resultMap.keys()), + Array.from(resultMap.values()) + ), unproxiableFieldNodes, combineSubschemas(sourceSubschemaOrSourceSubschemas, proxiableSubschemas), nonProxiableSubschemas, @@ -206,7 +227,7 @@ export function mergeFields( const subschemaTypesContainSelectionSet = memoize3(function ( mergedTypeInfo: MergedTypeInfo, - sourceSubschemaOrSourceSubschemas: SubschemaConfig | Array, + sourceSubschemaOrSourceSubschemas: Subschema | Array, selectionSet: SelectionSetNode ) { if (Array.isArray(sourceSubschemaOrSourceSubschemas)) { @@ -223,3 +244,27 @@ const subschemaTypesContainSelectionSet = memoize3(function ( selectionSet ); }); + +function typesContainSelectionSet(types: Array, selectionSet: SelectionSetNode): boolean { + const fieldMaps = types.map(type => type.getFields()); + + for (const selection of selectionSet.selections) { + if (selection.kind === Kind.FIELD) { + const fields = fieldMaps.map(fieldMap => fieldMap[selection.name.value]).filter(field => field != null); + if (!fields.length) { + return false; + } + + if (selection.selectionSet != null) { + return typesContainSelectionSet( + fields.map(field => getNamedType(field.type)) as Array, + selection.selectionSet + ); + } + } else if (selection.kind === Kind.INLINE_FRAGMENT && selection.typeCondition.name.value === types[0].name) { + return typesContainSelectionSet(types, selection.selectionSet); + } + } + + return true; +} diff --git a/packages/delegate/src/resolveExternalValue.ts b/packages/delegate/src/resolveExternalValue.ts new file mode 100644 index 00000000000..ab91cb155ff --- /dev/null +++ b/packages/delegate/src/resolveExternalValue.ts @@ -0,0 +1,180 @@ +import { + GraphQLResolveInfo, + getNullableType, + isCompositeType, + isLeafType, + isListType, + GraphQLError, + GraphQLSchema, + GraphQLCompositeType, + isAbstractType, + GraphQLList, + GraphQLType, + locatedError, +} from 'graphql'; + +import { StitchingInfo, SubschemaConfig } from './types'; +import { annotateExternalObject } from './externalObjects'; +import { getFieldsNotInSubschema } from './getFieldsNotInSubschema'; +import { mergeFields } from './mergeFields'; +import { Subschema } from './Subschema'; + +export function resolveExternalValue( + result: any, + unpathedErrors: Array, + subschema: GraphQLSchema | SubschemaConfig, + context: Record, + info: GraphQLResolveInfo, + returnType = info.returnType, + skipTypeMerging?: boolean +): any { + const type = getNullableType(returnType); + + if (result instanceof Error) { + return result; + } + + if (result == null) { + return reportUnpathedErrorsViaNull(unpathedErrors); + } + + if (isLeafType(type)) { + return type.parseValue(result); + } else if (isCompositeType(type)) { + return resolveExternalObject(type, result, unpathedErrors, subschema, context, info, skipTypeMerging); + } else if (isListType(type)) { + return resolveExternalList(type, result, unpathedErrors, subschema, context, info, skipTypeMerging); + } +} + +function resolveExternalObject( + type: GraphQLCompositeType, + object: any, + unpathedErrors: Array, + subschema: GraphQLSchema | SubschemaConfig, + context: Record, + info: GraphQLResolveInfo, + skipTypeMerging?: boolean +) { + const stitchingInfo: StitchingInfo = info?.schema.extensions?.stitchingInfo; + + annotateExternalObject(object, unpathedErrors, subschema); + + if (skipTypeMerging || !stitchingInfo) { + return object; + } + + let typeName: string; + + if (isAbstractType(type)) { + const resolvedType = info.schema.getTypeMap()[object.__typename]; + if (resolvedType == null) { + throw new Error( + `Unable to resolve type '${object.__typename}'. Did you forget to include a transform that renames types? Did you delegate to the original subschema rather that the subschema config object containing the transform?` + ); + } + typeName = resolvedType.name; + } else { + typeName = type.name; + } + + const mergedTypeInfo = stitchingInfo.mergedTypes[typeName]; + let targetSubschemas: Array; + + // Within the stitching context, delegation to a stitched GraphQLSchema or SubschemaConfig + // will be redirected to the appropriate Subschema object, from which merge targets can be queried. + if (mergedTypeInfo != null) { + targetSubschemas = mergedTypeInfo.targetSubschemas.get(subschema as Subschema); + } + + // If there are no merge targets from the subschema, return. + if (!targetSubschemas) { + return object; + } + + const fieldNodes = getFieldsNotInSubschema(info, subschema, mergedTypeInfo); + + return mergeFields( + mergedTypeInfo, + typeName, + object, + fieldNodes, + subschema as Subschema, + targetSubschemas, + context, + info + ); +} + +function resolveExternalList( + type: GraphQLList, + list: Array, + unpathedErrors: Array, + subschema: GraphQLSchema | SubschemaConfig, + context: Record, + info: GraphQLResolveInfo, + skipTypeMerging?: boolean +) { + return list.map(listMember => + resolveExternalListMember( + getNullableType(type.ofType), + listMember, + unpathedErrors, + subschema, + context, + info, + skipTypeMerging + ) + ); +} + +function resolveExternalListMember( + type: GraphQLType, + listMember: any, + unpathedErrors: Array, + subschema: GraphQLSchema | SubschemaConfig, + context: Record, + info: GraphQLResolveInfo, + skipTypeMerging?: boolean +): any { + if (listMember instanceof Error) { + return listMember; + } + + if (listMember == null) { + return reportUnpathedErrorsViaNull(unpathedErrors); + } + + if (isLeafType(type)) { + return type.parseValue(listMember); + } else if (isCompositeType(type)) { + return resolveExternalObject(type, listMember, unpathedErrors, subschema, context, info, skipTypeMerging); + } else if (isListType(type)) { + return resolveExternalList(type, listMember, unpathedErrors, subschema, context, info, skipTypeMerging); + } +} + +const reportedErrors: WeakMap = new Map(); + +function reportUnpathedErrorsViaNull(unpathedErrors: Array) { + if (unpathedErrors.length) { + const unreportedErrors: Array = []; + unpathedErrors.forEach(error => { + if (!reportedErrors.has(error)) { + unreportedErrors.push(error); + reportedErrors.set(error, true); + } + }); + + if (unreportedErrors.length) { + if (unreportedErrors.length === 1) { + return unreportedErrors[0]; + } + + const combinedError = new AggregateError(unreportedErrors); + return locatedError(combinedError, undefined, unreportedErrors[0].path); + } + } + + return null; +} diff --git a/packages/delegate/src/results/handleList.ts b/packages/delegate/src/results/handleList.ts deleted file mode 100644 index 3641e90aea8..00000000000 --- a/packages/delegate/src/results/handleList.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - GraphQLList, - GraphQLSchema, - GraphQLError, - GraphQLResolveInfo, - getNullableType, - GraphQLType, - isLeafType, - isCompositeType, - isListType, -} from 'graphql'; - -import { getErrorsByPathSegment } from '@graphql-tools/utils'; - -import { handleNull } from './handleNull'; -import { handleObject } from './handleObject'; -import { SubschemaConfig } from '../types'; - -export function handleList( - type: GraphQLList, - list: Array, - errors: ReadonlyArray, - subschema: GraphQLSchema | SubschemaConfig, - context: Record, - info: GraphQLResolveInfo, - skipTypeMerging?: boolean -) { - const childErrors = getErrorsByPathSegment(errors); - - return list.map((listMember, index) => - handleListMember( - getNullableType(type.ofType), - listMember, - index in childErrors ? childErrors[index] : [], - subschema, - context, - info, - skipTypeMerging - ) - ); -} - -function handleListMember( - type: GraphQLType, - listMember: any, - errors: ReadonlyArray, - subschema: GraphQLSchema | SubschemaConfig, - context: Record, - info: GraphQLResolveInfo, - skipTypeMerging?: boolean -): any { - if (listMember == null) { - return handleNull(errors); - } - - if (isLeafType(type)) { - return type.parseValue(listMember); - } else if (isCompositeType(type)) { - return handleObject(type, listMember, errors, subschema, context, info, skipTypeMerging); - } else if (isListType(type)) { - return handleList(type, listMember, errors, subschema, context, info, skipTypeMerging); - } -} diff --git a/packages/delegate/src/results/handleNull.ts b/packages/delegate/src/results/handleNull.ts deleted file mode 100644 index 9762d3ff9cf..00000000000 --- a/packages/delegate/src/results/handleNull.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { GraphQLError } from 'graphql'; - -import AggregateError from '@ardatan/aggregate-error'; -import { getErrorsByPathSegment, relocatedError } from '@graphql-tools/utils'; - -export function handleNull(errors: ReadonlyArray) { - if (errors.length) { - if (errors.some(error => !error.path || error.path.length < 2)) { - if (errors.length > 1) { - const combinedError = new AggregateError(errors); - return combinedError; - } - const error = errors[0]; - return error.originalError || relocatedError(error, null); - } else if (errors.some(error => typeof error.path[1] === 'string')) { - const childErrors = getErrorsByPathSegment(errors); - - const result = {}; - Object.keys(childErrors).forEach(pathSegment => { - result[pathSegment] = handleNull(childErrors[pathSegment]); - }); - - return result; - } - - const childErrors = getErrorsByPathSegment(errors); - - const result: Array = []; - Object.keys(childErrors).forEach(pathSegment => { - result.push(handleNull(childErrors[pathSegment])); - }); - - return result; - } - - return null; -} diff --git a/packages/delegate/src/results/handleObject.ts b/packages/delegate/src/results/handleObject.ts deleted file mode 100644 index 976845966fb..00000000000 --- a/packages/delegate/src/results/handleObject.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { GraphQLCompositeType, GraphQLError, GraphQLSchema, isAbstractType, GraphQLResolveInfo } from 'graphql'; - -import { setErrors, slicedError } from '@graphql-tools/utils'; - -import { SubschemaConfig } from '../types'; - -import { setObjectSubschema } from '../Subschema'; - -import { mergeFields } from './mergeFields'; -import { getFieldsNotInSubschema } from './getFieldsNotInSubschema'; - -export function handleObject( - type: GraphQLCompositeType, - object: any, - errors: ReadonlyArray, - subschema: GraphQLSchema | SubschemaConfig, - context: Record, - info: GraphQLResolveInfo, - skipTypeMerging?: boolean -) { - const stitchingInfo = info?.schema.extensions?.stitchingInfo; - - setErrors( - object, - errors.map(error => slicedError(error)) - ); - - setObjectSubschema(object, subschema); - - if (skipTypeMerging || !stitchingInfo) { - return object; - } - - let typeName: string; - - if (isAbstractType(type)) { - const resolvedType = info.schema.getTypeMap()[object.__typename]; - if (resolvedType == null) { - throw new Error( - `Unable to resolve type '${object.__typename}'. Did you forget to include a transform that renames types? Did you delegate to the original subschema rather that the subschema config object containing the transform?` - ); - } - typeName = resolvedType.name; - } else { - typeName = type.name; - } - - const mergedTypeInfo = stitchingInfo.mergedTypes[typeName]; - let targetSubschemas: Array; - - if (mergedTypeInfo != null) { - targetSubschemas = mergedTypeInfo.targetSubschemas.get(subschema); - } - - if (!targetSubschemas) { - return object; - } - - const fieldNodes = getFieldsNotInSubschema(info, subschema, mergedTypeInfo); - - return mergeFields( - mergedTypeInfo, - typeName, - object, - fieldNodes, - subschema as SubschemaConfig, - targetSubschemas, - context, - info - ); -} diff --git a/packages/delegate/src/results/handleResult.ts b/packages/delegate/src/results/handleResult.ts deleted file mode 100644 index 76cc53e5172..00000000000 --- a/packages/delegate/src/results/handleResult.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - GraphQLResolveInfo, - getNullableType, - isCompositeType, - isLeafType, - isListType, - GraphQLError, - GraphQLSchema, -} from 'graphql'; - -import { SubschemaConfig } from '../types'; - -import { handleNull } from './handleNull'; -import { handleObject } from './handleObject'; -import { handleList } from './handleList'; - -export function handleResult( - result: any, - errors: ReadonlyArray, - subschema: GraphQLSchema | SubschemaConfig, - context: Record, - info: GraphQLResolveInfo, - returnType = info.returnType, - skipTypeMerging?: boolean -): any { - const type = getNullableType(returnType); - - if (result == null) { - return handleNull(errors); - } - - if (isLeafType(type)) { - return type.parseValue(result); - } else if (isCompositeType(type)) { - return handleObject(type, result, errors, subschema, context, info, skipTypeMerging); - } else if (isListType(type)) { - return handleList(type, result, errors, subschema, context, info, skipTypeMerging); - } -} diff --git a/packages/delegate/src/results/mergeProxiedResults.ts b/packages/delegate/src/results/mergeProxiedResults.ts deleted file mode 100644 index 8dbb57de296..00000000000 --- a/packages/delegate/src/results/mergeProxiedResults.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { mergeDeep, ERROR_SYMBOL } from '@graphql-tools/utils'; - -import { SubschemaConfig } from '../types'; -import { OBJECT_SUBSCHEMA_SYMBOL, FIELD_SUBSCHEMA_MAP_SYMBOL } from '../symbols'; - -export function mergeProxiedResults(target: any, ...sources: Array): any { - const results: Array = []; - const errors: Array = []; - - sources.forEach(source => { - if (source instanceof Error) { - errors.push(source); - } else { - results.push(source); - errors.push(source[ERROR_SYMBOL]); - } - }); - - const fieldSubschemaMap = results.reduce((acc: Record, source: any) => { - const subschema = source[OBJECT_SUBSCHEMA_SYMBOL]; - Object.keys(source).forEach(key => { - acc[key] = subschema; - }); - return acc; - }, {}); - - const result = results.reduce(mergeDeep, target); - result[FIELD_SUBSCHEMA_MAP_SYMBOL] = target[FIELD_SUBSCHEMA_MAP_SYMBOL] - ? Object.assign({}, target[FIELD_SUBSCHEMA_MAP_SYMBOL], fieldSubschemaMap) - : fieldSubschemaMap; - - result[ERROR_SYMBOL] = target[ERROR_SYMBOL].concat(...errors); - - return result; -} diff --git a/packages/delegate/src/subschemaConfig.ts b/packages/delegate/src/subschemaConfig.ts new file mode 100644 index 00000000000..85229e99763 --- /dev/null +++ b/packages/delegate/src/subschemaConfig.ts @@ -0,0 +1,35 @@ +import { SubschemaConfig } from './types'; + +export function isSubschemaConfig(value: any): value is SubschemaConfig { + return Boolean(value?.schema); +} + +export function cloneSubschemaConfig(subschemaConfig: SubschemaConfig): SubschemaConfig { + const newSubschemaConfig = { + ...subschemaConfig, + transforms: subschemaConfig.transforms != null ? [...subschemaConfig.transforms] : undefined, + }; + + if (newSubschemaConfig.merge != null) { + newSubschemaConfig.merge = { ...subschemaConfig.merge }; + Object.keys(newSubschemaConfig.merge).forEach(typeName => { + newSubschemaConfig.merge[typeName] = { ...subschemaConfig.merge[typeName] }; + + const fields = newSubschemaConfig.merge[typeName].fields; + if (fields != null) { + Object.keys(fields).forEach(fieldName => { + fields[fieldName] = { ...fields[fieldName] }; + }); + } + + const computedFields = newSubschemaConfig.merge[typeName].computedFields; + if (computedFields != null) { + Object.keys(computedFields).forEach(fieldName => { + computedFields[fieldName] = { ...computedFields[fieldName] }; + }); + } + }); + } + + return newSubschemaConfig; +} diff --git a/packages/delegate/src/symbols.ts b/packages/delegate/src/symbols.ts index 8fb59b4f22f..dad8b7b958a 100644 --- a/packages/delegate/src/symbols.ts +++ b/packages/delegate/src/symbols.ts @@ -1,2 +1,3 @@ +export const UNPATHED_ERRORS_SYMBOL = Symbol('subschemaErrors'); export const OBJECT_SUBSCHEMA_SYMBOL = Symbol('initialSubschema'); export const FIELD_SUBSCHEMA_MAP_SYMBOL = Symbol('subschemaMap'); diff --git a/packages/delegate/src/transforms/AddArgumentsAsVariables.ts b/packages/delegate/src/transforms/AddArgumentsAsVariables.ts index 1849ae520b1..d70904f443d 100644 --- a/packages/delegate/src/transforms/AddArgumentsAsVariables.ts +++ b/packages/delegate/src/transforms/AddArgumentsAsVariables.ts @@ -12,14 +12,14 @@ import { VariableDefinitionNode, } from 'graphql'; -import { Transform, Request, serializeInputValue, updateArgument } from '@graphql-tools/utils'; +import { Request, serializeInputValue, updateArgument } from '@graphql-tools/utils'; + +import { Transform, DelegationContext } from '../types'; export default class AddArgumentsAsVariables implements Transform { - private readonly targetSchema: GraphQLSchema; private readonly args: Record; - constructor(targetSchema: GraphQLSchema, args: Record) { - this.targetSchema = targetSchema; + constructor(args: Record) { this.args = Object.entries(args).reduce( (prev, [key, val]) => ({ ...prev, @@ -29,8 +29,12 @@ export default class AddArgumentsAsVariables implements Transform { ); } - public transformRequest(originalRequest: Request): Request { - const { document, variables } = addVariablesToRootField(this.targetSchema, originalRequest, this.args); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + _transformationContext: Record + ): Request { + const { document, variables } = addVariablesToRootField(delegationContext.targetSchema, originalRequest, this.args); return { ...originalRequest, diff --git a/packages/delegate/src/transforms/AddFragmentsByField.ts b/packages/delegate/src/transforms/AddFragmentsByField.ts deleted file mode 100644 index c8944bdd29f..00000000000 --- a/packages/delegate/src/transforms/AddFragmentsByField.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { - DocumentNode, - GraphQLSchema, - GraphQLType, - Kind, - SelectionSetNode, - TypeInfo, - visit, - visitWithTypeInfo, - InlineFragmentNode, -} from 'graphql'; - -import { Transform, Request } from '@graphql-tools/utils'; - -export default class AddFragmentsByField implements Transform { - private readonly targetSchema: GraphQLSchema; - private readonly mapping: Record>; - - constructor(targetSchema: GraphQLSchema, mapping: Record>) { - this.targetSchema = targetSchema; - this.mapping = mapping; - } - - public transformRequest(originalRequest: Request): Request { - const document = addFragmentsByField(this.targetSchema, originalRequest.document, this.mapping); - return { - ...originalRequest, - document, - }; - } -} - -function addFragmentsByField( - targetSchema: GraphQLSchema, - document: DocumentNode, - mapping: Record> -): DocumentNode { - const typeInfo = new TypeInfo(targetSchema); - return visit( - document, - visitWithTypeInfo(typeInfo, { - [Kind.SELECTION_SET](node: SelectionSetNode): SelectionSetNode | null | undefined { - const parentType: GraphQLType | null | undefined = typeInfo.getParentType(); - if (parentType != null) { - const parentTypeName = parentType.name; - let selections = node.selections; - - if (parentTypeName in mapping) { - node.selections.forEach(selection => { - if (selection.kind === Kind.FIELD) { - const name = selection.name.value; - const fragment = mapping[parentTypeName][name]; - if (fragment != null) { - selections = selections.concat(fragment); - } - } - }); - } - - if (selections !== node.selections) { - return { - ...node, - selections, - }; - } - } - }, - }) - ); -} diff --git a/packages/delegate/src/transforms/AddSelectionSets.ts b/packages/delegate/src/transforms/AddSelectionSets.ts index 87e0769593b..d725fd1c364 100644 --- a/packages/delegate/src/transforms/AddSelectionSets.ts +++ b/packages/delegate/src/transforms/AddSelectionSets.ts @@ -1,16 +1,8 @@ -import { - GraphQLSchema, - SelectionSetNode, - TypeInfo, - GraphQLOutputType, - Kind, - FieldNode, - SelectionNode, - print, -} from 'graphql'; +import { SelectionSetNode, TypeInfo, Kind, FieldNode, SelectionNode, print } from 'graphql'; -import { Transform, Request } from '@graphql-tools/utils'; +import { Request } from '@graphql-tools/utils'; +import { Transform, DelegationContext } from '../types'; import { memoize2 } from '../memoize'; import VisitSelectionSets from './VisitSelectionSets'; @@ -19,19 +11,21 @@ export default class AddSelectionSets implements Transform { private readonly transformer: VisitSelectionSets; constructor( - sourceSchema: GraphQLSchema, - initialType: GraphQLOutputType, selectionSetsByType: Record, selectionSetsByField: Record>, dynamicSelectionSetsByField: Record SelectionSetNode>>> ) { - this.transformer = new VisitSelectionSets(sourceSchema, initialType, (node, typeInfo) => + this.transformer = new VisitSelectionSets((node, typeInfo) => visitSelectionSet(node, typeInfo, selectionSetsByType, selectionSetsByField, dynamicSelectionSetsByField) ); } - public transformRequest(originalRequest: Request): Request { - return this.transformer.transformRequest(originalRequest); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: Record + ): Request { + return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } } diff --git a/packages/delegate/src/transforms/AddSelectionSetsByField.ts b/packages/delegate/src/transforms/AddSelectionSetsByField.ts deleted file mode 100644 index a0e05143746..00000000000 --- a/packages/delegate/src/transforms/AddSelectionSetsByField.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - DocumentNode, - GraphQLSchema, - GraphQLType, - Kind, - SelectionSetNode, - TypeInfo, - visit, - visitWithTypeInfo, -} from 'graphql'; - -import { Transform, Request } from '@graphql-tools/utils'; - -export default class AddSelectionSetsByField implements Transform { - private readonly schema: GraphQLSchema; - private readonly mapping: Record>; - - constructor(schema: GraphQLSchema, mapping: Record>) { - this.schema = schema; - this.mapping = mapping; - } - - public transformRequest(originalRequest: Request): Request { - const document = addSelectionSetsByField(this.schema, originalRequest.document, this.mapping); - return { - ...originalRequest, - document, - }; - } -} - -function addSelectionSetsByField( - schema: GraphQLSchema, - document: DocumentNode, - mapping: Record> -): DocumentNode { - const typeInfo = new TypeInfo(schema); - return visit( - document, - visitWithTypeInfo(typeInfo, { - [Kind.SELECTION_SET](node: SelectionSetNode): SelectionSetNode | null | undefined { - const parentType: GraphQLType | null | undefined = typeInfo.getParentType(); - if (parentType != null) { - const parentTypeName = parentType.name; - let selections = node.selections; - - if (parentTypeName in mapping) { - node.selections.forEach(selection => { - if (selection.kind === Kind.FIELD) { - const name = selection.name.value; - const selectionSet = mapping[parentTypeName][name]; - if (selectionSet != null) { - selections = selections.concat(selectionSet.selections); - } - } - }); - } - - if (selections !== node.selections) { - return { - ...node, - selections, - }; - } - } - }, - }) - ); -} diff --git a/packages/delegate/src/transforms/AddSelectionSetsByType.ts b/packages/delegate/src/transforms/AddSelectionSetsByType.ts deleted file mode 100644 index ac573cc7249..00000000000 --- a/packages/delegate/src/transforms/AddSelectionSetsByType.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - DocumentNode, - GraphQLSchema, - GraphQLType, - Kind, - SelectionSetNode, - TypeInfo, - visit, - visitWithTypeInfo, -} from 'graphql'; - -import { Transform, Request } from '@graphql-tools/utils'; - -export default class AddSelectionSetsByType implements Transform { - private readonly targetSchema: GraphQLSchema; - private readonly mapping: Record; - - constructor(targetSchema: GraphQLSchema, mapping: Record) { - this.targetSchema = targetSchema; - this.mapping = mapping; - } - - public transformRequest(originalRequest: Request): Request { - const document = addSelectionSetsByType(this.targetSchema, originalRequest.document, this.mapping); - return { - ...originalRequest, - document, - }; - } -} - -function addSelectionSetsByType( - targetSchema: GraphQLSchema, - document: DocumentNode, - mapping: Record -): DocumentNode { - const typeInfo = new TypeInfo(targetSchema); - return visit( - document, - visitWithTypeInfo(typeInfo, { - [Kind.SELECTION_SET](node: SelectionSetNode): SelectionSetNode | null | undefined { - const parentType: GraphQLType | null | undefined = typeInfo.getParentType(); - if (parentType != null) { - const parentTypeName = parentType.name; - let selections = node.selections; - - if (parentTypeName in mapping) { - const selectionSet = mapping[parentTypeName]; - if (selectionSet != null) { - selections = selections.concat(selectionSet.selections); - } - } - - if (selections !== node.selections) { - return { - ...node, - selections, - }; - } - } - }, - }) - ); -} diff --git a/packages/delegate/src/transforms/AddTypenameToAbstract.ts b/packages/delegate/src/transforms/AddTypenameToAbstract.ts index 212da9457a0..4ffb31f57a7 100644 --- a/packages/delegate/src/transforms/AddTypenameToAbstract.ts +++ b/packages/delegate/src/transforms/AddTypenameToAbstract.ts @@ -10,17 +10,17 @@ import { isAbstractType, } from 'graphql'; -import { Transform, Request } from '@graphql-tools/utils'; +import { Request } from '@graphql-tools/utils'; -export default class AddTypenameToAbstract implements Transform { - private readonly targetSchema: GraphQLSchema; - - constructor(targetSchema: GraphQLSchema) { - this.targetSchema = targetSchema; - } +import { Transform, DelegationContext } from '../types'; - public transformRequest(originalRequest: Request): Request { - const document = addTypenameToAbstract(this.targetSchema, originalRequest.document); +export default class AddTypenameToAbstract implements Transform { + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + _transformationContext: Record + ): Request { + const document = addTypenameToAbstract(delegationContext.targetSchema, originalRequest.document); return { ...originalRequest, document, diff --git a/packages/delegate/src/transforms/CheckResultAndHandleErrors.ts b/packages/delegate/src/transforms/CheckResultAndHandleErrors.ts index 83d4561a431..c9582dc5962 100644 --- a/packages/delegate/src/transforms/CheckResultAndHandleErrors.ts +++ b/packages/delegate/src/transforms/CheckResultAndHandleErrors.ts @@ -1,42 +1,33 @@ -import { GraphQLResolveInfo, GraphQLOutputType, GraphQLSchema } from 'graphql'; +import { + GraphQLResolveInfo, + GraphQLOutputType, + GraphQLSchema, + GraphQLError, + responsePathAsArray, + locatedError, +} from 'graphql'; -import { Transform, getResponseKeyFromInfo, ExecutionResult } from '@graphql-tools/utils'; -import { handleResult } from '../results/handleResult'; -import { SubschemaConfig } from '../types'; +import AggregateError from '@ardatan/aggregate-error'; -export default class CheckResultAndHandleErrors implements Transform { - private readonly context?: Record; - private readonly info: GraphQLResolveInfo; - private readonly fieldName?: string; - private readonly subschema?: GraphQLSchema | SubschemaConfig; - private readonly returnType?: GraphQLOutputType; - private readonly typeMerge?: boolean; - - constructor( - info: GraphQLResolveInfo, - fieldName?: string, - subschema?: GraphQLSchema | SubschemaConfig, - context?: Record, - returnType: GraphQLOutputType = info.returnType, - typeMerge?: boolean - ) { - this.context = context; - this.info = info; - this.fieldName = fieldName; - this.subschema = subschema; - this.returnType = returnType; - this.typeMerge = typeMerge; - } +import { getResponseKeyFromInfo, ExecutionResult, relocatedError } from '@graphql-tools/utils'; - public transformResult(result: any): any { +import { SubschemaConfig, Transform, DelegationContext } from '../types'; +import { resolveExternalValue } from '../resolveExternalValue'; + +export default class CheckResultAndHandleErrors implements Transform { + public transformResult( + originalResult: ExecutionResult, + delegationContext: DelegationContext, + _transformationContext: Record + ): ExecutionResult { return checkResultAndHandleErrors( - result, - this.context != null ? this.context : {}, - this.info, - this.fieldName, - this.subschema, - this.returnType, - this.typeMerge + originalResult, + delegationContext.context != null ? delegationContext.context : {}, + delegationContext.info, + delegationContext.fieldName, + delegationContext.subschema, + delegationContext.returnType, + delegationContext.skipTypeMerging ); } } @@ -50,8 +41,71 @@ export function checkResultAndHandleErrors( returnType: GraphQLOutputType = info.returnType, skipTypeMerging?: boolean ): any { - const errors = result.errors != null ? result.errors : []; - const data = result.data != null ? result.data[responseKey] : undefined; + const { data, unpathedErrors } = mergeDataAndErrors( + result.data == null ? undefined : result.data[responseKey], + result.errors == null ? [] : result.errors, + info ? responsePathAsArray(info.path) : undefined + ); + + return resolveExternalValue(data, unpathedErrors, subschema, context, info, returnType, skipTypeMerging); +} + +export function mergeDataAndErrors( + data: any, + errors: ReadonlyArray, + path: Array, + index = 1 +): { data: any; unpathedErrors: Array } { + if (data == null) { + if (!errors.length) { + return { data: null, unpathedErrors: [] }; + } + + if (errors.length === 1) { + const error = errors[0]; + const newPath = + path === undefined ? error.path : error.path === undefined ? path : path.concat(error.path.slice(1)); + return { data: relocatedError(errors[0], newPath), unpathedErrors: [] }; + } + + return { data: locatedError(new AggregateError(errors), undefined, path), unpathedErrors: [] }; + } + + if (!errors.length) { + return { data, unpathedErrors: [] }; + } + + let unpathedErrors: Array = []; + + const errorMap: Record> = Object.create(null); + errors.forEach(error => { + const pathSegment = error.path?.[index]; + if (pathSegment != null) { + const pathSegmentErrors = errorMap[pathSegment]; + if (pathSegmentErrors === undefined) { + errorMap[pathSegment] = [error]; + } else { + pathSegmentErrors.push(error); + } + } else { + unpathedErrors.push(error); + } + }); + + Object.keys(errorMap).forEach(pathSegment => { + if (data[pathSegment] !== undefined) { + const { data: newData, unpathedErrors: newErrors } = mergeDataAndErrors( + data[pathSegment], + errorMap[pathSegment], + path, + index + 1 + ); + data[pathSegment] = newData; + unpathedErrors = unpathedErrors.concat(newErrors); + } else { + unpathedErrors = unpathedErrors.concat(errorMap[pathSegment]); + } + }); - return handleResult(data, errors, subschema, context, info, returnType, skipTypeMerging); + return { data, unpathedErrors }; } diff --git a/packages/delegate/src/transforms/ExpandAbstractTypes.ts b/packages/delegate/src/transforms/ExpandAbstractTypes.ts index 482e465069e..a2ba8d2abfa 100644 --- a/packages/delegate/src/transforms/ExpandAbstractTypes.ts +++ b/packages/delegate/src/transforms/ExpandAbstractTypes.ts @@ -15,28 +15,27 @@ import { visitWithTypeInfo, } from 'graphql'; -import { implementsAbstractType, Transform, Request } from '@graphql-tools/utils'; +import { implementsAbstractType, Request } from '@graphql-tools/utils'; -export default class ExpandAbstractTypes implements Transform { - private readonly targetSchema: GraphQLSchema; - private readonly possibleTypesMap: Record>; - private readonly reversePossibleTypesMap: Record>; - private readonly interfaceExtensionsMap: Record>; - - constructor(sourceSchema: GraphQLSchema, targetSchema: GraphQLSchema) { - this.targetSchema = targetSchema; - const { possibleTypesMap, interfaceExtensionsMap } = extractPossibleTypes(sourceSchema, targetSchema); - this.possibleTypesMap = possibleTypesMap; - this.reversePossibleTypesMap = flipMapping(this.possibleTypesMap); - this.interfaceExtensionsMap = interfaceExtensionsMap; - } +import { Transform, DelegationContext } from '../types'; - public transformRequest(originalRequest: Request): Request { +export default class ExpandAbstractTypes implements Transform { + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + _transformationContext: Record + ): Request { + const targetSchema = delegationContext.targetSchema; + const { possibleTypesMap, interfaceExtensionsMap } = extractPossibleTypes( + delegationContext.info.schema, + targetSchema + ); + const reversePossibleTypesMap = flipMapping(possibleTypesMap); const document = expandAbstractTypes( - this.targetSchema, - this.possibleTypesMap, - this.reversePossibleTypesMap, - this.interfaceExtensionsMap, + targetSchema, + possibleTypesMap, + reversePossibleTypesMap, + interfaceExtensionsMap, originalRequest.document ); diff --git a/packages/delegate/src/transforms/FilterToSchema.ts b/packages/delegate/src/transforms/FilterToSchema.ts index 8c654e142e9..6f236ddcb05 100644 --- a/packages/delegate/src/transforms/FilterToSchema.ts +++ b/packages/delegate/src/transforms/FilterToSchema.ts @@ -21,19 +21,19 @@ import { isInterfaceType, } from 'graphql'; -import { Transform, Request, implementsAbstractType, TypeMap } from '@graphql-tools/utils'; +import { Request, implementsAbstractType, TypeMap } from '@graphql-tools/utils'; -export default class FilterToSchema implements Transform { - private readonly targetSchema: GraphQLSchema; - - constructor(targetSchema: GraphQLSchema) { - this.targetSchema = targetSchema; - } +import { Transform, DelegationContext } from '../types'; - public transformRequest(originalRequest: Request): Request { +export default class FilterToSchema implements Transform { + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + _transformationContext: Record + ): Request { return { ...originalRequest, - ...filterToSchema(this.targetSchema, originalRequest.document, originalRequest.variables), + ...filterToSchema(delegationContext.targetSchema, originalRequest.document, originalRequest.variables), }; } } diff --git a/packages/delegate/src/transforms/ReplaceFieldWithFragment.ts b/packages/delegate/src/transforms/ReplaceFieldWithFragment.ts deleted file mode 100644 index 79b9d2c4077..00000000000 --- a/packages/delegate/src/transforms/ReplaceFieldWithFragment.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { - DocumentNode, - GraphQLSchema, - GraphQLType, - InlineFragmentNode, - Kind, - SelectionSetNode, - TypeInfo, - OperationDefinitionNode, - parse, - visit, - visitWithTypeInfo, -} from 'graphql'; - -import { concatInlineFragments, Transform, Request } from '@graphql-tools/utils'; - -export default class ReplaceFieldWithFragment implements Transform { - private readonly targetSchema: GraphQLSchema; - private readonly mapping: FieldToFragmentMapping; - - constructor( - targetSchema: GraphQLSchema, - fragments: Array<{ - field: string; - fragment: string; - }> - ) { - this.targetSchema = targetSchema; - this.mapping = {}; - for (const { field, fragment } of fragments) { - const parsedFragment = parseFragmentToInlineFragment(fragment); - const actualTypeName = parsedFragment.typeCondition.name.value; - if (!(actualTypeName in this.mapping)) { - this.mapping[actualTypeName] = Object.create(null); - } - - const typeMapping = this.mapping[actualTypeName]; - - if (!(field in typeMapping)) { - typeMapping[field] = [parsedFragment]; - } else { - typeMapping[field].push(parsedFragment); - } - } - } - - public transformRequest(originalRequest: Request): Request { - const document = replaceFieldsWithFragments(this.targetSchema, originalRequest.document, this.mapping); - return { - ...originalRequest, - document, - }; - } -} - -type FieldToFragmentMapping = { - [typeName: string]: { [fieldName: string]: Array }; -}; - -function replaceFieldsWithFragments( - targetSchema: GraphQLSchema, - document: DocumentNode, - mapping: FieldToFragmentMapping -): DocumentNode { - const typeInfo = new TypeInfo(targetSchema); - return visit( - document, - visitWithTypeInfo(typeInfo, { - [Kind.SELECTION_SET](node: SelectionSetNode): SelectionSetNode | null | undefined { - const parentType: GraphQLType = typeInfo.getParentType(); - if (parentType != null) { - const parentTypeName = parentType.name; - let selections = node.selections; - - if (parentTypeName in mapping) { - node.selections.forEach(selection => { - if (selection.kind === Kind.FIELD) { - const name = selection.name.value; - const fragments = mapping[parentTypeName][name]; - if (fragments != null && fragments.length > 0) { - const fragment = concatInlineFragments(parentTypeName, fragments); - selections = selections.concat(fragment); - } - } - }); - } - - if (selections !== node.selections) { - return { - ...node, - selections, - }; - } - } - }, - }) - ); -} - -function parseFragmentToInlineFragment(definitions: string): InlineFragmentNode { - if (definitions.trim().startsWith('fragment')) { - const document = parse(definitions); - for (const definition of document.definitions) { - if (definition.kind === Kind.FRAGMENT_DEFINITION) { - return { - kind: Kind.INLINE_FRAGMENT, - typeCondition: definition.typeCondition, - selectionSet: definition.selectionSet, - }; - } - } - } - - const query = parse(`{${definitions}}`).definitions[0] as OperationDefinitionNode; - for (const selection of query.selectionSet.selections) { - if (selection.kind === Kind.INLINE_FRAGMENT) { - return selection; - } - } - - throw new Error('Could not parse fragment'); -} diff --git a/packages/delegate/src/transforms/VisitSelectionSets.ts b/packages/delegate/src/transforms/VisitSelectionSets.ts index dd0f70a3817..3f807241b0c 100644 --- a/packages/delegate/src/transforms/VisitSelectionSets.ts +++ b/packages/delegate/src/transforms/VisitSelectionSets.ts @@ -13,25 +13,28 @@ import { DefinitionNode, } from 'graphql'; -import { Transform, Request, collectFields, GraphQLExecutionContext } from '@graphql-tools/utils'; +import { Request, collectFields, GraphQLExecutionContext } from '@graphql-tools/utils'; + +import { Transform, DelegationContext } from '../types'; export default class VisitSelectionSets implements Transform { - private readonly schema: GraphQLSchema; - private readonly initialType: GraphQLOutputType; private readonly visitor: (node: SelectionSetNode, typeInfo: TypeInfo) => SelectionSetNode; - constructor( - schema: GraphQLSchema, - initialType: GraphQLOutputType, - visitor: (node: SelectionSetNode, typeInfo: TypeInfo) => SelectionSetNode - ) { - this.schema = schema; - this.initialType = initialType; + constructor(visitor: (node: SelectionSetNode, typeInfo: TypeInfo) => SelectionSetNode) { this.visitor = visitor; } - public transformRequest(originalRequest: Request): Request { - const document = visitSelectionSets(originalRequest, this.schema, this.initialType, this.visitor); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + _transformationContext: Record + ): Request { + const document = visitSelectionSets( + originalRequest, + delegationContext.info.schema, + delegationContext.returnType, + this.visitor + ); return { ...originalRequest, document, diff --git a/packages/delegate/src/transforms/WrapConcreteTypes.ts b/packages/delegate/src/transforms/WrapConcreteTypes.ts index dd425193a3a..02b5f3b2e93 100644 --- a/packages/delegate/src/transforms/WrapConcreteTypes.ts +++ b/packages/delegate/src/transforms/WrapConcreteTypes.ts @@ -12,21 +12,23 @@ import { FieldNode, } from 'graphql'; -import { Transform, Request } from '@graphql-tools/utils'; +import { Request } from '@graphql-tools/utils'; + +import { Transform, DelegationContext } from '../types'; // For motivation, see https://github.com/ardatan/graphql-tools/issues/751 export default class WrapConcreteTypes implements Transform { - private readonly returnType: GraphQLOutputType; - private readonly targetSchema: GraphQLSchema; - - constructor(returnType: GraphQLOutputType, targetSchema: GraphQLSchema) { - this.returnType = returnType; - this.targetSchema = targetSchema; - } - - public transformRequest(originalRequest: Request): Request { - const document = wrapConcreteTypes(this.returnType, this.targetSchema, originalRequest.document); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + _transformationContext: Record + ): Request { + const document = wrapConcreteTypes( + delegationContext.returnType, + delegationContext.targetSchema, + originalRequest.document + ); return { ...originalRequest, document, @@ -45,50 +47,92 @@ function wrapConcreteTypes( return document; } - const queryRootType = targetSchema.getQueryType(); - const mutationRootType = targetSchema.getMutationType(); - const subscriptionRootType = targetSchema.getSubscriptionType(); - const typeInfo = new TypeInfo(targetSchema); const newDocument = visit( document, visitWithTypeInfo(typeInfo, { - [Kind.FIELD](node: FieldNode) { - const maybeType = typeInfo.getParentType(); - if (maybeType == null) { - return false; + [Kind.FIELD]: (node: FieldNode) => { + if (isAbstractType(getNamedType(typeInfo.getType()))) { + return { + ...node, + selectionSet: { + kind: Kind.SELECTION_SET, + selections: [ + { + kind: Kind.INLINE_FRAGMENT, + typeCondition: { + kind: Kind.NAMED_TYPE, + name: { + kind: Kind.NAME, + value: namedType.name, + }, + }, + selectionSet: node.selectionSet, + }, + ], + }, + }; } + }, + }), + // visitorKeys argument usage a la https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/batching/merge-queries.js + // empty keys cannot be removed only because of typescript errors + // will hopefully be fixed in future version of graphql-js to be optional + { + Name: [], - const parentType = getNamedType(maybeType); - if (parentType !== queryRootType && parentType !== mutationRootType && parentType !== subscriptionRootType) { - return false; - } + Document: ['definitions'], + OperationDefinition: ['selectionSet'], + VariableDefinition: [], + Variable: [], + SelectionSet: ['selections'], + Field: [], + Argument: [], - if (!isAbstractType(getNamedType(typeInfo.getType()))) { - return false; - } + FragmentSpread: [], + InlineFragment: ['selectionSet'], + FragmentDefinition: ['selectionSet'], - return { - ...node, - selectionSet: { - kind: Kind.SELECTION_SET, - selections: [ - { - kind: Kind.INLINE_FRAGMENT, - typeCondition: { - kind: Kind.NAMED_TYPE, - name: { - kind: Kind.NAME, - value: namedType.name, - }, - }, - selectionSet: node.selectionSet, - }, - ], - }, - }; - }, - }) + IntValue: [], + FloatValue: [], + StringValue: [], + BooleanValue: [], + NullValue: [], + EnumValue: [], + ListValue: [], + ObjectValue: [], + ObjectField: [], + + Directive: [], + + NamedType: [], + ListType: [], + NonNullType: [], + + SchemaDefinition: [], + OperationTypeDefinition: [], + + ScalarTypeDefinition: [], + ObjectTypeDefinition: [], + FieldDefinition: [], + InputValueDefinition: [], + InterfaceTypeDefinition: [], + UnionTypeDefinition: [], + EnumTypeDefinition: [], + EnumValueDefinition: [], + InputObjectTypeDefinition: [], + + DirectiveDefinition: [], + + SchemaExtension: [], + + ScalarTypeExtension: [], + ObjectTypeExtension: [], + InterfaceTypeExtension: [], + UnionTypeExtension: [], + EnumTypeExtension: [], + InputObjectTypeExtension: [], + } ); return newDocument; diff --git a/packages/delegate/src/transforms/index.ts b/packages/delegate/src/transforms/index.ts index 20e7ba3e9f8..624bc89e3fa 100644 --- a/packages/delegate/src/transforms/index.ts +++ b/packages/delegate/src/transforms/index.ts @@ -1,14 +1,7 @@ -export { default as CheckResultAndHandleErrors } from './CheckResultAndHandleErrors'; -export { checkResultAndHandleErrors } from './CheckResultAndHandleErrors'; +export { default as CheckResultAndHandleErrors, checkResultAndHandleErrors } from './CheckResultAndHandleErrors'; export { default as ExpandAbstractTypes } from './ExpandAbstractTypes'; export { default as VisitSelectionSets } from './VisitSelectionSets'; export { default as AddSelectionSets } from './AddSelectionSets'; export { default as AddArgumentsAsVariables } from './AddArgumentsAsVariables'; export { default as FilterToSchema } from './FilterToSchema'; export { default as AddTypenameToAbstract } from './AddTypenameToAbstract'; - -// superseded by VisitSelectionSets and AddSelectionSets -export { default as AddSelectionSetsByField } from './AddSelectionSetsByField'; -export { default as AddMergedTypeSelectionSets } from './AddSelectionSetsByType'; -export { default as ReplaceFieldWithFragment } from './ReplaceFieldWithFragment'; -export { default as AddFragmentsByField } from './AddFragmentsByField'; diff --git a/packages/delegate/src/types.ts b/packages/delegate/src/types.ts index 768f0470427..f0d000f989b 100644 --- a/packages/delegate/src/types.ts +++ b/packages/delegate/src/types.ts @@ -6,17 +6,41 @@ import { DocumentNode, GraphQLResolveInfo, GraphQLFieldResolver, - InlineFragmentNode, FragmentDefinitionNode, GraphQLObjectType, VariableDefinitionNode, OperationTypeNode, + GraphQLError, } from 'graphql'; -import { Operation, Transform, Request, TypeMap, ExecutionResult } from '@graphql-tools/utils'; +import DataLoader from 'dataloader'; + +import { Request, TypeMap, ExecutionResult } from '@graphql-tools/utils'; import { Subschema } from './Subschema'; -import DataLoader from 'dataloader'; +import { OBJECT_SUBSCHEMA_SYMBOL, FIELD_SUBSCHEMA_MAP_SYMBOL, UNPATHED_ERRORS_SYMBOL } from './symbols'; + +export type SchemaTransform = ( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema +) => GraphQLSchema; +export type RequestTransform> = ( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: T +) => Request; +export type ResultTransform> = ( + originalResult: ExecutionResult, + delegationContext: DelegationContext, + transformationContext: T +) => ExecutionResult; + +export interface Transform> { + transformSchema?: SchemaTransform; + transformRequest?: RequestTransform; + transformResult?: ResultTransform; +} export interface DelegationContext { subschema: GraphQLSchema | SubschemaConfig; @@ -35,9 +59,9 @@ export interface DelegationContext { export type DelegationBinding = (delegationContext: DelegationContext) => Array; export interface IDelegateToSchemaOptions, TArgs = Record> { - schema: GraphQLSchema | SubschemaConfig | Subschema; + schema: GraphQLSchema | SubschemaConfig; operationName?: string; - operation?: Operation; + operation?: OperationTypeNode; fieldName?: string; returnType?: GraphQLOutputType; args?: TArgs; @@ -61,7 +85,7 @@ export interface IDelegateRequestOptions extends Omit; @@ -74,7 +98,7 @@ export interface ICreateRequest { fragments?: Record; variableDefinitions?: ReadonlyArray; variableValues?: Record; - targetOperation: Operation; + targetOperation: OperationTypeNode; targetOperationName?: string; targetFieldName: string; selectionSet?: SelectionSetNode; @@ -84,12 +108,12 @@ export interface ICreateRequest { export interface MergedTypeInfo { typeName: string; selectionSet?: SelectionSetNode; - targetSubschemas: Map>; - uniqueFields: Record; - nonUniqueFields: Record>; + targetSubschemas: Map>; + uniqueFields: Record; + nonUniqueFields: Record>; typeMaps: Map; - selectionSets: Map; - fieldSelectionSets: Map>; + selectionSets: Map; + fieldSelectionSets: Map>; } export interface ExecutionParams, TContext = any> { @@ -110,43 +134,37 @@ export type AsyncExecutor = < export type SyncExecutor = , TArgs = Record, TContext = Record>( params: ExecutionParams ) => ExecutionResult; -export type Executor = AsyncExecutor | SyncExecutor; +export type Executor = , TArgs = Record, TContext = Record>( + params: ExecutionParams +) => ExecutionResult | Promise>; export type Subscriber = , TArgs = Record, TContext = Record>( params: ExecutionParams ) => Promise> | ExecutionResult>; export interface ICreateProxyingResolverOptions { - schema: GraphQLSchema | SubschemaConfig; - transforms?: Array; + subschemaConfig: SubschemaConfig; transformedSchema?: GraphQLSchema; - operation?: Operation; + operation?: OperationTypeNode; fieldName?: string; } export type CreateProxyingResolverFn = (options: ICreateProxyingResolverOptions) => GraphQLFieldResolver; -export interface Endpoint { - rootValue?: Record; - executor?: Executor; - subscriber?: Subscriber; - batch?: boolean; - batchingOptions?: EndpointBatchingOptions; -} - -export interface EndpointBatchingOptions { +export interface BatchingOptions { extensionsReducer?: (mergedExtensions: Record, executionParams: ExecutionParams) => Record; dataLoaderOptions?: DataLoader.Options; } -export interface SubschemaPermutation { +export interface SubschemaConfig { + schema: GraphQLSchema; createProxyingResolver?: CreateProxyingResolverFn; transforms?: Array; merge?: Record; -} - -export interface SubschemaConfig extends SubschemaPermutation, Endpoint { - schema: GraphQLSchema; - endpoint?: Endpoint; + rootValue?: Record; + executor?: Executor; + subscriber?: Subscriber; + batch?: boolean; + batchingOptions?: BatchingOptions; } export interface MergedTypeConfig { @@ -174,10 +192,15 @@ export type MergedTypeResolver = ( ) => any; export interface StitchingInfo { - transformedSubschemaConfigs: Map; - transformedSchemas: Map; - fragmentsByField: Record>; + subschemaMap: Map; selectionSetsByField: Record>; dynamicSelectionSetsByField: Record SelectionSetNode>>>; mergedTypes: Record; } + +export interface ExternalObject { + key: any; + [OBJECT_SUBSCHEMA_SYMBOL]: GraphQLSchema | SubschemaConfig; + [FIELD_SUBSCHEMA_MAP_SYMBOL]: Record; + [UNPATHED_ERRORS_SYMBOL]: Array; +} diff --git a/packages/delegate/tests/batchExecution.test.ts b/packages/delegate/tests/batchExecution.test.ts index 93bb9692297..59119b8ff88 100644 --- a/packages/delegate/tests/batchExecution.test.ts +++ b/packages/delegate/tests/batchExecution.test.ts @@ -1,7 +1,7 @@ import { graphql, execute, ExecutionResult } from 'graphql'; import { makeExecutableSchema } from '@graphql-tools/schema'; -import { delegateToSchema, SubschemaConfig, ExecutionParams, SyncExecutor, Endpoint } from '../src'; +import { delegateToSchema, SubschemaConfig, ExecutionParams, SyncExecutor, Executor } from '../src'; import { stitchSchemas } from '@graphql-tools/stitch'; import { FilterObjectFields } from '@graphql-tools/wrap'; @@ -61,7 +61,7 @@ describe('batch execution', () => { expect(executions).toEqual(1); }); - it('should share batching dataloader between subschemas when using a common endpoint', async () => { + it('should share batching dataloader between subschemas when using a common executor', async () => { const innerSchemaA = makeExecutableSchema({ typeDefs: ` type Object { @@ -104,13 +104,10 @@ describe('batch execution', () => { let executions = 0; - const endpoint: Endpoint = { - batch: true, - executor: ((params: ExecutionParams): ExecutionResult => { - executions++; - return execute(innerSchemaA, params.document, undefined, params.context, params.variables) as ExecutionResult; - }) as SyncExecutor - }; + const executor = ((params: ExecutionParams): ExecutionResult => { + executions++; + return execute(innerSchemaA, params.document, undefined, params.context, params.variables) as ExecutionResult; + }) as Executor; const innerSubschemaConfigA: Array = [{ schema: innerSchemaA, @@ -121,7 +118,8 @@ describe('batch execution', () => { args: () => ({}), }, }, - endpoint, + batch: true, + executor, }, { schema: innerSchemaA, transforms: [new FilterObjectFields((typeName, fieldName) => typeName !== 'Object' || fieldName !== 'field1')], @@ -131,7 +129,8 @@ describe('batch execution', () => { args: () => ({}), }, }, - endpoint, + batch: true, + executor, }]; const innerSubschemaConfigB: SubschemaConfig = { diff --git a/packages/delegate/tests/errors.test.ts b/packages/delegate/tests/errors.test.ts new file mode 100644 index 00000000000..faf8d5b2ff0 --- /dev/null +++ b/packages/delegate/tests/errors.test.ts @@ -0,0 +1,212 @@ +import { GraphQLError, GraphQLResolveInfo, locatedError, graphql } from 'graphql'; + +import { makeExecutableSchema } from '@graphql-tools/schema'; +import { ExecutionResult } from '@graphql-tools/utils'; +import { stitchSchemas } from '@graphql-tools/stitch'; + +import { checkResultAndHandleErrors } from '../src/transforms/CheckResultAndHandleErrors'; +import { UNPATHED_ERRORS_SYMBOL } from '../src/symbols'; +import { getUnpathedErrors } from '../src/externalObjects'; +import { delegateToSchema, defaultMergedResolver } from '../src'; + +class ErrorWithExtensions extends GraphQLError { + constructor(message: string, code: string) { + super(message, null, null, null, null, null, { code }); + } +} + +describe('Errors', () => { + describe('getUnpathedErrors', () => { + test('should return all unpathed errors', () => { + const error = { + message: 'Test error without path', + }; + const mockExternalObject: any = { + responseKey: '', + [UNPATHED_ERRORS_SYMBOL]: [error], + }; + + expect(getUnpathedErrors(mockExternalObject)).toEqual([ + mockExternalObject[UNPATHED_ERRORS_SYMBOL][0], + ]); + }); + }); + + describe('checkResultAndHandleErrors', () => { + test('persists single error', () => { + const result = { + errors: [new GraphQLError('Test error')], + }; + try { + checkResultAndHandleErrors( + result, + {}, + ({} as unknown) as GraphQLResolveInfo, + 'responseKey', + ); + } catch (e) { + expect(e.message).toEqual('Test error'); + expect(e.originalError.errors).toBeUndefined(); + } + }); + + test('persists single error with extensions', () => { + const result = { + errors: [new ErrorWithExtensions('Test error', 'UNAUTHENTICATED')], + }; + try { + checkResultAndHandleErrors( + result, + {}, + ({} as unknown) as GraphQLResolveInfo, + 'responseKey', + ); + } catch (e) { + expect(e.message).toEqual('Test error'); + expect(e.extensions && e.extensions.code).toEqual('UNAUTHENTICATED'); + expect(e.originalError.errors).toBeUndefined(); + } + }); + + test('combines errors and persists the original errors', () => { + const result = { + errors: [new GraphQLError('Error1'), new GraphQLError('Error2')], + }; + try { + checkResultAndHandleErrors( + result, + {}, + ({} as unknown) as GraphQLResolveInfo, + 'responseKey', + ); + } catch (e) { + expect(e.message).toEqual('Error1\nError2'); + expect(e.originalError).toBeDefined(); + expect(e.originalError.errors).toBeDefined(); + expect(e.originalError.errors).toHaveLength(result.errors.length); + result.errors.forEach((error, i) => { + expect(e.originalError.errors[i]).toEqual(error); + }); + } + }); + + // see https://github.com/ardatan/graphql-tools/issues/1641 + describe('it proxies errors with invalid paths', () => { + test('it works with bare delegation', async () => { + const typeDefs = ` + type Object { + field1: String + field2: String + } + type Query { + object: Object + } + `; + + const unpathedError = locatedError(new Error('TestError'), undefined, ["_entities", 7, "name"]); + + const remoteSchema = makeExecutableSchema({ + typeDefs, + resolvers: { + Query: { + object: () => ({ + field1: unpathedError, + field2: 'data', + }) + } + } + }); + + const gatewaySchema = makeExecutableSchema({ + typeDefs, + resolvers: { + Query: { + object: (_parent, _args, context, info) => delegateToSchema({ + schema: remoteSchema, + operation: 'query', + context, + info, + }), + } + }, + }); + + const query = `{ + object { + field1 + field2 + } + }`; + + const expectedResult: ExecutionResult = { + data: { + object: { + field1: null, + field2: 'data', + } + }, + errors: [unpathedError], + }; + + const gatewayResult = await graphql({ + schema: gatewaySchema, + source: query, + fieldResolver: defaultMergedResolver, + }); + + expect(gatewayResult).toEqual(expectedResult); + }); + + test('it works with stitched schemas', async () => { + const typeDefs = ` + type Object { + field1: String + field2: String + } + type Query { + object: Object + } + `; + + const unpathedError = locatedError(new Error('TestError'), undefined, ["_entities", 7, "name"]); + + const remoteSchema = makeExecutableSchema({ + typeDefs, + resolvers: { + Query: { + object: () => ({ + field1: unpathedError, + field2: 'data', + }) + } + } + }); + + const gatewaySchema = stitchSchemas({ + subschemas: [remoteSchema], + }); + + const query = `{ + object { + field1 + field2 + } + }`; + + const expectedResult: ExecutionResult = { + data: { + object: { + field1: null, + field2: 'data', + } + }, + errors: [unpathedError], + }; + + const gatewayResult = await graphql(gatewaySchema, query); + + expect(gatewayResult).toEqual(expectedResult); + }); + }); + }); +}); diff --git a/packages/graphql-tools/package.json b/packages/graphql-tools/package.json index 4eda41f99a1..d93d0330998 100644 --- a/packages/graphql-tools/package.json +++ b/packages/graphql-tools/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "@graphql-tools/batch-delegate": "^6.2.4", + "@graphql-tools/batch-execute": "^6.2.4", "@graphql-tools/delegate": "^6.2.4", "@graphql-tools/graphql-tag-pluck": "^6.2.4", "@graphql-tools/import": "^6.2.4", diff --git a/packages/graphql-tools/src/index.ts b/packages/graphql-tools/src/index.ts index 13d3b00d43c..54623c18b10 100644 --- a/packages/graphql-tools/src/index.ts +++ b/packages/graphql-tools/src/index.ts @@ -1,4 +1,5 @@ export * from '@graphql-tools/batch-delegate'; +export * from '@graphql-tools/batch-execute'; export * from '@graphql-tools/delegate'; export * from '@graphql-tools/graphql-tag-pluck'; export * from '@graphql-tools/import'; diff --git a/packages/links/tests/upload.test.ts b/packages/links/tests/upload.test.ts index 61da3740d16..9aec2c2070f 100644 --- a/packages/links/tests/upload.test.ts +++ b/packages/links/tests/upload.test.ts @@ -114,7 +114,7 @@ describe('graphql upload', () => { }; const gatewaySchema = stitchSchemas({ - schemas: [subschema], + subschemas: [subschema], resolvers: { Upload: ServerGraphQLUpload, }, diff --git a/packages/merge/src/merge-schemas.ts b/packages/merge/src/merge-schemas.ts index c3df20b8c30..27bf24200fe 100644 --- a/packages/merge/src/merge-schemas.ts +++ b/packages/merge/src/merge-schemas.ts @@ -42,11 +42,11 @@ export interface MergeSchemasConfig e } const defaultResolverValidationOptions: Partial = { - requireResolversForArgs: false, - requireResolversForNonScalar: false, - requireResolversForAllFields: false, - requireResolversForResolveType: false, - allowResolversNotInSchema: true, + requireResolversForArgs: 'ignore', + requireResolversForNonScalar: 'ignore', + requireResolversForAllFields: 'ignore', + requireResolversForResolveType: 'ignore', + requireResolversToMatchSchema: 'ignore', }; /** diff --git a/packages/merge/tests/merge-typedefs.spec.ts b/packages/merge/tests/merge-typedefs.spec.ts index 9148d47461b..7b71bc728b5 100644 --- a/packages/merge/tests/merge-typedefs.spec.ts +++ b/packages/merge/tests/merge-typedefs.spec.ts @@ -781,7 +781,7 @@ describe('Merge TypeDefs', () => { }); it('should handle extend types when GraphQLSchema is the source', () => { const schema = stitchSchemas({ - schemas: [ + typeDefs: [ ` type Query { foo: String @@ -825,7 +825,7 @@ describe('Merge TypeDefs', () => { it('should handle extend input types', () => { const schema = stitchSchemas({ - schemas: [ + typeDefs: [ ` type Query { foo(i: TestInput): String diff --git a/packages/mock/src/mocking.ts b/packages/mock/src/mocking.ts index cd987fd7973..24420ae7c0a 100644 --- a/packages/mock/src/mocking.ts +++ b/packages/mock/src/mocking.ts @@ -124,7 +124,7 @@ export function addMocksToSchema({ schema, mocks = {}, preserveResolvers = false // if we're here, the field is already defined if (typeof root[fieldName] === 'function') { - result = root[fieldName](root, args, context, info); + result = root[fieldName](args, context, info); if (isMockList(result)) { result = result.mock(root, args, context, info, fieldType as GraphQLList, mockType); } diff --git a/packages/mock/tests/mocking.spec.ts b/packages/mock/tests/mocking.spec.ts index 307c2a7f4eb..4081db790a6 100644 --- a/packages/mock/tests/mocking.spec.ts +++ b/packages/mock/tests/mocking.spec.ts @@ -983,11 +983,6 @@ describe('Mock', () => { let jsSchema = makeExecutableSchema({ typeDefs: [shorthand], resolvers, - resolverValidationOptions: { - requireResolversForArgs: false, - requireResolversForNonScalar: false, - requireResolversForAllFields: false, - }, logger: console, }); const mockMap = { @@ -1056,7 +1051,7 @@ describe('Mock', () => { let jsSchema = buildSchemaFromTypeDefinitions(shorthand); const mockMap = { RootQuery: () => ({ - returnStringArgument: (_o: any, a: Record) => a.s, + returnStringArgument: (a: Record) => a.s, }), }; jsSchema = addMocksToSchema({ schema: jsSchema, mocks: mockMap }); @@ -1075,7 +1070,7 @@ describe('Mock', () => { let jsSchema = buildSchemaFromTypeDefinitions(shorthand); const mockMap = { RootMutation: () => ({ - returnStringArgument: (_o: any, a: Record) => a.s, + returnStringArgument: (a: Record) => a.s, }), }; jsSchema = addMocksToSchema({ schema: jsSchema, mocks: mockMap }); @@ -1129,7 +1124,7 @@ describe('Mock', () => { let jsSchema = buildSchemaFromTypeDefinitions(shorthand); const mockMap = { RootQuery: () => ({ - returnListOfIntArg: (_o: any, a: Record) => + returnListOfIntArg: (a: Record) => new MockList(a.l), }), Int: () => 12, @@ -1258,13 +1253,13 @@ describe('Mock', () => { // unintuitive corner-cases const mockMap = { RootQuery: () => ({ - thread: (_o: any, a: Record) => ({ id: a.id }), - threads: (_o: any, a: Record) => + thread: (a: Record) => ({ id: a.id }), + threads: (a: Record) => new MockList(ITEMS_PER_PAGE * a.num), }), Thread: () => ({ name: 'Lorem Ipsum', - posts: (_o: any, a: Record) => + posts: (a: Record) => new MockList( ITEMS_PER_PAGE * a.num, (_oi: any, ai: Record) => ({ diff --git a/packages/schema/src/addResolversToSchema.ts b/packages/schema/src/addResolversToSchema.ts index 4225ac03d22..19d564db3a2 100644 --- a/packages/schema/src/addResolversToSchema.ts +++ b/packages/schema/src/addResolversToSchema.ts @@ -55,7 +55,7 @@ export function addResolversToSchema( updateResolversInPlace = false, } = options; - const { allowResolversNotInSchema = false, requireResolversForResolveType } = resolverValidationOptions; + const { requireResolversToMatchSchema = 'error', requireResolversForResolveType } = resolverValidationOptions; const resolvers = inheritResolversFromInterfaces ? extendResolversFromInterfaces(schema, inputResolvers) @@ -85,7 +85,7 @@ export function addResolversToSchema( const type = schema.getType(typeName); if (type == null) { - if (allowResolversNotInSchema) { + if (requireResolversToMatchSchema === 'ignore') { return; } @@ -106,14 +106,19 @@ export function addResolversToSchema( if ( !fieldName.startsWith('__') && !values.some(value => value.name === fieldName) && - !allowResolversNotInSchema + requireResolversToMatchSchema && + requireResolversToMatchSchema !== 'ignore' ) { throw new Error(`${type.name}.${fieldName} was defined in resolvers, but not present within ${type.name}`); } }); } else if (isUnionType(type)) { Object.keys(resolverValue).forEach(fieldName => { - if (!fieldName.startsWith('__') && !allowResolversNotInSchema) { + if ( + !fieldName.startsWith('__') && + requireResolversToMatchSchema && + requireResolversToMatchSchema !== 'ignore' + ) { throw new Error( `${type.name}.${fieldName} was defined in resolvers, but ${type.name} is not an object or interface type` ); @@ -125,7 +130,7 @@ export function addResolversToSchema( const fields = type.getFields(); const field = fields[fieldName]; - if (field == null && !allowResolversNotInSchema) { + if (field == null && requireResolversToMatchSchema && requireResolversToMatchSchema !== 'ignore') { throw new Error(`${typeName}.${fieldName} defined in resolvers, but not in schema`); } diff --git a/packages/schema/src/assertResolversPresent.ts b/packages/schema/src/assertResolversPresent.ts index a935c143975..9026b858a27 100644 --- a/packages/schema/src/assertResolversPresent.ts +++ b/packages/schema/src/assertResolversPresent.ts @@ -1,15 +1,15 @@ import { GraphQLSchema, GraphQLField, getNamedType, isScalarType } from 'graphql'; -import { IResolverValidationOptions, forEachField } from '@graphql-tools/utils'; +import { IResolverValidationOptions, forEachField, ValidatorBehavior } from '@graphql-tools/utils'; export function assertResolversPresent( schema: GraphQLSchema, resolverValidationOptions: IResolverValidationOptions = {} ): void { const { - requireResolversForArgs = false, - requireResolversForNonScalar = false, - requireResolversForAllFields = false, + requireResolversForArgs, + requireResolversForNonScalar, + requireResolversForAllFields, } = resolverValidationOptions; if (requireResolversForAllFields && (requireResolversForArgs || requireResolversForNonScalar)) { @@ -23,32 +23,44 @@ export function assertResolversPresent( forEachField(schema, (field, typeName, fieldName) => { // requires a resolver for *every* field. if (requireResolversForAllFields) { - expectResolver(field, typeName, fieldName); + expectResolver('requireResolversForAllFields', requireResolversForAllFields, field, typeName, fieldName); } // requires a resolver on every field that has arguments if (requireResolversForArgs && field.args.length > 0) { - expectResolver(field, typeName, fieldName); + expectResolver('requireResolversForArgs', requireResolversForArgs, field, typeName, fieldName); } // requires a resolver on every field that returns a non-scalar type - if (requireResolversForNonScalar && !isScalarType(getNamedType(field.type))) { - expectResolver(field, typeName, fieldName); + if (requireResolversForNonScalar !== 'ignore' && !isScalarType(getNamedType(field.type))) { + expectResolver('requireResolversForNonScalar', requireResolversForNonScalar, field, typeName, fieldName); } }); } -function expectResolver(field: GraphQLField, typeName: string, fieldName: string) { +function expectResolver( + validator: string, + behavior: ValidatorBehavior, + field: GraphQLField, + typeName: string, + fieldName: string +) { if (!field.resolve) { - // eslint-disable-next-line no-console - console.warn( - `Resolver missing for "${typeName}.${fieldName}". -To disable this warning check pass; -resolverValidationOptions: { - requireResolversForNonScalar: false -} - ` - ); + const message = `Resolver missing for "${typeName}.${fieldName}". +To disable this validator, use: + resolverValidationOptions: { + ${validator}: 'ignore' + }`; + + if (behavior === 'error') { + throw new Error(message); + } + + if (behavior === 'warn') { + // eslint-disable-next-line no-console + console.warn(message); + } + return; } if (typeof field.resolve !== 'function') { diff --git a/packages/schema/src/checkForResolveTypeResolver.ts b/packages/schema/src/checkForResolveTypeResolver.ts index f8c8a25efec..1a2a8cd0408 100644 --- a/packages/schema/src/checkForResolveTypeResolver.ts +++ b/packages/schema/src/checkForResolveTypeResolver.ts @@ -1,21 +1,25 @@ -import { GraphQLInterfaceType, GraphQLUnionType, GraphQLSchema, isAbstractType } from 'graphql'; +import { GraphQLSchema } from 'graphql'; -// If we have any union or interface types throw if no there is no resolveType or isTypeOf resolvers -export function checkForResolveTypeResolver(schema: GraphQLSchema, requireResolversForResolveType?: boolean) { - Object.keys(schema.getTypeMap()) - .map(typeName => schema.getType(typeName)) - .forEach((type: GraphQLUnionType | GraphQLInterfaceType) => { - if (!isAbstractType(type)) { - return; - } - if (!type.resolveType) { - if (!requireResolversForResolveType) { - return; +import { MapperKind, mapSchema, ValidatorBehavior } from '@graphql-tools/utils'; + +// If we have any union or interface types throw if no there is no resolveType resolver +export function checkForResolveTypeResolver(schema: GraphQLSchema, requireResolversForResolveType?: ValidatorBehavior) { + mapSchema(schema, { + [MapperKind.ABSTRACT_TYPE]: type => { + if (!type.resolveType && requireResolversForResolveType) { + const message = + `Type "${type.name}" is missing a "__resolveType" resolver. Pass 'ignore' into ` + + '"resolverValidationOptions.requireResolversForResolveType" to disable this error.'; + if (requireResolversForResolveType === 'error') { + throw new Error(message); + } + + if (requireResolversForResolveType === 'warn') { + // eslint-disable-next-line no-console + console.warn(message); } - throw new Error( - `Type "${type.name}" is missing a "__resolveType" resolver. Pass false into ` + - '"resolverValidationOptions.requireResolversForResolveType" to disable this error.' - ); } - }); + return undefined; + }, + }); } diff --git a/packages/schema/src/makeExecutableSchema.ts b/packages/schema/src/makeExecutableSchema.ts index 6faa1cfef97..2cb94259acf 100644 --- a/packages/schema/src/makeExecutableSchema.ts +++ b/packages/schema/src/makeExecutableSchema.ts @@ -20,7 +20,7 @@ import { IExecutableSchemaDefinition } from './types'; * should return an array of strings or `DocumentNode`s. * * Note: You can use `graphql-tag` to not only parse a string into a - * `DocumentNode` but also to provide additinal syntax hightlighting in your + * `DocumentNode` but also to provide additional syntax highlighting in your * editor (with the appropriate editor plugin). * * ```js diff --git a/packages/schema/src/types.ts b/packages/schema/src/types.ts index 400c456bedb..c74472a069f 100644 --- a/packages/schema/src/types.ts +++ b/packages/schema/src/types.ts @@ -1,3 +1,5 @@ +import { GraphQLSchema } from 'graphql'; + import { ITypeDefinitions, IResolvers, @@ -5,7 +7,6 @@ import { IDirectiveResolvers, SchemaDirectiveVisitorClass, GraphQLParseOptions, - SchemaTransform, PruneSchemaOptions, } from '@graphql-tools/utils'; @@ -51,7 +52,7 @@ export interface IExecutableSchemaDefinition { /** * An array of schema transformation functions */ - schemaTransforms?: Array; + schemaTransforms?: Array<(originalWrappingSchema: GraphQLSchema) => GraphQLSchema>; /** * Additional options for parsing the type definitions if they are provided * as a string diff --git a/packages/schema/tests/forAwaitEach.ts b/packages/schema/tests/forAwaitEach.ts deleted file mode 100644 index 0f07f29be1b..00000000000 --- a/packages/schema/tests/forAwaitEach.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable callback-return */ -/* eslint-disable @typescript-eslint/await-thenable */ - -function isAsyncIterable(obj: any): obj is AsyncIterable { - return Symbol.asyncIterator in obj; -} - -export async function forAwaitEach( - obj: AsyncIterable | T, - callback: (i: T) => any | Promise, -) { - if (isAsyncIterable(obj)) { - for await (const i of obj) { - await callback(i); - } - } else { - await callback(obj); - } -} diff --git a/packages/schema/tests/resolution.test.ts b/packages/schema/tests/resolution.test.ts index ef037009b44..9cc71a3c43c 100644 --- a/packages/schema/tests/resolution.test.ts +++ b/packages/schema/tests/resolution.test.ts @@ -11,8 +11,6 @@ import { makeExecutableSchema, addSchemaLevelResolver } from '@graphql-tools/sch import { ExecutionResult } from '@graphql-tools/utils'; -import { forAwaitEach } from './forAwaitEach'; - describe('Resolve', () => { describe('addSchemaLevelResolver', () => { const pubsub = new PubSub(); @@ -79,97 +77,58 @@ describe('Resolve', () => { }); }); - test('should isolate roots from the different operation types', (done) => { + test('should isolate roots from the different operation types', async () => { schemaLevelResolverCalls = 0; const queryRoot = 'queryRoot'; const mutationRoot = 'mutationRoot'; const subscriptionRoot = 'subscriptionRoot'; const subscriptionRoot2 = 'subscriptionRoot2'; - let subsCbkCalls = 0; - const firstSubsTriggered = new Promise((resolveFirst) => { - subscribe( - schema, - parse(` - subscription TestSubscription { - printRoot - } - `), - ) - .then((results) => { - forAwaitEach( - results as AsyncIterable, - (result: ExecutionResult) => { - if (result.errors != null) { - return done( - new Error( - `Unexpected errors in GraphQL result: ${JSON.stringify( - result.errors, - )}`, - ), - ); - } - - const subsData = result.data; - subsCbkCalls++; - try { - if (subsCbkCalls === 1) { - expect(schemaLevelResolverCalls).toEqual(1); - expect(subsData).toEqual({ printRoot: subscriptionRoot }); - return resolveFirst(); - } else if (subsCbkCalls === 2) { - expect(schemaLevelResolverCalls).toEqual(4); - expect(subsData).toEqual({ - printRoot: subscriptionRoot2, - }); - return done(); - } - } catch (e) { - return done(e); - } - done(new Error('Too many subscription fired')); - }, - ).catch(done); - }) - .then(() => - pubsub.publish('printRootChannel', { printRoot: subscriptionRoot }), - ) - .catch(done); - }); + const sub = await subscribe( + schema, + parse(` + subscription TestSubscription { + printRoot + } + `), + ) as AsyncIterableIterator; + + const payload1 = sub.next(); + await pubsub.publish('printRootChannel', { printRoot: subscriptionRoot }); + + expect(await payload1).toEqual({ done: false, value: { data: { printRoot: subscriptionRoot } } }); + expect(schemaLevelResolverCalls).toEqual(1); + + const queryResult = await graphql( + schema, + ` + query TestQuery { + printRoot + } + `, + queryRoot, + ); + + expect(queryResult).toEqual({ data: { printRoot: queryRoot } }); + expect(schemaLevelResolverCalls).toEqual(2); + + const mutationResult = await graphql( + schema, + ` + mutation TestMutation { + printRoot + } + `, + mutationRoot, + ); + + expect(mutationResult).toEqual({ data: { printRoot: mutationRoot } }); + expect(schemaLevelResolverCalls).toEqual(3); + + await pubsub.publish('printRootChannel', { printRoot: subscriptionRoot2 }); - firstSubsTriggered - .then(() => - graphql( - schema, - ` - query TestQuery { - printRoot - } - `, - queryRoot, - ), - ) - .then(({ data }) => { - expect(schemaLevelResolverCalls).toEqual(2); - expect(data).toEqual({ printRoot: queryRoot }); - return graphql( - schema, - ` - mutation TestMutation { - printRoot - } - `, - mutationRoot, - ); - }) - .then(({ data: mutationData }) => { - expect(schemaLevelResolverCalls).toEqual(3); - expect(mutationData).toEqual({ printRoot: mutationRoot }); - return pubsub.publish('printRootChannel', { - printRoot: subscriptionRoot2, - }); - }) - .catch(done); + expect(await sub.next()).toEqual({ done: false, value: { data: { printRoot: subscriptionRoot2 } } }); + expect(schemaLevelResolverCalls).toEqual(4); }); it('should not force an otherwise synchronous operation to be asynchronous', () => { diff --git a/packages/schema/tests/schemaGenerator.test.ts b/packages/schema/tests/schemaGenerator.test.ts index 6c4d10ba5d1..38738dda2fe 100644 --- a/packages/schema/tests/schemaGenerator.test.ts +++ b/packages/schema/tests/schemaGenerator.test.ts @@ -1517,7 +1517,7 @@ describe('generating schema from shorthand', () => { typeDefs: short, resolvers: rf, resolverValidationOptions: { - requireResolversForArgs: true, + requireResolversForArgs: 'warn', }, }); }, 'Resolver missing for "Query.bird"'); @@ -1573,7 +1573,7 @@ describe('generating schema from shorthand', () => { const rf = {}; const resolverValidationOptions: IResolverValidationOptions = { - requireResolversForNonScalar: true, + requireResolversForNonScalar: 'warn', }; expectWarning(() => { @@ -1582,7 +1582,11 @@ describe('generating schema from shorthand', () => { resolvers: rf, resolverValidationOptions, }); - }, 'Resolver missing for "Query.bird"'); + }, `Resolver missing for "Query.bird". +To disable this validator, use: + resolverValidationOptions: { + requireResolversForNonScalar: 'ignore' + }`); }); test('allows non-scalar field to use default resolver if `resolverValidationOptions.requireResolversForNonScalar` = false', () => { @@ -1644,7 +1648,7 @@ describe('generating schema from shorthand', () => { typeDefs: short, resolvers: rf, resolverValidationOptions: { - allowResolversNotInSchema: true, + requireResolversToMatchSchema: 'ignore', }, }), ).not.toThrowError(); @@ -1679,7 +1683,7 @@ describe('generating schema from shorthand', () => { typeDefs: short, resolvers: rf, resolverValidationOptions: { - allowResolversNotInSchema: true, + requireResolversToMatchSchema: 'ignore', }, }), ).not.toThrowError(); @@ -1740,7 +1744,7 @@ describe('generating schema from shorthand', () => { typeDefs: short, resolvers: rf, resolverValidationOptions: { - allowResolversNotInSchema: true, + requireResolversToMatchSchema: 'ignore', }, }), ).not.toThrowError(); @@ -1787,7 +1791,7 @@ describe('generating schema from shorthand', () => { typeDefs: short, resolvers: rf, resolverValidationOptions: { - allowResolversNotInSchema: true, + requireResolversToMatchSchema: 'ignore', }, }), ).not.toThrowError(); @@ -1819,21 +1823,21 @@ describe('generating schema from shorthand', () => { } assertOptionsError({ - requireResolversForAllFields: true, - requireResolversForNonScalar: true, - requireResolversForArgs: true, + requireResolversForAllFields: 'error', + requireResolversForNonScalar: 'error', + requireResolversForArgs: 'error', }); assertOptionsError({ - requireResolversForAllFields: true, - requireResolversForNonScalar: true, + requireResolversForAllFields: 'error', + requireResolversForNonScalar: 'error', }); assertOptionsError({ - requireResolversForAllFields: true, - requireResolversForArgs: true, + requireResolversForAllFields: 'error', + requireResolversForArgs: 'error', }); }); - test('throws for any missing field if `resolverValidationOptions.requireResolversForAllFields` = true', () => { + test('warns for any missing field if `resolverValidationOptions.requireResolversForAllFields` = warn', () => { const typeDefs = ` type Bird { id: ID @@ -1851,7 +1855,7 @@ describe('generating schema from shorthand', () => { typeDefs, resolvers, resolverValidationOptions: { - requireResolversForAllFields: true, + requireResolversForAllFields: 'warn', }, }); }, errorMatcher); @@ -1869,7 +1873,7 @@ describe('generating schema from shorthand', () => { }); }); - test('does not throw if all fields are satisfied when `resolverValidationOptions.requireResolversForAllFields` = true', () => { + test('does not throw if all fields are satisfied when `resolverValidationOptions.requireResolversForAllFields` = error', () => { const typeDefs = ` type Bird { id: ID @@ -1894,7 +1898,7 @@ describe('generating schema from shorthand', () => { makeExecutableSchema({ typeDefs, resolvers, - resolverValidationOptions: { requireResolversForAllFields: true }, + resolverValidationOptions: { requireResolversForAllFields: 'error' }, }), ).not.toThrow(); }); @@ -2543,11 +2547,11 @@ describe('interfaces', () => { makeExecutableSchema({ typeDefs: testSchemaWithInterfaces, resolvers, - resolverValidationOptions: { requireResolversForResolveType: true }, + resolverValidationOptions: { requireResolversForResolveType: 'error' }, }); } catch (error) { expect(error.message).toEqual( - 'Type "Node" is missing a "__resolveType" resolver. Pass false into "resolverValidationOptions.requireResolversForResolveType" to disable this error.', + `Type "Node" is missing a "__resolveType" resolver. Pass 'ignore' into "resolverValidationOptions.requireResolversForResolveType" to disable this error.`, ); return; } @@ -2563,7 +2567,7 @@ describe('interfaces', () => { const schema = makeExecutableSchema({ typeDefs: testSchemaWithInterfaces, resolvers, - resolverValidationOptions: { requireResolversForResolveType: true }, + resolverValidationOptions: { requireResolversForResolveType: 'error' }, }); const response = await graphql(schema, query); expect(response.errors).not.toBeDefined(); @@ -2575,7 +2579,7 @@ describe('interfaces', () => { makeExecutableSchema({ typeDefs: testSchemaWithInterfaces, resolvers, - resolverValidationOptions: { requireResolversForResolveType: false }, + resolverValidationOptions: { requireResolversForResolveType: 'ignore' }, }); }); }); @@ -2615,8 +2619,8 @@ describe('interface resolver inheritance', () => { resolvers, inheritResolversFromInterfaces: true, resolverValidationOptions: { - requireResolversForAllFields: true, - requireResolversForResolveType: true, + requireResolversForAllFields: 'error', + requireResolversForResolveType: 'error', }, }); const query = '{ user { id name } }'; @@ -2679,8 +2683,8 @@ describe('interface resolver inheritance', () => { resolvers, inheritResolversFromInterfaces: true, resolverValidationOptions: { - requireResolversForAllFields: true, - requireResolversForResolveType: true, + requireResolversForAllFields: 'error', + requireResolversForResolveType: 'error', }, }); const query = '{ cyborg { id name } replicant { id name }}'; @@ -2742,11 +2746,11 @@ describe('unions', () => { makeExecutableSchema({ typeDefs: testSchemaWithUnions, resolvers, - resolverValidationOptions: { requireResolversForResolveType: true }, + resolverValidationOptions: { requireResolversForResolveType: 'error' }, }); } catch (error) { expect(error.message).toEqual( - 'Type "Displayable" is missing a "__resolveType" resolver. Pass false into "resolverValidationOptions.requireResolversForResolveType" to disable this error.', + `Type "Displayable" is missing a "__resolveType" resolver. Pass 'ignore' into "resolverValidationOptions.requireResolversForResolveType" to disable this error.`, ); return; } @@ -2762,7 +2766,7 @@ describe('unions', () => { const schema = makeExecutableSchema({ typeDefs: testSchemaWithUnions, resolvers, - resolverValidationOptions: { requireResolversForResolveType: true }, + resolverValidationOptions: { requireResolversForResolveType: 'error' }, }); const response = await graphql(schema, query); expect(response.errors).not.toBeDefined(); @@ -2774,7 +2778,7 @@ describe('unions', () => { makeExecutableSchema({ typeDefs: testSchemaWithUnions, resolvers, - resolverValidationOptions: { requireResolversForResolveType: false }, + resolverValidationOptions: { requireResolversForResolveType: 'ignore' }, }); }); }); diff --git a/packages/stitch/src/isolateComputedFields.ts b/packages/stitch/src/isolateComputedFields.ts index f070aa2d745..67bb2b89920 100644 --- a/packages/stitch/src/isolateComputedFields.ts +++ b/packages/stitch/src/isolateComputedFields.ts @@ -46,16 +46,9 @@ export function isolateComputedFields(subschemaConfig: SubschemaConfig): Array = []; - const transformedSubschemaConfigs: Map = new Map(); + let transformedSubschemas: Array = []; + const subschemaMap: Map = new Map(); + const originalSubschemaMap: Map = new Map(); subschemas.forEach(subschemaOrSubschemaArray => { if (Array.isArray(subschemaOrSubschemaArray)) { subschemaOrSubschemaArray.forEach(s => { - schemaLikeObjects = schemaLikeObjects.concat( - applySubschemaConfigTransforms(subschemaConfigTransforms, s, transformedSubschemaConfigs) + transformedSubschemas = transformedSubschemas.concat( + applySubschemaConfigTransforms(subschemaConfigTransforms, s, subschemaMap, originalSubschemaMap) ); }); } else { - schemaLikeObjects = schemaLikeObjects.concat( + transformedSubschemas = transformedSubschemas.concat( applySubschemaConfigTransforms( subschemaConfigTransforms, subschemaOrSubschemaArray, - transformedSubschemaConfigs + subschemaMap, + originalSubschemaMap ) ); } }); - // to be removed in v7 - schemas.forEach(schemaLikeObject => { - if ( - !isSchema(schemaLikeObject) && - !isSubschemaConfig(schemaLikeObject) && - typeof schemaLikeObject !== 'string' && - !isDocumentNode(schemaLikeObject) && - !Array.isArray(schemaLikeObject) - ) { - throw new Error('Invalid schema passed'); - } - }); - - // to be removed in v7 - schemas.forEach(schemaLikeObject => { - if (isSchema(schemaLikeObject) || isSubschemaConfig(schemaLikeObject)) { - schemaLikeObjects.push(schemaLikeObject); - } - }); - - if ((typeDefs && !Array.isArray(typeDefs)) || (Array.isArray(typeDefs) && typeDefs.length)) { - schemaLikeObjects.push(buildDocumentFromTypeDefinitions(typeDefs, parseOptions)); - } - - // to be removed in v7 - schemas.forEach(schemaLikeObject => { - if (typeof schemaLikeObject === 'string' || isDocumentNode(schemaLikeObject)) { - schemaLikeObjects.push(buildDocumentFromTypeDefinitions(schemaLikeObject, parseOptions)); - } - }); - - if (types != null) { - schemaLikeObjects = schemaLikeObjects.concat(types); - } - - // to be removed in v7 - schemas.forEach(schemaLikeObject => { - if (Array.isArray(schemaLikeObject)) { - schemaLikeObjects = schemaLikeObjects.concat(schemaLikeObject); - } - }); - - const transformedSchemas: Map = new Map(); const extensions: Array = []; const directives: Array = []; const directiveMap: Record = specifiedDirectives.reduce((acc, directive) => { @@ -134,8 +90,11 @@ export function stitchSchemas({ }; const typeCandidates = buildTypeCandidates({ - schemaLikeObjects, - transformedSchemas, + subschemas: transformedSubschemas, + originalSubschemaMap, + types, + typeDefs, + parseOptions, extensions, directiveMap, schemaDefs, @@ -147,10 +106,11 @@ export function stitchSchemas({ directives.push(directiveMap[directiveName]); }); - let stitchingInfo = createStitchingInfo(transformedSubschemaConfigs, transformedSchemas, typeCandidates, mergeTypes); + let stitchingInfo = createStitchingInfo(subschemaMap, typeCandidates, mergeTypes); - const typeMap = buildTypeMap({ + const { typeMap: newTypeMap, directives: newDirectives } = buildTypes({ typeCandidates, + directives, stitchingInfo, operationTypeNames, onTypeConflict, @@ -158,8 +118,6 @@ export function stitchSchemas({ typeMergingOptions, }); - const { typeMap: newTypeMap, directives: newDirectives } = rewireTypes(typeMap, directives, { skipPruning: true }); - let schema = new GraphQLSchema({ query: newTypeMap[operationTypeNames.query] as GraphQLObjectType, mutation: newTypeMap[operationTypeNames.mutation] as GraphQLObjectType, @@ -229,8 +187,9 @@ export function stitchSchemas({ function applySubschemaConfigTransforms( subschemaConfigTransforms: Array, subschemaOrSubschemaConfig: GraphQLSchema | SubschemaConfig, - transformedSubschemaConfigs: Map -): Array { + subschemaMap: Map, + originalSubschemaMap: Map +): Array { const subschemaConfig = isSubschemaConfig(subschemaOrSubschemaConfig) ? subschemaOrSubschemaConfig : { schema: subschemaOrSubschemaConfig }; @@ -239,13 +198,17 @@ function applySubschemaConfigTransforms( return subschemaConfigTransform(acc); }, subschemaConfig); - const subschemas = isolateComputedFields(newSubschemaConfig); + const transformedSubschemas = isolateComputedFields(newSubschemaConfig).map( + subschemaConfig => new Subschema(subschemaConfig) + ); + + const baseSubschema = transformedSubschemas[0]; - const baseSubschema = subschemas[0]; + subschemaMap.set(subschemaOrSubschemaConfig, baseSubschema); - transformedSubschemaConfigs.set(subschemaConfig, baseSubschema); + transformedSubschemas.forEach(subschema => originalSubschemaMap.set(subschema, subschemaOrSubschemaConfig)); - return subschemas; + return transformedSubschemas; } export function isDocumentNode(object: any): object is DocumentNode { diff --git a/packages/stitch/src/stitchingInfo.ts b/packages/stitch/src/stitchingInfo.ts index 03e64f3305b..7e169344a79 100644 --- a/packages/stitch/src/stitchingInfo.ts +++ b/packages/stitch/src/stitchingInfo.ts @@ -14,24 +14,16 @@ import { isLeafType, } from 'graphql'; -import { - parseFragmentToInlineFragment, - concatInlineFragments, - parseSelectionSet, - TypeMap, - IResolvers, - IFieldResolverOptions, -} from '@graphql-tools/utils'; +import { parseSelectionSet, TypeMap, IResolvers, IFieldResolverOptions } from '@graphql-tools/utils'; -import { delegateToSchema, isSubschemaConfig, SubschemaConfig } from '@graphql-tools/delegate'; +import { delegateToSchema, Subschema, SubschemaConfig } from '@graphql-tools/delegate'; import { batchDelegateToSchema } from '@graphql-tools/batch-delegate'; import { MergeTypeCandidate, MergedTypeInfo, StitchingInfo, MergeTypeFilter } from './types'; export function createStitchingInfo( - transformedSubschemaConfigs: Map, - transformedSchemas: Map, + subschemaMap: Map, typeCandidates: Record>, mergeTypes?: boolean | Array | MergeTypeFilter ): StitchingInfo { @@ -83,9 +75,7 @@ export function createStitchingInfo( }); return { - transformedSubschemaConfigs, - transformedSchemas, - fragmentsByField: undefined, + subschemaMap, selectionSetsByField, dynamicSelectionSetsByField: undefined, mergedTypes, @@ -105,10 +95,9 @@ function createMergedTypes( ) { const typeCandidatesWithMergedTypeConfig = typeCandidates[typeName].filter( typeCandidate => - typeCandidate.subschema != null && - isSubschemaConfig(typeCandidate.subschema) && - typeCandidate.subschema.merge != null && - typeName in typeCandidate.subschema.merge + typeCandidate.transformedSubschema != null && + typeCandidate.transformedSubschema.merge != null && + typeName in typeCandidate.transformedSubschema.merge ); if ( @@ -117,25 +106,21 @@ function createMergedTypes( (Array.isArray(mergeTypes) && mergeTypes.includes(typeName)) || typeCandidatesWithMergedTypeConfig.length ) { - const targetSubschemas: Array = []; + const targetSubschemas: Array = []; const typeMaps: Map = new Map(); - const supportedBySubschemas: Record> = Object.create({}); - const selectionSets: Map = new Map(); - const fieldSelectionSets: Map> = new Map(); + const supportedBySubschemas: Record> = Object.create({}); + const selectionSets: Map = new Map(); + const fieldSelectionSets: Map> = new Map(); typeCandidates[typeName].forEach(typeCandidate => { - const subschema = typeCandidate.subschema; + const subschema = typeCandidate.transformedSubschema; if (subschema == null) { return; } - typeMaps.set(subschema, typeCandidate.transformedSchema.getTypeMap()); - - if (!isSubschemaConfig(subschema)) { - return; - } + typeMaps.set(subschema, subschema.transformedSchema.getTypeMap()); const mergedTypeConfig = subschema?.merge?.[typeName]; @@ -179,7 +164,7 @@ function createMergedTypes( operation: 'query', fieldName: mergedTypeConfig.fieldName, key: mergedTypeConfig.key(originalResult), - argsFromKeys: mergedTypeConfig.argsFromKeys ?? mergedTypeConfig.args, + argsFromKeys: mergedTypeConfig.argsFromKeys, valuesFromResults: mergedTypeConfig.valuesFromResults, selectionSet, context, @@ -209,7 +194,7 @@ function createMergedTypes( return; } - const type = typeCandidate.transformedSchema.getType(typeName) as GraphQLObjectType | GraphQLInterfaceType; + const type = subschema.transformedSchema.getType(typeName) as GraphQLObjectType | GraphQLInterfaceType; const fieldMap = type.getFields(); const selectionSet = selectionSets.get(subschema); Object.keys(fieldMap).forEach(fieldName => { @@ -226,9 +211,9 @@ function createMergedTypes( }); const sourceSubschemas = typeCandidates[typeName] - .filter(typeCandidate => typeCandidate.subschema != null) - .map(typeCandidate => typeCandidate.subschema); - const targetSubschemasBySubschema: Map> = new Map(); + .filter(typeCandidate => typeCandidate.transformedSubschema != null) + .map(typeCandidate => typeCandidate.transformedSubschema); + const targetSubschemasBySubschema: Map> = new Map(); sourceSubschemas.forEach(subschema => { const filteredSubschemas = targetSubschemas.filter(s => s !== subschema); if (filteredSubschemas.length) { @@ -263,7 +248,6 @@ function createMergedTypes( export function completeStitchingInfo(stitchingInfo: StitchingInfo, resolvers: IResolvers): StitchingInfo { const selectionSetsByField = stitchingInfo.selectionSetsByField; const dynamicSelectionSetsByField = Object.create(null); - const rawFragments: Array<{ field: string; fragment: string }> = []; Object.keys(resolvers).forEach(typeName => { const type = resolvers[typeName]; @@ -300,12 +284,6 @@ export function completeStitchingInfo(stitchingInfo: StitchingInfo, resolvers: I ].selections.concat(selectionSet.selections); } } - if (field.fragment) { - rawFragments.push({ - field: fieldName, - fragment: field.fragment, - }); - } }); }); @@ -321,34 +299,8 @@ export function completeStitchingInfo(stitchingInfo: StitchingInfo, resolvers: I }); }); - const parsedFragments = Object.create(null); - rawFragments.forEach(({ field, fragment }) => { - const parsedFragment = parseFragmentToInlineFragment(fragment); - const actualTypeName = parsedFragment.typeCondition.name.value; - if (!(actualTypeName in parsedFragments)) { - parsedFragments[actualTypeName] = Object.create(null); - } - - if (!(field in parsedFragments[actualTypeName])) { - parsedFragments[actualTypeName][field] = []; - } - parsedFragments[actualTypeName][field].push(parsedFragment); - }); - - const fragmentsByField = Object.create(null); - Object.keys(parsedFragments).forEach(typeName => { - Object.keys(parsedFragments[typeName]).forEach(field => { - if (!(typeName in fragmentsByField)) { - fragmentsByField[typeName] = Object.create(null); - } - - fragmentsByField[typeName][field] = concatInlineFragments(typeName, parsedFragments[typeName][field]); - }); - }); - stitchingInfo.selectionSetsByField = selectionSetsByField; stitchingInfo.dynamicSelectionSetsByField = dynamicSelectionSetsByField; - stitchingInfo.fragmentsByField = fragmentsByField; return stitchingInfo; } diff --git a/packages/stitch/src/typeCandidates.ts b/packages/stitch/src/typeCandidates.ts index fb4c75bfabb..05c56afcd82 100644 --- a/packages/stitch/src/typeCandidates.ts +++ b/packages/stitch/src/typeCandidates.ts @@ -1,19 +1,19 @@ import { DocumentNode, GraphQLNamedType, - GraphQLSchema, getNamedType, isNamedType, GraphQLDirective, - ASTNode, - isSchema, SchemaDefinitionNode, SchemaExtensionNode, isSpecifiedScalarType, + GraphQLSchema, } from 'graphql'; import { wrapSchema } from '@graphql-tools/wrap'; -import { isSubschemaConfig, SubschemaConfig } from '@graphql-tools/delegate'; +import { Subschema, SubschemaConfig } from '@graphql-tools/delegate'; +import { GraphQLParseOptions, ITypeDefinitions, rewireTypes, TypeMap } from '@graphql-tools/utils'; +import { buildDocumentFromTypeDefinitions } from '@graphql-tools/schema'; import { extractTypeDefinitions, @@ -25,26 +25,27 @@ import { import typeFromAST from './typeFromAST'; import { MergeTypeCandidate, MergeTypeFilter, OnTypeConflict, StitchingInfo, TypeMergingOptions } from './types'; -import { TypeMap } from '@graphql-tools/utils'; import { mergeCandidates } from './mergeCandidates'; type CandidateSelector = (candidates: Array) => MergeTypeCandidate; -function isDocumentNode(schemaLikeObject: any): schemaLikeObject is DocumentNode { - return (schemaLikeObject as ASTNode).kind !== undefined; -} - export function buildTypeCandidates({ - schemaLikeObjects, - transformedSchemas, + subschemas, + originalSubschemaMap, + types, + typeDefs, + parseOptions, extensions, directiveMap, schemaDefs, operationTypeNames, mergeDirectives, }: { - schemaLikeObjects: Array; - transformedSchemas: Map; + subschemas: Array; + originalSubschemaMap: Map; + types: Array; + typeDefs: ITypeDefinitions; + parseOptions: GraphQLParseOptions; extensions: Array; directiveMap: Record; schemaDefs: { @@ -59,92 +60,84 @@ export function buildTypeCandidates({ let schemaDef: SchemaDefinitionNode; let schemaExtensions: Array = []; - schemaLikeObjects.forEach(schemaLikeObject => { - if (isDocumentNode(schemaLikeObject)) { - schemaDef = extractSchemaDefinition(schemaLikeObject); - schemaExtensions = schemaExtensions.concat(extractSchemaExtensions(schemaLikeObject)); - } - }); + let document: DocumentNode; + if ((typeDefs && !Array.isArray(typeDefs)) || (Array.isArray(typeDefs) && typeDefs.length)) { + document = buildDocumentFromTypeDefinitions(typeDefs, parseOptions); + schemaDef = extractSchemaDefinition(document); + schemaExtensions = schemaExtensions.concat(extractSchemaExtensions(document)); + } schemaDefs.schemaDef = schemaDef; schemaDefs.schemaExtensions = schemaExtensions; setOperationTypeNames(schemaDefs, operationTypeNames); - schemaLikeObjects.forEach(schemaLikeObject => { - if (isSchema(schemaLikeObject) || isSubschemaConfig(schemaLikeObject)) { - const schema = wrapSchema(schemaLikeObject); - - transformedSchemas.set(schemaLikeObject, schema); - - const operationTypes = { - query: schema.getQueryType(), - mutation: schema.getMutationType(), - subscription: schema.getSubscriptionType(), - }; + subschemas.forEach(subschema => { + const schema = wrapSchema(subschema); + + const operationTypes = { + query: schema.getQueryType(), + mutation: schema.getMutationType(), + subscription: schema.getSubscriptionType(), + }; + + Object.keys(operationTypes).forEach(operationType => { + if (operationTypes[operationType] != null) { + addTypeCandidate(typeCandidates, operationTypeNames[operationType], { + type: operationTypes[operationType], + subschema: originalSubschemaMap.get(subschema), + transformedSubschema: subschema, + }); + } + }); - Object.keys(operationTypes).forEach(operationType => { - if (operationTypes[operationType] != null) { - addTypeCandidate(typeCandidates, operationTypeNames[operationType], { - type: operationTypes[operationType], - subschema: schemaLikeObject, - transformedSchema: schema, - }); - } + if (mergeDirectives) { + schema.getDirectives().forEach(directive => { + directiveMap[directive.name] = directive; }); + } - if (mergeDirectives) { - schema.getDirectives().forEach(directive => { - directiveMap[directive.name] = directive; + const originalTypeMap = schema.getTypeMap(); + Object.keys(originalTypeMap).forEach(typeName => { + const type: GraphQLNamedType = originalTypeMap[typeName]; + if ( + isNamedType(type) && + getNamedType(type).name.slice(0, 2) !== '__' && + type !== operationTypes.query && + type !== operationTypes.mutation && + type !== operationTypes.subscription + ) { + addTypeCandidate(typeCandidates, type.name, { + type, + subschema: originalSubschemaMap.get(subschema), + transformedSubschema: subschema, }); } + }); + }); - const originalTypeMap = schema.getTypeMap(); - Object.keys(originalTypeMap).forEach(typeName => { - const type: GraphQLNamedType = originalTypeMap[typeName]; - if ( - isNamedType(type) && - getNamedType(type).name.slice(0, 2) !== '__' && - type !== operationTypes.query && - type !== operationTypes.mutation && - type !== operationTypes.subscription - ) { - addTypeCandidate(typeCandidates, type.name, { - type, - subschema: schemaLikeObject, - transformedSchema: schema, - }); - } - }); - } else if (isDocumentNode(schemaLikeObject)) { - const typesDocument = extractTypeDefinitions(schemaLikeObject); - typesDocument.definitions.forEach(def => { - const type = typeFromAST(def) as GraphQLNamedType; - if (type != null) { - addTypeCandidate(typeCandidates, type.name, { - type, - }); - } - }); + if (document !== undefined) { + const typesDocument = extractTypeDefinitions(document); + typesDocument.definitions.forEach(def => { + const type = typeFromAST(def) as GraphQLNamedType; + if (type != null) { + addTypeCandidate(typeCandidates, type.name, { type }); + } + }); - const directivesDocument = extractDirectiveDefinitions(schemaLikeObject); - directivesDocument.definitions.forEach(def => { - const directive = typeFromAST(def) as GraphQLDirective; - directiveMap[directive.name] = directive; - }); + const directivesDocument = extractDirectiveDefinitions(document); + directivesDocument.definitions.forEach(def => { + const directive = typeFromAST(def) as GraphQLDirective; + directiveMap[directive.name] = directive; + }); - const extensionsDocument = extractTypeExtensionDefinitions(schemaLikeObject); - if (extensionsDocument.definitions.length > 0) { - extensions.push(extensionsDocument); - } - } else if (isNamedType(schemaLikeObject)) { - addTypeCandidate(typeCandidates, schemaLikeObject.name, { - type: schemaLikeObject, - }); - } else { - throw new Error(`Invalid object ${schemaLikeObject as string}`); + const extensionsDocument = extractTypeExtensionDefinitions(document); + if (extensionsDocument.definitions.length > 0) { + extensions.push(extensionsDocument); } - }); + } + + types.forEach(type => addTypeCandidate(typeCandidates, type.name, { type })); return typeCandidates; } @@ -184,8 +177,9 @@ function addTypeCandidate( typeCandidates[name].push(typeCandidate); } -export function buildTypeMap({ +export function buildTypes({ typeCandidates, + directives, stitchingInfo, operationTypeNames, onTypeConflict, @@ -193,12 +187,13 @@ export function buildTypeMap({ typeMergingOptions, }: { typeCandidates: Record>; + directives: Array; stitchingInfo: StitchingInfo; operationTypeNames: Record; onTypeConflict: OnTypeConflict; mergeTypes: boolean | Array | MergeTypeFilter; typeMergingOptions: TypeMergingOptions; -}): TypeMap { +}): { typeMap: TypeMap; directives: Array } { const typeMap: TypeMap = Object.create(null); Object.keys(typeCandidates).forEach(typeName => { @@ -221,7 +216,7 @@ export function buildTypeMap({ } }); - return typeMap; + return rewireTypes(typeMap, directives); } function onTypeConflictToCandidateSelector(onTypeConflict: OnTypeConflict): CandidateSelector { @@ -229,10 +224,12 @@ function onTypeConflictToCandidateSelector(onTypeConflict: OnTypeConflict): Cand cands.reduce((prev, next) => { const type = onTypeConflict(prev.type, next.type, { left: { - schema: prev.transformedSchema, + subschema: prev.subschema, + transformedSubschema: prev.transformedSubschema, }, right: { - schema: next.transformedSchema, + subschema: prev.subschema, + transformedSubschema: prev.transformedSubschema, }, }); if (prev.type === type) { diff --git a/packages/stitch/src/types.ts b/packages/stitch/src/types.ts index 45978d51136..56eab95045f 100644 --- a/packages/stitch/src/types.ts +++ b/packages/stitch/src/types.ts @@ -2,8 +2,6 @@ import { GraphQLNamedType, GraphQLSchema, SelectionSetNode, - DocumentNode, - InlineFragmentNode, FieldNode, GraphQLFieldConfig, GraphQLObjectType, @@ -12,13 +10,13 @@ import { GraphQLInputObjectType, } from 'graphql'; import { ITypeDefinitions, TypeMap } from '@graphql-tools/utils'; -import { SubschemaConfig } from '@graphql-tools/delegate'; +import { Subschema, SubschemaConfig } from '@graphql-tools/delegate'; import { IExecutableSchemaDefinition } from '@graphql-tools/schema'; export interface MergeTypeCandidate { type: GraphQLNamedType; subschema?: GraphQLSchema | SubschemaConfig; - transformedSchema?: GraphQLSchema; + transformedSubschema?: Subschema; } export interface MergeFieldConfigCandidate { @@ -26,7 +24,7 @@ export interface MergeFieldConfigCandidate { fieldName: string; type: GraphQLObjectType | GraphQLInterfaceType; subschema?: GraphQLSchema | SubschemaConfig; - transformedSchema?: GraphQLSchema; + transformedSubschema?: Subschema; } export interface MergeInputFieldConfigCandidate { @@ -34,37 +32,32 @@ export interface MergeInputFieldConfigCandidate { fieldName: string; type: GraphQLInputObjectType; subschema?: GraphQLSchema | SubschemaConfig; - transformedSchema?: GraphQLSchema; + transformedSubschema?: Subschema; } export type MergeTypeFilter = (mergeTypeCandidates: Array, typeName: string) => boolean; export interface MergedTypeInfo { typeName: string; - targetSubschemas: Map>; - uniqueFields: Record; - nonUniqueFields: Record>; + targetSubschemas: Map>; + uniqueFields: Record; + nonUniqueFields: Record>; typeMaps: Map; - selectionSets: Map; - fieldSelectionSets: Map>; + selectionSets: Map; + fieldSelectionSets: Map>; } export interface StitchingInfo { - transformedSubschemaConfigs: Map; - transformedSchemas: Map; - fragmentsByField: Record>; + subschemaMap: Map; selectionSetsByField: Record>; dynamicSelectionSetsByField: Record SelectionSetNode>>>; mergedTypes: Record; } -export type SchemaLikeObject = SubschemaConfig | GraphQLSchema | string | DocumentNode | Array; - export interface IStitchSchemasOptions extends Omit, 'typeDefs'> { subschemas?: Array>; typeDefs?: ITypeDefinitions; types?: Array; - schemas?: Array; onTypeConflict?: OnTypeConflict; mergeDirectives?: boolean; mergeTypes?: boolean | Array | MergeTypeFilter; @@ -85,10 +78,12 @@ export type OnTypeConflict = ( right: GraphQLNamedType, info?: { left: { - schema?: GraphQLSchema | SubschemaConfig; + subschema?: GraphQLSchema | SubschemaConfig; + transformedSubschema?: Subschema; }; right: { - schema?: GraphQLSchema | SubschemaConfig; + subschema?: GraphQLSchema | SubschemaConfig; + transformedSubschema?: Subschema; }; } ) => GraphQLNamedType; diff --git a/packages/stitch/tests/alternateStitchSchemas.test.ts b/packages/stitch/tests/alternateStitchSchemas.test.ts index 6a885046882..cd16a289670 100644 --- a/packages/stitch/tests/alternateStitchSchemas.test.ts +++ b/packages/stitch/tests/alternateStitchSchemas.test.ts @@ -20,7 +20,6 @@ import { RenameRootFields, RenameObjectFields, TransformObjectFields, - ExtendSchema, WrapType, WrapFields, HoistField, @@ -31,26 +30,13 @@ import { PruneSchema, } from '@graphql-tools/wrap'; -import { - delegateToSchema, - createMergedResolver, - SubschemaConfig -} from '@graphql-tools/delegate'; - +import { delegateToSchema, SubschemaConfig } from '@graphql-tools/delegate'; import { makeExecutableSchema } from '@graphql-tools/schema'; import { addMocksToSchema } from '@graphql-tools/mock'; -import { - wrapFieldNode, - renameFieldNode, - hoistFieldNodes, - filterSchema, - ExecutionResult, -} from '@graphql-tools/utils'; +import { filterSchema, ExecutionResult } from '@graphql-tools/utils'; import { stitchSchemas } from '../src/stitchSchemas'; -import { forAwaitEach } from './forAwaitEach'; - import { bookingSchema, propertySchema, @@ -121,6 +107,7 @@ describe('merge schemas through transforms', () => { new RenameRootFields( (_operation: string, name: string) => `Properties_${name}`, ), + new PruneSchema(), ]; const bookingSchemaTransforms = [ new FilterRootFields( @@ -131,6 +118,7 @@ describe('merge schemas through transforms', () => { new RenameRootFields( (_operation: string, name: string) => `Bookings_${name}`, ), + new PruneSchema(), ]; const subscriptionSchemaTransforms = [ new FilterRootFields( @@ -143,6 +131,7 @@ describe('merge schemas through transforms', () => { new RenameRootFields( (_operation: string, name: string) => `Subscriptions_${name}`, ), + new PruneSchema(), ]; const propertySubschema = { @@ -318,7 +307,7 @@ describe('merge schemas through transforms', () => { }); }); - test('local subscriptions should work even if root fields are renamed', (done) => { + test('local subscriptions should work even if root fields are renamed', async () => { const originalNotification = { notifications: { text: 'Hello world', @@ -331,70 +320,62 @@ describe('merge schemas through transforms', () => { }; const subscription = parse(` - subscription Subscription { - Subscriptions_notifications { - text - } + subscription Subscription { + Subscriptions_notifications { + text } - `); - - let notificationCnt = 0; - subscribe(stitchedSchema, subscription) - .then((results) => { - forAwaitEach( - results as AsyncIterable, - (result: ExecutionResult) => { - expect(result).toHaveProperty('data'); - expect(result.data).toEqual(transformedNotification); - if (!notificationCnt++) { - return done(); - } - }, - ).catch(done); - }) - .then(() => - subscriptionPubSub.publish( - subscriptionPubSubTrigger, - originalNotification, - ), - ) - .catch(done); + } + `); + + const sub = await subscribe(stitchedSchema, subscription) as AsyncIterableIterator; + + const payload = sub.next(); + + await subscriptionPubSub.publish( + subscriptionPubSubTrigger, + originalNotification, + ); + + expect(await payload).toEqual({ done: false, value: { data: transformedNotification } } ); }); }); describe('transform object fields', () => { test('should work to add a resolver', async () => { - const transformedPropertySchema = wrapSchema(propertySchema, [ - new TransformObjectFields( - ( - typeName: string, - fieldName: string, - fieldConfig: GraphQLFieldConfig, - ) => { - if (typeName !== 'Property' || fieldName !== 'name') { - return undefined; - } - return { - ...fieldConfig, - description: fieldConfig.deprecationReason, - resolve: () => 'test', - }; - }, - (typeName: string, fieldName: string, fieldNode: FieldNode) => { - if (typeName !== 'Property' || fieldName !== 'name') { - return fieldNode; - } - const newFieldNode = { - ...fieldNode, - name: { - ...fieldNode.name, - value: 'id', - }, - }; - return newFieldNode; - }, - ), - ]); + const transformedPropertySchema = wrapSchema({ + schema: propertySchema, + transforms: [ + new TransformObjectFields( + ( + typeName: string, + fieldName: string, + fieldConfig: GraphQLFieldConfig, + ) => { + if (typeName !== 'Property' || fieldName !== 'name') { + return undefined; + } + return { + ...fieldConfig, + description: fieldConfig.deprecationReason, + resolve: () => 'test', + }; + }, + (typeName: string, fieldName: string, fieldNode: FieldNode) => { + if (typeName !== 'Property' || fieldName !== 'name') { + return fieldNode; + } + const newFieldNode = { + ...fieldNode, + name: { + ...fieldNode.name, + value: 'id', + }, + }; + return newFieldNode; + }, + ), + ], + }); const result = await graphql( transformedPropertySchema, @@ -448,7 +429,7 @@ describe('optional arguments', () => { }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], }); it('work with schema stitching', async () => { @@ -509,32 +490,35 @@ describe('optional arguments', () => { describe('default values', () => { test('should work to add a default value even when renaming root fields', async () => { - const transformedPropertySchema = wrapSchema(propertySchema, [ - new TransformRootFields( - ( - typeName: string, - fieldName: string, - fieldConfig: GraphQLFieldConfig, - ) => { - if (typeName === 'Query' && fieldName === 'jsonTest') { - return [ - 'renamedJsonTest', - { - ...fieldConfig, - description: fieldConfig.deprecationReason, - args: { - ...fieldConfig.args, - input: { - ...fieldConfig.args.input, - defaultValue: { test: 'test' } + const transformedPropertySchema = wrapSchema({ + schema: propertySchema, + transforms: [ + new TransformRootFields( + ( + typeName: string, + fieldName: string, + fieldConfig: GraphQLFieldConfig, + ) => { + if (typeName === 'Query' && fieldName === 'jsonTest') { + return [ + 'renamedJsonTest', + { + ...fieldConfig, + description: fieldConfig.deprecationReason, + args: { + ...fieldConfig.args, + input: { + ...fieldConfig.args.input, + defaultValue: { test: 'test' } + } } } - } - ]; - } - }, - ), - ]); + ]; + } + }, + ), + ], + }); const result = await graphql( transformedPropertySchema, @@ -588,20 +572,23 @@ describe('rename fields that implement interface fields', () => { }, }); - const wrappedSchema = wrapSchema(originalSchema, [ - new RenameRootFields((_operation, fieldName) => { - if (fieldName === 'node') { - return '_node'; - } - return fieldName; - }), - new RenameInterfaceFields((typeName, fieldName) => { - if (typeName === 'Item' && fieldName === 'node') { - return '_node'; - } - return fieldName; - }), - ]); + const wrappedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RenameRootFields((_operation, fieldName) => { + if (fieldName === 'node') { + return '_node'; + } + return fieldName; + }), + new RenameInterfaceFields((typeName, fieldName) => { + if (typeName === 'Item' && fieldName === 'node') { + return '_node'; + } + return fieldName; + }), + ], + }); const originalQuery = ` query { @@ -674,32 +661,35 @@ describe('transform object fields', () => { }, }); - schema = wrapSchema(itemSchema, [ - new FilterObjectFields((_typeName, fieldName) => { - if (fieldName === 'id') { - return false; - } - return true; - }), - new RenameRootFields((_operation, fieldName) => { - if (fieldName === 'allItems') { - return 'items'; - } - return fieldName; - }), - new RenameObjectFields((_typeName, fieldName) => { - if (fieldName === 'camel_case') { - return 'camelCase'; - } - return fieldName; - }), - new RenameObjectFields((_typeName, fieldName) => { - if (fieldName === 'camelCase') { - return 'prefixCamelCase'; - } - return fieldName; - }), - ]); + schema = wrapSchema({ + schema: itemSchema, + transforms: [ + new FilterObjectFields((_typeName, fieldName) => { + if (fieldName === 'id') { + return false; + } + return true; + }), + new RenameRootFields((_operation, fieldName) => { + if (fieldName === 'allItems') { + return 'items'; + } + return fieldName; + }), + new RenameObjectFields((_typeName, fieldName) => { + if (fieldName === 'camel_case') { + return 'camelCase'; + } + return fieldName; + }), + new RenameObjectFields((_typeName, fieldName) => { + if (fieldName === 'camelCase') { + return 'prefixCamelCase'; + } + return fieldName; + }), + ], + }); }); test('renaming should work', async () => { @@ -778,15 +768,18 @@ describe('filter and rename object fields', () => { beforeAll(() => { transformedPropertySchema = filterSchema({ - schema: wrapSchema(propertySchema, [ - new RenameTypes((name: string) => `New_${name}`), - new RenameObjectFields((typeName: string, fieldName: string) => - typeName === 'New_Property' ? `new_${fieldName}` : fieldName, - ), - ]), + schema: wrapSchema({ + schema: propertySchema, + transforms: [ + new RenameTypes((name: string) => `New_${name}`), + new RenameObjectFields((typeName: string, fieldName: string) => + typeName === 'New_Property' ? `new_${fieldName}` : fieldName, + ), + ], + }), rootFieldFilter: (operation: string, fieldName: string) => `${operation}.${fieldName}` === 'Query.propertyById', - fieldFilter: (typeName: string, fieldName: string) => + objectFieldFilter: (typeName: string, fieldName: string) => typeName === 'New_Property' || fieldName === 'name', typeFilter: (typeName: string, type) => typeName === 'New_Property' || @@ -934,20 +927,23 @@ describe('rename nested object fields with interfaces', () => { }, }); - const transformedSchema = wrapSchema(originalSchema, [ - new RenameObjectFields((typeName, fieldName) => { - if (typeName === 'Query') { - return fieldName; - } + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RenameObjectFields((typeName, fieldName) => { + if (typeName === 'Query') { + return fieldName; + } - // Remote uses leading underscores for special fields. Leave them alone. - if (fieldName[0] === '_') { - return fieldName; - } + // Remote uses leading underscores for special fields. Leave them alone. + if (fieldName[0] === '_') { + return fieldName; + } - return fieldName.toUpperCase(); - }), - ]); + return fieldName.toUpperCase(); + }), + ], + }); const originalQuery = ` query { @@ -991,9 +987,12 @@ describe('rename nested object fields with interfaces', () => { describe('WrapType', () => { test('Query transform should work', async () => { - const transformedBookingSchema = wrapSchema(bookingSchema, [ - new WrapType('Query', 'Namespace_Query', 'namespace'), - ]); + const transformedBookingSchema = wrapSchema({ + schema: bookingSchema, + transforms: [ + new WrapType('Query', 'Namespace_Query', 'namespace'), + ], + }); const result = await graphql( transformedBookingSchema, ` @@ -1044,9 +1043,12 @@ describe('WrapType', () => { }); test('Mutation transform should work', async () => { - const transformedBookingSchema = wrapSchema(bookingSchema, [ - new WrapType('Mutation', 'Namespace_Mutation', 'namespace'), - ]); + const transformedBookingSchema = wrapSchema({ + schema: bookingSchema, + transforms: [ + new WrapType('Mutation', 'Namespace_Mutation', 'namespace'), + ], + }); const result = await graphql( transformedBookingSchema, ` @@ -1169,80 +1171,13 @@ describe('WrapType', () => { }); describe('schema transformation with extraction of nested fields', () => { - test('should work via ExtendSchema transform', async () => { - const transformedPropertySchema = wrapSchema(propertySchema, [ - new ExtendSchema({ - typeDefs: ` - extend type Property { - locationName: String - renamedError: String - } - `, - resolvers: { - Property: { - locationName: createMergedResolver({ fromPath: ['location'] }), - }, - }, - fieldNodeTransformerMap: { - Property: { - locationName: (fieldNode) => - wrapFieldNode(renameFieldNode(fieldNode, 'name'), ['location']), - renamedError: (fieldNode) => renameFieldNode(fieldNode, 'error'), - }, - }, - }), - ]); - - const result = await graphql( - transformedPropertySchema, - ` - query($pid: ID!) { - propertyById(id: $pid) { - id - name - test: locationName - renamedError - } - } - `, - {}, - {}, - { - pid: 'p1', - }, - ); - - const expectedResult: any = { - data: { - propertyById: { - id: 'p1', - name: 'Super great hotel', - test: 'Helsinki', - renamedError: null, - }, - }, - errors: [ - { - locations: [ - { - column: 13, - line: 7, - }, - ], - message: 'Property.error error', - path: ['propertyById', 'renamedError'], - }, - ], - }; - expectedResult.errors[0].extensions = { code: 'SOME_CUSTOM_CODE' }; - - expect(result).toEqual(expectedResult); - }); - test('should work via HoistField transform', async () => { - const transformedPropertySchema = wrapSchema(propertySchema, [ - new HoistField('Property', ['location', 'name'], 'locationName'), - ]); + const transformedPropertySchema = wrapSchema({ + schema: propertySchema, + transforms: [ + new HoistField('Property', ['location', 'name'], 'locationName'), + ], + }); const result = await graphql( transformedPropertySchema, @@ -1268,6 +1203,7 @@ describe('schema transformation with extraction of nested fields', () => { }, }); }); + }); describe('HoistField transform', () => { @@ -1362,122 +1298,39 @@ describe('HoistField transform', () => { expect(result).toEqual(expectedResult); }); -}); -describe('schema transformation with wrapping of object fields', () => { - test('should work via ExtendSchema transform', async () => { - const transformedPropertySchema = wrapSchema(propertySchema, [ - new ExtendSchema({ - typeDefs: ` - extend type Property { - outerWrap: OuterWrap - } - - type OuterWrap { - innerWrap: InnerWrap - } + test('should work to hoist fields to new root fields', async () => { + const wrappedSchema = wrapSchema({ + schema, + transforms: [new HoistField('Query', ['query', 'inner', 'test'], 'hoisted'), new PruneSchema({})], + }) - type InnerWrap { - id: ID - name: String - error: String - } - `, - resolvers: { - Property: { - outerWrap: createMergedResolver({ dehoist: true }), - }, - }, - fieldNodeTransformerMap: { - Property: { - outerWrap: (fieldNode, fragments) => - hoistFieldNodes({ - fieldNode, - fieldNames: ['id', 'name', 'error'], - path: ['innerWrap'], - fragments, - }), - }, - }, - }), - ]); + const result = await graphql(wrappedSchema, '{ hoisted }'); - const result = await graphql( - transformedPropertySchema, - ` - query($pid: ID!) { - propertyById(id: $pid) { - test1: outerWrap { - innerWrap { - ...W1 - } - } - test2: outerWrap { - innerWrap { - ...W2 - } - } - } - } - fragment W1 on InnerWrap { - one: id - two: error - } - fragment W2 on InnerWrap { - one: name - } - `, - {}, - {}, - { - pid: 'p1', - }, - ); - - const expectedResult: any = { + const expectedResult = { data: { - propertyById: { - test1: { - innerWrap: { - one: 'p1', - two: null, - }, - }, - test2: { - innerWrap: { - one: 'Super great hotel', - }, - }, - }, + hoisted: 'test', }, - errors: [ - { - locations: [ - { - column: 11, - line: 18, - }, - ], - message: 'Property.error error', - path: ['propertyById', 'test1', 'innerWrap', 'two'], - }, - ], }; - expectedResult.errors[0].extensions = { code: 'SOME_CUSTOM_CODE' }; expect(result).toEqual(expectedResult); }); +}); +describe('schema transformation with wrapping of object fields', () => { describe('WrapFields transform', () => { - test('should work', async () => { - const transformedPropertySchema = wrapSchema(propertySchema, [ - new WrapFields( - 'Property', - ['outerWrap'], - ['OuterWrap'], - ['id', 'name', 'error'], - ), - ]); + test('should work to wrap fields even with errors', async () => { + const transformedPropertySchema = wrapSchema({ + schema: propertySchema, + transforms: [ + new WrapFields( + 'Property', + ['outerWrap'], + ['OuterWrap'], + ['id', 'name', 'error'], + ), + ], + }); const result = await graphql( transformedPropertySchema, @@ -1539,14 +1392,17 @@ describe('schema transformation with wrapping of object fields', () => { }); test('should work, even with multiple fields', async () => { - const transformedPropertySchema = wrapSchema(propertySchema, [ - new WrapFields( - 'Property', - ['outerWrap', 'innerWrap'], - ['OuterWrap', 'InnerWrap'], - ['id', 'name', 'error'], - ), - ]); + const transformedPropertySchema = wrapSchema({ + schema: propertySchema, + transforms: [ + new WrapFields( + 'Property', + ['outerWrap', 'innerWrap'], + ['OuterWrap', 'InnerWrap'], + ['id', 'name', 'error'], + ), + ], + }); const result = await graphql( transformedPropertySchema, @@ -1657,70 +1513,6 @@ describe('schema transformation with wrapping of object fields', () => { }); }); -describe('schema transformation with renaming of object fields', () => { - let transformedPropertySchema: GraphQLSchema; - - beforeAll(() => { - transformedPropertySchema = wrapSchema(propertySchema, [ - new ExtendSchema({ - typeDefs: ` - extend type Property { - new_error: String - } - `, - fieldNodeTransformerMap: { - Property: { - // eslint-disable-next-line camelcase - new_error: (fieldNode) => renameFieldNode(fieldNode, 'error'), - }, - }, - }), - ]); - }); - - test('should work, even with aliases, and should preserve errors', async () => { - const result = await graphql( - transformedPropertySchema, - ` - query($pid: ID!) { - propertyById(id: $pid) { - new_error - } - } - `, - {}, - {}, - { - pid: 'p1', - }, - ); - - const expectedResult: any = { - data: { - propertyById: { - // eslint-disable-next-line camelcase - new_error: null, - }, - }, - errors: [ - { - locations: [ - { - column: 13, - line: 4, - }, - ], - message: 'Property.error error', - path: ['propertyById', 'new_error'], - }, - ], - }; - expectedResult.errors[0].extensions = { code: 'SOME_CUSTOM_CODE' }; - - expect(result).toEqual(expectedResult); - }); -}); - describe('interface resolver inheritance', () => { const testSchemaWithInterfaceResolvers = ` interface Node { @@ -1753,12 +1545,12 @@ describe('interface resolver inheritance', () => { test('copies resolvers from interface', async () => { const stitchedSchema = stitchSchemas({ - schemas: [ - // pull in an executable schema just so mergeSchema doesn't complain + subschemas: [ + // pull in an executable schema just so stitchSchemas doesn't complain // about not finding default types (e.g. ID) propertySchema, - testSchemaWithInterfaceResolvers, ], + typeDefs: testSchemaWithInterfaceResolvers, resolvers, inheritResolversFromInterfaces: true, }); @@ -1776,12 +1568,12 @@ describe('interface resolver inheritance', () => { test('does not copy resolvers from interface when flag is false', async () => { const stitchedSchema = stitchSchemas({ - schemas: [ + subschemas: [ // pull in an executable schema just so mergeSchema doesn't complain // about not finding default types (e.g. ID) propertySchema, - testSchemaWithInterfaceResolvers, ], + typeDefs: testSchemaWithInterfaceResolvers, resolvers, inheritResolversFromInterfaces: false, }); @@ -1796,12 +1588,12 @@ describe('interface resolver inheritance', () => { test('does not copy resolvers from interface when flag is not provided', async () => { const stitchedSchema = stitchSchemas({ - schemas: [ - // pull in an executable schema just so mergeSchema doesn't complain + subschemas: [ + // pull in an executable schema just so stitchSchemas doesn't complain // about not finding default types (e.g. ID) propertySchema, - testSchemaWithInterfaceResolvers, ], + typeDefs: testSchemaWithInterfaceResolvers, resolvers, }); const query = '{ user { id name } }'; @@ -1832,7 +1624,7 @@ describe('stitchSchemas', () => { }, }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], }); const query = '{ test { field } }'; @@ -1858,7 +1650,7 @@ describe('stitchSchemas', () => { }, }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], }); const query = '{ getInput(input: {}) }'; @@ -1904,7 +1696,7 @@ type Query { }, }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], resolvers: { TestScalar: new GraphQLScalarType({ name: 'TestScalar', @@ -1944,7 +1736,7 @@ type Query { }, }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], resolvers: { TestScalar: new GraphQLScalarType({ name: 'TestScalar', @@ -1979,14 +1771,12 @@ type Query { }, }); const stitchedSchema = stitchSchemas({ - schemas: [ - schema, - ` - type Query { - get2: WrappingType - } - `, - ], + subschemas: [schema], + typeDefs: ` + type Query { + get2: WrappingType + } + `, resolvers: { Query: { get2: (_root, _args, context, info) => @@ -2025,7 +1815,7 @@ type Query { }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], resolvers: { Query: { wrappingObject: () => ({ @@ -2095,9 +1885,10 @@ describe('onTypeConflict', () => { }); }); - test('by default takes last type', async () => { + test('takes last type if mergeTypes is false', async () => { const stitchedSchema = stitchSchemas({ - schemas: [schema1, schema2], + subschemas: [schema1, schema2], + mergeTypes: false, }); const result1 = await graphql(stitchedSchema, '{ test2 { fieldC } }'); expect(result1.data?.test2.fieldC).toBe('C'); @@ -2107,7 +1898,8 @@ describe('onTypeConflict', () => { test('can use onTypeConflict to select last type', async () => { const stitchedSchema = stitchSchemas({ - schemas: [schema1, schema2], + subschemas: [schema1, schema2], + mergeTypes: false, onTypeConflict: (_left, right) => right, }); const result1 = await graphql(stitchedSchema, '{ test2 { fieldC } }'); @@ -2118,7 +1910,8 @@ describe('onTypeConflict', () => { test('can use onTypeConflict to select first type', async () => { const stitchedSchema = stitchSchemas({ - schemas: [schema1, schema2], + subschemas: [schema1, schema2], + mergeTypes: false, onTypeConflict: (left) => left, }); const result1 = await graphql(stitchedSchema, '{ test1 { fieldB } }'); diff --git a/packages/stitch/tests/dataloader.test.ts b/packages/stitch/tests/dataloader.test.ts index 6dd53535503..f7692b3dbbe 100644 --- a/packages/stitch/tests/dataloader.test.ts +++ b/packages/stitch/tests/dataloader.test.ts @@ -49,7 +49,7 @@ describe('dataloader', () => { }); const schema = stitchSchemas({ - schemas: [taskSchema, userSchema], + subschemas: [taskSchema, userSchema], typeDefs: ` extend type Task { user: User! diff --git a/packages/stitch/tests/errors.test.ts b/packages/stitch/tests/errors.test.ts index c0caf77f734..498c979bd90 100644 --- a/packages/stitch/tests/errors.test.ts +++ b/packages/stitch/tests/errors.test.ts @@ -31,13 +31,14 @@ describe('passes along errors for missing fields on list', () => { }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], }); const query = '{ getOuter { innerList { mandatoryField } } }'; const originalResult = await graphql(schema, query); const stitchedResult = await graphql(stitchedSchema, query); expect(stitchedResult).toEqual(originalResult); + expect(stitchedResult.errors[0].path).toEqual(originalResult.errors[0].path); }); test('even if nullable', async () => { @@ -65,13 +66,14 @@ describe('passes along errors for missing fields on list', () => { }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], }); const query = '{ getOuter { innerList { mandatoryField } } }'; const originalResult = await graphql(schema, query); const stitchedResult = await graphql(stitchedSchema, query); expect(stitchedResult).toEqual(originalResult); + expect(stitchedResult.errors[0].path).toEqual(originalResult.errors[0].path); }); }); @@ -101,13 +103,14 @@ describe('passes along errors when list field errors', () => { }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], }); const query = '{ getOuter { innerList { mandatoryField } } }'; const originalResult = await graphql(schema, query); const stitchedResult = await graphql(stitchedSchema, query); expect(stitchedResult).toEqual(originalResult); + expect(stitchedResult.errors[0].path).toEqual(originalResult.errors[0].path); }); test('even if nullable', async () => { @@ -135,13 +138,45 @@ describe('passes along errors when list field errors', () => { }); const stitchedSchema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], }); const query = '{ getOuter { innerList { mandatoryField } } }'; const originalResult = await graphql(schema, query); const stitchedResult = await graphql(stitchedSchema, query); expect(stitchedResult).toEqual(originalResult); + expect(stitchedResult.errors[0].path).toEqual(originalResult.errors[0].path); + }); + + describe('passes along correct error when there are two non-null fields', () => { + test('should work', async () => { + const schema = makeExecutableSchema({ + typeDefs: ` + type Query { + getBoth: Both + } + type Both { + mandatoryField1: String! + mandatoryField2: String! + } + `, + resolvers: { + Query: { + getBoth: () => ({ mandatoryField1: 'test' }), + }, + }, + }); + + const stitchedSchema = stitchSchemas({ + subschemas: [schema], + }); + + const query = '{ getBoth { mandatoryField1 mandatoryField2 } }'; + const originalResult = await graphql(schema, query); + const stitchedResult = await graphql(stitchedSchema, query); + expect(stitchedResult).toEqual(originalResult); + expect(stitchedResult.errors[0].path).toEqual(originalResult.errors[0].path); + }); }); }); @@ -172,7 +207,7 @@ describe('passes along errors for remote schemas', () => { }) as ExecutionResult; const stitchedSchema = stitchSchemas({ - schemas: [{ + subschemas: [{ schema, executor, }] diff --git a/packages/stitch/tests/forAwaitEach.ts b/packages/stitch/tests/forAwaitEach.ts deleted file mode 100644 index 0f07f29be1b..00000000000 --- a/packages/stitch/tests/forAwaitEach.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable callback-return */ -/* eslint-disable @typescript-eslint/await-thenable */ - -function isAsyncIterable(obj: any): obj is AsyncIterable { - return Symbol.asyncIterator in obj; -} - -export async function forAwaitEach( - obj: AsyncIterable | T, - callback: (i: T) => any | Promise, -) { - if (isAsyncIterable(obj)) { - for await (const i of obj) { - await callback(i); - } - } else { - await callback(obj); - } -} diff --git a/packages/stitch/tests/fragments.test.ts b/packages/stitch/tests/fragments.test.ts index b2d441e499c..e58e1e066cd 100644 --- a/packages/stitch/tests/fragments.test.ts +++ b/packages/stitch/tests/fragments.test.ts @@ -78,7 +78,8 @@ describe('stitching', () => { let schema: GraphQLSchema; beforeAll(() => { schema = stitchSchemas({ - schemas: [bookingSchema, propertySchema, proxyTypeDefs], + subschemas: [bookingSchema, propertySchema], + typeDefs: proxyTypeDefs, resolvers: proxyResolvers, }); }); diff --git a/packages/stitch/tests/mergeFailures.test.ts b/packages/stitch/tests/mergeFailures.test.ts new file mode 100644 index 00000000000..2df0bb8f2c0 --- /dev/null +++ b/packages/stitch/tests/mergeFailures.test.ts @@ -0,0 +1,282 @@ +import { makeExecutableSchema } from '@graphql-tools/schema'; +import { stitchSchemas } from '@graphql-tools/stitch'; +import { ExecutionResult } from '@graphql-tools/utils'; +import { graphql, GraphQLError, GraphQLSchema } from 'graphql'; + +describe('merge failures', () => { + const firstSchema = makeExecutableSchema({ + typeDefs: ` + type Thing { + id: ID! + name: String! + } + type Query { + thing(id: ID!): Thing + } + `, + resolvers: { + Query: { + thing: (_root, { id }) => ({ id, name: 'The Thing' }), + } + } + }); + + const getGatewaySchema = (secondSchema: GraphQLSchema): GraphQLSchema => stitchSchemas({ + subschemas: [ + { + schema: firstSchema, + merge: { + Thing: { + selectionSet: '{ id }', + fieldName: 'thing', + args: ({ id }) => ({ id }), + } + } + }, + { + schema: secondSchema, + merge: { + Thing: { + selectionSet: '{ id }', + fieldName: '_thing', + args: ({ id }) => ({ id }), + } + } + }, + ], + mergeTypes: true + }); + + it('proxies merged errors', async () => { + const secondSchema = makeExecutableSchema({ + typeDefs: ` + type Thing { + id: ID! + description: String! + } + type Query { + _thing(id: ID!): Thing + } + `, + resolvers: { + Query: { + _thing: () => new Error('unable to produce the thing'), + } + } + }); + + const gatewaySchema = getGatewaySchema(secondSchema); + + const result = await graphql(gatewaySchema, ` + query { + thing(id: 23) { + id + name + description + } + } + `); + + const expectedResult: ExecutionResult = { + data: { thing: null }, + errors: [new GraphQLError('unable to produce the thing')], + } + + expect(result).toEqual(expectedResult); + }); + + it('proxies inappropriate null', async () => { + const secondSchema = makeExecutableSchema({ + typeDefs: ` + type Thing { + id: ID! + description: String! + } + type Query { + _thing(id: ID!): Thing + } + `, + resolvers: { + Query: { + _thing: () => null, + } + } + }); + + const gatewaySchema = getGatewaySchema(secondSchema); + + const result = await graphql(gatewaySchema, ` + query { + thing(id: 23) { + id + name + description + } + } + `); + + const expectedResult: ExecutionResult = { + data: { thing: null }, + errors: [new GraphQLError('Cannot return null for non-nullable field Thing.description.')], + } + + expect(result).toEqual(expectedResult); + }); + + it('proxies errors on object', async () => { + const secondSchema = makeExecutableSchema({ + typeDefs: ` + type Thing { + id: ID! + description: String! + } + type Query { + _thing(id: ID!): Thing + } + `, + resolvers: { + Query: { + _thing: () => ({}), + } + } + }); + + const gatewaySchema = getGatewaySchema(secondSchema); + + const result = await graphql(gatewaySchema, ` + query { + thing(id: 23) { + id + name + description + } + } + `); + + const expectedResult: ExecutionResult = { + data: { thing: null }, + errors: [new GraphQLError('Cannot return null for non-nullable field Thing.description.')], + } + + expect(result).toEqual(expectedResult); + }); +}); + +describe('nullable merging', () => { + test('works for asymmetric record sets', async () => { + const users = [ + { id: '1', username: 'hanshotfirst' }, + { id: '2', username: 'bigvader23' }, + { id: '3', username: 'yodamecrazy' }, + ]; + + const usersSchema = makeExecutableSchema({ + typeDefs: ` + type User { + id: ID! + username: String! + } + type Query { + users(ids: [ID!]!): [User]! + } + `, + resolvers: { + Query: { + users: (_root, { ids }) => ids.map((id: string) => users.find(u => u.id === id)), + } + } + }); + + const appUserSettings = [ + { id: '1', user_id: '1', appSetting1: 'yes', appSetting2: true }, + { id: '2', user_id: '3', appSetting1: 'no', appSetting2: false }, + ]; + + const appSchema = makeExecutableSchema({ + typeDefs: ` + type User { + id: ID! + appSetting1: String + appSetting2: Boolean + } + type Query { + _users(ids: [ID!]!): [User]! + } + `, + resolvers: { + Query: { + _users: (_root, { ids }) => ids.map((id: string) => { + const userSettings = appUserSettings.find(u => u.user_id === id); + return userSettings ? { ...userSettings, id } : null; + }), + } + } + }); + + const gatewaySchema = stitchSchemas({ + subschemas: [ + { + schema: usersSchema, + merge: { + User: { + selectionSet: '{ id }', + fieldName: 'users', + key: ({ id }) => id, + args: (ids) => ({ ids }), + } + } + }, + { + schema: appSchema, + merge: { + User: { + selectionSet: '{ id }', + fieldName: '_users', + key: ({ id }) => id, + args: (ids) => ({ ids }), + } + } + }, + ], + mergeTypes: true + }); + + const result = await graphql(gatewaySchema, ` + query { + users(ids: [1, 2, 3]) { + id + username + appSetting1 + appSetting2 + } + } + `); + + const expectedResult = { + data: { + users: [ + { + id: '1', + username: 'hanshotfirst', + appSetting1: 'yes', + appSetting2: true, + }, + { + id: '2', + username: 'bigvader23', + appSetting1: null, + appSetting2: null, + }, + { + id: '3', + username: 'yodamecrazy', + appSetting1: 'no', + appSetting2: false, + }, + ], + }, + }; + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/packages/stitch/tests/stitchSchemas.test.ts b/packages/stitch/tests/stitchSchemas.test.ts index 515d670483f..b63e87ae319 100644 --- a/packages/stitch/tests/stitchSchemas.test.ts +++ b/packages/stitch/tests/stitchSchemas.test.ts @@ -21,9 +21,8 @@ import { IResolvers, ExecutionResult, } from '@graphql-tools/utils'; -import { addMocksToSchema } from '@graphql-tools/mock'; -import { forAwaitEach } from './forAwaitEach'; +import { addMocksToSchema } from '@graphql-tools/mock'; import { propertySchema as localPropertySchema, @@ -340,16 +339,18 @@ testCombinations.forEach((combination) => { productSchema = await combination.product; stitchedSchema = stitchSchemas({ - schemas: [ + subschemas: [ propertySchema, bookingSchema, productSchema, - interfaceExtensionTest, scalarSchema, enumSchema, + localSubscriptionSchema, + ], + typeDefs: [ linkSchema, + interfaceExtensionTest, loneExtend, - localSubscriptionSchema, codeCoverageTypeDefs, schemaDirectiveTypeDefs, ], @@ -846,7 +847,7 @@ bookingById(id: "b1") { expect(stitchedResult).toEqual(bookingResult); }); - test('local subscriptions working in merged schema', (done) => { + test('local subscriptions working in merged schema', async () => { const mockNotification = { notifications: { text: 'Hello world', @@ -861,30 +862,19 @@ bookingById(id: "b1") { } `); - let notificationCnt = 0; - subscribe(stitchedSchema, subscription) - .then((results) => { - forAwaitEach( - results as AsyncIterable, - (result: ExecutionResult) => { - expect(result).toHaveProperty('data'); - expect(result.data).toEqual(mockNotification); - if (!notificationCnt++) { - done(); - } - }, - ).catch(done); - }) - .then(() => - subscriptionPubSub.publish( - subscriptionPubSubTrigger, - mockNotification, - ), - ) - .catch(done); + const sub = await subscribe(stitchedSchema, subscription) as AsyncIterableIterator; + + const payload = sub.next(); + + await subscriptionPubSub.publish( + subscriptionPubSubTrigger, + mockNotification, + ); + + expect(await payload).toEqual({ done: false, value: { data: mockNotification } }); }); - test('subscription errors are working correctly in merged schema', (done) => { + test('subscription errors are working correctly in merged schema', async () => { const mockNotification = { notifications: { text: 'Hello world', @@ -921,30 +911,16 @@ bookingById(id: "b1") { } `); - let notificationCnt = 0; - subscribe(stitchedSchema, subscription) - .then((results) => { - forAwaitEach( - results as AsyncIterable, - (result: ExecutionResult) => { - expect(result).toHaveProperty('data'); - expect(result).toHaveProperty('errors'); - expect(result.errors).toHaveLength(1); - expect(result.errors).toEqual(expectedResult.errors); - expect(result.data).toEqual(expectedResult.data); - if (!notificationCnt++) { - done(); - } - }, - ).catch(done); - }) - .then(() => - subscriptionPubSub.publish( - subscriptionPubSubTrigger, - mockNotification, - ), - ) - .catch(done); + const sub = await subscribe(stitchedSchema, subscription) as AsyncIterableIterator; + + const payload = sub.next(); + + await subscriptionPubSub.publish( + subscriptionPubSubTrigger, + mockNotification, + ); + + expect(await payload).toEqual({ done: false, value: expectedResult }); }); test('links in queries', async () => { @@ -1571,15 +1547,17 @@ bookingById(id: "b1") { }, }; const schema = stitchSchemas({ - schemas: [ + subschemas: [ propertySchema, bookingSchema, productSchema, - scalarTest, enumSchema, + localSubscriptionSchema, + ], + typeDefs: [ + scalarTest, linkSchema, loneExtend, - localSubscriptionSchema, ], resolvers: [ Scalars, @@ -2932,7 +2910,7 @@ fragment BookingFragment on Booking { }; schema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], resolvers, }); @@ -2966,7 +2944,8 @@ fragment BookingFragment on Booking { }; const schema = stitchSchemas({ - schemas: [propertySchema, typeDefs], + subschemas: [propertySchema], + typeDefs, resolvers, }); @@ -3016,7 +2995,7 @@ fragment BookingFragment on Booking { }; const result = await graphql( - stitchSchemas({ schemas: [BookSchema, AuthorSchema], resolvers }), + stitchSchemas({ typeDefs: [BookSchema, AuthorSchema], resolvers }), ` query { book { @@ -3063,7 +3042,7 @@ fragment BookingFragment on Booking { }; schema = stitchSchemas({ - schemas: [schema], + subschemas: [schema], resolvers, typeDefs: [], }); @@ -3103,7 +3082,7 @@ fragment BookingFragment on Booking { movieSchema = addMocksToSchema({ schema: movieSchema }); const stitchedSchema = stitchSchemas({ - schemas: [bookSchema, movieSchema], + subschemas: [bookSchema, movieSchema], typeDefs: ` schema { query: RootQuery diff --git a/packages/stitch/tests/stitchingFromSubschemas.test.ts b/packages/stitch/tests/stitchingFromSubschemas.test.ts index df419c955dc..a5925979dcf 100644 --- a/packages/stitch/tests/stitchingFromSubschemas.test.ts +++ b/packages/stitch/tests/stitchingFromSubschemas.test.ts @@ -39,7 +39,7 @@ const schemas: Record = {}; const getSchema = (name: string) => schemas[name]; let chirpSchema = stitchSchemas({ - schemas: [ + typeDefs: [ chirpTypeDefs, authorTypeDefs, ` @@ -77,7 +77,7 @@ chirpSchema = addMocksToSchema({ }); let authorSchema = stitchSchemas({ - schemas: [ + typeDefs: [ chirpTypeDefs, authorTypeDefs, ` @@ -117,7 +117,7 @@ schemas.chirpSchema = chirpSchema; schemas.authorSchema = authorSchema; const stitchedSchema = stitchSchemas({ - schemas: Object.keys(schemas).map((schemaName) => schemas[schemaName]), + subschemas:Object.keys(schemas).map((schemaName) => schemas[schemaName]), }); describe('merging without specifying fragments', () => { diff --git a/packages/stitch/tests/transforms.test.ts b/packages/stitch/tests/transforms.test.ts index 8e150dae783..588dd83bb89 100644 --- a/packages/stitch/tests/transforms.test.ts +++ b/packages/stitch/tests/transforms.test.ts @@ -105,24 +105,27 @@ describe('filter fields', () => { // E.g. strip out types/fields from the monolith slowly and re-add them // as stitched resolvers to another service. it('should allow stitching a previously filtered field onto a type', () => { - const filteredSchema = wrapSchema(propertySchema, [ - new FilterObjectFields( - (typeName, fieldName) => - `${typeName}.${fieldName}` !== 'Property.location', - ), - ]); + const filteredSchema = wrapSchema({ + schema: propertySchema, + transforms: [ + new FilterObjectFields( + (typeName, fieldName) => + `${typeName}.${fieldName}` !== 'Property.location', + ), + ], + }); assertValidSchema(filteredSchema); const stitchedSchema = stitchSchemas({ - schemas: [ + subschemas: [ filteredSchema, - ` - extend type Property { - location: Location - } - `, ], + typeDefs: ` + extend type Property { + location: Location + } + `, }); assertValidSchema(stitchedSchema); diff --git a/packages/utils/src/Interfaces.ts b/packages/utils/src/Interfaces.ts index 59e9d63ba37..2b89b7908c0 100644 --- a/packages/utils/src/Interfaces.ts +++ b/packages/utils/src/Interfaces.ts @@ -58,9 +58,6 @@ export interface ExecutionResult> extends GraphQLExe extensions?: Record; } -// for backwards compatibility -export type Result = ExecutionResult; - // graphql-js non-exported typings export type TypeMap = Record; @@ -85,35 +82,37 @@ export interface GraphQLParseOptions { // graphql-tools typings +export type ValidatorBehavior = 'error' | 'warn' | 'ignore'; + /** * Options for validating resolvers */ export interface IResolverValidationOptions { /** - * Set to `true` to require a resolver to be defined for any field that has - * arguments. Defaults to `false`. + * Enable to require a resolver to be defined for any field that has + * arguments. Defaults to `ignore`. */ - requireResolversForArgs?: boolean; + requireResolversForArgs?: ValidatorBehavior; /** - * Set to `true` to require a resolver to be defined for any field which has - * a return type that isn't a scalar. Defaults to `false`. + * Enable to require a resolver to be defined for any field which has + * a return type that isn't a scalar. Defaults to `ignore`. */ - requireResolversForNonScalar?: boolean; + requireResolversForNonScalar?: ValidatorBehavior; /** - * Set to `true` to require a resolver for be defined for all fields defined - * in the schema. Defaults to `false`. + * Enable to require a resolver for be defined for all fields defined + * in the schema. Defaults to `ignore`. */ - requireResolversForAllFields?: boolean; + requireResolversForAllFields?: ValidatorBehavior; /** - * Set to `true` to require a `resolveType()` for Interface and Union types. - * Defaults to `false`. + * Enable to require a `resolveType()` for Interface and Union types. + * Defaults to `ignore`. */ - requireResolversForResolveType?: boolean; + requireResolversForResolveType?: ValidatorBehavior; /** - * Set to `false` to require all defined resolvers to match fields that - * actually exist in the schema. Defaults to `true`. + * Enable to require all defined resolvers to match fields that + * actually exist in the schema. Defaults to `error` to catch common errors. */ - allowResolversNotInSchema?: boolean; + requireResolversToMatchSchema?: ValidatorBehavior; } /** @@ -179,24 +178,6 @@ export interface IFieldResolverOptions GraphQLSchema; -export type RequestTransform> = ( - originalRequest: Request, - delegationContext?: Record, - transformationContext?: T -) => Request; -export type ResultTransform> = ( - originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: T -) => ExecutionResult; - -export interface Transform> { - transformSchema?: SchemaTransform; - transformRequest?: RequestTransform; - transformResult?: ResultTransform; -} - export type FieldNodeMapper = ( fieldNode: FieldNode, fragments: Record, @@ -214,7 +195,7 @@ export type InputFieldFilter = ( export type FieldFilter = ( typeName?: string, fieldName?: string, - fieldConfig?: GraphQLFieldConfig + fieldConfig?: GraphQLFieldConfig | GraphQLInputFieldConfig ) => boolean; export type RootFieldFilter = ( @@ -225,6 +206,13 @@ export type RootFieldFilter = ( export type TypeFilter = (typeName: string, type: GraphQLType) => boolean; +export type ArgumentFilter = ( + typeName?: string, + fieldName?: string, + argName?: string, + argConfig?: GraphQLArgumentConfig +) => boolean; + export type RenameTypesOptions = { renameBuiltins: boolean; renameScalars: boolean; @@ -237,9 +225,9 @@ export type IFieldResolver, TRetu info: GraphQLResolveInfo ) => TReturn; -export type ITypedef = (() => Array) | string | DocumentNode; +export type ITypedef = string | DocumentNode | (() => Array); -export type ITypeDefinitions = ITypedef | Array; +export type ITypeDefinitions = string | DocumentNode | Array; export type IObjectTypeResolver = { [key: string]: IFieldResolver | IFieldResolverOptions; @@ -316,8 +304,6 @@ export interface IDirectiveResolvers { [directiveName: string]: DirectiveResolverFn; } -export type Operation = 'query' | 'mutation' | 'subscription'; - export interface Request { document: DocumentNode; variables: Record; diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 062993c8b53..27693349367 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -1,7 +1,5 @@ import { GraphQLError } from 'graphql'; -export const ERROR_SYMBOL = Symbol('subschemaErrors'); - export function relocatedError(originalError: GraphQLError, path?: ReadonlyArray): GraphQLError { return new GraphQLError( originalError.message, @@ -13,46 +11,3 @@ export function relocatedError(originalError: GraphQLError, path?: ReadonlyArray originalError.extensions ); } - -export function slicedError(originalError: GraphQLError) { - return relocatedError(originalError, originalError.path != null ? originalError.path.slice(1) : undefined); -} - -export function getErrorsByPathSegment(errors: ReadonlyArray): Record> { - const record = Object.create(null); - errors.forEach(error => { - if (!error.path || error.path.length < 2) { - return; - } - - const pathSegment = error.path[1]; - - const current = pathSegment in record ? record[pathSegment] : []; - current.push(slicedError(error)); - record[pathSegment] = current; - }); - - return record; -} - -export function setErrors(result: any, errors: Array) { - result[ERROR_SYMBOL] = errors; -} - -export function getErrors(result: any, pathSegment: string): Array { - const errors = result != null ? result[ERROR_SYMBOL] : result; - - if (!Array.isArray(errors)) { - return null; - } - - const fieldErrors = []; - - for (const error of errors) { - if (!error.path || error.path[0] === pathSegment) { - fieldErrors.push(error); - } - } - - return fieldErrors; -} diff --git a/packages/utils/src/fieldNodes.ts b/packages/utils/src/fieldNodes.ts deleted file mode 100644 index d27c1cd5227..00000000000 --- a/packages/utils/src/fieldNodes.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { FieldNode, Kind, FragmentDefinitionNode, SelectionSetNode } from 'graphql'; - -export function renameFieldNode(fieldNode: FieldNode, name: string): FieldNode { - return { - ...fieldNode, - alias: { - kind: Kind.NAME, - value: fieldNode.alias != null ? fieldNode.alias.value : fieldNode.name.value, - }, - name: { - kind: Kind.NAME, - value: name, - }, - }; -} - -export function preAliasFieldNode(fieldNode: FieldNode, str: string): FieldNode { - return { - ...fieldNode, - alias: { - kind: Kind.NAME, - value: `${str}${fieldNode.alias != null ? fieldNode.alias.value : fieldNode.name.value}`, - }, - }; -} - -export function wrapFieldNode(fieldNode: FieldNode, path: Array): FieldNode { - let newFieldNode = fieldNode; - path.forEach(fieldName => { - newFieldNode = { - kind: Kind.FIELD, - name: { - kind: Kind.NAME, - value: fieldName, - }, - selectionSet: { - kind: Kind.SELECTION_SET, - selections: [fieldNode], - }, - }; - }); - - return newFieldNode; -} - -function collectFields( - selectionSet: SelectionSetNode | undefined, - fragments: Record, - fields: Array = [], - visitedFragmentNames = {} -): Array { - if (selectionSet != null) { - selectionSet.selections.forEach(selection => { - switch (selection.kind) { - case Kind.FIELD: - fields.push(selection); - break; - case Kind.INLINE_FRAGMENT: - collectFields(selection.selectionSet, fragments, fields, visitedFragmentNames); - break; - case Kind.FRAGMENT_SPREAD: { - const fragmentName = selection.name.value; - if (!visitedFragmentNames[fragmentName]) { - visitedFragmentNames[fragmentName] = true; - collectFields(fragments[fragmentName].selectionSet, fragments, fields, visitedFragmentNames); - } - break; - } - default: - // unreachable - break; - } - }); - } - - return fields; -} - -export function hoistFieldNodes({ - fieldNode, - fieldNames, - path = [], - delimeter = '__gqltf__', - fragments, -}: { - fieldNode: FieldNode; - fieldNames?: Array; - path?: Array; - delimeter?: string; - fragments: Record; -}): Array { - const alias = fieldNode.alias != null ? fieldNode.alias.value : fieldNode.name.value; - - let newFieldNodes: Array = []; - - if (path.length) { - const remainingPathSegments = path.slice(); - const initialPathSegment = remainingPathSegments.shift(); - - collectFields(fieldNode.selectionSet, fragments).forEach((possibleFieldNode: FieldNode) => { - if (possibleFieldNode.name.value === initialPathSegment) { - newFieldNodes = newFieldNodes.concat( - hoistFieldNodes({ - fieldNode: preAliasFieldNode(possibleFieldNode, `${alias}${delimeter}`), - fieldNames, - path: remainingPathSegments, - delimeter, - fragments, - }) - ); - } - }); - } else { - collectFields(fieldNode.selectionSet, fragments).forEach((possibleFieldNode: FieldNode) => { - if (!fieldNames || fieldNames.includes(possibleFieldNode.name.value)) { - newFieldNodes.push(preAliasFieldNode(possibleFieldNode, `${alias}${delimeter}`)); - } - }); - } - - return newFieldNodes; -} diff --git a/packages/utils/src/filterSchema.ts b/packages/utils/src/filterSchema.ts index c1a52895c9c..934bbb9537f 100644 --- a/packages/utils/src/filterSchema.ts +++ b/packages/utils/src/filterSchema.ts @@ -8,7 +8,7 @@ import { GraphQLSchema, } from 'graphql'; -import { MapperKind, FieldFilter, RootFieldFilter, TypeFilter } from './Interfaces'; +import { MapperKind, FieldFilter, RootFieldFilter, TypeFilter, ArgumentFilter } from './Interfaces'; import { mapSchema } from './mapSchema'; @@ -16,11 +16,13 @@ import { Constructor } from './types'; export function filterSchema({ schema, - rootFieldFilter = () => true, typeFilter = () => true, - fieldFilter = () => true, - objectFieldFilter = () => true, - interfaceFieldFilter = () => true, + fieldFilter = undefined, + rootFieldFilter = undefined, + objectFieldFilter = undefined, + interfaceFieldFilter = undefined, + inputObjectFieldFilter = undefined, + argumentFilter = undefined, }: { schema: GraphQLSchema; rootFieldFilter?: RootFieldFilter; @@ -28,6 +30,8 @@ export function filterSchema({ fieldFilter?: FieldFilter; objectFieldFilter?: FieldFilter; interfaceFieldFilter?: FieldFilter; + inputObjectFieldFilter?: FieldFilter; + argumentFilter?: ArgumentFilter; }): GraphQLSchema { const filteredSchema: GraphQLSchema = mapSchema(schema, { [MapperKind.QUERY]: (type: GraphQLObjectType) => filterRootFields(type, 'Query', rootFieldFilter), @@ -35,14 +39,31 @@ export function filterSchema({ [MapperKind.SUBSCRIPTION]: (type: GraphQLObjectType) => filterRootFields(type, 'Subscription', rootFieldFilter), [MapperKind.OBJECT_TYPE]: (type: GraphQLObjectType) => typeFilter(type.name, type) - ? filterElementFields(type, objectFieldFilter || fieldFilter, GraphQLObjectType) + ? filterElementFields( + GraphQLObjectType, + type, + objectFieldFilter || fieldFilter, + argumentFilter + ) : null, [MapperKind.INTERFACE_TYPE]: (type: GraphQLInterfaceType) => typeFilter(type.name, type) - ? filterElementFields(type, interfaceFieldFilter, GraphQLInterfaceType) + ? filterElementFields( + GraphQLInterfaceType, + type, + interfaceFieldFilter || fieldFilter, + argumentFilter + ) + : null, + [MapperKind.INPUT_OBJECT_TYPE]: (type: GraphQLInputObjectType) => + typeFilter(type.name, type) + ? filterElementFields( + GraphQLInputObjectType, + type, + inputObjectFieldFilter || fieldFilter + ) : null, [MapperKind.UNION_TYPE]: (type: GraphQLUnionType) => (typeFilter(type.name, type) ? undefined : null), - [MapperKind.INPUT_OBJECT_TYPE]: (type: GraphQLInputObjectType) => (typeFilter(type.name, type) ? undefined : null), [MapperKind.ENUM_TYPE]: (type: GraphQLEnumType) => (typeFilter(type.name, type) ? undefined : null), [MapperKind.SCALAR_TYPE]: (type: GraphQLScalarType) => (typeFilter(type.name, type) ? undefined : null), }); @@ -53,27 +74,41 @@ export function filterSchema({ function filterRootFields( type: GraphQLObjectType, operation: 'Query' | 'Mutation' | 'Subscription', - rootFieldFilter: RootFieldFilter + rootFieldFilter?: RootFieldFilter ): GraphQLObjectType { - const config = type.toConfig(); - Object.keys(config.fields).forEach(fieldName => { - if (!rootFieldFilter(operation, fieldName, config.fields[fieldName])) { - delete config.fields[fieldName]; - } - }); - return new GraphQLObjectType(config); + if (rootFieldFilter) { + const config = type.toConfig(); + Object.keys(config.fields).forEach(fieldName => { + if (!rootFieldFilter(operation, fieldName, config.fields[fieldName])) { + delete config.fields[fieldName]; + } + }); + return new GraphQLObjectType(config); + } + return type; } function filterElementFields( - type: GraphQLObjectType | GraphQLInterfaceType, - fieldFilter: FieldFilter, - ElementConstructor: Constructor -): ElementType { - const config = type.toConfig(); - Object.keys(config.fields).forEach(fieldName => { - if (!fieldFilter(type.name, fieldName, config.fields[fieldName])) { - delete config.fields[fieldName]; + ElementConstructor: Constructor, + type: GraphQLObjectType | GraphQLInterfaceType | GraphQLInputObjectType, + fieldFilter?: FieldFilter, + argumentFilter?: ArgumentFilter +): ElementType | undefined { + if (fieldFilter || argumentFilter) { + if (!fieldFilter) fieldFilter = () => true; + + const config = type.toConfig(); + for (const [fieldName, field] of Object.entries(config.fields)) { + if (!fieldFilter(type.name, fieldName, config.fields[fieldName])) { + delete config.fields[fieldName]; + } else if (argumentFilter && 'args' in field) { + for (const argName of Object.keys(field.args)) { + if (!argumentFilter(type.name, fieldName, argName, field.args[argName])) { + delete field.args[argName]; + } + } + } } - }); - return new ElementConstructor(config); + return new ElementConstructor(config); + } } diff --git a/packages/utils/src/fragments.ts b/packages/utils/src/fragments.ts deleted file mode 100644 index c537495a087..00000000000 --- a/packages/utils/src/fragments.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { InlineFragmentNode, SelectionNode, Kind, parse, OperationDefinitionNode } from 'graphql'; - -export function concatInlineFragments(type: string, fragments: Array): InlineFragmentNode { - const fragmentSelections: Array = fragments.reduce( - (selections, fragment) => selections.concat(fragment.selectionSet.selections), - [] - ); - - const deduplicatedFragmentSelection: Array = deduplicateSelection(fragmentSelections); - - return { - kind: Kind.INLINE_FRAGMENT, - typeCondition: { - kind: Kind.NAMED_TYPE, - name: { - kind: Kind.NAME, - value: type, - }, - }, - selectionSet: { - kind: Kind.SELECTION_SET, - selections: deduplicatedFragmentSelection, - }, - }; -} - -function deduplicateSelection(nodes: Array): Array { - const selectionMap = nodes.reduce((map, node) => { - switch (node.kind) { - case 'Field': { - if (node.alias != null) { - if (node.alias.value in map) { - return map; - } - - return { - ...map, - [node.alias.value]: node, - }; - } - - if (node.name.value in map) { - return map; - } - - return { - ...map, - [node.name.value]: node, - }; - } - case 'FragmentSpread': { - if (node.name.value in map) { - return map; - } - - return { - ...map, - [node.name.value]: node, - }; - } - case 'InlineFragment': { - if (map.__fragment != null) { - const fragment = map.__fragment as InlineFragmentNode; - - return { - ...map, - __fragment: concatInlineFragments(fragment.typeCondition.name.value, [fragment, node]), - }; - } - - return { - ...map, - __fragment: node, - }; - } - default: { - return map; - } - } - }, Object.create(null)); - - const selection = Object.keys(selectionMap).reduce( - (selectionList, node) => selectionList.concat(selectionMap[node]), - [] - ); - - return selection; -} - -export function parseFragmentToInlineFragment(definitions: string): InlineFragmentNode { - if (definitions.trim().startsWith('fragment')) { - const document = parse(definitions); - for (const definition of document.definitions) { - if (definition.kind === Kind.FRAGMENT_DEFINITION) { - return { - kind: Kind.INLINE_FRAGMENT, - typeCondition: definition.typeCondition, - selectionSet: definition.selectionSet, - }; - } - } - } - - const query = parse(`{${definitions}}`).definitions[0] as OperationDefinitionNode; - for (const selection of query.selectionSet.selections) { - if (selection.kind === Kind.INLINE_FRAGMENT) { - return selection; - } - } - - throw new Error('Could not parse fragment'); -} diff --git a/packages/utils/src/heal.ts b/packages/utils/src/heal.ts index b1791476fae..73a00cbf224 100644 --- a/packages/utils/src/heal.ts +++ b/packages/utils/src/heal.ts @@ -58,12 +58,7 @@ export function healSchema(schema: GraphQLSchema): GraphQLSchema { export function healTypes( originalTypeMap: Record, - directives: ReadonlyArray, - config: { - skipPruning: boolean; - } = { - skipPruning: false, - } + directives: ReadonlyArray ) { const actualNamedTypeMap: TypeMap = Object.create(null); @@ -120,13 +115,6 @@ export function healTypes( } } - if (!config.skipPruning) { - // TODO: - // consider removing the default level of pruning in v7, - // see comments below on the pruneTypes function. - pruneTypes(originalTypeMap, directives); - } - function healNamedType(type: GraphQLNamedType) { if (isObjectType(type)) { healFields(type); @@ -222,53 +210,3 @@ export function healTypes( return type; } } - -// TODO: -// consider removing the default level of pruning in v7 -// -// Pruning was introduced into healSchema in v5, so legacy schema directives relying on pruning -// during healing are likely to be rare. pruning is now recommended via the dedicated pruneSchema -// function which does not force pruning on library users and gives granular control in terms of -// pruning types. pruneSchema does recreate the schema -- a parallel version that prunes in place -// could be considered. -function pruneTypes(typeMap: Record, directives: ReadonlyArray) { - const implementedInterfaces = {}; - Object.values(typeMap).forEach(namedType => { - if ('getInterfaces' in namedType) { - namedType.getInterfaces().forEach(iface => { - implementedInterfaces[iface.name] = true; - }); - } - }); - - let prunedTypeMap = false; - const typeNames = Object.keys(typeMap); - for (let i = 0; i < typeNames.length; i++) { - const typeName = typeNames[i]; - const type = typeMap[typeName]; - if (isObjectType(type) || isInputObjectType(type)) { - // prune types with no fields - if (!Object.keys(type.getFields()).length) { - typeMap[typeName] = null; - prunedTypeMap = true; - } - } else if (isUnionType(type)) { - // prune unions without underlying types - if (!type.getTypes().length) { - typeMap[typeName] = null; - prunedTypeMap = true; - } - } else if (isInterfaceType(type)) { - // prune interfaces without fields or without implementations - if (!Object.keys(type.getFields()).length || !(type.name in implementedInterfaces)) { - typeMap[typeName] = null; - prunedTypeMap = true; - } - } - } - - // every prune requires another round of healing - if (prunedTypeMap) { - healTypes(typeMap, directives); - } -} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 1fda6639b9d..f0d0ff163f3 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -31,12 +31,9 @@ export * from './rewire'; export * from './prune'; export * from './mergeDeep'; export * from './Interfaces'; -export * from './fieldNodes'; export * from './stub'; -export * from './fragments'; export * from './selectionSets'; export * from './getResponseKeyFromInfo'; -export * from './transforms'; export * from './fields'; export * from './renameType'; export * from './collectFields'; @@ -50,3 +47,4 @@ export * from './observableToAsyncIterable'; export * from './visitResult'; export * from './getArgumentValues'; export * from './valueMatchesCriteria'; +export * from './isAsyncIterable'; diff --git a/packages/utils/src/isAsyncIterable.ts b/packages/utils/src/isAsyncIterable.ts new file mode 100644 index 00000000000..8f836233f89 --- /dev/null +++ b/packages/utils/src/isAsyncIterable.ts @@ -0,0 +1,3 @@ +export function isAsyncIterable(value: any): value is AsyncIterable { + return Symbol.asyncIterator in value; +} diff --git a/packages/utils/src/prune.ts b/packages/utils/src/prune.ts index 302fdda3fb4..d0cb3eb438b 100644 --- a/packages/utils/src/prune.ts +++ b/packages/utils/src/prune.ts @@ -14,6 +14,8 @@ import { isInputObjectType, } from 'graphql'; +import { PruneSchemaOptions } from './types'; + import { mapSchema } from './mapSchema'; import { MapperKind } from './Interfaces'; @@ -31,29 +33,6 @@ interface PruningContext { implementations: Record>; } -/** - * Options for removing unused types from the schema - */ -export interface PruneSchemaOptions { - /** - * Set to `true` to skip pruning object types or interfaces with no no fields - */ - skipEmptyCompositeTypePruning?: boolean; - /** - * Set to `true` to skip pruning interfaces that are not implemented by any - * other types - */ - skipUnimplementedInterfacesPruning?: boolean; - /** - * Set to `true` to skip pruning empty unions - */ - skipEmptyUnionPruning?: boolean; - /** - * Set to `true` to skip pruning unused types - */ - skipUnusedTypesPruning?: boolean; -} - /** * Prunes the provided schema, removing unused and empty types * @param schema The schema to prune diff --git a/packages/utils/src/rewire.ts b/packages/utils/src/rewire.ts index 42d0157270d..930a8ee701f 100644 --- a/packages/utils/src/rewire.ts +++ b/packages/utils/src/rewire.ts @@ -31,12 +31,7 @@ import { TypeMap } from './Interfaces'; export function rewireTypes( originalTypeMap: Record, - directives: ReadonlyArray, - options: { - skipPruning: boolean; - } = { - skipPruning: false, - } + directives: ReadonlyArray ): { typeMap: TypeMap; directives: Array; @@ -72,15 +67,10 @@ export function rewireTypes( const newDirectives = directives.map(directive => rewireDirective(directive)); - // TODO: - // consider removing the default level of pruning in v7, - // see comments below on the pruneTypes function. - return options.skipPruning - ? { - typeMap: newTypeMap, - directives: newDirectives, - } - : pruneTypes(newTypeMap, newDirectives); + return { + typeMap: newTypeMap, + directives: newDirectives, + }; function rewireDirective(directive: GraphQLDirective): GraphQLDirective { if (isSpecifiedDirective(directive)) { @@ -209,65 +199,3 @@ export function rewireTypes( return null; } } - -// TODO: -// consider removing the default level of pruning in v7 -// -// Pruning during mapSchema limits the ability to create an unpruned schema, which may be of use -// to some library users. pruning is now recommended via the dedicated pruneSchema function -// which does not force pruning on library users and gives granular control in terms of pruning -// types. -function pruneTypes( - typeMap: TypeMap, - directives: Array -): { - typeMap: TypeMap; - directives: Array; -} { - const newTypeMap = {}; - - const implementedInterfaces = {}; - Object.keys(typeMap).forEach(typeName => { - const namedType = typeMap[typeName]; - - if ('getInterfaces' in namedType) { - namedType.getInterfaces().forEach(iface => { - implementedInterfaces[iface.name] = true; - }); - } - }); - - let prunedTypeMap = false; - const typeNames = Object.keys(typeMap); - for (let i = 0; i < typeNames.length; i++) { - const typeName = typeNames[i]; - const type = typeMap[typeName]; - if (isObjectType(type) || isInputObjectType(type)) { - // prune types with no fields - if (Object.keys(type.getFields()).length) { - newTypeMap[typeName] = type; - } else { - prunedTypeMap = true; - } - } else if (isUnionType(type)) { - // prune unions without underlying types - if (type.getTypes().length) { - newTypeMap[typeName] = type; - } else { - prunedTypeMap = true; - } - } else if (isInterfaceType(type)) { - // prune interfaces without fields or without implementations - if (Object.keys(type.getFields()).length && implementedInterfaces[type.name]) { - newTypeMap[typeName] = type; - } else { - prunedTypeMap = true; - } - } else { - newTypeMap[typeName] = type; - } - } - - // every prune requires another round of healing - return prunedTypeMap ? rewireTypes(newTypeMap, directives) : { typeMap, directives }; -} diff --git a/packages/utils/src/selectionSets.ts b/packages/utils/src/selectionSets.ts index 4a408aedce6..b0b467133fa 100644 --- a/packages/utils/src/selectionSets.ts +++ b/packages/utils/src/selectionSets.ts @@ -1,52 +1,6 @@ -import { OperationDefinitionNode, SelectionSetNode, parse, Kind, GraphQLObjectType, getNamedType } from 'graphql'; +import { OperationDefinitionNode, SelectionSetNode, parse } from 'graphql'; export function parseSelectionSet(selectionSet: string): SelectionSetNode { const query = parse(selectionSet).definitions[0] as OperationDefinitionNode; return query.selectionSet; } - -export function typesContainSelectionSet(types: Array, selectionSet: SelectionSetNode): boolean { - const fieldMaps = types.map(type => type.getFields()); - - for (const selection of selectionSet.selections) { - if (selection.kind === Kind.FIELD) { - const fields = fieldMaps.map(fieldMap => fieldMap[selection.name.value]).filter(field => field != null); - if (!fields.length) { - return false; - } - - if (selection.selectionSet != null) { - return typesContainSelectionSet( - fields.map(field => getNamedType(field.type)) as Array, - selection.selectionSet - ); - } - } else if (selection.kind === Kind.INLINE_FRAGMENT && selection.typeCondition.name.value === types[0].name) { - return typesContainSelectionSet(types, selection.selectionSet); - } - } - - return true; -} - -export function typeContainsSelectionSet(type: GraphQLObjectType, selectionSet: SelectionSetNode): boolean { - const fields = type.getFields(); - - for (const selection of selectionSet.selections) { - if (selection.kind === Kind.FIELD) { - const field = fields[selection.name.value]; - - if (field == null) { - return false; - } - - if (selection.selectionSet != null) { - return typeContainsSelectionSet(getNamedType(field.type) as GraphQLObjectType, selection.selectionSet); - } - } else if (selection.kind === Kind.INLINE_FRAGMENT && selection.typeCondition.name.value === type.name) { - return typeContainsSelectionSet(type, selection.selectionSet); - } - } - - return true; -} diff --git a/packages/utils/src/transforms.ts b/packages/utils/src/transforms.ts deleted file mode 100644 index 21f84881287..00000000000 --- a/packages/utils/src/transforms.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { GraphQLSchema } from 'graphql'; - -import { Request, Transform } from './Interfaces'; - -import { cloneSchema } from './clone'; - -export function applySchemaTransforms(originalSchema: GraphQLSchema, transforms: Array): GraphQLSchema { - return transforms.reduce( - (schema: GraphQLSchema, transform: Transform) => - transform.transformSchema != null ? transform.transformSchema(cloneSchema(schema)) : schema, - originalSchema - ); -} - -export function applyRequestTransforms(originalRequest: Request, transforms: Array): Request { - return transforms.reduce( - (request: Request, transform: Transform) => - transform.transformRequest != null ? transform.transformRequest(request) : request, - - originalRequest - ); -} - -export function applyResultTransforms(originalResult: any, transforms: Array): any { - return transforms.reduceRight( - (result: any, transform: Transform) => - transform.transformResult != null ? transform.transformResult(result) : result, - originalResult - ); -} diff --git a/packages/utils/src/types.ts b/packages/utils/src/types.ts index 27ee8edd1ea..5de49e253bc 100644 --- a/packages/utils/src/types.ts +++ b/packages/utils/src/types.ts @@ -13,3 +13,26 @@ export interface SchemaPrintOptions { export type Maybe = null | undefined | T; export type Constructor = new (...args: any[]) => T; + +/** + * Options for removing unused types from the schema + */ +export interface PruneSchemaOptions { + /** + * Set to `true` to skip pruning object types or interfaces with no no fields + */ + skipEmptyCompositeTypePruning?: boolean; + /** + * Set to `true` to skip pruning interfaces that are not implemented by any + * other types + */ + skipUnimplementedInterfacesPruning?: boolean; + /** + * Set to `true` to skip pruning empty unions + */ + skipEmptyUnionPruning?: boolean; + /** + * Set to `true` to skip pruning unused types + */ + skipUnusedTypesPruning?: boolean; +} diff --git a/packages/utils/src/visitResult.ts b/packages/utils/src/visitResult.ts index 7ee0135ab0b..2bf24fd46dd 100644 --- a/packages/utils/src/visitResult.ts +++ b/packages/utils/src/visitResult.ts @@ -28,7 +28,9 @@ export type ResultVisitorMap = Record export type ErrorVisitor = (error: GraphQLError, pathIndex: number) => GraphQLError; -export type ErrorVisitorMap = Record>; +export type ErrorVisitorMap = { + __unpathed?: (error: GraphQLError) => GraphQLError; +} & Record>; interface SegmentInfo { type: GraphQLObjectType; @@ -38,12 +40,12 @@ interface SegmentInfo { interface ErrorInfo { segmentInfoMap: Map>; - unpathedErrors: Array; + unpathedErrors: Set; } interface SortedErrors { errorMap: Record>; - unpathedErrors: Array; + unpathedErrors: Set; } export function visitData(data: any, enter?: ValueVisitor, leave?: ValueVisitor): any { @@ -91,7 +93,7 @@ export function visitResult( const errorInfo: ErrorInfo = { segmentInfoMap: new Map>(), - unpathedErrors: [], + unpathedErrors: new Set(), }; const data = result.data; @@ -121,20 +123,30 @@ function visitErrorsByType( errorVisitorMap: ErrorVisitorMap, errorInfo: ErrorInfo ): Array { - return errors.map(error => { - const pathSegmentsInfo = errorInfo.segmentInfoMap.get(error); - if (pathSegmentsInfo == null) { - return error; + const segmentInfoMap = errorInfo.segmentInfoMap; + const unpathedErrors = errorInfo.unpathedErrors; + const unpathedErrorVisitor = errorVisitorMap['__unpathed']; + + return errors.map(originalError => { + const pathSegmentsInfo = segmentInfoMap.get(originalError); + const newError = + pathSegmentsInfo == null + ? originalError + : pathSegmentsInfo.reduceRight((acc, segmentInfo) => { + const typeName = segmentInfo.type.name; + const typeVisitorMap = errorVisitorMap[typeName]; + if (typeVisitorMap == null) { + return acc; + } + const errorVisitor = typeVisitorMap[segmentInfo.fieldName]; + return errorVisitor == null ? acc : errorVisitor(acc, segmentInfo.pathIndex); + }, originalError); + + if (unpathedErrorVisitor && unpathedErrors.has(originalError)) { + return unpathedErrorVisitor(newError); } - return pathSegmentsInfo.reduceRight((acc, segmentInfo) => { - const typeName = segmentInfo.type.name; - const typeVisitorMap = errorVisitorMap[typeName]; - if (typeVisitorMap == null) { - return acc; - } - const errorVisitor = typeVisitorMap[segmentInfo.fieldName]; - return errorVisitor == null ? acc : errorVisitor(acc as GraphQLError, segmentInfo.pathIndex); - }, error) as GraphQLError; + + return newError; }); } @@ -179,7 +191,7 @@ function visitObjectValue( if (errors != null) { sortedErrors = sortErrorsByPathSegment(errors, pathIndex); errorMap = sortedErrors.errorMap; - errorInfo.unpathedErrors = errorInfo.unpathedErrors.concat(sortedErrors.unpathedErrors); + sortedErrors.unpathedErrors.forEach(error => errorInfo.unpathedErrors.add(error)); } Object.keys(fieldNodeMap).forEach(responseKey => { @@ -219,7 +231,7 @@ function visitObjectValue( if (errors != null) { Object.keys(errorMap).forEach(unknownResponseKey => { - errorInfo.unpathedErrors = errorInfo.unpathedErrors.concat(errorMap[unknownResponseKey]); + errorMap[unknownResponseKey].forEach(error => errorInfo.unpathedErrors.add(error)); }); } @@ -334,11 +346,11 @@ function visitFieldValue( function sortErrorsByPathSegment(errors: ReadonlyArray, pathIndex: number): SortedErrors { const errorMap = Object.create(null); - const unpathedErrors: Array = []; + const unpathedErrors: Set = new Set(); errors.forEach(error => { const pathSegment = error.path?.[pathIndex]; if (pathSegment == null) { - unpathedErrors.push(error); + unpathedErrors.add(error); return; } diff --git a/packages/utils/tests/filterSchema.test.ts b/packages/utils/tests/filterSchema.test.ts new file mode 100644 index 00000000000..0c1bd3ec3e6 --- /dev/null +++ b/packages/utils/tests/filterSchema.test.ts @@ -0,0 +1,204 @@ +import { makeExecutableSchema } from '@graphql-tools/schema'; +import { filterSchema } from '@graphql-tools/utils'; + +describe('filterSchema', () => { + it('filters root fields', () => { + const schema = makeExecutableSchema({ + typeDefs: ` + type Query { + keep: String + omit: String + } + type Mutation { + keepThis(id: ID): String + omitThis(id: ID): String + } + ` + }); + + const filtered = filterSchema({ + schema, + rootFieldFilter: (opName, fieldName) => fieldName.startsWith('keep'), + }); + + expect(filtered.getType('Query').getFields()['keep']).toBeDefined(); + expect(filtered.getType('Query').getFields()['omit']).toBeUndefined(); + expect(filtered.getType('Mutation').getFields()['keepThis']).toBeDefined(); + expect(filtered.getType('Mutation').getFields()['omitThis']).toBeUndefined(); + }); + + it('filters types', () => { + const schema = makeExecutableSchema({ + typeDefs: ` + type Keep implements IKeep { + field(input: KeepInput): String + } + interface IKeep { + field(input: KeepInput): String + } + type Remove implements IRemove { + field(input: RemoveInput): String + } + interface IRemove { + field(input: RemoveInput): String + } + union KeepMany = Keep | Remove + union RemoveMany = Keep | Remove + input KeepInput { + field: String + } + input RemoveInput { + field: String + } + enum KeepValues { + VALUE + } + enum RemoveValues { + VALUE + } + scalar KeepScalar + scalar RemoveScalar + ` + }); + + const filtered = filterSchema({ + schema, + typeFilter: (typeName) => !/^I?Remove/.test(typeName) + }); + + expect(filtered.getType('Keep')).toBeDefined(); + expect(filtered.getType('IKeep')).toBeDefined(); + expect(filtered.getType('KeepMany')).toBeDefined(); + expect(filtered.getType('KeepInput')).toBeDefined(); + expect(filtered.getType('KeepValues')).toBeDefined(); + expect(filtered.getType('KeepScalar')).toBeDefined(); + + expect(filtered.getType('Remove')).toBeUndefined(); + expect(filtered.getType('IRemove')).toBeUndefined(); + expect(filtered.getType('RemoveMany')).toBeUndefined(); + expect(filtered.getType('RemoveInput')).toBeUndefined(); + expect(filtered.getType('RemoveValues')).toBeUndefined(); + expect(filtered.getType('RemoveScalar')).toBeUndefined(); + }); + + it('filters object fields', () => { + const schema = makeExecutableSchema({ + typeDefs: ` + type Thing implements IThing { + keep: String + omit: String + } + interface IThing { + control: String + } + ` + }); + + const filtered = filterSchema({ + schema, + objectFieldFilter: (typeName, fieldName) => fieldName.startsWith('keep'), + }); + + expect(filtered.getType('Thing').getFields()['keep']).toBeDefined(); + expect(filtered.getType('Thing').getFields()['omit']).toBeUndefined(); + expect(filtered.getType('IThing').getFields()['control']).toBeDefined(); + }); + + it('filters interface fields', () => { + const schema = makeExecutableSchema({ + typeDefs: ` + interface IThing { + keep: String + omit: String + } + type Thing implements IThing { + control: String + } + ` + }); + + const filtered = filterSchema({ + schema, + interfaceFieldFilter: (typeName, fieldName) => fieldName.startsWith('keep'), + }); + + expect(filtered.getType('IThing').getFields()['keep']).toBeDefined(); + expect(filtered.getType('IThing').getFields()['omit']).toBeUndefined(); + expect(filtered.getType('Thing').getFields()['control']).toBeDefined(); + }); + + it('filters input object fields', () => { + const schema = makeExecutableSchema({ + typeDefs: ` + input ThingInput { + keep: String + omit: String + } + type Thing { + control: String + } + ` + }); + + const filtered = filterSchema({ + schema, + inputObjectFieldFilter: (typeName, fieldName) => fieldName.startsWith('keep'), + }); + + expect(filtered.getType('ThingInput').getFields()['keep']).toBeDefined(); + expect(filtered.getType('ThingInput').getFields()['omit']).toBeUndefined(); + expect(filtered.getType('Thing').getFields()['control']).toBeDefined(); + }); + + it('filters all field types', () => { + const schema = makeExecutableSchema({ + typeDefs: ` + type Thing implements IThing { + keep: String + omit: String + } + interface IThing { + keep: String + omit: String + } + input ThingInput { + keep: String + omit: String + } + ` + }); + + const filtered = filterSchema({ + schema, + fieldFilter: (typeName, fieldName) => fieldName.startsWith('keep'), + }); + + expect(filtered.getType('Thing').getFields()['keep']).toBeDefined(); + expect(filtered.getType('Thing').getFields()['omit']).toBeUndefined(); + expect(filtered.getType('IThing').getFields()['keep']).toBeDefined(); + expect(filtered.getType('IThing').getFields()['omit']).toBeUndefined(); + expect(filtered.getType('ThingInput').getFields()['keep']).toBeDefined(); + expect(filtered.getType('ThingInput').getFields()['omit']).toBeUndefined(); + }); + + it('filters all arguments', () => { + const schema = makeExecutableSchema({ + typeDefs: ` + type Thing implements IThing { + field(keep: String, omit: String): String + } + interface IThing { + field(keep: String, omit: String): String + } + ` + }); + + const filtered = filterSchema({ + schema, + argumentFilter: (typeName, fieldName, argName) => argName.startsWith('keep'), + }); + + expect(filtered.getType('Thing').getFields()['field'].args.map(arg => arg.name)).toEqual(['keep']); + expect(filtered.getType('IThing').getFields()['field'].args.map(arg => arg.name)).toEqual(['keep']); + }); +}); diff --git a/packages/utils/tests/print-schema-with-directives.spec.ts b/packages/utils/tests/print-schema-with-directives.spec.ts index e100b28b5aa..953e43ee721 100644 --- a/packages/utils/tests/print-schema-with-directives.spec.ts +++ b/packages/utils/tests/print-schema-with-directives.spec.ts @@ -103,9 +103,12 @@ describe('printSchemaWithDirectives', () => { const schema = buildSchema(printedSchema); - const transformedSchema = wrapSchema(schema, [ - new RenameTypes(typeName => `My${typeName}`) - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new RenameTypes(typeName => `My${typeName}`) + ] + }); const printedTransformedSchema = printSchemaWithDirectives(transformedSchema); expect(printedTransformedSchema).not.toContain(/* GraphQL */`type Foo`); expect(printedTransformedSchema).toContain(/* GraphQL */`type MyFoo`); diff --git a/packages/utils/tests/heal.test.ts b/packages/utils/tests/pruneSchema.test.ts similarity index 69% rename from packages/utils/tests/heal.test.ts rename to packages/utils/tests/pruneSchema.test.ts index a282d0db259..1b3deeadcf0 100644 --- a/packages/utils/tests/heal.test.ts +++ b/packages/utils/tests/pruneSchema.test.ts @@ -1,8 +1,7 @@ import { GraphQLObjectType, buildSchema } from 'graphql'; +import { pruneSchema } from '../src/prune'; -import { healSchema } from '../src/heal'; - -describe('heal', () => { +describe('pruneSchema', () => { test('should prune empty types', () => { const schema = buildSchema(` type WillBeEmptyObject { @@ -21,9 +20,9 @@ describe('heal', () => { fields: {}, }); - healSchema(schema); + const prunedSchema = pruneSchema(schema); - const healedTypeMap = schema.getTypeMap(); - expect(healedTypeMap).not.toHaveProperty('WillBeEmptyObject'); + const prunedTypeMap = prunedSchema.getTypeMap(); + expect(prunedTypeMap).not.toHaveProperty('WillBeEmptyObject'); }); }); diff --git a/packages/utils/tests/relocatedError.test.ts b/packages/utils/tests/relocatedError.test.ts new file mode 100644 index 00000000000..e5d5d427a02 --- /dev/null +++ b/packages/utils/tests/relocatedError.test.ts @@ -0,0 +1,18 @@ +import { GraphQLError } from 'graphql'; +import { relocatedError } from '../src/errors'; + +describe('Errors', () => { + describe('relocatedError', () => { + test('should adjust the path of a GraphqlError', () => { + const originalError = new GraphQLError('test', null, null, null, [ + 'test', + ]); + const newError = relocatedError(originalError, ['test', 1]); + const expectedError = new GraphQLError('test', null, null, null, [ + 'test', + 1, + ]); + expect(newError).toEqual(expectedError); + }); + }); +}); diff --git a/packages/wrap/src/generateProxyingResolvers.ts b/packages/wrap/src/generateProxyingResolvers.ts index d6c3789a4b0..c2e07c0d6f7 100644 --- a/packages/wrap/src/generateProxyingResolvers.ts +++ b/packages/wrap/src/generateProxyingResolvers.ts @@ -1,49 +1,33 @@ -import { GraphQLSchema, GraphQLFieldResolver, GraphQLObjectType, GraphQLResolveInfo } from 'graphql'; +import { GraphQLFieldResolver, GraphQLObjectType, GraphQLResolveInfo, OperationTypeNode } from 'graphql'; -import { Transform, Operation, getResponseKeyFromInfo, getErrors, applySchemaTransforms } from '@graphql-tools/utils'; +import { getResponseKeyFromInfo } from '@graphql-tools/utils'; import { delegateToSchema, getSubschema, - handleResult, + resolveExternalValue, SubschemaConfig, - isSubschemaConfig, - CreateProxyingResolverFn, ICreateProxyingResolverOptions, + applySchemaTransforms, + isExternalObject, + getUnpathedErrors, } from '@graphql-tools/delegate'; export function generateProxyingResolvers( - subschemaOrSubschemaConfig: GraphQLSchema | SubschemaConfig, - transforms: Array + subschemaConfig: SubschemaConfig ): Record>> { - let targetSchema: GraphQLSchema; - let schemaTransforms: Array = []; - let createProxyingResolver: CreateProxyingResolverFn; + const targetSchema = subschemaConfig.schema; + const createProxyingResolver = subschemaConfig.createProxyingResolver ?? defaultCreateProxyingResolver; - if (isSubschemaConfig(subschemaOrSubschemaConfig)) { - targetSchema = subschemaOrSubschemaConfig.schema; - createProxyingResolver = subschemaOrSubschemaConfig.createProxyingResolver ?? defaultCreateProxyingResolver; - if (subschemaOrSubschemaConfig.transforms != null) { - schemaTransforms = schemaTransforms.concat(subschemaOrSubschemaConfig.transforms); - } - } else { - targetSchema = subschemaOrSubschemaConfig; - createProxyingResolver = defaultCreateProxyingResolver; - } - - if (transforms != null) { - schemaTransforms = schemaTransforms.concat(transforms); - } - - const transformedSchema = applySchemaTransforms(targetSchema, schemaTransforms); + const transformedSchema = applySchemaTransforms(targetSchema, subschemaConfig); - const operationTypes: Record = { + const operationTypes: Record = { query: targetSchema.getQueryType(), mutation: targetSchema.getMutationType(), subscription: targetSchema.getSubscriptionType(), }; const resolvers = {}; - Object.keys(operationTypes).forEach((operation: Operation) => { + Object.keys(operationTypes).forEach((operation: OperationTypeNode) => { const rootType = operationTypes[operation]; if (rootType != null) { const typeName = rootType.name; @@ -52,14 +36,13 @@ export function generateProxyingResolvers( resolvers[typeName] = {}; Object.keys(fields).forEach(fieldName => { const proxyingResolver = createProxyingResolver({ - schema: subschemaOrSubschemaConfig, - transforms, + subschemaConfig, transformedSchema, operation, fieldName, }); - const finalResolver = createPossiblyNestedProxyingResolver(subschemaOrSubschemaConfig, proxyingResolver); + const finalResolver = createPossiblyNestedProxyingResolver(subschemaConfig, proxyingResolver); if (operation === 'subscription') { resolvers[typeName][fieldName] = { @@ -80,23 +63,23 @@ export function generateProxyingResolvers( } function createPossiblyNestedProxyingResolver( - subschemaOrSubschemaConfig: GraphQLSchema | SubschemaConfig, + subschemaConfig: SubschemaConfig, proxyingResolver: GraphQLFieldResolver ): GraphQLFieldResolver { return (parent, args, context, info) => { if (parent != null) { const responseKey = getResponseKeyFromInfo(info); - const errors = getErrors(parent, responseKey); // Check to see if the parent contains a proxied result - if (errors != null) { + if (isExternalObject(parent)) { + const unpathedErrors = getUnpathedErrors(parent); const subschema = getSubschema(parent, responseKey); // If there is a proxied result from this subschema, return it // This can happen even for a root field when the root type ia // also nested as a field within a different type. - if (subschemaOrSubschemaConfig === subschema && parent[responseKey] !== undefined) { - return handleResult(parent[responseKey], errors, subschema, context, info); + if (subschemaConfig === subschema && parent[responseKey] !== undefined) { + return resolveExternalValue(parent[responseKey], unpathedErrors, subschema, context, info); } } } @@ -106,18 +89,16 @@ function createPossiblyNestedProxyingResolver( } export function defaultCreateProxyingResolver({ - schema, + subschemaConfig, operation, - transforms, transformedSchema, }: ICreateProxyingResolverOptions): GraphQLFieldResolver { return (_parent, _args, context, info) => delegateToSchema({ - schema, + schema: subschemaConfig, operation, context, info, - transforms, transformedSchema, }); } diff --git a/packages/wrap/src/transforms/ExtendSchema.ts b/packages/wrap/src/transforms/ExtendSchema.ts deleted file mode 100644 index 41e243a001d..00000000000 --- a/packages/wrap/src/transforms/ExtendSchema.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { GraphQLSchema, extendSchema, parse } from 'graphql'; - -import { - Transform, - IFieldResolver, - IResolvers, - Request, - FieldNodeMappers, - ExecutionResult, -} from '@graphql-tools/utils'; -import { addResolversToSchema } from '@graphql-tools/schema'; -import { defaultMergedResolver } from '@graphql-tools/delegate'; - -import { ObjectValueTransformerMap, ErrorsTransformer } from '../types'; - -import MapFields from './MapFields'; - -export default class ExtendSchema implements Transform { - private readonly typeDefs: string | undefined; - private readonly resolvers: IResolvers | undefined; - private readonly defaultFieldResolver: IFieldResolver | undefined; - private readonly transformer: MapFields; - - constructor({ - typeDefs, - resolvers = {}, - defaultFieldResolver, - fieldNodeTransformerMap, - objectValueTransformerMap, - errorsTransformer, - }: { - typeDefs?: string; - resolvers?: IResolvers; - defaultFieldResolver?: IFieldResolver; - fieldNodeTransformerMap?: FieldNodeMappers; - objectValueTransformerMap?: ObjectValueTransformerMap; - errorsTransformer?: ErrorsTransformer; - }) { - this.typeDefs = typeDefs; - this.resolvers = resolvers; - this.defaultFieldResolver = defaultFieldResolver != null ? defaultFieldResolver : defaultMergedResolver; - this.transformer = new MapFields( - fieldNodeTransformerMap != null ? fieldNodeTransformerMap : {}, - objectValueTransformerMap, - errorsTransformer - ); - } - - public transformSchema(schema: GraphQLSchema): GraphQLSchema { - // MapFields's transformSchema function does not actually modify the schema -- - // it saves the current schema state, to be used later to transform requests. - this.transformer.transformSchema(schema); - - return addResolversToSchema({ - schema: this.typeDefs ? extendSchema(schema, parse(this.typeDefs)) : schema, - resolvers: this.resolvers != null ? this.resolvers : {}, - defaultFieldResolver: this.defaultFieldResolver, - }); - } - - public transformRequest( - originalRequest: Request, - delegationContext?: Record, - transformationContext?: Record - ): Request { - return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); - } - - public transformResult( - originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: Record - ): ExecutionResult { - return this.transformer.transformResult(originalResult, delegationContext, transformationContext); - } -} diff --git a/packages/wrap/src/transforms/ExtractField.ts b/packages/wrap/src/transforms/ExtractField.ts index 3ce38c88b10..787372bf7f7 100644 --- a/packages/wrap/src/transforms/ExtractField.ts +++ b/packages/wrap/src/transforms/ExtractField.ts @@ -1,6 +1,8 @@ import { visit, Kind, SelectionSetNode, BREAK, FieldNode } from 'graphql'; -import { Transform, Request } from '@graphql-tools/utils'; +import { Request } from '@graphql-tools/utils'; + +import { Transform, DelegationContext } from '@graphql-tools/delegate'; export default class ExtractField implements Transform { private readonly from: Array; @@ -11,7 +13,11 @@ export default class ExtractField implements Transform { this.to = to; } - public transformRequest(originalRequest: Request): Request { + public transformRequest( + originalRequest: Request, + _delegationContext: DelegationContext, + _transformationContext: Record + ): Request { let fromSelection: SelectionSetNode | undefined; const ourPathFrom = JSON.stringify(this.from); const ourPathTo = JSON.stringify(this.to); diff --git a/packages/wrap/src/transforms/FilterInputObjectFields.ts b/packages/wrap/src/transforms/FilterInputObjectFields.ts index ae7c1c69453..e5b4158fc2c 100644 --- a/packages/wrap/src/transforms/FilterInputObjectFields.ts +++ b/packages/wrap/src/transforms/FilterInputObjectFields.ts @@ -1,10 +1,13 @@ import { GraphQLSchema, GraphQLInputFieldConfig } from 'graphql'; -import { Transform, Request, InputFieldFilter } from '@graphql-tools/utils'; +import { Request, InputFieldFilter } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; -import TransformInputObjectFields from './TransformInputObjectFields'; import { InputObjectNodeTransformer } from '../types'; +import TransformInputObjectFields from './TransformInputObjectFields'; + export default class FilterInputObjectFields implements Transform { private readonly transformer: TransformInputObjectFields; @@ -17,11 +20,19 @@ export default class FilterInputObjectFields implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } - public transformRequest(originalRequest: Request, delegationContext?: Record): Request { - return this.transformer.transformRequest(originalRequest, delegationContext); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: Record + ): Request { + return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } } diff --git a/packages/wrap/src/transforms/FilterInterfaceFields.ts b/packages/wrap/src/transforms/FilterInterfaceFields.ts index d43ec3fbb21..cd797c0ffcf 100644 --- a/packages/wrap/src/transforms/FilterInterfaceFields.ts +++ b/packages/wrap/src/transforms/FilterInterfaceFields.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, FieldFilter } from '@graphql-tools/utils'; +import { FieldFilter } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import TransformInterfaceFields from './TransformInterfaceFields'; @@ -14,7 +16,11 @@ export default class FilterInterfaceFields implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } } diff --git a/packages/wrap/src/transforms/FilterObjectFieldDirectives.ts b/packages/wrap/src/transforms/FilterObjectFieldDirectives.ts index a3f2a0efb10..4d471964613 100644 --- a/packages/wrap/src/transforms/FilterObjectFieldDirectives.ts +++ b/packages/wrap/src/transforms/FilterObjectFieldDirectives.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, getArgumentValues } from '@graphql-tools/utils'; +import { getArgumentValues } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import TransformObjectFields from './TransformObjectFields'; @@ -11,11 +13,15 @@ export default class FilterObjectFieldDirectives implements Transform { this.filter = filter; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { const transformer = new TransformObjectFields( (_typeName: string, _fieldName: string, fieldConfig: GraphQLFieldConfig) => { const keepDirectives = fieldConfig.astNode.directives.filter(dir => { - const directiveDef = originalSchema.getDirective(dir.name.value); + const directiveDef = originalWrappingSchema.getDirective(dir.name.value); const directiveValue = directiveDef ? getArgumentValues(directiveDef, dir) : undefined; return this.filter(dir.name.value, directiveValue); }); @@ -33,6 +39,6 @@ export default class FilterObjectFieldDirectives implements Transform { } ); - return transformer.transformSchema(originalSchema); + return transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } } diff --git a/packages/wrap/src/transforms/FilterObjectFields.ts b/packages/wrap/src/transforms/FilterObjectFields.ts index acbb3e80faf..d02dc59d956 100644 --- a/packages/wrap/src/transforms/FilterObjectFields.ts +++ b/packages/wrap/src/transforms/FilterObjectFields.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, FieldFilter } from '@graphql-tools/utils'; +import { FieldFilter } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import TransformObjectFields from './TransformObjectFields'; @@ -14,7 +16,11 @@ export default class FilterObjectFields implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } } diff --git a/packages/wrap/src/transforms/FilterRootFields.ts b/packages/wrap/src/transforms/FilterRootFields.ts index da454b4292f..92673b031b1 100644 --- a/packages/wrap/src/transforms/FilterRootFields.ts +++ b/packages/wrap/src/transforms/FilterRootFields.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, RootFieldFilter } from '@graphql-tools/utils'; +import { RootFieldFilter } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import TransformRootFields from './TransformRootFields'; @@ -23,7 +25,11 @@ export default class FilterRootFields implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } } diff --git a/packages/wrap/src/transforms/FilterTypes.ts b/packages/wrap/src/transforms/FilterTypes.ts index 21938951f26..10e6c638f30 100644 --- a/packages/wrap/src/transforms/FilterTypes.ts +++ b/packages/wrap/src/transforms/FilterTypes.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLNamedType } from 'graphql'; -import { mapSchema, Transform, MapperKind } from '@graphql-tools/utils'; +import { mapSchema, MapperKind } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; export default class FilterTypes implements Transform { private readonly filter: (type: GraphQLNamedType) => boolean; @@ -9,8 +11,12 @@ export default class FilterTypes implements Transform { this.filter = filter; } - public transformSchema(schema: GraphQLSchema): GraphQLSchema { - return mapSchema(schema, { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + _subschemaConfig: SubschemaConfig, + _transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return mapSchema(originalWrappingSchema, { [MapperKind.TYPE]: (type: GraphQLNamedType) => { if (this.filter(type)) { return undefined; diff --git a/packages/wrap/src/transforms/HoistField.ts b/packages/wrap/src/transforms/HoistField.ts index a6920a789d1..198aa0aa2f1 100644 --- a/packages/wrap/src/transforms/HoistField.ts +++ b/packages/wrap/src/transforms/HoistField.ts @@ -6,19 +6,14 @@ import { Kind, GraphQLError, GraphQLArgument, + GraphQLFieldResolver, } from 'graphql'; -import { - renameFieldNode, - appendObjectFields, - removeObjectFields, - Transform, - Request, - ExecutionResult, - relocatedError, -} from '@graphql-tools/utils'; +import { appendObjectFields, removeObjectFields, Request, ExecutionResult, relocatedError } from '@graphql-tools/utils'; + +import { Transform, defaultMergedResolver, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; -import { defaultMergedResolver } from '@graphql-tools/delegate'; +import { defaultCreateProxyingResolver } from '../generateProxyingResolvers'; import MapFields from './MapFields'; @@ -69,7 +64,11 @@ export default class HoistField implements Transform { this.argLevels = argLevels; } - public transformSchema(schema: GraphQLSchema): GraphQLSchema { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema: GraphQLSchema + ): GraphQLSchema { const argsMap: Record = Object.create(null); const innerType: GraphQLObjectType = this.pathToField.reduce((acc, pathSegment, index) => { const field = acc.getFields()[pathSegment]; @@ -80,19 +79,40 @@ export default class HoistField implements Transform { } }); return getNullableType(field.type) as GraphQLObjectType; - }, schema.getType(this.typeName) as GraphQLObjectType); + }, originalWrappingSchema.getType(this.typeName) as GraphQLObjectType); let [newSchema, targetFieldConfigMap] = removeObjectFields( - schema, + originalWrappingSchema, innerType.name, fieldName => fieldName === this.oldFieldName ); const targetField = targetFieldConfigMap[this.oldFieldName]; + let resolve: GraphQLFieldResolver; + if (transformedSchema) { + const hoistingToRootField = + this.typeName === originalWrappingSchema.getQueryType()?.name || + this.typeName === originalWrappingSchema.getMutationType()?.name; + + if (hoistingToRootField) { + const targetSchema = subschemaConfig.schema; + const operation = this.typeName === targetSchema.getQueryType().name ? 'query' : 'mutation'; + const createProxyingResolver = subschemaConfig.createProxyingResolver ?? defaultCreateProxyingResolver; + resolve = createProxyingResolver({ + subschemaConfig, + transformedSchema, + operation, + fieldName: this.newFieldName, + }); + } else { + resolve = defaultMergedResolver; + } + } + const newTargetField = { ...targetField, - resolve: defaultMergedResolver, + resolve, }; const level = this.pathToField.length; @@ -119,21 +139,21 @@ export default class HoistField implements Transform { [this.newFieldName]: newTargetField, }); - return this.transformer.transformSchema(newSchema); + return this.transformer.transformSchema(newSchema, subschemaConfig, transformedSchema); } public transformRequest( originalRequest: Request, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): Request { return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } public transformResult( originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): ExecutionResult { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } @@ -169,6 +189,20 @@ export function wrapFieldNode( ); } +export function renameFieldNode(fieldNode: FieldNode, name: string): FieldNode { + return { + ...fieldNode, + alias: { + kind: Kind.NAME, + value: fieldNode.alias != null ? fieldNode.alias.value : fieldNode.name.value, + }, + name: { + kind: Kind.NAME, + value: name, + }, + }; +} + export function unwrapValue(originalValue: any, alias: string): any { let newValue = originalValue; diff --git a/packages/wrap/src/transforms/MapFields.ts b/packages/wrap/src/transforms/MapFields.ts index c45d07a81d1..ffe602c38e0 100644 --- a/packages/wrap/src/transforms/MapFields.ts +++ b/packages/wrap/src/transforms/MapFields.ts @@ -1,11 +1,13 @@ import { GraphQLSchema } from 'graphql'; -import { Transform, Request, FieldNodeMappers, ExecutionResult } from '@graphql-tools/utils'; +import { Request, FieldNodeMappers, ExecutionResult } from '@graphql-tools/utils'; -import TransformCompositeFields from './TransformCompositeFields'; +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import { ObjectValueTransformerMap, ErrorsTransformer } from '../types'; +import TransformCompositeFields from './TransformCompositeFields'; + export default class MapFields implements Transform { private readonly transformer: TransformCompositeFields; @@ -52,22 +54,26 @@ export default class MapFields implements Transform { ); } - public transformSchema(schema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(schema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } public transformRequest( originalRequest: Request, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): Request { return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } public transformResult( originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): ExecutionResult { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } diff --git a/packages/wrap/src/transforms/MapLeafValues.ts b/packages/wrap/src/transforms/MapLeafValues.ts index f6e2bd9137d..a9f4cd402e1 100644 --- a/packages/wrap/src/transforms/MapLeafValues.ts +++ b/packages/wrap/src/transforms/MapLeafValues.ts @@ -15,7 +15,6 @@ import { } from 'graphql'; import { - Transform, Request, ExecutionResult, visitResult, @@ -24,6 +23,8 @@ import { transformInputValue, } from '@graphql-tools/utils'; +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; + import { LeafValueTransformer } from '../types'; export interface MapLeafValuesTransformationContext { @@ -34,7 +35,7 @@ export default class MapLeafValues implements Transform { const type = typeMap[typeName]; if (!typeName.startsWith('__')) { @@ -54,13 +59,13 @@ export default class MapLeafValues implements Transform, + _delegationContext: DelegationContext, transformationContext?: MapLeafValuesTransformationContext ): Request { const document = originalRequest.document; @@ -91,13 +96,13 @@ export default class MapLeafValues implements Transform, + _delegationContext: DelegationContext, transformationContext?: MapLeafValuesTransformationContext - ) { + ): ExecutionResult { return visitResult( originalResult, transformationContext.transformedRequest, - this.originalSchema, + this.originalWrappingSchema, this.resultVisitorMap ); } diff --git a/packages/wrap/src/transforms/PruneSchema.ts b/packages/wrap/src/transforms/PruneSchema.ts index 13843a7e450..4cbc066f3bb 100644 --- a/packages/wrap/src/transforms/PruneSchema.ts +++ b/packages/wrap/src/transforms/PruneSchema.ts @@ -1,15 +1,21 @@ import { GraphQLSchema } from 'graphql'; -import { Transform, PruneSchemaOptions, pruneSchema } from '@graphql-tools/utils'; +import { PruneSchemaOptions, pruneSchema } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; export default class PruneTypes implements Transform { private readonly options: PruneSchemaOptions; - constructor(options: PruneSchemaOptions) { + constructor(options: PruneSchemaOptions = {}) { this.options = options; } - public transformSchema(schema: GraphQLSchema): GraphQLSchema { - return pruneSchema(schema, this.options); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + _subschemaConfig: SubschemaConfig, + _transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return pruneSchema(originalWrappingSchema, this.options); } } diff --git a/packages/wrap/src/transforms/RemoveObjectFieldDeprecations.ts b/packages/wrap/src/transforms/RemoveObjectFieldDeprecations.ts index ae21c300a5d..b0ddb11dcfe 100644 --- a/packages/wrap/src/transforms/RemoveObjectFieldDeprecations.ts +++ b/packages/wrap/src/transforms/RemoveObjectFieldDeprecations.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, valueMatchesCriteria } from '@graphql-tools/utils'; +import { valueMatchesCriteria } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import FilterObjectFieldDirectives from './FilterObjectFieldDirectives'; import TransformObjectFields from './TransformObjectFields'; @@ -25,7 +27,15 @@ export default class RemoveObjectFieldDeprecations implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.removeDeprecations.transformSchema(this.removeDirectives.transformSchema(originalSchema)); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.removeDeprecations.transformSchema( + this.removeDirectives.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema), + subschemaConfig, + transformedSchema + ); } } diff --git a/packages/wrap/src/transforms/RemoveObjectFieldDirectives.ts b/packages/wrap/src/transforms/RemoveObjectFieldDirectives.ts index 502e59ce14b..6464c699149 100644 --- a/packages/wrap/src/transforms/RemoveObjectFieldDirectives.ts +++ b/packages/wrap/src/transforms/RemoveObjectFieldDirectives.ts @@ -1,6 +1,8 @@ import { GraphQLSchema } from 'graphql'; -import { Transform, valueMatchesCriteria } from '@graphql-tools/utils'; +import { valueMatchesCriteria } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import FilterObjectFieldDirectives from './FilterObjectFieldDirectives'; @@ -13,7 +15,11 @@ export default class RemoveObjectFieldDirectives implements Transform { }); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } } diff --git a/packages/wrap/src/transforms/RemoveObjectFieldsWithDeprecation.ts b/packages/wrap/src/transforms/RemoveObjectFieldsWithDeprecation.ts index c8e6cba10de..958f32f3911 100644 --- a/packages/wrap/src/transforms/RemoveObjectFieldsWithDeprecation.ts +++ b/packages/wrap/src/transforms/RemoveObjectFieldsWithDeprecation.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, valueMatchesCriteria } from '@graphql-tools/utils'; +import { valueMatchesCriteria } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import FilterObjectFields from './FilterObjectFields'; @@ -18,7 +20,11 @@ export default class RemoveObjectFieldsWithDeprecation implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } } diff --git a/packages/wrap/src/transforms/RemoveObjectFieldsWithDirective.ts b/packages/wrap/src/transforms/RemoveObjectFieldsWithDirective.ts index 2ae35ce28a4..d44aee5b7c1 100644 --- a/packages/wrap/src/transforms/RemoveObjectFieldsWithDirective.ts +++ b/packages/wrap/src/transforms/RemoveObjectFieldsWithDirective.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, getDirectives, valueMatchesCriteria } from '@graphql-tools/utils'; +import { getDirectives, valueMatchesCriteria } from '@graphql-tools/utils'; + +import { SubschemaConfig, Transform } from '@graphql-tools/delegate'; import FilterObjectFields from './FilterObjectFields'; @@ -13,10 +15,14 @@ export default class RemoveObjectFieldsWithDirective implements Transform { this.args = args; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { const transformer = new FilterObjectFields( (_typeName: string, _fieldName: string, fieldConfig: GraphQLFieldConfig) => { - const valueMap = getDirectives(originalSchema, fieldConfig); + const valueMap = getDirectives(originalWrappingSchema, fieldConfig); return !Object.keys(valueMap).some( directiveName => valueMatchesCriteria(directiveName, this.directiveName) && @@ -27,6 +33,6 @@ export default class RemoveObjectFieldsWithDirective implements Transform { } ); - return transformer.transformSchema(originalSchema); + return transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } } diff --git a/packages/wrap/src/transforms/RenameInputObjectFields.ts b/packages/wrap/src/transforms/RenameInputObjectFields.ts index 2633763b1ee..6e2d80ecbc8 100644 --- a/packages/wrap/src/transforms/RenameInputObjectFields.ts +++ b/packages/wrap/src/transforms/RenameInputObjectFields.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLInputFieldConfig, ObjectFieldNode } from 'graphql'; -import { Transform, Request, mapSchema, MapperKind } from '@graphql-tools/utils'; +import { Request, mapSchema, MapperKind } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import TransformInputObjectFields from './TransformInputObjectFields'; @@ -40,8 +42,12 @@ export default class RenameInputObjectFields implements Transform { this.reverseMap = Object.create(null); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - mapSchema(originalSchema, { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + mapSchema(originalWrappingSchema, { [MapperKind.INPUT_OBJECT_FIELD]: ( inputFieldConfig: GraphQLInputFieldConfig, fieldName: string, @@ -62,10 +68,14 @@ export default class RenameInputObjectFields implements Transform { }, }); - return this.transformer.transformSchema(originalSchema); + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } - public transformRequest(originalRequest: Request, delegationContext?: Record): Request { - return this.transformer.transformRequest(originalRequest, delegationContext); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: Record + ): Request { + return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } } diff --git a/packages/wrap/src/transforms/RenameInterfaceFields.ts b/packages/wrap/src/transforms/RenameInterfaceFields.ts index df9e0303b8d..091b98c9c6b 100644 --- a/packages/wrap/src/transforms/RenameInterfaceFields.ts +++ b/packages/wrap/src/transforms/RenameInterfaceFields.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, Request } from '@graphql-tools/utils'; +import { Request } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import TransformInterfaceFields from './TransformInterfaceFields'; @@ -16,11 +18,19 @@ export default class RenameInterfaceFields implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } - public transformRequest(originalRequest: Request): Request { - return this.transformer.transformRequest(originalRequest); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: Record + ): Request { + return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } } diff --git a/packages/wrap/src/transforms/RenameObjectFields.ts b/packages/wrap/src/transforms/RenameObjectFields.ts index f305072978c..c763a82844e 100644 --- a/packages/wrap/src/transforms/RenameObjectFields.ts +++ b/packages/wrap/src/transforms/RenameObjectFields.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, Request } from '@graphql-tools/utils'; +import { Request } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import TransformObjectFields from './TransformObjectFields'; @@ -16,11 +18,19 @@ export default class RenameObjectFields implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } - public transformRequest(originalRequest: Request): Request { - return this.transformer.transformRequest(originalRequest); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: Record + ): Request { + return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } } diff --git a/packages/wrap/src/transforms/RenameRootFields.ts b/packages/wrap/src/transforms/RenameRootFields.ts index 5178f9fa516..6db0d3c39b9 100644 --- a/packages/wrap/src/transforms/RenameRootFields.ts +++ b/packages/wrap/src/transforms/RenameRootFields.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, Request } from '@graphql-tools/utils'; +import { Request } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import TransformRootFields from './TransformRootFields'; @@ -23,11 +25,19 @@ export default class RenameRootFields implements Transform { ); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(originalSchema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } - public transformRequest(originalRequest: Request): Request { - return this.transformer.transformRequest(originalRequest); + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: Record + ): Request { + return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } } diff --git a/packages/wrap/src/transforms/RenameRootTypes.ts b/packages/wrap/src/transforms/RenameRootTypes.ts index 65c6946c6ed..3d3f06d5aa0 100644 --- a/packages/wrap/src/transforms/RenameRootTypes.ts +++ b/packages/wrap/src/transforms/RenameRootTypes.ts @@ -1,14 +1,8 @@ import { visit, GraphQLSchema, NamedTypeNode, Kind } from 'graphql'; -import { - Request, - ExecutionResult, - MapperKind, - Transform, - mapSchema, - renameType, - visitData, -} from '@graphql-tools/utils'; +import { Request, ExecutionResult, MapperKind, mapSchema, renameType, visitData } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; export default class RenameRootTypes implements Transform { private readonly renamer: (name: string) => string | undefined; @@ -21,8 +15,12 @@ export default class RenameRootTypes implements Transform { this.reverseMap = Object.create(null); } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return mapSchema(originalSchema, { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + _subschemaConfig: SubschemaConfig, + _transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return mapSchema(originalWrappingSchema, { [MapperKind.ROOT_OBJECT]: type => { const oldName = type.name; const newName = this.renamer(oldName); @@ -36,7 +34,11 @@ export default class RenameRootTypes implements Transform { }); } - public transformRequest(originalRequest: Request): Request { + public transformRequest( + originalRequest: Request, + _delegationContext: DelegationContext, + _transformationContext: Record + ): Request { const document = visit(originalRequest.document, { [Kind.NAMED_TYPE]: (node: NamedTypeNode) => { const name = node.name.value; @@ -57,10 +59,14 @@ export default class RenameRootTypes implements Transform { }; } - public transformResult(result: ExecutionResult): ExecutionResult { + public transformResult( + originalResult: ExecutionResult, + _delegationContext: DelegationContext, + _transformationContext?: Record + ): ExecutionResult { return { - ...result, - data: visitData(result.data, object => { + ...originalResult, + data: visitData(originalResult.data, object => { const typeName = object?.__typename; if (typeName != null && typeName in this.map) { object.__typename = this.map[typeName]; diff --git a/packages/wrap/src/transforms/RenameTypes.ts b/packages/wrap/src/transforms/RenameTypes.ts index 401f4ba8be7..00a207b358e 100644 --- a/packages/wrap/src/transforms/RenameTypes.ts +++ b/packages/wrap/src/transforms/RenameTypes.ts @@ -9,7 +9,6 @@ import { } from 'graphql'; import { - Transform, Request, ExecutionResult, MapperKind, @@ -19,6 +18,8 @@ import { renameType, } from '@graphql-tools/utils'; +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; + export default class RenameTypes implements Transform { private readonly renamer: (name: string) => string | undefined; private map: Record; @@ -35,8 +36,12 @@ export default class RenameTypes implements Transform { this.renameScalars = renameScalars; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - return mapSchema(originalSchema, { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + _subschemaConfig: SubschemaConfig, + _transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return mapSchema(originalWrappingSchema, { [MapperKind.TYPE]: (type: GraphQLNamedType) => { if (isSpecifiedScalarType(type) && !this.renameBuiltins) { return undefined; @@ -60,7 +65,11 @@ export default class RenameTypes implements Transform { }); } - public transformRequest(originalRequest: Request): Request { + public transformRequest( + originalRequest: Request, + _delegationContext: DelegationContext, + _transformationContext: Record + ): Request { const document = visit(originalRequest.document, { [Kind.NAMED_TYPE]: (node: NamedTypeNode) => { const name = node.name.value; @@ -82,10 +91,14 @@ export default class RenameTypes implements Transform { }; } - public transformResult(result: ExecutionResult): ExecutionResult { + public transformResult( + originalResult: ExecutionResult, + _delegationContext: DelegationContext, + _transformationContext?: Record + ): ExecutionResult { return { - ...result, - data: visitData(result.data, object => { + ...originalResult, + data: visitData(originalResult.data, object => { const typeName = object?.__typename; if (typeName != null && typeName in this.map) { object.__typename = this.map[typeName]; diff --git a/packages/wrap/src/transforms/TransformCompositeFields.ts b/packages/wrap/src/transforms/TransformCompositeFields.ts index 56b4c782c04..1d6edd91c6e 100644 --- a/packages/wrap/src/transforms/TransformCompositeFields.ts +++ b/packages/wrap/src/transforms/TransformCompositeFields.ts @@ -11,7 +11,10 @@ import { FragmentDefinitionNode, } from 'graphql'; -import { Transform, Request, MapperKind, mapSchema, visitData, ExecutionResult } from '@graphql-tools/utils'; +import { Request, MapperKind, mapSchema, visitData, ExecutionResult } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; + import { FieldTransformer, FieldNodeTransformer, DataTransformer, ErrorsTransformer } from '../types'; export default class TransformCompositeFields implements Transform { @@ -36,8 +39,12 @@ export default class TransformCompositeFields implements Transform { this.mapping = {}; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - this.transformedSchema = mapSchema(originalSchema, { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + _subschemaConfig: SubschemaConfig, + _transformedSchema?: GraphQLSchema + ): GraphQLSchema { + this.transformedSchema = mapSchema(originalWrappingSchema, { [MapperKind.COMPOSITE_FIELD]: (fieldConfig, fieldName, typeName) => { const transformedField = this.fieldTransformer(typeName, fieldName, fieldConfig); if (Array.isArray(transformedField)) { @@ -60,8 +67,8 @@ export default class TransformCompositeFields implements Transform { public transformRequest( originalRequest: Request, - _delegationContext?: Record, - transformationContext?: Record + _delegationContext: DelegationContext, + transformationContext: Record ): Request { const document = originalRequest.document; const fragments = Object.create(null); @@ -78,9 +85,9 @@ export default class TransformCompositeFields implements Transform { public transformResult( result: ExecutionResult, - _delegationContext?: Record, - transformationContext?: Record - ) { + _delegationContext: DelegationContext, + transformationContext: Record + ): ExecutionResult { if (this.dataTransformer != null) { result.data = visitData(result.data, value => this.dataTransformer(value, transformationContext)); } diff --git a/packages/wrap/src/transforms/TransformEnumValues.ts b/packages/wrap/src/transforms/TransformEnumValues.ts index 89478e3e227..009cf5e0d56 100644 --- a/packages/wrap/src/transforms/TransformEnumValues.ts +++ b/packages/wrap/src/transforms/TransformEnumValues.ts @@ -1,6 +1,8 @@ import { GraphQLSchema, GraphQLEnumValueConfig, ExecutionResult } from 'graphql'; -import { Transform, Request, MapperKind, mapSchema } from '@graphql-tools/utils'; +import { Request, MapperKind, mapSchema } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import { EnumValueTransformer, LeafValueTransformer } from '../types'; @@ -27,9 +29,13 @@ export default class TransformEnumValues implements Transform this.transformEnumValue(typeName, externalValue, valueConfig), }); @@ -38,16 +44,16 @@ export default class TransformEnumValues implements Transform, - transformationContext?: MapLeafValuesTransformationContext + delegationContext: DelegationContext, + transformationContext: MapLeafValuesTransformationContext ): Request { return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } public transformResult( originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: MapLeafValuesTransformationContext + delegationContext: DelegationContext, + transformationContext: MapLeafValuesTransformationContext ) { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } diff --git a/packages/wrap/src/transforms/TransformInputObjectFields.ts b/packages/wrap/src/transforms/TransformInputObjectFields.ts index c038115df45..a8026d39716 100644 --- a/packages/wrap/src/transforms/TransformInputObjectFields.ts +++ b/packages/wrap/src/transforms/TransformInputObjectFields.ts @@ -12,9 +12,11 @@ import { ObjectFieldNode, } from 'graphql'; -import { Transform, Request, MapperKind, mapSchema } from '@graphql-tools/utils'; +import { Request, MapperKind, mapSchema } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; + import { InputFieldTransformer, InputFieldNodeTransformer, InputObjectNodeTransformer } from '../types'; -import { DelegationContext } from '@graphql-tools/delegate'; export default class TransformInputObjectFields implements Transform { private readonly inputFieldTransformer: InputFieldTransformer; @@ -34,8 +36,12 @@ export default class TransformInputObjectFields implements Transform { this.mapping = {}; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - this.transformedSchema = mapSchema(originalSchema, { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + _subschemaConfig: SubschemaConfig, + _transformedSchema?: GraphQLSchema + ): GraphQLSchema { + this.transformedSchema = mapSchema(originalWrappingSchema, { [MapperKind.INPUT_OBJECT_FIELD]: (inputFieldConfig, fieldName, typeName) => { const transformedInputField = this.inputFieldTransformer(typeName, fieldName, inputFieldConfig); if (Array.isArray(transformedInputField)) { @@ -55,7 +61,11 @@ export default class TransformInputObjectFields implements Transform { return this.transformedSchema; } - public transformRequest(originalRequest: Request, delegationContext?: Record): Request { + public transformRequest( + originalRequest: Request, + delegationContext: DelegationContext, + _transformationContextד: Record + ): Request { const fragments = Object.create(null); originalRequest.document.definitions .filter(def => def.kind === Kind.FRAGMENT_DEFINITION) @@ -68,8 +78,7 @@ export default class TransformInputObjectFields implements Transform { this.inputFieldNodeTransformer, this.inputObjectNodeTransformer, originalRequest, - // cast to DelegationContext as workaround to avoid breaking change in types until next major version - delegationContext as DelegationContext + delegationContext ); return { ...originalRequest, diff --git a/packages/wrap/src/transforms/TransformInterfaceFields.ts b/packages/wrap/src/transforms/TransformInterfaceFields.ts index 7c2976e25a3..956ac4e5673 100644 --- a/packages/wrap/src/transforms/TransformInterfaceFields.ts +++ b/packages/wrap/src/transforms/TransformInterfaceFields.ts @@ -1,6 +1,9 @@ import { GraphQLSchema, isInterfaceType, GraphQLFieldConfig } from 'graphql'; -import { Transform, Request, ExecutionResult } from '@graphql-tools/utils'; +import { Request, ExecutionResult } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; + import { FieldTransformer, FieldNodeTransformer } from '../types'; import TransformCompositeFields from './TransformCompositeFields'; @@ -15,13 +18,17 @@ export default class TransformInterfaceFields implements Transform { this.fieldNodeTransformer = fieldNodeTransformer; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { const compositeToObjectFieldTransformer = ( typeName: string, fieldName: string, fieldConfig: GraphQLFieldConfig ) => { - if (isInterfaceType(originalSchema.getType(typeName))) { + if (isInterfaceType(originalWrappingSchema.getType(typeName))) { return this.interfaceFieldTransformer(typeName, fieldName, fieldConfig); } @@ -30,21 +37,21 @@ export default class TransformInterfaceFields implements Transform { this.transformer = new TransformCompositeFields(compositeToObjectFieldTransformer, this.fieldNodeTransformer); - return this.transformer.transformSchema(originalSchema); + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } public transformRequest( originalRequest: Request, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): Request { return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } public transformResult( originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): ExecutionResult { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } diff --git a/packages/wrap/src/transforms/TransformObjectFields.ts b/packages/wrap/src/transforms/TransformObjectFields.ts index bcf40c0fd90..7ced6e12f2c 100644 --- a/packages/wrap/src/transforms/TransformObjectFields.ts +++ b/packages/wrap/src/transforms/TransformObjectFields.ts @@ -1,6 +1,9 @@ import { GraphQLSchema, isObjectType, GraphQLFieldConfig } from 'graphql'; -import { Transform, Request, ExecutionResult } from '@graphql-tools/utils'; +import { Request, ExecutionResult } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; + import { FieldTransformer, FieldNodeTransformer } from '../types'; import TransformCompositeFields from './TransformCompositeFields'; @@ -15,13 +18,17 @@ export default class TransformObjectFields implements Transform { this.fieldNodeTransformer = fieldNodeTransformer; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { const compositeToObjectFieldTransformer = ( typeName: string, fieldName: string, fieldConfig: GraphQLFieldConfig ) => { - if (isObjectType(originalSchema.getType(typeName))) { + if (isObjectType(originalWrappingSchema.getType(typeName))) { return this.objectFieldTransformer(typeName, fieldName, fieldConfig); } @@ -30,21 +37,21 @@ export default class TransformObjectFields implements Transform { this.transformer = new TransformCompositeFields(compositeToObjectFieldTransformer, this.fieldNodeTransformer); - return this.transformer.transformSchema(originalSchema); + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } public transformRequest( originalRequest: Request, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): Request { return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } public transformResult( originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): ExecutionResult { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } diff --git a/packages/wrap/src/transforms/TransformQuery.ts b/packages/wrap/src/transforms/TransformQuery.ts index 3ed51e534c9..febd6881c58 100644 --- a/packages/wrap/src/transforms/TransformQuery.ts +++ b/packages/wrap/src/transforms/TransformQuery.ts @@ -1,6 +1,8 @@ import { visit, Kind, SelectionSetNode, FragmentDefinitionNode, GraphQLError } from 'graphql'; -import { Transform, Request, ExecutionResult, relocatedError } from '@graphql-tools/utils'; +import { Request, ExecutionResult, relocatedError } from '@graphql-tools/utils'; + +import { Transform, DelegationContext } from '@graphql-tools/delegate'; export type QueryTransformer = ( selectionSet: SelectionSetNode, @@ -38,7 +40,11 @@ export default class TransformQuery implements Transform { this.fragments = fragments; } - public transformRequest(originalRequest: Request): Request { + public transformRequest( + originalRequest: Request, + _delegationContext: DelegationContext, + _transformationContext: Record + ): Request { const pathLength = this.path.length; let index = 0; const document = visit(originalRequest.document, { @@ -71,7 +77,11 @@ export default class TransformQuery implements Transform { }; } - public transformResult(originalResult: ExecutionResult): ExecutionResult { + public transformResult( + originalResult: ExecutionResult, + _delegationContext: DelegationContext, + _transformationContext: Record + ): ExecutionResult { const data = this.transformData(originalResult.data); const errors = originalResult.errors; return { diff --git a/packages/wrap/src/transforms/TransformRootFields.ts b/packages/wrap/src/transforms/TransformRootFields.ts index ed14067e702..ba224efbf5c 100644 --- a/packages/wrap/src/transforms/TransformRootFields.ts +++ b/packages/wrap/src/transforms/TransformRootFields.ts @@ -1,10 +1,13 @@ import { GraphQLSchema, GraphQLFieldConfig } from 'graphql'; -import { Transform, Request, ExecutionResult } from '@graphql-tools/utils'; +import { Request, ExecutionResult } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; -import TransformObjectFields from './TransformObjectFields'; import { RootFieldTransformer, FieldNodeTransformer } from '../types'; +import TransformObjectFields from './TransformObjectFields'; + export default class TransformRootFields implements Transform { private readonly rootFieldTransformer: RootFieldTransformer; private readonly fieldNodeTransformer: FieldNodeTransformer; @@ -15,10 +18,14 @@ export default class TransformRootFields implements Transform { this.fieldNodeTransformer = fieldNodeTransformer; } - public transformSchema(originalSchema: GraphQLSchema): GraphQLSchema { - const queryTypeName = originalSchema.getQueryType()?.name; - const mutationTypeName = originalSchema.getMutationType()?.name; - const subscriptionTypeName = originalSchema.getSubscriptionType()?.name; + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + const queryTypeName = originalWrappingSchema.getQueryType()?.name; + const mutationTypeName = originalWrappingSchema.getMutationType()?.name; + const subscriptionTypeName = originalWrappingSchema.getSubscriptionType()?.name; const rootToObjectFieldTransformer = ( typeName: string, @@ -42,21 +49,21 @@ export default class TransformRootFields implements Transform { this.transformer = new TransformObjectFields(rootToObjectFieldTransformer, this.fieldNodeTransformer); - return this.transformer.transformSchema(originalSchema); + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } public transformRequest( originalRequest: Request, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): Request { return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } public transformResult( originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): ExecutionResult { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } diff --git a/packages/wrap/src/transforms/WrapFields.ts b/packages/wrap/src/transforms/WrapFields.ts index 7f1d4371c73..ee989ae9b9d 100644 --- a/packages/wrap/src/transforms/WrapFields.ts +++ b/packages/wrap/src/transforms/WrapFields.ts @@ -1,17 +1,17 @@ import { GraphQLSchema, GraphQLObjectType, - GraphQLResolveInfo, - GraphQLFieldResolver, GraphQLError, FieldNode, FragmentDefinitionNode, SelectionSetNode, Kind, + GraphQLFieldConfigMap, + GraphQLFieldConfig, + GraphQLFieldResolver, } from 'graphql'; import { - Transform, Request, appendObjectFields, selectObjectFields, @@ -20,35 +20,22 @@ import { relocatedError, } from '@graphql-tools/utils'; -import { defaultMergedResolver } from '@graphql-tools/delegate'; +import { Transform, defaultMergedResolver, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import MapFields from './MapFields'; +import { defaultCreateProxyingResolver } from '../generateProxyingResolvers'; interface WrapFieldsTransformationContext { nextIndex: number; paths: Record; alias: string }>; } -function defaultWrappingResolver( - parent: any, - args: Record, - context: Record, - info: GraphQLResolveInfo -): any { - if (!parent) { - return {}; - } - - return defaultMergedResolver(parent, args, context, info); -} - export default class WrapFields implements Transform { private readonly outerTypeName: string; private readonly wrappingFieldNames: Array; private readonly wrappingTypeNames: Array; private readonly numWraps: number; private readonly fieldNames: Array; - private readonly wrappingResolver: GraphQLFieldResolver; private readonly transformer: Transform; constructor( @@ -56,7 +43,6 @@ export default class WrapFields implements Transform, wrappingTypeNames: Array, fieldNames?: Array, - wrappingResolver: GraphQLFieldResolver = defaultWrappingResolver, prefix = 'gqtld' ) { this.outerTypeName = outerTypeName; @@ -64,7 +50,6 @@ export default class WrapFields implements Transform true : fieldName => this.fieldNames.includes(fieldName) ); + const newTargetFieldConfigMap: GraphQLFieldConfigMap = Object.create(null); + Object.keys(targetFieldConfigMap).forEach(fieldName => { + const field = targetFieldConfigMap[fieldName]; + const newField: GraphQLFieldConfig = { + ...field, + resolve: defaultMergedResolver, + }; + newTargetFieldConfigMap[fieldName] = newField; + }); + let wrapIndex = this.numWraps - 1; let wrappingTypeName = this.wrappingTypeNames[wrapIndex]; let wrappingFieldName = this.wrappingFieldNames[wrapIndex]; - let newSchema = appendObjectFields(schema, wrappingTypeName, targetFieldConfigMap); + let newSchema = appendObjectFields(originalWrappingSchema, wrappingTypeName, newTargetFieldConfigMap); for (wrapIndex--; wrapIndex > -1; wrapIndex--) { const nextWrappingTypeName = this.wrappingTypeNames[wrapIndex]; @@ -112,7 +111,7 @@ export default class WrapFields implements Transform; + if (transformedSchema) { + if (wrappingRootField) { + const targetSchema = subschemaConfig.schema; + const operation = this.outerTypeName === targetSchema.getQueryType().name ? 'query' : 'mutation'; + const createProxyingResolver = subschemaConfig.createProxyingResolver ?? defaultCreateProxyingResolver; + resolve = createProxyingResolver({ + subschemaConfig, + transformedSchema, + operation, + fieldName: wrappingFieldName, + }); + } else { + resolve = defaultMergedResolver; + } + } + + const selectedFieldNames = Object.keys(newTargetFieldConfigMap); [newSchema] = modifyObjectFields( newSchema, this.outerTypeName, @@ -128,18 +148,18 @@ export default class WrapFields implements Transform, - transformationContext?: WrapFieldsTransformationContext + delegationContext: DelegationContext, + transformationContext: WrapFieldsTransformationContext ): Request { transformationContext.nextIndex = 0; transformationContext.paths = Object.create(null); @@ -148,8 +168,8 @@ export default class WrapFields implements Transform, - transformationContext?: WrapFieldsTransformationContext + delegationContext: DelegationContext, + transformationContext: WrapFieldsTransformationContext ): ExecutionResult { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } diff --git a/packages/wrap/src/transforms/WrapQuery.ts b/packages/wrap/src/transforms/WrapQuery.ts index ebf62492d2b..04b7dbc84ba 100644 --- a/packages/wrap/src/transforms/WrapQuery.ts +++ b/packages/wrap/src/transforms/WrapQuery.ts @@ -1,6 +1,8 @@ import { FieldNode, visit, Kind, SelectionNode, SelectionSetNode } from 'graphql'; -import { Transform, Request, ExecutionResult } from '@graphql-tools/utils'; +import { Request, ExecutionResult } from '@graphql-tools/utils'; + +import { Transform, DelegationContext } from '@graphql-tools/delegate'; export type QueryWrapper = (subtree: SelectionSetNode) => SelectionNode | SelectionSetNode; @@ -15,7 +17,11 @@ export default class WrapQuery implements Transform { this.extractor = extractor; } - public transformRequest(originalRequest: Request): Request { + public transformRequest( + originalRequest: Request, + _delegationContext: DelegationContext, + _transformationContext: Record + ): Request { const fieldPath: Array = []; const ourPath = JSON.stringify(this.path); const document = visit(originalRequest.document, { @@ -52,7 +58,11 @@ export default class WrapQuery implements Transform { }; } - public transformResult(originalResult: ExecutionResult): ExecutionResult { + public transformResult( + originalResult: ExecutionResult, + _delegationContext: DelegationContext, + _transformationContext: Record + ): ExecutionResult { const rootData = originalResult.data; if (rootData != null) { let data = rootData; diff --git a/packages/wrap/src/transforms/WrapType.ts b/packages/wrap/src/transforms/WrapType.ts index 1757b2daeee..83d99089e1a 100644 --- a/packages/wrap/src/transforms/WrapType.ts +++ b/packages/wrap/src/transforms/WrapType.ts @@ -1,6 +1,8 @@ import { GraphQLSchema } from 'graphql'; -import { Transform, Request, ExecutionResult } from '@graphql-tools/utils'; +import { Request, ExecutionResult } from '@graphql-tools/utils'; + +import { Transform, DelegationContext, SubschemaConfig } from '@graphql-tools/delegate'; import WrapFields from './WrapFields'; @@ -11,22 +13,26 @@ export default class WrapType implements Transform { this.transformer = new WrapFields(outerTypeName, [fieldName], [innerTypeName]); } - public transformSchema(schema: GraphQLSchema): GraphQLSchema { - return this.transformer.transformSchema(schema); + public transformSchema( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema + ): GraphQLSchema { + return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema); } public transformRequest( originalRequest: Request, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): Request { return this.transformer.transformRequest(originalRequest, delegationContext, transformationContext); } public transformResult( originalResult: ExecutionResult, - delegationContext?: Record, - transformationContext?: Record + delegationContext: DelegationContext, + transformationContext: Record ): ExecutionResult { return this.transformer.transformResult(originalResult, delegationContext, transformationContext); } diff --git a/packages/wrap/src/transforms/index.ts b/packages/wrap/src/transforms/index.ts index e8a32dfb6b4..b4ff9273547 100644 --- a/packages/wrap/src/transforms/index.ts +++ b/packages/wrap/src/transforms/index.ts @@ -23,7 +23,6 @@ export { default as RemoveObjectFieldsWithDirective } from './RemoveObjectFields export { default as RemoveObjectFieldDeprecations } from './RemoveObjectFieldDeprecations'; export { default as RemoveObjectFieldsWithDeprecation } from './RemoveObjectFieldsWithDeprecation'; -export { default as ExtendSchema } from './ExtendSchema'; export { default as PruneSchema } from './PruneSchema'; export { default as WrapType } from './WrapType'; export { default as WrapFields } from './WrapFields'; diff --git a/packages/wrap/src/types.ts b/packages/wrap/src/types.ts index 22a1200c88c..dd59d63c028 100644 --- a/packages/wrap/src/types.ts +++ b/packages/wrap/src/types.ts @@ -72,7 +72,7 @@ export type FieldNodeTransformer = ( export type LeafValueTransformer = (typeName: string, value: any) => any; -export type DataTransformer = (value: any, transformationContext?: Record) => any; +export type DataTransformer = (value: any, transformationContext: Record) => any; export type ObjectValueTransformerMap = Record; diff --git a/packages/wrap/src/wrapSchema.ts b/packages/wrap/src/wrapSchema.ts index f7aaf0f8dbc..12f55f7bcde 100644 --- a/packages/wrap/src/wrapSchema.ts +++ b/packages/wrap/src/wrapSchema.ts @@ -6,35 +6,20 @@ import { GraphQLFieldResolver, } from 'graphql'; -import { Transform, MapperKind, mapSchema, applySchemaTransforms } from '@graphql-tools/utils'; +import { MapperKind, mapSchema } from '@graphql-tools/utils'; -import { SubschemaConfig, isSubschemaConfig, defaultMergedResolver } from '@graphql-tools/delegate'; +import { SubschemaConfig, defaultMergedResolver, applySchemaTransforms } from '@graphql-tools/delegate'; import { generateProxyingResolvers } from './generateProxyingResolvers'; -export function wrapSchema( - subschemaOrSubschemaConfig: GraphQLSchema | SubschemaConfig, - transforms?: Array -): GraphQLSchema { - let targetSchema: GraphQLSchema; - let schemaTransforms: Array = []; +export function wrapSchema(subschemaConfig: SubschemaConfig): GraphQLSchema { + const targetSchema = subschemaConfig.schema; - if (isSubschemaConfig(subschemaOrSubschemaConfig)) { - targetSchema = subschemaOrSubschemaConfig.schema; - if (subschemaOrSubschemaConfig.transforms != null) { - schemaTransforms = schemaTransforms.concat(subschemaOrSubschemaConfig.transforms); - } - } else { - targetSchema = subschemaOrSubschemaConfig; - } - - if (transforms != null) { - schemaTransforms = schemaTransforms.concat(transforms); - } - - const proxyingResolvers = generateProxyingResolvers(subschemaOrSubschemaConfig, transforms); + const proxyingResolvers = generateProxyingResolvers(subschemaConfig); const schema = createWrappingSchema(targetSchema, proxyingResolvers); - return applySchemaTransforms(schema, schemaTransforms); + const transformedSchema = applySchemaTransforms(schema, subschemaConfig); + + return applySchemaTransforms(schema, subschemaConfig, transformedSchema); } function createWrappingSchema( diff --git a/packages/wrap/tests/errors.test.ts b/packages/wrap/tests/errors.test.ts deleted file mode 100644 index 728e6677823..00000000000 --- a/packages/wrap/tests/errors.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { GraphQLError, GraphQLResolveInfo } from 'graphql'; - -import { relocatedError, getErrors, ERROR_SYMBOL } from '@graphql-tools/utils'; - -import { checkResultAndHandleErrors } from '@graphql-tools/delegate'; - -class ErrorWithExtensions extends GraphQLError { - constructor(message: string, code: string) { - super(message, null, null, null, null, null, { code }); - } -} - -describe('Errors', () => { - describe('relocatedError', () => { - test('should adjust the path of a GraphqlError', () => { - const originalError = new GraphQLError('test', null, null, null, [ - 'test', - ]); - const newError = relocatedError(originalError, ['test', 1]); - const expectedError = new GraphQLError('test', null, null, null, [ - 'test', - 1, - ]); - expect(newError).toEqual(expectedError); - }); - }); - - describe('getErrors', () => { - test('should return all errors including if path is not defined', () => { - const error = { - message: 'Test error without path', - }; - const mockErrors: any = { - responseKey: '', - [ERROR_SYMBOL]: [error], - }; - - expect(getErrors(mockErrors, 'responseKey')).toEqual([ - mockErrors[ERROR_SYMBOL][0], - ]); - }); - }); - - describe('checkResultAndHandleErrors', () => { - test('persists single error', () => { - const result = { - errors: [new GraphQLError('Test error')], - }; - try { - checkResultAndHandleErrors( - result, - {}, - ({} as unknown) as GraphQLResolveInfo, - 'responseKey', - ); - } catch (e) { - expect(e.message).toEqual('Test error'); - expect(e.originalError.errors).toBeUndefined(); - } - }); - - test('persists single error with extensions', () => { - const result = { - errors: [new ErrorWithExtensions('Test error', 'UNAUTHENTICATED')], - }; - try { - checkResultAndHandleErrors( - result, - {}, - ({} as unknown) as GraphQLResolveInfo, - 'responseKey', - ); - } catch (e) { - expect(e.message).toEqual('Test error'); - expect(e.extensions && e.extensions.code).toEqual('UNAUTHENTICATED'); - expect(e.originalError.errors).toBeUndefined(); - } - }); - - test('combines errors and persists the original errors', () => { - const result = { - errors: [new GraphQLError('Error1'), new GraphQLError('Error2')], - }; - try { - checkResultAndHandleErrors( - result, - {}, - ({} as unknown) as GraphQLResolveInfo, - 'responseKey', - ); - } catch (e) { - expect(e.message).toEqual('Error1\nError2'); - expect(e.originalError).toBeDefined(); - expect(e.originalError.errors).toBeDefined(); - expect(e.originalError.errors).toHaveLength(result.errors.length); - result.errors.forEach((error, i) => { - expect(e.originalError.errors[i]).toEqual(error); - }); - } - }); - }); -}); diff --git a/packages/wrap/tests/forAwaitEach.ts b/packages/wrap/tests/forAwaitEach.ts deleted file mode 100644 index 0f07f29be1b..00000000000 --- a/packages/wrap/tests/forAwaitEach.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable callback-return */ -/* eslint-disable @typescript-eslint/await-thenable */ - -function isAsyncIterable(obj: any): obj is AsyncIterable { - return Symbol.asyncIterator in obj; -} - -export async function forAwaitEach( - obj: AsyncIterable | T, - callback: (i: T) => any | Promise, -) { - if (isAsyncIterable(obj)) { - for await (const i of obj) { - await callback(i); - } - } else { - await callback(obj); - } -} diff --git a/packages/wrap/tests/fragmentsAreNotDuplicated.test.ts b/packages/wrap/tests/fragmentsAreNotDuplicated.test.ts index 533ea1e5d22..02df525b46a 100644 --- a/packages/wrap/tests/fragmentsAreNotDuplicated.test.ts +++ b/packages/wrap/tests/fragmentsAreNotDuplicated.test.ts @@ -22,7 +22,7 @@ describe('Merging schemas', () => { ); assertNoDuplicateFragmentErrors(originalResult); - const transformedSchema = wrapSchema(originalSchema, []); + const transformedSchema = wrapSchema({ schema: originalSchema }); const transformedResult = await graphql( transformedSchema, diff --git a/packages/wrap/tests/gatsbyTransforms.test.ts b/packages/wrap/tests/gatsbyTransforms.test.ts index f08f718f8dc..3831e37be25 100644 --- a/packages/wrap/tests/gatsbyTransforms.test.ts +++ b/packages/wrap/tests/gatsbyTransforms.test.ts @@ -135,15 +135,18 @@ describe('Gatsby transforms', () => { schema = addMocksToSchema({ schema }); - const transformedSchema = wrapSchema(schema, [ - new StripNonQueryTransform(), - new RenameTypes((name) => `CountriesQuery_${name}`), - new NamespaceUnderFieldTransform({ - typeName: 'CountriesQuery', - fieldName: 'countries', - resolver: () => ({}), - }), - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new StripNonQueryTransform(), + new RenameTypes((name) => `CountriesQuery_${name}`), + new NamespaceUnderFieldTransform({ + typeName: 'CountriesQuery', + fieldName: 'countries', + resolver: () => ({}), + }), + ], + }); expect(transformedSchema).toBeInstanceOf(GraphQLSchema); diff --git a/packages/wrap/tests/makeRemoteExecutableSchema.test.ts b/packages/wrap/tests/makeRemoteExecutableSchema.test.ts index 20cd65ef239..554d656108b 100644 --- a/packages/wrap/tests/makeRemoteExecutableSchema.test.ts +++ b/packages/wrap/tests/makeRemoteExecutableSchema.test.ts @@ -1,4 +1,3 @@ -import { forAwaitEach } from './forAwaitEach'; import { GraphQLSchema, subscribe, @@ -6,6 +5,7 @@ import { graphql, execute, print, + ExecutionResult, } from 'graphql'; import { makeRemoteExecutableSchema } from '../src/index'; @@ -63,7 +63,7 @@ describe('remote subscriptions', () => { schema = makeRemoteExecutableSchema(remoteSubschemaConfig); }); - test('should work', (done) => { + test('should work', async () => { const mockNotification = { notifications: { text: 'Hello world', @@ -78,21 +78,13 @@ describe('remote subscriptions', () => { } `); - let notificationCnt = 0; - subscribe(schema, subscription) - .then((results) => { - forAwaitEach(results, (result) => { - expect(result).toHaveProperty('data'); - expect(result.data).toEqual(mockNotification); - if (!notificationCnt++) { - done(); - } - }).catch(done); - }) - .then(() => - subscriptionPubSub.publish(subscriptionPubSubTrigger, mockNotification), - ) - .catch(done); + const sub = await subscribe(schema, subscription) as AsyncIterableIterator; + + const payload = sub.next(); + + await subscriptionPubSub.publish(subscriptionPubSubTrigger, mockNotification); + + expect(await payload).toEqual({ done: false, value: { data: mockNotification } }); }); test('should work without triggering multiple times per notification', (done) => { @@ -111,36 +103,32 @@ describe('remote subscriptions', () => { `); let notificationCnt = 0; - const sub1 = subscribe(schema, subscription).then((results) => { - forAwaitEach(results, (result) => { + const sub1 = subscribe(schema, subscription); + sub1.then(async (results) => { + for await (const result of results as AsyncIterable) { expect(result).toHaveProperty('data'); expect(result.data).toEqual(mockNotification); notificationCnt++; - }).catch(done); + } }); - const sub2 = subscribe(schema, subscription).then((results) => { - forAwaitEach(results, (result) => { + const sub2 = subscribe(schema, subscription); + sub2.then(async (results) => { + for await (const result of results as AsyncIterable) { expect(result).toHaveProperty('data'); expect(result.data).toEqual(mockNotification); - }).catch(done); + } }); Promise.all([sub1, sub2]) .then(() => { - subscriptionPubSub - .publish(subscriptionPubSubTrigger, mockNotification) - .catch(done); - subscriptionPubSub - .publish(subscriptionPubSubTrigger, mockNotification) - .catch(done); - + subscriptionPubSub.publish(subscriptionPubSubTrigger, mockNotification); + subscriptionPubSub.publish(subscriptionPubSubTrigger, mockNotification); setTimeout(() => { expect(notificationCnt).toBe(2); done(); }, 0); }) - .catch(done); }); }); diff --git a/packages/wrap/tests/transformFilterObjectFieldDirectives.test.ts b/packages/wrap/tests/transformFilterObjectFieldDirectives.test.ts index d1d9fd7fbc2..733cf13b34d 100644 --- a/packages/wrap/tests/transformFilterObjectFieldDirectives.test.ts +++ b/packages/wrap/tests/transformFilterObjectFieldDirectives.test.ts @@ -16,9 +16,12 @@ describe('FilterObjectFieldDirectives', () => { ` }); - const transformedSchema = wrapSchema(schema, [ - new FilterObjectFieldDirectives((dirName: string, dirValue: any) => dirName === 'keep' && dirValue.arg !== 1) - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new FilterObjectFieldDirectives((dirName: string, dirValue: any) => dirName === 'keep' && dirValue.arg !== 1) + ], + }); const fields = transformedSchema.getType('Query').getFields(); expect(fields.alpha.astNode.directives.length).toEqual(0); diff --git a/packages/wrap/tests/transformRemoveObjectFieldDeprecations.test.ts b/packages/wrap/tests/transformRemoveObjectFieldDeprecations.test.ts index 40e02f114c4..8fd64f6b53a 100644 --- a/packages/wrap/tests/transformRemoveObjectFieldDeprecations.test.ts +++ b/packages/wrap/tests/transformRemoveObjectFieldDeprecations.test.ts @@ -13,9 +13,12 @@ describe('RemoveObjectFieldDeprecations', () => { }); test('removes deprecations by reason', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldDeprecations('remove this') - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldDeprecations('remove this') + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first.deprecationReason).toEqual('do not remove'); @@ -25,9 +28,12 @@ describe('RemoveObjectFieldDeprecations', () => { }); test('removes deprecations by reason regex', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldDeprecations(/remove/) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldDeprecations(/remove/) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first.deprecationReason).toBeUndefined(); diff --git a/packages/wrap/tests/transformRemoveObjectFieldDirectives.test.ts b/packages/wrap/tests/transformRemoveObjectFieldDirectives.test.ts index 74c49bfe84d..331c78eaa4a 100644 --- a/packages/wrap/tests/transformRemoveObjectFieldDirectives.test.ts +++ b/packages/wrap/tests/transformRemoveObjectFieldDirectives.test.ts @@ -17,9 +17,12 @@ describe('RemoveObjectFieldDirectives', () => { }); test('removes directives by name', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldDirectives('alpha') - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldDirectives('alpha') + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.id.astNode.directives.length).toEqual(1); @@ -29,9 +32,12 @@ describe('RemoveObjectFieldDirectives', () => { }); test('removes directives by name regex', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldDirectives(/^alp/) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldDirectives(/^alp/) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.id.astNode.directives.length).toEqual(1); @@ -41,9 +47,12 @@ describe('RemoveObjectFieldDirectives', () => { }); test('removes directives by argument', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldDirectives(/.+/, { arg: 'remove this' }) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldDirectives(/.+/, { arg: 'remove this' }) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.id.astNode.directives.length).toEqual(0); @@ -53,9 +62,12 @@ describe('RemoveObjectFieldDirectives', () => { }); test('removes directives by argument regex', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldDirectives(/.+/, { arg: /remove/ }) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldDirectives(/.+/, { arg: /remove/ }) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.id.astNode.directives.length).toEqual(0); diff --git a/packages/wrap/tests/transformRemoveObjectFieldsWithDeprecation.test.ts b/packages/wrap/tests/transformRemoveObjectFieldsWithDeprecation.test.ts index 37713497386..27781011cfd 100644 --- a/packages/wrap/tests/transformRemoveObjectFieldsWithDeprecation.test.ts +++ b/packages/wrap/tests/transformRemoveObjectFieldsWithDeprecation.test.ts @@ -13,9 +13,12 @@ describe('RemoveObjectFieldsWithDeprecation', () => { }); test('removes deprecated fields by reason', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldsWithDeprecation('remove this') - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldsWithDeprecation('remove this') + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first).toBeDefined(); @@ -23,9 +26,12 @@ describe('RemoveObjectFieldsWithDeprecation', () => { }); test('removes deprecated fields by reason regex', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldsWithDeprecation(/remove/) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldsWithDeprecation(/remove/) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first).toBeUndefined(); diff --git a/packages/wrap/tests/transformRemoveObjectFieldsWithDirective.test.ts b/packages/wrap/tests/transformRemoveObjectFieldsWithDirective.test.ts index 6da71fc6e8c..6e661ea1b56 100644 --- a/packages/wrap/tests/transformRemoveObjectFieldsWithDirective.test.ts +++ b/packages/wrap/tests/transformRemoveObjectFieldsWithDirective.test.ts @@ -18,9 +18,12 @@ describe('RemoveObjectFieldsWithDirective', () => { }); test('removes directive fields by name', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldsWithDirective('alpha') - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldsWithDirective('alpha') + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first).toBeUndefined(); @@ -30,9 +33,12 @@ describe('RemoveObjectFieldsWithDirective', () => { }); test('removes directive fields by name regex', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldsWithDirective(/^alp/) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldsWithDirective(/^alp/) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first).toBeUndefined(); @@ -42,9 +48,12 @@ describe('RemoveObjectFieldsWithDirective', () => { }); test('removes directive fields by argument', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldsWithDirective(/.+/, { arg: 'remove this' }) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldsWithDirective(/.+/, { arg: 'remove this' }) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first).toBeDefined(); @@ -54,9 +63,12 @@ describe('RemoveObjectFieldsWithDirective', () => { }); test('removes directive fields by argument regex', async () => { - const transformedSchema = wrapSchema(originalSchema, [ - new RemoveObjectFieldsWithDirective(/.+/, { arg: /remove/ }) - ]); + const transformedSchema = wrapSchema({ + schema: originalSchema, + transforms: [ + new RemoveObjectFieldsWithDirective(/.+/, { arg: /remove/ }) + ], + }); const fields = transformedSchema.getType('Test').getFields(); expect(fields.first).toBeUndefined(); diff --git a/packages/wrap/tests/transforms.test.ts b/packages/wrap/tests/transforms.test.ts index 6275804313e..3a126b4f7e7 100644 --- a/packages/wrap/tests/transforms.test.ts +++ b/packages/wrap/tests/transforms.test.ts @@ -13,10 +13,6 @@ import { } from 'graphql'; import { makeExecutableSchema } from '@graphql-tools/schema'; -import { - concatInlineFragments, - parseFragmentToInlineFragment, -} from '@graphql-tools/utils'; import { addMocksToSchema } from '@graphql-tools/mock'; import { @@ -36,9 +32,8 @@ import { import { delegateToSchema, defaultMergedResolver, - ReplaceFieldWithFragment, FilterToSchema, - AddFragmentsByField, + DelegationContext, } from '@graphql-tools/delegate'; import { propertySchema, bookingSchema } from './fixtures/schemas'; @@ -83,7 +78,7 @@ describe('transforms', () => { }); test('should work', async () => { - const schema = wrapSchema(scalarSchema, []); + const schema = wrapSchema({ schema: scalarSchema }); const result = await graphql( schema, ` @@ -110,10 +105,10 @@ describe('transforms', () => { }); test('should work when specified as a subschema configuration object', async () => { - const schema = wrapSchema( - { schema: scalarSchema, transforms: [] }, - [], - ); + const schema = wrapSchema({ + schema: scalarSchema, + transforms: [], + }); const result = await graphql( schema, ` @@ -157,7 +152,7 @@ describe('transforms', () => { }, }, }); - const schema = wrapSchema(subschema, []); + const schema = wrapSchema({ schema: subschema }); const query = 'query { errorTest }'; const originalResult = await graphql(subschema, query); @@ -183,7 +178,10 @@ describe('transforms', () => { }[name]), ), ]; - schema = wrapSchema(propertySchema, transforms); + schema = wrapSchema({ + schema: propertySchema, + transforms, + }); }); test('should work', async () => { const result = await graphql( @@ -253,9 +251,12 @@ describe('transforms', () => { subschema = addMocksToSchema({ schema: subschema }); - const schema = wrapSchema(subschema, [ - new RenameRootTypes((name) => (name === 'QueryRoot' ? 'Query' : name)), - ]); + const schema = wrapSchema({ + schema: subschema, + transforms: [ + new RenameRootTypes((name) => (name === 'QueryRoot' ? 'Query' : name)), + ], + }); const result = await graphql( schema, @@ -289,7 +290,10 @@ describe('transforms', () => { new RenameTypes((name: string) => `_${name}`), new RenameTypes((name: string) => `Property${name}`), ]; - schema = wrapSchema(propertySchema, transforms); + schema = wrapSchema({ + schema: propertySchema, + transforms, + }); }); test('should work', async () => { const result = await graphql( @@ -347,7 +351,7 @@ describe('transforms', () => { describe('filter to schema', () => { let filter: FilterToSchema; beforeAll(() => { - filter = new FilterToSchema(bookingSchema); + filter = new FilterToSchema(); }); test('should remove empty selection sets on objects', () => { @@ -366,8 +370,10 @@ describe('transforms', () => { document: query, variables: { id: 'c1', - }, - }); + } + }, { + targetSchema: bookingSchema + } as DelegationContext, {}); const expected = parse(` query customerQuery($id: ID!) { @@ -398,7 +404,9 @@ describe('transforms', () => { id: 'c1', limit: 10, }, - }); + }, { + targetSchema: bookingSchema + } as DelegationContext, {}); const expected = parse(` query customerQuery($id: ID!) { @@ -428,7 +436,9 @@ describe('transforms', () => { variables: { id: 'b1', }, - }); + }, { + targetSchema: bookingSchema + } as DelegationContext, {}); const expected = parse(` query bookingQuery($id: ID!) { @@ -451,7 +461,10 @@ describe('transforms', () => { (type: GraphQLNamedType) => typeNames.indexOf(type.name) >= 0, ), ]; - schema = wrapSchema(bookingSchema, transforms); + schema = wrapSchema({ + schema: bookingSchema, + transforms + }); }); test('should work normally', async () => { @@ -1135,275 +1148,38 @@ describe('transforms', () => { }); }); }); - - describe('replaces field with fragments', () => { - let data: any; - let schema: GraphQLSchema; - let subschema: GraphQLSchema; - beforeAll(() => { - data = { - u1: { - id: 'u1', - name: 'joh', - surname: 'gats', - }, - }; - - subschema = makeExecutableSchema({ - typeDefs: ` - type User { - id: ID! - name: String! - surname: String! - } - - type Query { - userById(id: ID!): User - } - `, - resolvers: { - Query: { - userById(_parent, { id }) { - return data[id]; - }, - }, - }, - }); - - schema = makeExecutableSchema({ - typeDefs: ` - type User { - id: ID! - name: String! - surname: String! - fullname: String! - } - - type Query { - userById(id: ID!): User - } - `, - resolvers: { - Query: { - userById(_parent, { id }, context, info) { - return delegateToSchema({ - schema: subschema, - operation: 'query', - fieldName: 'userById', - args: { id }, - context, - info, - transforms: [ - new ReplaceFieldWithFragment(subschema, [ - { - field: 'fullname', - fragment: 'fragment UserName on User { name }', - }, - { - field: 'fullname', - fragment: 'fragment UserSurname on User { surname }', - }, - ]), - ], - }); - }, - }, - User: { - fullname(parent, _args, _context, _info) { - return `${parent.name as string} ${parent.surname as string}`; - }, - }, - }, - }); - }); - test('should work', async () => { - const result = await graphql( - schema, - ` - query { - userById(id: "u1") { - id - fullname - } - } - `, - ); - - expect(result).toEqual({ - data: { - userById: { - id: 'u1', - fullname: 'joh gats', - }, - }, - }); - }); - }); }); -describe('replaces field with processed fragment node', () => { - let data: any; - let schema: GraphQLSchema; - let subschema: GraphQLSchema; - beforeAll(() => { - data = { - u1: { - id: 'u1', - name: 'joh', - surname: 'gats', - }, - }; - - subschema = makeExecutableSchema({ +describe('transform input object fields', () => { + test('filtering works', async () => { + const schema = makeExecutableSchema({ typeDefs: ` - type User { - id: ID! - name: String! - surname: String! - } - - type Query { - userById(id: ID!): User + input InputObject { + field1: String + field2: String } - `, - resolvers: { - Query: { - userById(_parent, { id }) { - return data[id]; - }, - }, - }, - }); - schema = makeExecutableSchema({ - typeDefs: ` - type User implements Named { - id: ID! - name: String! - surname: String! - fullname: String! - specialName: String! + type OutputObject { + field1: String + field2: String } type Query { - userById(id: ID!): User - } - - interface Named { - specialName: String! + test(argument: InputObject): OutputObject } `, resolvers: { Query: { - userById(_parent, { id }, context, info) { - return delegateToSchema({ - schema: subschema, - operation: 'query', - fieldName: 'userById', - args: { id }, - context, - info, - transforms: [ - new AddFragmentsByField(subschema, { - User: { - fullname: concatInlineFragments('User', [ - parseFragmentToInlineFragment( - 'fragment UserName on User { name }', - ), - parseFragmentToInlineFragment( - 'fragment UserSurname on User { surname }', - ), - parseFragmentToInlineFragment('... on Named { name }'), - ]), - }, - }), - ], - }); - }, - }, - User: { - fullname(parent, _args, _context, _info) { - return `${parent.name as string} ${parent.surname as string}`; - }, - specialName() { - return data.u1.name; - }, - }, - }, - }); - }); - test('should work', async () => { - const result = await graphql( - schema, - ` - query { - userById(id: "u1") { - id - fullname + test: (_root, args) => { + return args.argument; } } - `, - ); - - expect(result).toEqual({ - data: { - userById: { - id: 'u1', - fullname: 'joh gats', - }, - }, + } }); - }); - it('should accept fragments and resolvers that rely on an interface the type implements', async () => { - const result = await graphql( + const transformedSchema = wrapSchema({ schema, - ` - query { - userById(id: "u1") { - specialName - } - } - `, - ); - - expect(result).toEqual({ - data: { - userById: { - specialName: data.u1.name, - }, - }, - }); - }); - - describe('transform input object fields', () => { - test('filtering works', async () => { - const schema = makeExecutableSchema({ - typeDefs: ` - input InputObject { - field1: String - field2: String - } - - type OutputObject { - field1: String - field2: String - } - - type Query { - test(argument: InputObject): OutputObject - } - `, - resolvers: { - Query: { - test: (_root, args) => { - return args.argument; - } - } - } - }); - - const transformedSchema = wrapSchema(schema, [ + transforms: [ new FilterInputObjectFields( (typeName, fieldName) => (typeName !== 'InputObject' || fieldName !== 'field2'), (typeName, inputObjectNode) => { @@ -1422,21 +1198,21 @@ describe('replaces field with processed fragment node', () => { } } ) - ]); - - const query = `{ - test(argument: { - field1: "field1" - }) { - field1 - field2 - } - }`; - - const result = await graphql(transformedSchema, query); - expect(result.data.test.field1).toBe('field1'); - expect(result.data.test.field2).toBe('field2'); + ], }); + + const query = `{ + test(argument: { + field1: "field1" + }) { + field1 + field2 + } + }`; + + const result = await graphql(transformedSchema, query); + expect(result.data.test.field1).toBe('field1'); + expect(result.data.test.field2).toBe('field2'); }); test('renaming works', async () => { @@ -1465,15 +1241,18 @@ describe('replaces field with processed fragment node', () => { } }); - const transformedSchema = wrapSchema(schema, [ - new RenameInputObjectFields( - (typeName: string, fieldName: string) => { - if (typeName === 'InputObject' && fieldName === 'field2') { - return 'field3'; - } - }, - ) - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new RenameInputObjectFields( + (typeName: string, fieldName: string) => { + if (typeName === 'InputObject' && fieldName === 'field2') { + return 'field3'; + } + }, + ) + ], + }); const query = `{ test(argument: { @@ -1524,9 +1303,12 @@ describe('MapLeafValues', () => { } }; - const transformedSchema = wrapSchema(schema, [ - new MapLeafValues(valueIterator, valueIterator), - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new MapLeafValues(valueIterator, valueIterator), + ], + }); const query = `{ testEnum(argument: ONE) @@ -1558,11 +1340,14 @@ describe('TransformEnumValues', () => { } }); - const transformedSchema = wrapSchema(schema, [ - new TransformEnumValues( - (_typeName, _externalValue, valueConfig) => ['UNO', valueConfig], - ) - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new TransformEnumValues( + (_typeName, _externalValue, valueConfig) => ['UNO', valueConfig], + ) + ], + }); const query = `{ test(argument: UNO) @@ -1589,14 +1374,17 @@ describe('TransformEnumValues', () => { } }); - const transformedSchema = wrapSchema(schema, [ - new TransformEnumValues( - (_typeName, _externalValue, valueConfig) => ['UNO', { - ...valueConfig, - value: 'ONE', - }], - ) - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new TransformEnumValues( + (_typeName, _externalValue, valueConfig) => ['UNO', { + ...valueConfig, + value: 'ONE', + }], + ) + ], + }); const query = `{ test(argument: UNO) @@ -1625,11 +1413,14 @@ describe('TransformEnumValues', () => { } }); - const transformedSchema = wrapSchema(schema, [ - new TransformEnumValues( - (_typeName, _externalValue, valueConfig) => ['UNO', valueConfig], - ) - ]); + const transformedSchema = wrapSchema({ + schema, + transforms: [ + new TransformEnumValues( + (_typeName, _externalValue, valueConfig) => ['UNO', valueConfig], + ) + ], + }); const query = `query Test($test: TestEnum) { test(argument: $test) diff --git a/website/docs/generate-schema.md b/website/docs/generate-schema.md index 09441db8610..06d8746115e 100644 --- a/website/docs/generate-schema.md +++ b/website/docs/generate-schema.md @@ -239,16 +239,16 @@ const jsSchema = makeExecutableSchema({ - `allowUndefinedInResolve` is an optional argument, which is `true` by default. When set to `false`, causes your resolver to throw errors if they return undefined, which can help make debugging easier. -- `resolverValidationOptions` is an optional argument which accepts an `ResolverValidationOptions` object which has the following boolean properties: - - `requireResolversForArgs` will cause `makeExecutableSchema` to throw an error if no resolver is defined for a field that has arguments. +- `resolverValidationOptions` is an optional argument with the following properties, each of which can be set to `error`, `warn`, or `ignore`: + - `requireResolversForArgs` will cause `makeExecutableSchema` to throw an error (`error`) or issue a warning (`warn`)unless a resolver is defined for every field with arguments. The default is `ignore`, causing this validator to be skipped. - - `requireResolversForNonScalar` will cause `makeExecutableSchema` to throw an error if a non-scalar field has no resolver defined. Setting this to `true` can be helpful in catching errors, but defaults to `false` to avoid confusing behavior for those coming from other GraphQL libraries. + - `requireResolversForNonScalar` require a resolver for every non-scalar field. Default is `ignore`. - - `requireResolversForAllFields` asserts that *all* fields have valid resolvers. + - `requireResolversForAllFields` asserts that *all* fields have valid resolvers. This option cannot be set in combination with the previous two validators. Default is `ignore`. - - `requireResolversForResolveType` will require a `resolveType()` method for Interface and Union types. This can be passed in with the field resolvers as `__resolveType()`. False to disable the warning. + - `requireResolversForResolveType` will require a `resolveType()` method for Interface and Union types. This can be passed in with the field resolvers as `__resolveType()`. Default is `ignore`. - - `allowResolversNotInSchema` turns off the functionality which throws errors when resolvers are found which are not present in the schema. Defaults to `false`, to help catch common errors. + - `requireResolversToMatchSchema` requires every resolver within the resolver map to correspond to a GraphQL entity within the schema. Defaults to `error`, to help catch common errors. - `inheritResolversFromInterfaces` GraphQL Objects that implement interfaces will inherit missing resolvers from their interface types defined in the `resolvers` object. diff --git a/website/docs/migration-from-tools-v5.md b/website/docs/migration-from-tools-v5.md deleted file mode 100644 index a3e8848e0fa..00000000000 --- a/website/docs/migration-from-tools-v5.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -id: migration-from-tools-v5 -title: Migration from v4 & v5 -sidebar_label: From v4 & v5 -description: Migration from GraphQL Tools v4 & v5 ---- - -If you're using old versions of GraphQL Tools, it is easy to migrate from those versions to v6 and later. But you need to install specific packages according to your needs instead of single large `graphql-tools` package because we switched to monorepo. - -#### Schema Generation and Decoration API (`@graphql-tools/schema`) - -Majority of schema modification functions has been renamed and they now return new schemas without editing the original schema, rather than modifying the original schema in place. The return value of the function has the new schema: -- `makeExecutableSchema` -- `addResolveFunctionsToSchema` => `addResolversToSchema` -- `attachDirectiveResolvers` -- `addSchemaLevelResolveFunctions` => `addSchemaLevelResolver` -- `addCatchUndefinedToSchema` -- `addErrorLoggingToSchema` -- `addMockFunctionsToSchema` => `addMocksToSchema` -- `addConnectorsToContext` has been deprecated, attaching context manually is clearer - - - See [#140](https://github.com/ardatan/graphql-tools/issues/140) - -Schema modification functions operating on fields now similarly take a schema as a parameter and return a new schema, rather than modifying the passed in typeMap (and requiring manual schema healing) - - - `appendObjectFields` - - - `removeObjectFields` - -Abstract types that use resolveType properties to return an actual type rather than a type name may be unstable when using graphql-tools, as these types are hidden from the type map and cannot be recreated. These resolveType resolvers should be relatively easy to rewrite to use the name of a known `GraphQLObject` type included within the schema’s type map. This may limit the use of `graphql-tools` for advanced schemas that rely on dynamic abstract types, but greatly simplifies the code base. - -#### Remote Schema & Wrapping (`makeRemoteExecutableSchema` and `@graphql-tools/wrap`) - -- Remote schema wrapping is now accomplished by using executors and subscribers rather than fetchers and links. Functions that convert links to executors/subscribers are included with @graphql-tools/links. [See the docs](/docs/remote-schemas). - -- `Transform`<*>`Field Transforms` now all take a `fieldTransformer` with altered `FieldTransformer` type. -A FieldTransformer receives a field config as an argument rather than a field, so that library users are spared having to call fieldToFieldConfig. A `FieldTransformer` can return an array of type `[string, GraphQLFieldConfig]` instead of an object `{ name: string, field: GraphQLFieldConfig }` if it wishes to rename the field, the tuple is less verbose and the object is misnamed, it should be { newName, newFieldConfig } anyway. - -#### Schema Stitching (`stitchSchemas` & `@graphql-tools/stitch`) - -- stitching has been renamed (`mergeSchemas` => `stitchSchemas`) -- use selectionSet hints instead of fragment hints within the resolver map -- Allows inheritance from interfaces -resolvers passed to stitchSchemas match type of resolvers passed to makeExecutableSchema (and can no longer be functions). Stitching metadata stored within “mergeInfo” may still be accessed within each resolver as info.mergeInfo -- Custom proxying resolvers now take an options object instead of individual parameters, a breaking change from v5, when the custom proxying resolvers were introduced - -#### Schema Delegation (`delegateToSchema` & `@graphql-tools/delegate`) - -`delegateToSchema` is not available in `mergeInfo` anymore. You need to import that `delegateToSchema` function from this package instead. - -- `info.mergeInfo.delegate` & `info.mergeInfo.delegateToSchema` => `delegateToSchema` - -Instead of `mergeInfo` in `GraphQLResolveInfo`, we have `stitchingInfo` in `GraphQLSchema`s extensions. - -#### Some other utils (`@graphql-tools/utils`) - -- Polyfills for graphql versions earlier than 14.2 have been removed, including `toConfig` -- `fieldToFieldConfig` and `inputFieldToInputFieldConfig` functionality is now exported separately, although library users should ideally not have to use them. diff --git a/website/docs/migration-from-tools.md b/website/docs/migration-from-tools.md new file mode 100644 index 00000000000..2e64296f23e --- /dev/null +++ b/website/docs/migration-from-tools.md @@ -0,0 +1,116 @@ +--- +id: migration-from-tools +title: Migration to v7 +sidebar_label: From tools v4 - v6 +description: Migration from GraphQL Tools v4 - v6 +--- + +## Upgrading from v6 + +If you are using GraphQL Tools v6, there are several breaking changes to be aware of. + +#### Schema Generation and Decoration API (`@graphql-tools/schema`) + +- Resolver validation options should now be set to `error`, `warn` or `ignore` rather than `true` or `false`. In previous versions, some of the validators caused errors to be thrown, while some issued warnings. This changes brings consistency to validator behavior. + +- The `allowResolversNotInSchema` has been renamed to `requireResolversToMatchSchema`, to harmonize the naming convention of all the validators. The default setting of `requireResolversToMatchSchema` is `error`, matching the previous behavior. + +#### Schema Delegation (`delegateToSchema` & `@graphql-tools/delegate`) + +- The `delegateToSchema` return value has matured and been formalized as an `ExternalObject`, in which all errors are integrated into the GraphQL response, preserving their initial path. Those advanced users accessing the result directly will note the change in error handling. This also allows for the deprecation of unnecessary helper functions including `slicedError`, `getErrors`, `getErrorsByPathSegment` functions. Only external errors with missing or invalid paths must still be preserved by annotating the remote object with special properties. The new `getUnpathedErrors` function is therefore necessary for retrieving only these errors. Note also the new `annotateExternalObject` and `mergeExternalObjects` functions, as well as the renaming of `handleResult` to `resolveExternalValue`. + +- Transform types and the `applySchemaTransforms` are now relocated to the `delegate` package; `applyRequestTransforms`/`applyResultTransforms` functions have been deprecated, however, as this functionality has been replaced since v6 by the `Transformer` abstraction. + +- The `transformRequest`/`transformResult` methods are now provided additional `delegationContext` and `transformationContext` arguments -- these were introduced in v6, but previously optional. + +- The `transformSchema` method may wish to create additional delegating resolvers and so it is now provided the `subschemaConfig` and final (non-executable) `transformedSchema` parameters. As in v6, the `transformSchema` is kicked off once to produce the non-executable version, and then, if a wrapping schema is being generated, proxying resolvers are created with access to the (non-executabel) initial result. In v7, the individual `transformSchema` methods also get access to the result of the first run, if necessary, they can create additional wrapping schema proxying resolvers. + +- `applySchemaTransforms` parameters have been updated to match and support the `transformSchema` parameters above. + +#### Remote Schemas & Wrapping (`wrapSchema`, `makeRemoteExecutableSchema`, and `@graphql-tools/wrap`) + +- `wrapSchema` and `generateProxyingResolvers` now only take a single options argument with named properties of type `SubschemaConfig`. The previously possible shorthand version with first argument consisting of a `GraphQLSchema` and second argument representing the transforms should be reworked as a `SubschemaConfig` object. + +- Similarly, the `ICreateProxyingResolverOptions` interface that provides the options for the `createProxyingResolver` property of `SubschemaConfig` options has been adjusted. The `schema` property previously could be set to a `GraphQLSchema` or a `SubschemaConfig` object. This property has been removed in favor of a `subschemaConfig` property that will always be a `SubschemaConfig` object. The `transforms` property has been removed; transforms should be included within the `SubschemaConfig` object.` + +- The format of the wrapping schema has solidified. All non-root fields are expected to use identical resolvers, either `defaultMergedResolver` or a custom equivalent, with root fields doing the hard work of proxying. Support for custom merged resolvers throught `createMergedResolver` has been deprecated, as custom merging resolvers conflicts when using stitching's type merging, where resolvers are expected to be identical across subschemas. + +- The `WrapFields` transform's `wrappingResolver` option has been removed, as this complicates multiple wrapping layers, as well as planned functionality to wrap subscription root fields in potentially multiple layers, as the wrapping resolvers may be different in different layers. Modifying resolvers can still be performed by use of an additional transform such as `TransformRootFields` or `TransformObjectFields`. + +- The `ExtendSchema` transform has been removed, as it is conceptually simpler just to use `stitchSchemas` with one subschema. + +- The `ReplaceFieldsWithFragment`, `AddFragmentsByField`, `AddSelectionSetsByField`, and `AddMergedTypeSelectionSets` transforms has been removed, as they are superseded by the `AddSelectionSets` and `VisitSelectionSets` transforms. The `AddSelectionSets` purposely takes parsed SDL rather than strings, to nudge end users to parse these strings at build time (when possible), rather than at runtime. Parsing of selection set strings can be performed using the `parseSelectionSet` function from `@graphql-tools/utils`. + +#### Schema Stitching (`stitchSchemas` & `@graphql-tools/stitch`) + +- `stitchSchemas`'s `mergeTypes` option is now true by default! This causes the `onTypeConflict` option to be ignored by default. To use `onTypeConflict` to select a specific type instead of simply merging, simply set `mergeTypes` to false. + +- `schemas` argument has been deprecated, use `subschemas`, `typeDefs`, or `types`, depending on what you are stitching. + +- When using batch delegation in type merging, the `argsFromKeys` function is now set only via the `argsFromKeys` property. Previously, if `argsFromKeys` was absent, it could be read from `args`. + +- Support for fragment hints has been removed in favor of selection set hints. + +- `stitchSchemas` now processes all `GraphQLSchema` and `SubschemaConfig` subschema input into new `Subschema` objects, handling schema config directives such aso`@computed` as well as generating the final transformed schema, stored as the `transformedSchema` property, if transforms are used. Signatures of the `onTypeConflict`, `fieldConfigMerger`, and `inputFieldConfigMerger` have been updated to include metadata related to the original and transformed subschemas. Note the property name change for `onTypeConflict` from `schema` to `subschema`. + +#### Mocking (`addMocksToSchema` and `@graphql-tools/mock`) + +- Mocks returning objects with fields set as functions are now operating according to upstream graphql-js convention, i.e. these functions take three arguments, `args`, `context`, and `info` with `parent` available as `this` rather than as the first argument. + +#### Other Utilities (`@graphql-tools/utils`) + +- `filterSchema`'s `fieldFilter` will now filter *all* fields across Object, Interface, and Input types. For the previous Object-only behavior, switch to the `objectFieldFilter` option. +- Unused `fieldNodes` utility functions have been removed. +- Unused `typeContainsSelectionSet` function has been removed, and `typesContainSelectionSet` has been moved to the `stitch` package. +- Unnecessary `Operation` type has been removed in favor of `OperationTypeNode` from upstream graphql-js. +- As above, `applySchemaTransforms`/`applyRequestTransforms`/`applyResultTransforms` have been removed from the `utils` package, as they are implemented elsewhere or no longer necessary. + +## Upgrading from v4/v5 + +If you are using GraphQL Tools v4/v5, additioanl changes are necessary. + +#### Monorepo design + +You can still import functions directly from `graphql-tools`, but we encourage you to instead import functions from specific packages under the new mono repo design: `@graphql-tools/schema`, `@graphql-tools/merge`, etc. + +#### Schema Generation and Decoration API (`@graphql-tools/schema`) + +Majority of schema modification functions now return new, altered schemas rather than modifying the original schema in place. Note that several functions have been renamed as `ResolveFunctions` and `MockFunctions` have been shortened to `Resolvers` and `Mocks` throughout the code base and documentation: +- `makeExecutableSchema` +- `addResolveFunctionsToSchema` => `addResolversToSchema` +- `attachDirectiveResolvers` +- `addSchemaLevelResolveFunctions` => `addSchemaLevelResolver` +- `addCatchUndefinedToSchema` +- `addErrorLoggingToSchema` +- `addMockFunctionsToSchema` => `addMocksToSchema` + +Schema modification functions operating on fields now similarly take a schema as a parameter and return a new schema, rather than modifying the passed in typeMap (and requiring manual schema healing). + - `appendObjectFields` + - `removeObjectFields` + +The `addConnectorsToContext` has been deprecated in favor of manually attaching connectors to context, see [#140](https://github.com/ardatan/graphql-tools/issues/140). + +Abstract types that use resolveType properties to return an actual type rather than a type name may be unstable when using `graphql-tools`, as these types are hidden from the type map and cannot be recreated. These resolveType resolvers should be relatively easy to rewrite to use the name of a known `GraphQLObject` type included within the schema’s type map. This will soon be the recommended approach in upstream `graphql-js` as well, see [#2279](https://github.com/graphql/graphql-js/pull/2779#issuecomment-684947685). + +#### Remote Schemas & Wrapping (`wrapSchema`, `makeRemoteExecutableSchema`, and `@graphql-tools/wrap`) + +- Remote schema wrapping is now accomplished by using executors and subscribers rather than fetchers and links. Functions that convert links to executors/subscribers are included with @graphql-tools/links. [See the docs](/docs/remote-schemas). + +- `Transform`<*>`Field Transforms` now all take a `fieldTransformer` with altered `FieldTransformer` type. +A FieldTransformer receives a field config as an argument rather than a field, so that library users are spared having to call fieldToFieldConfig. A `FieldTransformer` can return an array of type `[string, GraphQLFieldConfig]` instead of an object `{ name: string, field: GraphQLFieldConfig }` if it wishes to rename the field, the tuple is less verbose -- and the object is misnamed, it should be `{ newName, newFieldConfig }`. + +#### Schema Stitching (`stitchSchemas` & `@graphql-tools/stitch`) + +- Stitching has been renamed (`mergeSchemas` => `stitchSchemas`) +- `resolvers` parameter passed to stitchSchemas match type signature of resolvers passed to makeExecutableSchema (and can no longer be functions). Stitching metadata stored within “mergeInfo” may still be accessed within each resolver under `info.schema.extensions.stitchingInfo`. +- Custom proxying resolvers take an options object instead of individual parameters, a breaking change from v5, when the custom proxying resolvers were introduced. + +#### Schema Delegation (`delegateToSchema` & `@graphql-tools/delegate`) + +- As above, `mergeInfo` in `GraphQLResolveInfo` has been replaced by `stitchingInfo` in `GraphQLSchema`s extensions. +- `delegateToSchema` is not available in `mergeInfo` or `stitchingInfo` anymore. Simply import the `delegateToSchema` function from the `delegate` package instead. + +#### Other Utilities (`@graphql-tools/utils`) + +- Polyfills for graphql versions earlier than 14.2 have been removed, including `toConfig` +- `fieldToFieldConfig` and `inputFieldToInputFieldConfig` functionality is now exported separately, although library users should ideally not have to use them. diff --git a/website/docs/remote-schemas.md b/website/docs/remote-schemas.md index 0eb30d7bfdd..f28dea71768 100644 --- a/website/docs/remote-schemas.md +++ b/website/docs/remote-schemas.md @@ -213,9 +213,8 @@ For users who need to customize the root proxying resolvers at the time that the export type CreateProxyingResolverFn = (options: ICreateProxyingResolverOptions) => GraphQLFieldResolver; export interface ICreateProxyingResolverOptions { - schema: GraphQLSchema | SubschemaConfig; // target schema for delegation - transforms?: Array; // array of transformations to apply - transformedSchema?: GraphQLSchema; // pre-processed result of applying those transforms to the target schema + subschemaConfig: SubschemaConfig; // target schema config for delegation + transformedSchema?: GraphQLSchema; // pre-processed result of applying any transforms to the target schema operation?: Operation; // target operation type = 'query' | 'mutation' | 'subscription' fieldName?: string; // target root field name }; @@ -225,18 +224,17 @@ You may not need all the options to accomplish what you need. For example, the d ```ts export function defaultCreateProxyingResolver({ - schema, + subschemaConfig, operation, transforms, transformedSchema, }: ICreateProxyingResolverOptions): GraphQLFieldResolver { return (_parent, _args, context, info) => delegateToSchema({ - schema, + schema: subschemaConfig, operation, context, info, - transforms, transformedSchema, }); } diff --git a/website/docs/schema-wrapping.md b/website/docs/schema-wrapping.md index ea0196b14e8..7402bc784ee 100644 --- a/website/docs/schema-wrapping.md +++ b/website/docs/schema-wrapping.md @@ -10,14 +10,6 @@ Schema wrapping can be useful when building GraphQL gateways that combine multip Schema wrapping works by wrapping the original schema in a new 'gateway' schema that simply delegates all operations to the original subschema. A series of 'transforms' are applied to modify the schema after the initial wrapping is complete. Each transform includes a schema transformation function that changes the gateway schema. It may also include operation transforms, i.e. functions that either modify the operation prior to delegation or modify the result prior to its return. -```ts -interface Transform = { - transformSchema?: (schema: GraphQLSchema) => GraphQLSchema; - transformRequest?: (request: Request) => Request; - transformResult?: (result: Result) => Result; -}; -``` - For example, let's consider changing the name of the type in a simple schema. Imagine we've written a function that takes a `GraphQLSchema` and replaces all instances of type `Test` with `NewTest`. ```graphql @@ -82,31 +74,47 @@ By the same reasoning, we also need a `transformResult` function, because any re ### Transform ```ts -interface Transform = { - transformSchema?: (schema: GraphQLSchema) => GraphQLSchema; - transformRequest?: (request: Request) => Request; - transformResult?: (result: Result) => Result; -}; +export interface Transform> { + transformSchema?: SchemaTransform; + transformRequest?: RequestTransform; + transformResult?: ResultTransform; +} + +export type SchemaTransform = ( + originalWrappingSchema: GraphQLSchema, + subschemaConfig: SubschemaConfig, + transformedSchema?: GraphQLSchema +) => GraphQLSchema; + +export type RequestTransform> = ( + originalRequest: Request, + delegationContext: DelegationContext, + transformationContext: T +) => Request; + +export type ResultTransform> = ( + originalResult: ExecutionResult, + delegationContext: DelegationContext, + transformationContext: T +) => ExecutionResult; type Request = { document: DocumentNode; variables: Record; extensions?: Record; }; - -type Result = ExecutionResult & { - extensions?: Record; -}; ``` ### wrapSchema -Given a `GraphQLSchema` and an array of `Transform` objects, `wrapSchema` produces a new schema with those transforms applied. +Given a `GraphQLSchema` and an array of `Transform` objects, `wrapSchema` produces a new schema with the `transformSchema` methods applied. Delegating resolvers are generated to map from new schema root fields to old schema root fields. These automatic resolvers should be sufficient, so you don't have to implement your own. The delegating resolvers will apply the operation transforms defined by the `Transform` objects. Each provided `transformRequest` functions will be applies in reverse order, until the request matches the original schema. The `tranformResult` functions will be applied in the opposite order until the result matches the final gateway schema. +In advanced cases, transforms may wish to create additional delegating root resolvers (for example, when hoisting a field into a root type). This is also possible. The wrapping schema is actually generated twice -- the first run results in a possibly non-executable version, while the second execution also includes the result of the first one within the `transformedSchema` argument so that an executable version with any new proxying resolvers can be created. + Remote schemas can also be wrapped! In fact, this is the primary use case. See documentation regarding [remote schemas](/docs/remote-schemas/) for further details about remote schemas. Note that as explained there, when wrapping remote schemas, you will be wrapping a subschema config object, and the array of transforms should be defined on that object rather than as a second argument to `wrapSchema`. ## Built-in transforms @@ -310,4 +318,3 @@ By passing a custom `transforms` array to `delegateToSchema`, it's possible to r * `AddReplacementSelectionSets(schema: GraphQLSchema, mapping: ReplacementSelectionSetMapping)`: `stitchSchemas` adds selection sets on outgoing requests from the gateway, enabling delegation from fields specified on the gateway using fields obtained from the original requests. The selection sets can be added depending on the presence of fields within the request using the `selectionSet` option within the resolver map. `stitchSchemas` creates the mapping at gateway startup. Selection sets are used instead of fragments as the selections are added prior to transformation in case type names are changed, obviating the need for the fragment name. * `AddMergedTypeSelectionSets(schema: GraphQLSchema, mapping: Record)`: `stitchSchemas` adds selection sets on outgoing requests from the gateway, enabling type merging from the initial result using any fields initially obtained. The mapping is created at gateway startup. -* Deprecated: `ReplaceFieldWithFragment(targetSchema: GraphQLSchema, fragments: Array<{ field: string; fragment: string; }>)`: Replace the given fields with an inline fragment. Used by original `stitchSchemas` to add prespecified fragments to root fields, enabling delegation `fragment` option. Array was parsed at each delegation. diff --git a/website/docs/stitch-api.md b/website/docs/stitch-api.md index 7acf751545d..1ad8f9f76ed 100644 --- a/website/docs/stitch-api.md +++ b/website/docs/stitch-api.md @@ -7,7 +7,7 @@ description: Stitching API ## API ```ts -export type SubschemaConfig = { +export interface SubschemaConfig = { schema: GraphQLSchema; rootValue?: Record; executor?: Executor; @@ -15,28 +15,26 @@ export type SubschemaConfig = { transforms?: Array; }; -export type SchemaLikeObject = - SubschemaConfig | - GraphQLSchema | - string | - DocumentNode | - Array; +export interface Subschema extends SubschemaConfig { + transformedSchema: GraphQLSchema; +} stitchSchemas({ - subschemas: Array; + subschemas: Array; types: Array; typeDefs: string | DocumentNode; - schemas: Array; resolvers?: Array | IResolvers; onTypeConflict?: ( left: GraphQLNamedType, right: GraphQLNamedType, info?: { left: { - schema?: GraphQLSchema; + subschema?: GraphQLSchema | SubschemaConfig; + transformedSubschema?: Subschema; }; right: { - schema?: GraphQLSchema; + subschema?: GraphQLSchema | SubschemaConfig; + transformedSubschema?: Subschema; }; }, ) => GraphQLNamedType; @@ -111,10 +109,12 @@ type OnTypeConflict = ( right: GraphQLNamedType, info?: { left: { - schema?: GraphQLSchema; + subschema?: GraphQLSchema | SubschemaConfig; + transformedSubschema?: Subschema; }; right: { - schema?: GraphQLSchema; + subschema?: GraphQLSchema | SubschemaConfig; + transformedSubschema?: Subschema; }; }, ) => GraphQLNamedType; diff --git a/website/sidebars.json b/website/sidebars.json index 5e1d43242dc..f0c7fa88ecc 100644 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -36,7 +36,7 @@ "relay-operation-optimizer", { "Migration": [ - "migration-from-tools-v5", + "migration-from-tools", "migration-from-toolkit", "migration-from-merge-graphql-schemas", "migration-from-import" diff --git a/yarn.lock b/yarn.lock index 383b4f5b086..bfe44d3a4bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,115 +2,116 @@ # yarn lockfile v1 -"@algolia/cache-browser-local-storage@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.3.1.tgz#2adbb3de8adebf2c938fb8dc94359a89366017b9" - integrity sha512-pNelJomUeeQS5ZagEeUti8HltrfJbqXHnZXB1fez4Ycdm7GsEQm0r6fRCfx+1/6hqQJNo5zQUSA4ZgWi8VMs4Q== - dependencies: - "@algolia/cache-common" "4.3.1" - -"@algolia/cache-common@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.3.1.tgz#2470fd0a358ae5a66119851d77cdf12969b53591" - integrity sha512-BgZVQKfQ3rYSKHDbEuYeIHgQ7cIqbDVUe8gPib/YI6hB2FWdt3hQyDqKslulBt65MxZ5CLSrWg8mq/qL077Bog== - -"@algolia/cache-in-memory@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.3.1.tgz#905a27ab5f1303b1e0fea719bc808784e9415169" - integrity sha512-bd2Aqn8efGJpR8snjUvBJIONyQ2uqYQSbFH9rTrLPmJPMYdoTKTcVLrtpOhOlmvTTfguhqlv+zIjYdJcraeBvg== - dependencies: - "@algolia/cache-common" "4.3.1" - -"@algolia/client-account@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.3.1.tgz#e84f93e2c3375a9defc690e4c24b2e2d9a28824f" - integrity sha512-062Cxw61llvkeHS2bWghufNI0munw5fKGZBhUfDdnC7lsJpzYJwQdkdchzLqqIOXZa8k9vdLlnlKHk8f53E5fQ== - dependencies: - "@algolia/client-common" "4.3.1" - "@algolia/client-search" "4.3.1" - "@algolia/transporter" "4.3.1" - -"@algolia/client-analytics@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.3.1.tgz#391227f0e2cc1a7fefedbab06f4b2b78f59579a5" - integrity sha512-+/gn1z3oAh2CE0xox7/Df9SseHcOuqgm4ngSXGh1cWpldsF+gioA9HWSh/4RSydViASKu3YIk5O61zFzVTKbOA== - dependencies: - "@algolia/client-common" "4.3.1" - "@algolia/client-search" "4.3.1" - "@algolia/requester-common" "4.3.1" - "@algolia/transporter" "4.3.1" - -"@algolia/client-common@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.3.1.tgz#053580c0c2ed982eb2f65c7d728238f3da67db4e" - integrity sha512-1dcADKy3F/gMN+s+p5yvYdF6A4L5YEY0ll4JjSHGKXvZyWLDxKjyu/ToeUuHlrutWQu9w8UT2X7urES8BZU5WQ== - dependencies: - "@algolia/requester-common" "4.3.1" - "@algolia/transporter" "4.3.1" - -"@algolia/client-recommendation@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.3.1.tgz#e693b16cdf6ec7fa532f9ab39143c8dabed5cc76" - integrity sha512-4WZ9Pa2waOkpqv5acom4f8XBBlrnafeEwcSK4R0msubHJpUdkvD/+rxT5Ya1/0FAGvBPhOvtOJqsauaJYKM2Dw== - dependencies: - "@algolia/client-common" "4.3.1" - "@algolia/requester-common" "4.3.1" - "@algolia/transporter" "4.3.1" - -"@algolia/client-search@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.3.1.tgz#e0a3d9b757855901a185d3d918b27af28d520a5b" - integrity sha512-BGI8+8Gi3OELHtyXHflGz0Ms0DQLUQFu2Hs4us3L9gidyYhuvjl76x8EOOQRkXhQcWzEeqx+L2c2InTKtNfQfg== - dependencies: - "@algolia/client-common" "4.3.1" - "@algolia/requester-common" "4.3.1" - "@algolia/transporter" "4.3.1" - -"@algolia/logger-common@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.3.1.tgz#31d2ff5f81a3e2424cfb4b205e64cfd7b1acfba5" - integrity sha512-HOY89EkxFFR0LjeqE+fqaF3EeQUAYFdVdrAXsnrWhm/OsAlXiy+vsoHL4EaJLXvTQlJRBbgNyyQv8ZPAN9JLCw== - -"@algolia/logger-console@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.3.1.tgz#f61f2e0ed67ae92556d7e1b1cb4f08e270b2734b" - integrity sha512-aIJ2N++eTVLkwGFxb1AY60hxYIrNf3FgaEMkokPOAV7sPoWThITSQPj/2vruRLJsYZS2EnD8jxiETrCwSet7mw== - dependencies: - "@algolia/logger-common" "4.3.1" - -"@algolia/requester-browser-xhr@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.3.1.tgz#c664be05dbdddbd63cb66c4e32b598b563ab83d1" - integrity sha512-aSkBWqt9IjZYzmJpP14ISO9tizjyumwAmGxnx2t/QuE3LUh/sJG2FL3Vvq44wjNk9yTPC/c1yiQA85IqeqGZ7g== - dependencies: - "@algolia/requester-common" "4.3.1" - -"@algolia/requester-common@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.3.1.tgz#215084aa1ea025b1f2f73eb03b437de89c7c6c39" - integrity sha512-2lu0gOB2Rt4mn9gKDxjB8rY2IvU4usDA8bZVGl5tf/E81kRovtDZcgZjuKQ5zMyJ/xuIYXjx+ECXAxjUnNhieA== - -"@algolia/requester-node-http@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.3.1.tgz#8ffaeef57c1410e32d59565fbd2db6705bffaa92" - integrity sha512-CnVQ5fHJVsvOZjOIagAIWW315NwGF/spBT5o8/+9ZFTuKQTeLk8/jdj7OXKZ2+vbWkqDM1sKMFXH2jyHOlZjtQ== - dependencies: - "@algolia/requester-common" "4.3.1" - -"@algolia/transporter@4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.3.1.tgz#8320b29cabf54a1486435bea51d1c562952337ce" - integrity sha512-fbA/XHjdVoO+sp+rPVe/+oK/mCac0S6VugMycg7Etujb4+6nv3STIZxtPiC+Xppbouh5tEEOE81F1aALHXBkBQ== - dependencies: - "@algolia/cache-common" "4.3.1" - "@algolia/logger-common" "4.3.1" - "@algolia/requester-common" "4.3.1" +"@algolia/cache-browser-local-storage@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.5.1.tgz#bdf58c30795683fd48310c552c3a10f10fb26e2b" + integrity sha512-TAQHRHaCUAR0bNhUHG0CnO6FTx3EMPwZQrjPuNS6kHvCQ/H8dVD0sLsHyM8C7U4j33xPQCWi9TBnSx8cYXNmNw== + dependencies: + "@algolia/cache-common" "4.5.1" + +"@algolia/cache-common@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.5.1.tgz#3aefda3382dc30b67091b01a3d7461d937082821" + integrity sha512-Sux+pcedQi9sfScIiQdl6pEaTVl712qM9OblvDhnaeF1v6lf4jyTlRTiBLP7YBLuvO1Yo54W3maf03kmz9PVhA== + +"@algolia/cache-in-memory@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.5.1.tgz#127cd473474f62300a157f4ee3b3f6836003cf35" + integrity sha512-fzwAtBFwveuG+E5T/namChEIvdVl0DoV3djV1C078b/JpO5+DeAwuXIJGYbyl950u170n5NEYuIwYG+R6h4lJQ== + dependencies: + "@algolia/cache-common" "4.5.1" + +"@algolia/client-account@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.5.1.tgz#7d3ccda09d3c7849b171c915da0833e7649bab33" + integrity sha512-2WFEaI7Zf4ljnBsSAS4e+YylZ5glovm78xFg4E1JKA8PE6M+TeIgUY6HO2ouLh2dqQKxc9UfdAT1Loo/dha2iQ== + dependencies: + "@algolia/client-common" "4.5.1" + "@algolia/client-search" "4.5.1" + "@algolia/transporter" "4.5.1" + +"@algolia/client-analytics@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.5.1.tgz#bfc2a7292a9ea789ca3c99f79b1f96c08d378828" + integrity sha512-bTmZUU8zhZMWBeGEQ/TVqLoL3OOT0benU0HtS3iOnQURwb+AOCv3RsgZvkj2djp+M24Q6P8/L34uBJMmCurbLg== + dependencies: + "@algolia/client-common" "4.5.1" + "@algolia/client-search" "4.5.1" + "@algolia/requester-common" "4.5.1" + "@algolia/transporter" "4.5.1" + +"@algolia/client-common@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.5.1.tgz#91a401eba6eafd7cc74a0aeccb4c6e6cb1e72026" + integrity sha512-5CpIf8IK1hke7q+N4e+A4TWdFXVJ5Qwyaa0xS84DrDO8HQ7vfYbDvG1oYa9hVEtGn6c3WVKPAvuWynK+fXQQCA== + dependencies: + "@algolia/requester-common" "4.5.1" + "@algolia/transporter" "4.5.1" + +"@algolia/client-recommendation@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.5.1.tgz#57a1fe30987c90b10d5119b8e7d6cd91c423e54c" + integrity sha512-GiFrNSImoEBUQICjFBEoxPGzrjWji8PY9GeMg2CNvOYcRQ0Xt0Y36v9GN53NLjvB7QdQ2FlE1Cuv/PLUfS/aQQ== + dependencies: + "@algolia/client-common" "4.5.1" + "@algolia/requester-common" "4.5.1" + "@algolia/transporter" "4.5.1" + +"@algolia/client-search@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.5.1.tgz#cb798c99d6621e29a36334b92205518a74ecdf3e" + integrity sha512-wjuOTte9Auo9Cg4fL0709PjeJ9rXFh4okYUrOt/2SWqQid6DSdZOp+BtyaHKV3E94sj+SlmMxkMUacYluYg5zA== + dependencies: + "@algolia/client-common" "4.5.1" + "@algolia/requester-common" "4.5.1" + "@algolia/transporter" "4.5.1" + +"@algolia/logger-common@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.5.1.tgz#18d654516369a28e25ad7eee4fc2882fd47ed8ec" + integrity sha512-ZoVnGriinlLHlkvn5K7djOUn1/1IeTjU8rDzOJ3t06T+2hQytgJghaX7rSwKIeH4CjWMy61w8jLisuGJRBOEeg== + +"@algolia/logger-console@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.5.1.tgz#c9def97c20bea5eecb4b07f8d3f733c0192d1761" + integrity sha512-1qa7K18+uAgxyWuguayaDS5ViiZFcOjI3J5ACBb0i/n7RsXUo149lP6mwmx6TIU7s135hT0f0TCqnvfMvN1ilA== + dependencies: + "@algolia/logger-common" "4.5.1" + +"@algolia/requester-browser-xhr@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.5.1.tgz#838b55209d2c83572df261338f7cd75be36de401" + integrity sha512-tsQz+9pZw9dwPm/wMvZDpsWFZgmghLjXi4c3O4rfwoP/Ikum5fhle5fiR14yb4Lw4WlOQ1AJIHJvrg1qLIG8hQ== + dependencies: + "@algolia/requester-common" "4.5.1" + +"@algolia/requester-common@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.5.1.tgz#a34d02daa6093e112b528d3bcd5a5467c00ba823" + integrity sha512-bPCiLvhHKXaka7f5FLtheChToz0yHVhvza64naFJRRh/3kC0nvyrvQ0ogjiydiSrGIfdNDyyTVfKGdk4gS5gyA== + +"@algolia/requester-node-http@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.5.1.tgz#29911c104c6714a5cb29d3991f2b50c52301e091" + integrity sha512-BfFc2h9eQOKu1gGs3DtQO7GrVZW/rxUgpJVLja4UVQyGplJyTCrFgkTyfl+8rb3MkNgA/S2LNo7cKNSPfpqeAQ== + dependencies: + "@algolia/requester-common" "4.5.1" + +"@algolia/transporter@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.5.1.tgz#e0a5c64f358b6751f867001f51f384d6fc7ede14" + integrity sha512-asPDNToDAPhH0tM6qKGTn1l0wTlNUbekpa1ifZ6v+qhSjo3VdqGyp+2VeciJOBW/wVHXh3HUbAcycvLERRlCLg== + dependencies: + "@algolia/cache-common" "4.5.1" + "@algolia/logger-common" "4.5.1" + "@algolia/requester-common" "4.5.1" "@apollo/client@^3.1.5": - version "3.1.5" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.1.5.tgz#5865f5c32f061cd520459c5809e8debea6f4886c" - integrity sha512-nU/KpqzKN27iwVQwGvPaCkTH/+rNGPoXKr60ki02I8jPBIKXyePPov85Ro9phGxuBhLNqGYeP0uAUN0S+HlF1Q== + version "3.2.2" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.2.2.tgz#fe5cad4d53373979f13a925e9da02d8743e798a5" + integrity sha512-lw80L0i8PHhv863iLEwf5AvNak9STPNC6/0MWQYGZHV4yEryj7muLAueRzXkZHpoddGAou80xL8KqLAODNy0/A== dependencies: + "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" "@wry/context" "^0.5.2" "@wry/equality" "^0.2.0" @@ -119,16 +120,16 @@ hoist-non-react-statics "^3.3.2" optimism "^0.12.1" prop-types "^15.7.2" - symbol-observable "^1.2.0" + symbol-observable "^2.0.0" terser "^5.2.0" ts-invariant "^0.4.4" tslib "^1.10.0" zen-observable "^0.8.14" "@apollo/protobufjs@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.3.tgz#02c655aedd4ba7c7f64cbc3d2b1dd9a000a391ba" - integrity sha512-gqeT810Ect9WIqsrgfUvr+ljSB5m1PyBae9HGdrRyQ3HjHjTcjVvxpsMYXlUk4rUHnrfUqyoGvLSy2yLlRGEOw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.5.tgz#a78b726147efc0795e74c8cb8a11aafc6e02f773" + integrity sha512-ZtyaBH1icCgqwIGb3zrtopV2D5Q8yxibkJzlaViM08eOhTQc7rACdYu0pfORFfhllvdMZ3aq69vifYHszY4gNA== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -145,11 +146,11 @@ long "^4.0.0" "@apollographql/apollo-tools@^0.4.3": - version "0.4.7" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.7.tgz#6ba9e0fa872128fbfc82a5ded1447fde932a0169" - integrity sha512-6QjZz6aLq6QXHgJ1AmSg4C4cBmhF5z3g7LPsk4g+zJoWKxiFuSIbrTe12ETtn6wgPq//e5p2agbXYydIjqs7gw== + version "0.4.8" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz#d81da89ee880c2345eb86bddb92b35291f6135ed" + integrity sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA== dependencies: - apollo-env "^0.6.4" + apollo-env "^0.6.5" "@apollographql/graphql-playground-html@1.6.26": version "1.6.26" @@ -194,169 +195,134 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b" - integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g== +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" + integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== dependencies: - browserslist "^4.11.1" + browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@^7.9.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" - integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.6" - "@babel/parser" "^7.9.6" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" +"@babel/core@7.11.6", "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@^7.9.0": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" + integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.6" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.5" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.5" + "@babel/types" "^7.11.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" - lodash "^4.17.13" + lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.11.5", "@babel/generator@^7.5.0", "@babel/generator@^7.9.0", "@babel/generator@^7.9.6": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.5.tgz#a5582773425a468e4ba269d9a1f701fbca6a7a82" - integrity sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g== +"@babel/generator@^7.11.5", "@babel/generator@^7.11.6", "@babel/generator@^7.5.0": + version "7.11.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" + integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== dependencies: "@babel/types" "^7.11.5" jsesc "^2.5.1" - source-map "^0.6.1" + source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3" - integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg== +"@babel/helper-builder-react-jsx-experimental@^7.10.4", "@babel/helper-builder-react-jsx-experimental@^7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz#4ea43dd63857b0a35cd1f1b161dc29b43414e79f" + integrity sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.5" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/types" "^7.11.5" -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== +"@babel/helper-builder-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" + integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-compilation-targets@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a" - integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw== +"@babel/helper-compilation-targets@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== dependencies: - "@babel/compat-data" "^7.9.6" - browserslist "^4.11.1" + "@babel/compat-data" "^7.10.4" + browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz#79753d44017806b481017f24b02fd4113c7106ea" - integrity sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA== - dependencies: - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - -"@babel/helper-create-class-features-plugin@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" - integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== dependencies: - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.9.6" - "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" -"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== +"@babel/helper-define-map@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.5" + lodash "^4.17.19" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b" + integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ== dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": +"@babel/helper-function-name@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== @@ -372,151 +338,126 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.11.0" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== dependencies: - "@babel/types" "^7.8.3" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" + "@babel/types" "^7.10.4" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== +"@babel/helper-plugin-utils@7.10.4", "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== dependencies: - "@babel/types" "^7.8.3" + lodash "^4.17.19" -"@babel/helper-plugin-utils@7.8.3", "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.11.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d" + integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-plugin-utils@^7.10.4": +"@babel/helper-replace-supers@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== dependencies: - lodash "^4.17.13" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/helper-replace-supers@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" - integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== +"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" + integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.11.0" -"@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.8.3": +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== dependencies: "@babel/types" "^7.11.0" -"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.9.0": +"@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helpers@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" - integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/highlight@^7.10.4": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== @@ -525,54 +466,61 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@7.11.5", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0", "@babel/parser@^7.9.4", "@babel/parser@^7.9.6": +"@babel/parser@7.11.5", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5", "@babel/parser@^7.9.4": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== +"@babel/plugin-proposal-async-generator-functions@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-proposal-dynamic-import@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-proposal-export-namespace-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" + integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" + integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== @@ -580,55 +528,55 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== +"@babel/plugin-proposal-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@7.9.5", "@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz#3fd65911306d8746014ec0d0cf78f0e39a149116" - integrity sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg== +"@babel/plugin-proposal-object-rest-spread@7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" - integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== +"@babel/plugin-proposal-optional-catch-binding@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== +"@babel/plugin-proposal-optional-chaining@^7.10.3", "@babel/plugin-proposal-optional-chaining@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.10.3", "@babel/plugin-proposal-optional-chaining@^7.9.0": +"@babel/plugin-proposal-private-methods@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz#750f1255e930a1f82d8cdde45031f81a0d0adff7" - integrity sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ== + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" - integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.8" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -644,12 +592,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -658,13 +606,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.8.3": +"@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" - integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6" + integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -679,19 +634,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@7.8.3", "@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== +"@babel/plugin-syntax-jsx@7.10.4", "@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" + integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" - integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" @@ -700,12 +655,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" @@ -728,420 +683,433 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-top-level-await@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" - integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-transform-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.10.4": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" + integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" - integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" - integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-duplicate-keys@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== +"@babel/plugin-transform-exponentiation-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" - integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz#c497957f09e86e3df7296271e9eb642876bf7788" + integrity sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-flow" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-flow" "^7.10.4" -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-amd@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e" - integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw== +"@babel/plugin-transform-modules-amd@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== - dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" - -"@babel/plugin-transform-modules-commonjs@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" - integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4" - integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg== +"@babel/plugin-transform-modules-systemjs@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-modules-umd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== +"@babel/plugin-transform-new-target@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" - integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-constant-elements@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e" - integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e" + integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d" + integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-react-jsx-development@^7.10.4": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz#e1439e6a57ee3d43e9f54ace363fb29cefe5d7b6" + integrity sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-react-jsx-experimental" "^7.11.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" - integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== +"@babel/plugin-transform-react-jsx-self@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" + integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== +"@babel/plugin-transform-react-jsx-source@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" + integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" + integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx" "^7.10.4" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.9.4": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" - integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== +"@babel/plugin-transform-react-pure-annotations@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" + integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A== dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-regenerator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== +"@babel/plugin-transform-reserved-words@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-runtime@^7.9.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz#3ba804438ad0d880a17bca5eaa0cdf1edeedb2fd" - integrity sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz#f108bc8e0cf33c37da031c097d1df470b3a293fc" + integrity sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" + integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== +"@babel/plugin-transform-sticky-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== +"@babel/plugin-transform-typeof-symbol@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typescript@^7.9.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9" - integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ== +"@babel/plugin-transform-typescript@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb" + integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.9.6" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/preset-env@^7.9.0", "@babel/preset-env@^7.9.5": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" - integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272" + integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA== dependencies: - "@babel/compat-data" "^7.9.6" - "@babel/helper-compilation-targets" "^7.9.6" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.6" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/compat-data" "^7.11.0" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-export-namespace-from" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.11.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.11.0" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.5" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.9.5" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.6" - "@babel/plugin-transform-modules-commonjs" "^7.9.6" - "@babel/plugin-transform-modules-systemjs" "^7.9.6" - "@babel/plugin-transform-modules-umd" "^7.9.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.9.5" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.11.0" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.6" - browserslist "^4.11.1" + "@babel/types" "^7.11.5" + browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" semver "^5.5.0" "@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" + integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -1150,41 +1118,42 @@ esutils "^2.0.2" "@babel/preset-react@^7.9.4": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d" - integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" + integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.9.4" - "@babel/plugin-transform-react-jsx-development" "^7.9.0" - "@babel/plugin-transform-react-jsx-self" "^7.9.0" - "@babel/plugin-transform-react-jsx-source" "^7.9.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.10.4" + "@babel/plugin-transform-react-jsx" "^7.10.4" + "@babel/plugin-transform-react-jsx-development" "^7.10.4" + "@babel/plugin-transform-react-jsx-self" "^7.10.4" + "@babel/plugin-transform-react-jsx-source" "^7.10.4" + "@babel/plugin-transform-react-pure-annotations" "^7.10.4" "@babel/preset-typescript@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" - integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz#7d5d052e52a682480d6e2cc5aa31be61c8c25e36" + integrity sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-typescript" "^7.9.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.10.4" "@babel/runtime-corejs3@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz#a57fe6c13045ca33768a2aa527ead795146febe1" - integrity sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A== + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz#02c3029743150188edeb66541195f54600278419" + integrity sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.11.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4": +"@babel/template@^7.10.4", "@babel/template@^7.3.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== @@ -1193,16 +1162,7 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/template@^7.3.3", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@7.11.5", "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0", "@babel/traverse@^7.9.6": +"@babel/traverse@7.11.5", "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.9.0": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== @@ -1217,7 +1177,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@7.11.5", "@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": +"@babel/types@7.11.5", "@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.9.5": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== @@ -1233,7 +1193,7 @@ "@changesets/apply-release-plan@^4.0.0": version "4.0.0" - resolved "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-4.0.0.tgz#e78efb56a4e459a8dab814ba43045f2ace0f27c9" + resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-4.0.0.tgz#e78efb56a4e459a8dab814ba43045f2ace0f27c9" integrity sha512-MrcUd8wIlQ4S/PznzqJVsmnEpUGfPEkCGF54iqt8G05GEqi/zuxpoTfebcScpj5zeiDyxFIcA9RbeZ3pvJJxoA== dependencies: "@babel/runtime" "^7.4.4" @@ -1299,7 +1259,7 @@ "@changesets/config@^1.2.0", "@changesets/config@^1.3.0": version "1.3.0" - resolved "https://registry.npmjs.org/@changesets/config/-/config-1.3.0.tgz#82fcbf572b00ba16636be9ea45167983f1fc203b" + resolved "https://registry.yarnpkg.com/@changesets/config/-/config-1.3.0.tgz#82fcbf572b00ba16636be9ea45167983f1fc203b" integrity sha512-IeAHmN5kI7OywBUNJXsk/v4vcXDDscwgTe/K5D3FSng5QTvzbgiMAe5K1iwBxBvuT4u/33n89kxSJdg4TTTFfA== dependencies: "@changesets/errors" "^0.1.4" @@ -1311,14 +1271,14 @@ "@changesets/errors@^0.1.4": version "0.1.4" - resolved "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz#f79851746c43679a66b383fdff4c012f480f480d" + resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.1.4.tgz#f79851746c43679a66b383fdff4c012f480f480d" integrity sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q== dependencies: extendable-error "^0.1.5" "@changesets/get-dependents-graph@^1.1.3": version "1.1.3" - resolved "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-1.1.3.tgz#da959c43ce98f3a990a6b8d9c1f894bcc1b629c7" + resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.1.3.tgz#da959c43ce98f3a990a6b8d9c1f894bcc1b629c7" integrity sha512-cTbySXwSv9yWp4Pp5R/b5Qv23wJgFaFCqUbsI3IJ2pyPl0vMaODAZS8NI1nNK2XSxGIg1tw+dWNSR4PlrKBSVQ== dependencies: "@changesets/types" "^3.0.0" @@ -1342,12 +1302,12 @@ "@changesets/get-version-range-type@^0.3.2": version "0.3.2" - resolved "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz#8131a99035edd11aa7a44c341cbb05e668618c67" + resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz#8131a99035edd11aa7a44c341cbb05e668618c67" integrity sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg== "@changesets/git@^1.0.5", "@changesets/git@^1.0.6": version "1.0.6" - resolved "https://registry.npmjs.org/@changesets/git/-/git-1.0.6.tgz#057e627e5d3fcb74bf6c18d7284e130ba5a7632e" + resolved "https://registry.yarnpkg.com/@changesets/git/-/git-1.0.6.tgz#057e627e5d3fcb74bf6c18d7284e130ba5a7632e" integrity sha512-e0M06XuME3W5lGhz+CO0vLc60u+hLk/pYjOx/6GXEWuQrwtGgeycFIfRgRt8qTs664o1oKtVHBbd7ItpoWgFfA== dependencies: "@babel/runtime" "^7.10.4" @@ -1359,22 +1319,22 @@ "@changesets/logger@^0.0.5": version "0.0.5" - resolved "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz#68305dd5a643e336be16a2369cb17cdd8ed37d4c" + resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.0.5.tgz#68305dd5a643e336be16a2369cb17cdd8ed37d4c" integrity sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw== dependencies: chalk "^2.1.0" "@changesets/parse@^0.3.6": - version "0.3.6" - resolved "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.6.tgz#8c2c8480fc07d2db2c37469d4a8df10906a989c6" - integrity sha512-0XPd/es9CfogI7XIqDr7I2mWzm++xX2s9GZsij3GajPYd7ouEsgJyNatPooxNtqj6ZepkiD6uqlqbeBUyj/A0Q== + version "0.3.7" + resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.3.7.tgz#1368136e2b83d5cff11b4d383a3032723530db99" + integrity sha512-8yqKulslq/7V2VRBsJqPgjnZMoehYqhJm5lEOXJPZ2rcuSdyj8+p/2vq2vRDBJT2m0rP+C9G8DujsGYQIFZezw== dependencies: "@changesets/types" "^3.0.0" js-yaml "^3.13.1" "@changesets/pre@^1.0.4": version "1.0.5" - resolved "https://registry.npmjs.org/@changesets/pre/-/pre-1.0.5.tgz#91e5e3b31b4a85ce37de72f6511a786f62f29b51" + resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-1.0.5.tgz#91e5e3b31b4a85ce37de72f6511a786f62f29b51" integrity sha512-p43aAQY3aijhDnBLCriPao5YArlRjD4mSHRJq9PsBhljVLWqQQXcn6seSd77d+bD1tATLhB8tQ2eYoxMtMydXQ== dependencies: "@babel/runtime" "^7.4.4" @@ -1385,7 +1345,7 @@ "@changesets/read@^0.4.6": version "0.4.6" - resolved "https://registry.npmjs.org/@changesets/read/-/read-0.4.6.tgz#1c03e709a870a070fc95490ffa696297d23458f7" + resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.4.6.tgz#1c03e709a870a070fc95490ffa696297d23458f7" integrity sha512-rOd8dsF/Lgyy2SYlDalb3Ts/meDI2AcKPXYhSXIW3k6+ZLlj6Pt+nmgV5Ut8euyH7loibklNTDemfvMffF4xig== dependencies: "@babel/runtime" "^7.4.4" @@ -1399,12 +1359,12 @@ "@changesets/types@^3.0.0", "@changesets/types@^3.1.0", "@changesets/types@^3.1.1": version "3.1.1" - resolved "https://registry.npmjs.org/@changesets/types/-/types-3.1.1.tgz#447481380c42044a8788e46c0dbdf592b338b62f" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-3.1.1.tgz#447481380c42044a8788e46c0dbdf592b338b62f" integrity sha512-XWGEGWXhM92zvBWiQt2sOwhjTt8eCQbrsRbqkv4WYwW3Zsl4qPpvhHsNt845S42dJXrxgjWvId+jxFQocCayNQ== "@changesets/write@^0.1.3": version "0.1.3" - resolved "https://registry.npmjs.org/@changesets/write/-/write-0.1.3.tgz#00ae575af50274773d7493e77fb96838a08ad8ad" + resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.1.3.tgz#00ae575af50274773d7493e77fb96838a08ad8ad" integrity sha512-q79rbwlVmTNKP9O6XxcMDj81CEOn/kQHbTFdRleW0tFUv98S1EyEAE9vLPPzO6WnQipHnaozxB1zMhHy0aQn8Q== dependencies: "@babel/runtime" "^7.4.4" @@ -1771,6 +1731,11 @@ resolved "https://registry.yarnpkg.com/@francoischalifour/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.0.0-alpha.28.tgz#a5ad7996f42e43e4acbb4e0010d663746d0e9997" integrity sha512-bprfNmYt1opFUFEtD2XfY/kEsm13bzHQgU80uMjhuK0DJ914IjolT1GytpkdM6tJ4MBvyiJPP+bTtWO+BZ7c7w== +"@graphql-typed-document-node/core@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.0.tgz#0eee6373e11418bfe0b5638f654df7a4ca6a3950" + integrity sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg== + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1799,9 +1764,9 @@ integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== "@hapi/hoek@^9.0.0": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.0.4.tgz#e80ad4e8e8d2adc6c77d985f698447e8628b6010" - integrity sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw== + version "9.1.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.0.tgz#6c9eafc78c1529248f8f4d92b0799a712b6052c6" + integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw== "@hapi/joi@17.1.1", "@hapi/joi@^17.1.1": version "17.1.1" @@ -1844,12 +1809,13 @@ "@hapi/hoek" "^9.0.0" "@istanbuljs/load-nyc-config@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" - integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" find-up "^4.1.0" + get-package-type "^0.1.0" js-yaml "^3.13.1" resolve-from "^5.0.0" @@ -2018,10 +1984,10 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^25.3.0": - version "25.3.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.3.0.tgz#88f94b277a1d028fd7117bc1f74451e0fc2131e7" - integrity sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw== +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" @@ -2052,7 +2018,7 @@ "@manypkg/find-root@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" + resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== dependencies: "@babel/runtime" "^7.5.5" @@ -2062,7 +2028,7 @@ "@manypkg/get-packages@^1.0.1": version "1.1.1" - resolved "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.1.tgz#7c7e72d0061ab2e61d2ce4da58ce91290a60ac8d" + resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.1.tgz#7c7e72d0061ab2e61d2ce4da58ce91290a60ac8d" integrity sha512-J6VClfQSVgR6958eIDTGjfdCrELy1eT+SHeoSMomnvRQVktZMnEA5edIr5ovRFNw5y+Bk/jyoevPzGYod96mhw== dependencies: "@babel/runtime" "^7.5.5" @@ -2072,39 +2038,39 @@ read-yaml-file "^1.1.0" "@mdx-js/mdx@^1.5.8": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.1.tgz#95d53da3bdb0cd9239097e411b5a41ad86dbd059" - integrity sha512-DLnHbYZGoXSzfIHKgEtsO4qP8029YbdyJvC746PwfPNrRyGciPsqgWmfz/nEXt/fg+UMBG/6/cZaZx/hvyxnyg== + version "1.6.18" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.18.tgz#c73345ef75be0ec303c5d87f3b95cbe55c192742" + integrity sha512-RXtdFBP3cnf/RILx/ipp5TsSY1k75bYYmjorv7jTaPcHPQwhQdI6K4TrVUed/GL4f8zX5TN2QwO5g+3E/8RsXA== dependencies: - "@babel/core" "7.9.0" - "@babel/plugin-syntax-jsx" "7.8.3" + "@babel/core" "7.11.6" + "@babel/plugin-syntax-jsx" "7.10.4" "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "^1.6.1" - babel-plugin-apply-mdx-type-prop "^1.6.1" - babel-plugin-extract-import-names "^1.6.1" + "@mdx-js/util" "1.6.18" + babel-plugin-apply-mdx-type-prop "1.6.18" + babel-plugin-extract-import-names "1.6.18" camelcase-css "2.0.1" detab "2.0.3" - hast-util-raw "5.0.2" + hast-util-raw "6.0.1" lodash.uniq "4.5.0" - mdast-util-to-hast "8.2.0" - remark-footnotes "1.0.0" - remark-mdx "^1.6.1" - remark-parse "8.0.2" + mdast-util-to-hast "9.1.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.18" + remark-parse "8.0.3" remark-squeeze-paragraphs "4.0.0" style-to-object "0.3.0" - unified "9.0.0" + unified "9.2.0" unist-builder "2.0.3" - unist-util-visit "2.0.2" + unist-util-visit "2.0.3" "@mdx-js/react@^1.5.8": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.1.tgz#46e56602c1f513452db2f1f4185f56dc60a4fcb7" - integrity sha512-jXBSWdWFPK2fs3johKb0hQFsf/x/C24XQYQwMhj8FxwlBgf7+NGATwXFs6pGkKd5/JfK9HXmbOcQ78MYoIZyxA== + version "1.6.18" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.18.tgz#f83cbb2355de9cf36a213140ce21647da1e34fa7" + integrity sha512-aFHsZVu7r9WamlP+WO/lyvHHZAubkQjkcRYlvS7fQElypfJvjKdHevjC3xiqlsQpasx/4KqRMoEIb++wNtd+6w== -"@mdx-js/util@^1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.1.tgz#c1e8480844dfaeecde8b827d0e4bbf8793274659" - integrity sha512-A3TBBjg5iVo8S4TTG0VrW8G9YNLob4+M6rALKjY8Sxr9zPExWQ7iTPUSvJVE7YhF9E08EQMubx1vRal3jtpJ9Q== +"@mdx-js/util@1.6.18": + version "1.6.18" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.18.tgz#c7563bf72cb4520b8b7100b64006a64be717e936" + integrity sha512-axMe+NoLF55OlXPbhRn4GNCHcL1f5W3V3c0dWzg05S9JXm3Ecpxzxaht3g3vTP0dcqBL/yh/xCvzK0ZpO54Eug== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" @@ -2212,13 +2178,13 @@ resolve "^1.14.2" "@rollup/pluginutils@^3.0.6", "@rollup/pluginutils@^3.0.8": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.0.9.tgz#aa6adca2c45e5a1b950103a999e3cddfe49fd775" - integrity sha512-TLZavlfPAZYI7v33wQh4mTP6zojne14yok3DNSLcjoG/Hirxfkonn6icP5rrNWRn8nZsirJBFFpijVOJzkUHDg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: "@types/estree" "0.0.39" estree-walker "^1.0.1" - micromatch "^4.0.2" + picomatch "^2.2.2" "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -2226,9 +2192,9 @@ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== "@sinonjs/commons@^1.7.0": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" - integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== dependencies: type-detect "4.0.8" @@ -2366,21 +2332,10 @@ resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== -"@types/babel__core@^7.0.0": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__core@^7.1.7": - version "7.1.7" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" - integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.10" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40" + integrity sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2389,16 +2344,16 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214" + integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2418,11 +2373,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/connect@*": version "3.4.33" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" @@ -2467,12 +2417,16 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/express-serve-static-core@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084" + integrity sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" -"@types/express-serve-static-core@*", "@types/express-serve-static-core@4.17.9": +"@types/express-serve-static-core@4.17.9": version "4.17.9" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz#2d7b34dcfd25ec663c25c85d76608f8b249667f1" integrity sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA== @@ -2516,11 +2470,10 @@ "@types/node" "*" "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== dependencies: - "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" @@ -2541,16 +2494,28 @@ "@types/koa" "*" graphql "^15.3.0" +"@types/hast@^2.0.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9" + integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q== + dependencies: + "@types/unist" "*" + "@types/html-minifier-terser@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" - integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" + integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== "@types/http-assert@*": version "1.5.1" resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== +"@types/http-errors@*": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" + integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== + "@types/http-proxy-agent@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/http-proxy-agent/-/http-proxy-agent-2.0.2.tgz#942c1f35c7e1f0edd1b6ffae5d0f9051cfb32be1" @@ -2564,9 +2529,9 @@ integrity sha512-k3RS5HyBPu4h+5hTmIEfPB2rl5P3LnGdQEZrV2b9OWTJVtsUQ2VBcedqYKGqxvZqle5UALUXdSfVA8nf3HfyWQ== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": version "3.0.0" @@ -2576,9 +2541,9 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" @@ -2603,17 +2568,7 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb" integrity sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww== -"@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== - -"@types/json-schema@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== - -"@types/json-schema@^7.0.5": +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== @@ -2648,14 +2603,15 @@ "@types/koa" "*" "@types/koa@*": - version "2.11.3" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.3.tgz#540ece376581b12beadf9a417dd1731bc31c16ce" - integrity sha512-ABxVkrNWa4O/Jp24EYI/hRNqEVRlhB9g09p48neQp4m3xL1TJtdWk2NyNQSMCU45ejeELMQZBYyfstyVvO2H3Q== + version "2.11.4" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.4.tgz#8af02a069a9f8e08fa47b8da28d982e652f69cfb" + integrity sha512-Etqs0kdqbuAsNr5k6mlZQelpZKVwMu9WPRHVVTLnceZlhr0pYmblRNJbCgoCMzKWWePldydU0AYEOX4Q9fnGUQ== dependencies: "@types/accepts" "*" "@types/content-disposition" "*" "@types/cookies" "*" "@types/http-assert" "*" + "@types/http-errors" "*" "@types/keygrip" "*" "@types/koa-compose" "*" "@types/node" "*" @@ -2670,24 +2626,23 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== +"@types/mdast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + "@types/mime@*": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" - integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== "@types/minimatch@*", "@types/minimatch@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node-fetch@2.5.6": - version "2.5.6" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.6.tgz#df8377a66e64ddf75b65b072e37b3c5c5425a96f" - integrity sha512-2w0NTwMWF1d3NJMK0Uiq2UNN8htVCyOWOD0jIPjPgC5Ph/YP4dVhs9YxxcMcuLuwAslz0dVEcZQUaqkLs3IzOQ== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - "@types/node-fetch@2.5.7": version "2.5.7" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" @@ -2702,14 +2657,14 @@ integrity sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw== "@types/node@^10.1.0": - version "10.17.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.21.tgz#c00e9603399126925806bed2d9a1e37da506965e" - integrity sha512-PQKsydPxYxF1DsAFWmunaxd3sOi3iMt6Zmx/tgaagHYmwJ/9cRH91hQkeJZaUGWbvn0K5HlSVEXkn5U/llWPpQ== + version "10.17.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.35.tgz#58058f29b870e6ae57b20e4f6e928f02b7129f56" + integrity sha512-gXx7jAWpMddu0f7a+L+txMplp3FnHl53OhQIF9puXKq3hDGY/GjH+MF04oWnV/adPSCrbtHumDCFwzq2VhltWA== "@types/node@^12.7.1": - version "12.12.55" - resolved "https://registry.npmjs.org/@types/node/-/node-12.12.55.tgz#0aa266441cb9e1fd3e415a8f619cb7d776667cdd" - integrity sha512-Vd6xQUVvPCTm7Nx1N7XHcpX6t047ltm7TgcsOr4gFHjeYgwZevo+V7I1lfzHnj5BT5frztZ42+RTG4MwYw63dw== + version "12.12.62" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.62.tgz#733923d73669188d35950253dd18a21570085d2b" + integrity sha512-qAfo81CsD7yQIM9mVyh6B/U47li5g7cfpVQEDMfQeF8pSZVwzbhwU3crc0qG4DmpsebpJPR49AKOExQyJ05Cpg== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -2721,10 +2676,15 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + "@types/prettier@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" - integrity sha512-/rM+sWiuOZ5dvuVzV37sUuklsbg+JPOP8d+nNFlo2ZtfpzPiPvh1/gc8liWOLBqe+sR+ZM7guPaIcTt6UZTo7Q== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.1.tgz#be148756d5480a84cde100324c03a86ae5739fb5" + integrity sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ== "@types/prop-types@*": version "15.7.3" @@ -2737,9 +2697,9 @@ integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/qs@*": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.1.tgz#937fab3194766256ee09fcd40b781740758617e7" - integrity sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw== + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== "@types/range-parser@*": version "1.2.3" @@ -2754,9 +2714,9 @@ "@types/react" "*" "@types/react@*": - version "16.9.48" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.48.tgz#d3387329f070d1b1bc0ff4a54a54ceefd5a8485c" - integrity sha512-4ykBVswgYitPGMXFRxJCHkxJDU2rjfU3/zw67f8+dB7sNdVJXsrwqoYxz/stkAucymnEEbRPFmX7Ce5Mc/kJCw== + version "16.9.50" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.50.tgz#cb5f2c22d42de33ca1f5efc6a0959feb784a3a2d" + integrity sha512-kPx5YsNnKDJejTk1P+lqThwxN2PczrocwsvqXnjvVvKpFescoY62ZiM3TV7dH1T8lFhlHZF+PE5xUyimUwqEGA== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -2771,9 +2731,9 @@ typescript "^3.0.0" "@types/relay-runtime@*": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-8.0.8.tgz#77be2b7647995b6f2d9bcceae0febe7a7e337da8" - integrity sha512-Wy/31wkIZn0M1VlDAy2haNRiXQtaQr6D+XnhCRraX6BTGhzytLj05hdqMo3unbP0/5WcYXXTPMLPeGvDwHQISQ== + version "10.0.4" + resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-10.0.4.tgz#b3b70eb07b5c851fc5d7feffa5fc79cbda79831f" + integrity sha512-PqmnynswPz5STanyPI6rjfW2ZdLju9scm5DQWFRJXC/WtKJNggyBMDQlMbTp5Sq1/5nIcP6Z7DK+Mrod9wNo9g== "@types/resolve@0.0.8": version "0.0.8" @@ -2783,14 +2743,14 @@ "@types/node" "*" "@types/semver@^6.0.0": - version "6.2.1" - resolved "https://registry.npmjs.org/@types/semver/-/semver-6.2.1.tgz#a236185670a7860f1597cf73bea2e16d001461ba" - integrity sha512-+beqKQOh9PYxuHvijhVl+tIHvT6tuwOrE9m14zd+MT2A38KoKZhh7pYJ0SNleLtwDsiIxHDsIk9bv01oOxvSvA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.2.tgz#5c27df09ca39e3c9beb4fae6b95f4d71426df0a9" + integrity sha512-RxAwYt4rGwK5GyoRwuP0jT6ZHAVTdz2EqgsHmX0PYNjGsko+OeT4WFXXTs/lM3teJUJodM+SNtAL5/pXIJ61IQ== "@types/serve-static@*": - version "1.13.3" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1" - integrity sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g== + version "1.13.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53" + integrity sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ== dependencies: "@types/express-serve-static-core" "*" "@types/mime" "*" @@ -2806,9 +2766,9 @@ integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== "@types/superagent@*": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.7.tgz#a7d92d98c490ee0f802a127fdf149b9a114f77a5" - integrity sha512-JSwNPgRYjIC4pIeOqLwWwfGj6iP1n5NE6kNBEbGx2V8H78xCPwx7QpNp9plaI30+W3cFEzJO7BIIsXE+dbtaGg== + version "4.1.10" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.10.tgz#5e2cc721edf58f64fe9b819f326ee74803adee86" + integrity sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g== dependencies: "@types/cookiejar" "*" "@types/node" "*" @@ -2821,18 +2781,18 @@ "@types/superagent" "*" "@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02" - integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" + integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== "@types/uglify-js@*": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.1.tgz#0ad39d6a72979593f669acdfc7e980d590d3fb94" - integrity sha512-rdBIeMQyRBOXogop/EYBvSkYFn9D9yGxUa5hagBVG55KIdSUbp22EACJSHCs6kmmfunojAhf7zJH+Ds06/qLaQ== + version "3.11.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.11.0.tgz#2868d405cc45cd9dc3069179052103032c33afbc" + integrity sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q== dependencies: source-map "^0.6.1" -"@types/unist@^2.0.0", "@types/unist@^2.0.2": +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== @@ -2843,18 +2803,18 @@ integrity sha512-+33x29mg+ecU88ODdWpqaie2upIuRkhujVLA7TuJjM823cNMbeggfI6NhxewaRaRF8dy+g33e4uIg/m5Mb3xDQ== "@types/webpack-sources@*": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141" - integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.0.0.tgz#08216ab9be2be2e1499beaebc4d469cec81e82a7" + integrity sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg== dependencies: "@types/node" "*" "@types/source-list-map" "*" - source-map "^0.6.1" + source-map "^0.7.3" "@types/webpack@^4.41.0", "@types/webpack@^4.41.8": - version "4.41.17" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.17.tgz#0a69005e644d657c85b7d6ec1c826a71bebd1c93" - integrity sha512-6FfeCidTSHozwKI67gIVQQ5Mp0g4X96c2IXxX75hYEQJwST/i6NyZexP//zzMOBb+wG9jJ7oO8fk9yObP2HWAw== + version "4.41.22" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.22.tgz#ff9758a17c6bd499e459b91e78539848c32d0731" + integrity sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -2871,9 +2831,9 @@ "@types/node" "*" "@types/ws@^7.0.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.4.tgz#b3859f7b9c243b220efac9716ec42c716a72969d" - integrity sha512-9S6Ask71vujkVyeEXKxjBSUV8ZUB0mjL5la4IncBoheu04bDaYyUKErh1BQcY9+WzOUOiKqz/OnpJHYckbMfNg== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.7.tgz#362ad1a1d62721bdb725e72c8cccf357078cf5a3" + integrity sha512-UUFC/xxqFLP17hTva8/lVT0SybLUrfSD9c+iapKb0fEiC8uoDbA+xuZ3pAN603eW+bY8ebSMLm9jXdIPnD0ZgA== dependencies: "@types/node" "*" @@ -2883,16 +2843,16 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^15.0.0": - version "15.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" - integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== + version "15.0.7" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.7.tgz#dad50a7a234a35ef9460737a56024287a3de1d2b" + integrity sha512-Gf4u3EjaPNcC9cTu4/j2oN14nSVhr8PQ+BvBcBQHAhDZfl0bVIiLgvnRXv/dn58XhTm9UXvBpvJpDlwV65QxOA== dependencies: "@types/yargs-parser" "*" "@types/zen-observable@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" - integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== + version "0.8.1" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.1.tgz#5668c0bce55a91f2b9566b1d8a4c0a8dbbc79764" + integrity sha512-wmk0xQI6Yy7Fs/il4EpOcflG4uonUpYGqvZARESLc2oy4u69fkatFLbJOeW4Q6awO15P4rduAe6xkwHevpXcUQ== "@typescript-eslint/eslint-plugin@4.4.1": version "4.4.1" @@ -3142,13 +3102,13 @@ "@yarnpkg/lockfile@^1.1.0": version "1.1.0" - resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== abab@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== accepts@^1.3.5, accepts@^1.3.7, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" @@ -3167,26 +3127,21 @@ acorn-globals@^6.0.0: acorn-walk "^7.1.1" acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== acorn-walk@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" - integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== - -acorn@^7.4.0: +acorn@^7.1.1, acorn@^7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== @@ -3216,17 +3171,12 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv-keywords@^3.5.2: +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.5" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== @@ -3237,31 +3187,31 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.12.4, ajv uri-js "^4.2.2" algoliasearch-helper@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.1.1.tgz#4cdfbaed6670d82626ac1fae001ccbf53192f497" - integrity sha512-Jkqlp8jezQRixf7sbQ2zFXHpdaT41g9sHBqT6pztv5nfDmg94K+pwesAy6UbxRY78IL54LIaV1FLttMtT+IzzA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.2.2.tgz#12451c8e368935348453c8879785b20e1788c33c" + integrity sha512-/3XvE33R+gQKaiPdy3nmHYqhF8hqIu8xnlOicVxb1fD6uMFmxW8rGLzzrRfsPfxgAfm+c1NslLb3TzQVIB8aVA== dependencies: events "^1.1.1" algoliasearch@^4.0.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.3.1.tgz#dea6ad87705e0439855cf3e5a4406b74e794b874" - integrity sha512-q8aIYgdZZWOMzmvlIwxcbktVa8+M5cyI8hIrgd/NcSz/XKHfVTKdNYbnsmPqmYrssAmepx8C8vHnJrPuumUnYA== - dependencies: - "@algolia/cache-browser-local-storage" "4.3.1" - "@algolia/cache-common" "4.3.1" - "@algolia/cache-in-memory" "4.3.1" - "@algolia/client-account" "4.3.1" - "@algolia/client-analytics" "4.3.1" - "@algolia/client-common" "4.3.1" - "@algolia/client-recommendation" "4.3.1" - "@algolia/client-search" "4.3.1" - "@algolia/logger-common" "4.3.1" - "@algolia/logger-console" "4.3.1" - "@algolia/requester-browser-xhr" "4.3.1" - "@algolia/requester-common" "4.3.1" - "@algolia/requester-node-http" "4.3.1" - "@algolia/transporter" "4.3.1" + version "4.5.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.5.1.tgz#fd20cd76f6ba3fbecdd4e11bdaefefb44abc0b38" + integrity sha512-b6yT1vWMlBdVObQipKxvt0M6SEvGetVj+FFFlo0Fy06gkdj6WCJaS4t10Q/hC3I2VG9QmpCqlK3Esgg1y1E+uw== + dependencies: + "@algolia/cache-browser-local-storage" "4.5.1" + "@algolia/cache-common" "4.5.1" + "@algolia/cache-in-memory" "4.5.1" + "@algolia/client-account" "4.5.1" + "@algolia/client-analytics" "4.5.1" + "@algolia/client-common" "4.5.1" + "@algolia/client-recommendation" "4.5.1" + "@algolia/client-search" "4.5.1" + "@algolia/logger-common" "4.5.1" + "@algolia/logger-console" "4.5.1" + "@algolia/requester-browser-xhr" "4.5.1" + "@algolia/requester-common" "4.5.1" + "@algolia/requester-node-http" "4.5.1" + "@algolia/transporter" "4.5.1" alphanum-sort@^1.0.0: version "1.0.2" @@ -3270,7 +3220,7 @@ alphanum-sort@^1.0.0: ansi-align@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= dependencies: string-width "^2.0.0" @@ -3311,7 +3261,7 @@ ansi-regex@^2.0.0: ansi-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.1.0: @@ -3337,11 +3287,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" anymatch@^2.0.0: @@ -3376,16 +3325,6 @@ apollo-datasource@^0.7.2: apollo-server-caching "^0.5.2" apollo-server-env "^2.4.5" -apollo-env@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.6.4.tgz#c5b9b2510428df5257846c0d96c9c907269d4b1f" - integrity sha512-8tGDMFv3sZLd76b/ZAo8GbdWU5Qt3VEUWSB+FLN41p/hVShZw0XIo2s/i8pVCTAhaWiEiD0Cr+d/zi0/h5UTxA== - dependencies: - "@types/node-fetch" "2.5.6" - core-js "^3.0.1" - node-fetch "^2.2.0" - sha.js "^2.4.11" - apollo-env@^0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.6.5.tgz#5a36e699d39e2356381f7203493187260fded9f3" @@ -3530,9 +3469,9 @@ apollo-upload-client@14.1.2: extract-files "^9.0.0" apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.3.tgz#f1854715a7be80cd810bc3ac95df085815c0787c" - integrity sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw== + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== dependencies: "@wry/equality" "^0.1.2" fast-json-stable-stringify "^2.0.0" @@ -3573,7 +3512,7 @@ arr-union@^3.1.0: array-find-index@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: @@ -3635,14 +3574,15 @@ asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" asn1@~0.2.3: version "0.2.4" @@ -3719,16 +3659,16 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.8.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" - integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== dependencies: browserslist "^4.12.0" - caniuse-lite "^1.0.30001061" - chalk "^2.4.2" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.30" + postcss "^7.0.32" postcss-value-parser "^4.1.0" aws-sign2@~0.7.0: @@ -3737,9 +3677,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== babel-code-frame@^6.22.0: version "6.26.0" @@ -3775,13 +3715,13 @@ babel-loader@^8.1.0: pify "^4.0.1" schema-utils "^2.6.5" -babel-plugin-apply-mdx-type-prop@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.1.tgz#7eaf057300f91e2dbce3142001131f578605c843" - integrity sha512-chjmLo1x7fCpDRICGUlbkwf2E6sMVG9jjG6PtPBWnQfMEjgV03Gh0jSVGbZJsEUxcMqOpHSsIXvPz1sYip6X3g== +babel-plugin-apply-mdx-type-prop@1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.18.tgz#81f31b472f3b28289d4cea0f76c0315e6b85394f" + integrity sha512-lcpbj/GatKQp48jsJ8Os/ZXv381ZYFNKA27EPllcpFMpqiS696XkoK+xie/2GjzQSe5IIbo3srsXpd6/ik8PsQ== dependencies: - "@babel/helper-plugin-utils" "7.8.3" - "@mdx-js/util" "^1.6.1" + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.18" babel-plugin-dynamic-import-node@^2.3.0, babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" @@ -3790,12 +3730,12 @@ babel-plugin-dynamic-import-node@^2.3.0, babel-plugin-dynamic-import-node@^2.3.3 dependencies: object.assign "^4.1.0" -babel-plugin-extract-import-names@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.1.tgz#fc913f9fdb1aa1590ec96269a03c1ce98e8b76b1" - integrity sha512-u0uRrPyygx4RlNva1aqz7DM9UBpsQJQZ4NyakHVJF18s73H/iiyXuc+X7k+9tHeN0WKLsohQUGzGLli6z5a0Zw== +babel-plugin-extract-import-names@1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.18.tgz#be74a5e12e1b5a5db5af53015a6a62ad16ac18f5" + integrity sha512-2EyZia3Ezl3UdhBcgDl6KZTNkYa2VhmAHHbJdhCroa1pZD/E56BulVsSKIhm/kza9agnabDR2VEHO+ZnqpfxbQ== dependencies: - "@babel/helper-plugin-utils" "7.8.3" + "@babel/helper-plugin-utils" "7.10.4" babel-plugin-istanbul@^6.0.0: version "6.0.0" @@ -3824,9 +3764,9 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== babel-preset-current-node-syntax@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da" - integrity sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ== + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz#826f1f8e7245ad534714ba001f84f7e906c3b615" + integrity sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -3940,7 +3880,7 @@ bcrypt-pbkdf@^1.0.0: better-path-resolve@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" + resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== dependencies: is-windows "^1.0.0" @@ -3966,9 +3906,9 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== bindings@^1.5.0: version "1.5.0" @@ -3983,14 +3923,14 @@ bluebird@^3.5.5, bluebird@^3.7.1, bluebird@^3.7.2: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== bn.js@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5" - integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA== + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== body-parser@1.19.0, body-parser@^1.18.3: version "1.19.0" @@ -4027,7 +3967,7 @@ boolbase@^1.0.0, boolbase@~1.0.0: boxen@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== dependencies: ansi-align "^2.0.0" @@ -4085,7 +4025,7 @@ braces@^3.0.1, braces@~3.0.2: breakword@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz#fd420a417f55016736b5b615161cae1c8f819810" + resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.5.tgz#fd420a417f55016736b5b615161cae1c8f819810" integrity sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg== dependencies: wcwidth "^1.0.1" @@ -4140,15 +4080,15 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" - integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== dependencies: bn.js "^5.1.1" browserify-rsa "^4.0.1" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.2" + elliptic "^6.5.3" inherits "^2.0.4" parse-asn1 "^5.1.5" readable-stream "^3.6.0" @@ -4171,15 +4111,15 @@ browserslist@4.10.0: node-releases "^1.1.52" pkg-up "^3.1.0" -browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.12.0, browserslist@^4.6.4, browserslist@^4.8.5: - version "4.12.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" - integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.4, browserslist@^4.8.5: + version "4.14.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" + integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== dependencies: - caniuse-lite "^1.0.30001043" - electron-to-chromium "^1.3.413" - node-releases "^1.1.53" - pkg-up "^2.0.0" + caniuse-lite "^1.0.30001135" + electron-to-chromium "^1.3.571" + escalade "^3.1.0" + node-releases "^1.1.61" bs-logger@0.x: version "0.2.6" @@ -4398,7 +4338,7 @@ camelcase-css@2.0.1: camelcase-keys@^4.0.0: version "4.2.0" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= dependencies: camelcase "^4.1.0" @@ -4407,7 +4347,7 @@ camelcase-keys@^4.0.0: camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= camelcase@^5.0.0, camelcase@^5.3.1: @@ -4430,10 +4370,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061: - version "1.0.30001061" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001061.tgz#80ca87ef14eb543a7458e7fd2b5e2face3458c9f" - integrity sha512-SMICCeiNvMZnyXpuoO+ot7FHpMVPlrsR+HmfByj6nY4xYDHXLqMTbgH7ecEkDNXWkH1vaip+ZS0D7VTXwM1KYQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: + version "1.0.30001143" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001143.tgz#560f2cfb9f313d1d7e52eb8dac0e4e36c8821c0d" + integrity sha512-p/PO5YbwmCpBJPxjOiKBvAlUPgF8dExhfEpnsH+ys4N/791WHrYrGg0cyHiAURl5hSbx5vIcjKmQAP6sHDYH3w== capture-exit@^2.0.0: version "2.0.0" @@ -4646,13 +4586,13 @@ clean-stack@^2.0.0: cli-boxes@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-cursor@^3.1.0: version "3.1.0" @@ -4726,7 +4666,7 @@ clone-response@^1.0.2: clone@^1.0.2: version "1.0.4" - resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= clsx@^1.1.1: @@ -4748,7 +4688,7 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -collapse-white-space@^1.0.0, collapse-white-space@^1.0.2: +collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== @@ -4806,6 +4746,11 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -4829,9 +4774,9 @@ commander@^4.0.1, commander@^4.1.1: integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" - integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" + integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== commondir@^1.0.1: version "1.0.1" @@ -4906,9 +4851,9 @@ consola@2.11.3: integrity sha512-aoW0YIIAmeftGR8GSpw6CGQluNdkWMWh3yEFjH/hmynTYnMtibXszii3lxCXmk8YxJtI3FAK5aTiquA5VH68Gw== consola@^2.10.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.12.1.tgz#88e9311a02cb88a7f6f9488239dd30b6ba99cbb0" - integrity sha512-aEkkju9ZcEa9y2MhzNhfmTUws/CEZZ0LKu0FxftSU3HygPfVMMIMSYyYct+xBN6XNRhsaDZjw2HAv3m2ammXSA== + version "2.15.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.0.tgz#40fc4eefa4d2f8ef2e2806147f056ea207fcc0e9" + integrity sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ== console-browserify@^1.1.0: version "1.2.0" @@ -4987,9 +4932,9 @@ copy-text-to-clipboard@^2.2.0: integrity sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ== copy-webpack-plugin@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.4.tgz#7b7d7f7f290aa21b3411d02525859b89988a200b" - integrity sha512-zCazfdYAh3q/O4VzZFiadWGpDA2zTs6FC6D7YTHD6H1J40pzo0H4z22h1NYMCl4ArQP4CK8y/KWqPrJ4rVkZ5A== + version "6.2.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.2.0.tgz#dacd3f9b6e51e82132a12fa37410af35ecef0c9e" + integrity sha512-1s/VbhIX73FBFBYF4D0KdeBLkjEnAlCQn0Ufo2a/IyJ41jHpQ9ZzM4JAfbE7yTOhbmwRFkARErJ/XIiLceja6Q== dependencies: cacache "^15.0.5" fast-glob "^3.2.4" @@ -4999,8 +4944,8 @@ copy-webpack-plugin@^6.0.3: loader-utils "^2.0.0" normalize-path "^3.0.0" p-limit "^3.0.2" - schema-utils "^2.7.0" - serialize-javascript "^4.0.0" + schema-utils "^2.7.1" + serialize-javascript "^5.0.1" webpack-sources "^1.4.3" core-js-compat@^3.6.2: @@ -5077,12 +5022,12 @@ cosmiconfig@^7.0.0: yaml "^1.10.0" create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== dependencies: bn.js "^4.1.0" - elliptic "^6.0.0" + elliptic "^6.5.3" create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" @@ -5125,7 +5070,7 @@ cross-spawn@7.0.1: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" @@ -5134,7 +5079,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -5144,9 +5089,9 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: which "^1.2.9" cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -5203,22 +5148,22 @@ css-has-pseudo@^0.10.0: postcss-selector-parser "^5.0.0-rc.4" css-loader@^3.4.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf" - integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== dependencies: camelcase "^5.3.1" cssesc "^3.0.0" icss-utils "^4.1.1" loader-utils "^1.2.3" normalize-path "^3.0.0" - postcss "^7.0.27" + postcss "^7.0.32" postcss-modules-extract-imports "^2.0.0" postcss-modules-local-by-default "^3.0.2" postcss-modules-scope "^2.2.0" postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.3" - schema-utils "^2.6.6" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" semver "^6.3.0" css-prefers-color-scheme@^3.1.1: @@ -5275,9 +5220,9 @@ css-what@2.1: integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.1.tgz#81cb70b609e4b1351b1e54cbc90fd9c54af86e2e" + integrity sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g== cssdb@^4.4.0: version "4.4.0" @@ -5398,22 +5343,22 @@ csstype@^3.0.2: csv-generate@^3.2.4: version "3.2.4" - resolved "https://registry.npmjs.org/csv-generate/-/csv-generate-3.2.4.tgz#440dab9177339ee0676c9e5c16f50e2b3463c019" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.2.4.tgz#440dab9177339ee0676c9e5c16f50e2b3463c019" integrity sha512-qNM9eqlxd53TWJeGtY1IQPj90b563Zx49eZs8e0uMyEvPgvNVmX1uZDtdzAcflB3PniuH9creAzcFOdyJ9YGvA== csv-parse@^4.8.8: version "4.12.0" - resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-4.12.0.tgz#fd42d6291bbaadd51d3009f6cadbb3e53b4ce026" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.12.0.tgz#fd42d6291bbaadd51d3009f6cadbb3e53b4ce026" integrity sha512-wPQl3H79vWLPI8cgKFcQXl0NBgYYEqVnT1i6/So7OjMpsI540oD7p93r3w6fDSyPvwkTepG05F69/7AViX2lXg== csv-stringify@^5.3.6: version "5.5.1" - resolved "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.5.1.tgz#f42cdd379b0f7f142933a11f674b1a91ebd0fcd0" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.5.1.tgz#f42cdd379b0f7f142933a11f674b1a91ebd0fcd0" integrity sha512-HM0/86Ks8OwFbaYLd495tqTs1NhscZL52dC4ieKYumy8+nawQYC0xZ63w1NqLf0M148T2YLYqowoImc1giPn0g== csv@^5.3.1: version "5.3.2" - resolved "https://registry.npmjs.org/csv/-/csv-5.3.2.tgz#50b344e25dfbb8c62684a1bcec18c22468b2161e" + resolved "https://registry.yarnpkg.com/csv/-/csv-5.3.2.tgz#50b344e25dfbb8c62684a1bcec18c22468b2161e" integrity sha512-odDyucr9OgJTdGM2wrMbJXbOkJx3nnUX3Pt8SFOwlAMOpsUQlz1dywvLMXJWX/4Ib0rjfOsaawuuwfI5ucqBGQ== dependencies: csv-generate "^3.2.4" @@ -5423,7 +5368,7 @@ csv@^5.3.1: currently-unhandled@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" @@ -5486,7 +5431,7 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: dependencies: ms "2.1.2" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: +debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -5495,7 +5440,7 @@ debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: decamelize-keys@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= dependencies: decamelize "^1.1.0" @@ -5507,9 +5452,9 @@ decamelize@^1.1.0, decamelize@^1.2.0: integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decimal.js@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" - integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== decode-uri-component@^0.2.0: version "0.2.0" @@ -5565,7 +5510,7 @@ default-gateway@^4.2.0: defaults@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: clone "^1.0.2" @@ -5664,7 +5609,7 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detab@2.0.3, detab@^2.0.0: +detab@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.3.tgz#33e5dd74d230501bd69985a0d2b9a3382699a130" integrity sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A== @@ -5812,9 +5757,9 @@ domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" + integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== domexception@^2.0.1: version "2.0.1" @@ -5855,9 +5800,9 @@ dot-case@^3.0.3: tslib "^1.10.0" dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" @@ -5872,9 +5817,9 @@ duplexer3@^0.1.4: integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" @@ -5911,15 +5856,15 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.413: - version "1.3.441" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.441.tgz#094f71b992dca5bc96b798cfbaf37dc76302015a" - integrity sha512-leBfJwLuyGs1jEei2QioI+PjVMavmUIvPYidE8dCCYWLAq0uefhN3NYgDNb8WxD3uiUNnJ3ScMXg0upSlwySzQ== +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.571: + version "1.3.576" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz#2e70234484e03d7c7e90310d7d79fd3775379c34" + integrity sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew== -elliptic@^6.0.0, elliptic@^6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== +elliptic@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -5970,11 +5915,11 @@ encodeurl@~1.0.2: integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" @@ -5994,7 +5939,7 @@ enhanced-resolve@^4.3.0: enquirer@^2.3.0, enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" @@ -6005,9 +5950,9 @@ entities@^1.1.1, entities@~1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436" - integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -6024,21 +5969,39 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -6075,6 +6038,11 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" +escalade@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" + integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -6096,9 +6064,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -6136,9 +6104,9 @@ eslint-module-utils@^2.6.0: pkg-dir "^2.0.0" eslint-plugin-es@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" - integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng== + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== dependencies: eslint-utils "^2.0.0" regexpp "^3.0.0" @@ -6281,31 +6249,19 @@ esquery@^1.2.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -esrecurse@^4.3.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== - -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -6321,9 +6277,9 @@ esutils@^2.0.2: integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eta@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/eta/-/eta-1.1.1.tgz#acd575025233488a66870b02223001d4cd467441" - integrity sha512-YRchTAXZZrrJVmlAwmLHuKmlHNJ2hO0uen8LsDqvH5kknRjh0ef+Y9kInENygCgvu7FQNJBpbyDChfMo8f5Qgw== + version "1.11.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-1.11.0.tgz#cfc260fb4e77e1be96ac141f3e50b28da3e3c182" + integrity sha512-lfqIE6qD55WFYT6E0phTBUe0sapHJhfvRDB7jSpXxFGwzDaP69kQqRyF7krBe8I1QzF5nE1yAByiIOLB630x4Q== etag@~1.8.1: version "1.8.1" @@ -6343,9 +6299,9 @@ eventemitter3@^3.1.0: integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== eventemitter3@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== events@^1.1.1: version "1.1.1" @@ -6353,9 +6309,9 @@ events@^1.1.1: integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= events@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== eventsource@^1.0.7: version "1.0.7" @@ -6379,7 +6335,7 @@ exec-sh@^0.3.2: execa@^0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" @@ -6539,12 +6495,12 @@ extend@^3.0.0, extend@~3.0.2: extendable-error@^0.1.5: version "0.1.7" - resolved "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" + resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== external-editor@^3.0.3, external-editor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" @@ -6581,9 +6537,9 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^2.0.2: version "2.2.7" @@ -6597,19 +6553,7 @@ fast-glob@^2.0.2: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.0.3, fast-glob@^3.1.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" - integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-glob@^3.2.4: +fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== @@ -6644,9 +6588,9 @@ fast-url-parser@1.1.3: punycode "^1.3.2" fastq@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801" - integrity sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== dependencies: reusify "^1.0.4" @@ -6711,9 +6655,9 @@ fbjs@^1.0.0: ua-parser-js "^0.7.18" feed@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/feed/-/feed-4.1.0.tgz#58f1c9cc2b44715d14ac59234e1bf20c5d757aa7" - integrity sha512-dAXWXM8QMxZ1DRnAxDmy1MaWZFlh1Ku7TU3onbXgHrVJynsxkNGPUed1AxszVW8AXo43xExronVkIqK+ACsoBA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.1.tgz#b246ef891051c7dbf088ca203341d9fb0444baee" + integrity sha512-l28KKcK1J/u3iq5dRDmmoB2p7dtBfACC2NqJh4dI2kFptxH0asfjmOfcxqh5Sv8suAlVa73gZJ4REY5RrafVvg== dependencies: xml-js "^1.6.11" @@ -6737,12 +6681,12 @@ file-entry-cache@^5.0.1: flat-cache "^2.0.1" file-loader@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" - integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== + version "6.1.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.0.tgz#65b9fcfb0ea7f65a234a1f10cdd7f1ab9a33f253" + integrity sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg== dependencies: loader-utils "^2.0.0" - schema-utils "^2.6.5" + schema-utils "^2.7.1" file-uri-to-path@1.0.0: version "1.0.0" @@ -6831,7 +6775,7 @@ find-up@^3.0.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -6846,7 +6790,7 @@ find-versions@^3.2.0: find-yarn-workspace-root2@1.2.16: version "1.2.16" - resolved "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== dependencies: micromatch "^4.0.2" @@ -6854,7 +6798,7 @@ find-yarn-workspace-root2@1.2.16: find-yarn-workspace-root@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== dependencies: fs-extra "^4.0.3" @@ -6895,12 +6839,10 @@ flux@^3.1.3: fbemitter "^2.0.0" fbjs "^0.8.0" -follow-redirects@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" - integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== - dependencies: - debug "^3.0.0" +follow-redirects@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== for-in@^0.1.3: version "0.1.8" @@ -6992,9 +6934,9 @@ fs-capacitor@^2.0.4: integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== fs-capacitor@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.1.0.tgz#457f5868a743fe662caa9bd825be966c3d4641a4" - integrity sha512-YsKGCLAB40P3OKeciIa7cKzt7WkY8QT9ETa2wVIG3fQDHW2h3xtRo0770lUIbPrjCr5Sa+zFhixNJ+2xNxaraQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" + integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== fs-extra@8.1.0, fs-extra@^8.1.0: version "8.1.0" @@ -7027,7 +6969,7 @@ fs-extra@9.0.1, fs-extra@^9.0.0: fs-extra@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" @@ -7036,7 +6978,7 @@ fs-extra@^4.0.3: fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -7074,9 +7016,9 @@ fsevents@^1.2.7: nan "^2.12.1" fsevents@^2.1.2, fsevents@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== function-bind@^1.1.1: version "1.1.1" @@ -7103,6 +7045,11 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -7110,7 +7057,7 @@ get-stdin@^6.0.0: get-stream@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-stream@^4.0.0, get-stream@^4.1.0: @@ -7121,9 +7068,9 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.0.0, get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" @@ -7227,7 +7174,7 @@ globby@11.0.0: globby@11.0.1, globby@^11.0.0, globby@^11.0.1: version "11.0.1" - resolved "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== dependencies: array-union "^2.1.0" @@ -7299,19 +7246,14 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -graceful-fs@^4.1.5, graceful-fs@^4.2.2, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: version "4.2.4" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== grapheme-splitter@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== graphql-extensions@^0.12.5: @@ -7437,11 +7379,11 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" has-ansi@^2.0.0: @@ -7461,7 +7403,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -7526,17 +7468,18 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hast-to-hyperscript@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz#7c4c037d9a8ea19b0a3fdb676a26448ad922353d" - integrity sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA== +hast-to-hyperscript@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz#768fb557765fe28749169c885056417342d71e83" + integrity sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg== dependencies: + "@types/unist" "^2.0.3" comma-separated-tokens "^1.0.0" property-information "^5.3.0" space-separated-tokens "^1.0.0" - style-to-object "^0.2.1" - unist-util-is "^3.0.0" - web-namespaces "^1.1.2" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" hast-util-from-parse5@^5.0.0: version "5.0.3" @@ -7549,31 +7492,45 @@ hast-util-from-parse5@^5.0.0: web-namespaces "^1.1.2" xtend "^4.0.1" +hast-util-from-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz#b38793c81e1a99f5fd592a4a88fc2731dccd0f30" + integrity sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q== + dependencies: + "@types/parse5" "^5.0.0" + ccount "^1.0.0" + hastscript "^5.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + hast-util-parse-selector@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz#60c99d0b519e12ab4ed32e58f150ec3f61ed1974" integrity sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA== -hast-util-raw@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-5.0.2.tgz#62288f311ec2f35e066a30d5e0277f963ad43a67" - integrity sha512-3ReYQcIHmzSgMq8UrDZHFL0oGlbuVGdLKs8s/Fe8BfHFAyZDrdv1fy/AGn+Fim8ZuvAHcJ61NQhVMtyfHviT/g== +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== dependencies: - hast-util-from-parse5 "^5.0.0" - hast-util-to-parse5 "^5.0.0" + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" html-void-elements "^1.0.0" - parse5 "^5.0.0" + parse5 "^6.0.0" unist-util-position "^3.0.0" + vfile "^4.0.0" web-namespaces "^1.0.0" xtend "^4.0.0" zwitch "^1.0.0" -hast-util-to-parse5@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-5.1.2.tgz#09d27bee9ba9348ea05a6cfcc44e02f9083969b6" - integrity sha512-ZgYLJu9lYknMfsBY0rBV4TJn2xiwF1fXFFjbP6EE7S0s5mS8LIKBVWzhA1MeIs1SWW6GnnE4In6c3kPb+CWhog== +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== dependencies: - hast-to-hyperscript "^7.0.0" + hast-to-hyperscript "^9.0.0" property-information "^5.0.0" web-namespaces "^1.0.0" xtend "^4.0.0" @@ -7600,9 +7557,9 @@ hex-color-regex@^1.1.0: integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== highlight.js@^9.18.0: - version "9.18.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" - integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== + version "9.18.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.3.tgz#a1a0a2028d5e3149e2380f8a865ee8516703d634" + integrity sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ== history@^4.9.0: version "4.10.1" @@ -7708,9 +7665,9 @@ html-void-elements@^1.0.0: integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== html-webpack-plugin@^4.0.4: - version "4.3.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz#53bf8f6d696c4637d5b656d3d9863d89ce8174fd" - integrity sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w== + version "4.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" + integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" @@ -7787,10 +7744,10 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== http-proxy-agent@^4.0.1: version "4.0.1" @@ -7844,7 +7801,7 @@ https-proxy-agent@^5.0.0: human-id@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" + resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== human-signals@^1.1.1: @@ -7868,13 +7825,20 @@ husky@4.3.0: slash "^3.0.0" which-pm-runs "^1.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -7903,9 +7867,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.1, ignore@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== immer@1.10.0: version "1.10.0" @@ -7982,7 +7946,7 @@ imurmurhash@^0.1.4: indent-string@^3.0.0: version "3.2.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= indent-string@^4.0.0: @@ -8085,9 +8049,9 @@ internal-ip@^4.3.0: ipaddr.js "^1.9.0" interpret@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" @@ -8187,10 +8151,10 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== is-ci@^2.0.0: version "2.0.0" @@ -8259,9 +8223,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" - integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -8327,6 +8291,11 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-npm@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" @@ -8380,7 +8349,7 @@ is-path-inside@^3.0.1: is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-obj@^2.0.0: @@ -8405,12 +8374,12 @@ is-promise@4.0.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== -is-regex@^1.0.4, is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.0.4, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: - has "^1.0.3" + has-symbols "^1.0.1" is-regexp@^1.0.0: version "1.0.0" @@ -8444,7 +8413,7 @@ is-string@^1.0.5: is-subdir@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/is-subdir/-/is-subdir-1.1.1.tgz#423e66902f9c5f159b9cc4826c820df083059538" + resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.1.1.tgz#423e66902f9c5f159b9cc4826c820df083059538" integrity sha512-VYpq0S7gPBVkkmfwkvGnx1EL9UVIo87NQyNcgMiNUdQCws3CJm5wj2nB+XPL7zigvjxhuZgp3bl2yBcKkSIj1w== dependencies: better-path-resolve "1.0.0" @@ -8488,12 +8457,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== - -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -8563,20 +8527,7 @@ istanbul-lib-coverage@^3.0.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== -istanbul-lib-instrument@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" - integrity sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg== - dependencies: - "@babel/core" "^7.7.5" - "@babel/parser" "^7.7.5" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^4.0.3: +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== @@ -8670,14 +8621,14 @@ jest-config@^26.5.3: pretty-format "^26.5.2" jest-diff@^25.2.1: - version "25.3.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.3.0.tgz#0d7d6f5d6171e5dacde9e05be47b3615e147c26f" - integrity sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w== + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== dependencies: chalk "^3.0.0" diff-sequences "^25.2.6" jest-get-type "^25.2.6" - pretty-format "^25.3.0" + pretty-format "^25.5.0" jest-diff@^26.5.2: version "26.5.2" @@ -9041,7 +8992,7 @@ js-tokens@^3.0.2: js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.6.1: version "3.14.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" @@ -9104,6 +9055,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -9259,7 +9215,7 @@ kind-of@^6.0.0, kind-of@^6.0.2: klaw-sync@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== dependencies: graceful-fs "^4.1.11" @@ -9349,9 +9305,9 @@ lint-staged@10.4.0: stringify-object "^3.3.0" listr2@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.6.0.tgz#788a3d202978a1b8582062952cbc49272c8e206a" - integrity sha512-nwmqTJYQQ+AsKb4fCXH/6/UmLCEDL1jkRAdSn9M6cEUzoRGrs33YD/3N86gAZQnGZ6hxV18XSdlBcJ1GTmetJA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.6.2.tgz#4912eb01e1e2dd72ec37f3895a56bf2622d6f36a" + integrity sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" @@ -9384,7 +9340,7 @@ load-json-file@^4.0.0: load-yaml-file@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== dependencies: graceful-fs "^4.1.5" @@ -9449,7 +9405,7 @@ locate-path@^5.0.0: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" @@ -9626,7 +9582,7 @@ lodash.sortby@^4.6.0, lodash.sortby@^4.7.0: lodash.startcase@^4.4.0: version "4.4.0" - resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg= lodash.template@^4.5.0: @@ -9654,7 +9610,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.20, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5, lodash@^4.5.2: +lodash@4.17.20, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5, lodash@^4.5.2: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -9677,9 +9633,9 @@ log-update@^4.0.0: wrap-ansi "^6.2.0" loglevel@^1.6.7, loglevel@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" - integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + version "1.7.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" + integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== long@^4.0.0: version "4.0.0" @@ -9695,7 +9651,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 loud-rejection@^1.0.0: version "1.6.0" - resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" @@ -9720,7 +9676,7 @@ lowercase-keys@^2.0.0: lru-cache@^4.0.1: version "4.1.5" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" @@ -9741,9 +9697,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" lunr@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" - integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" @@ -9754,9 +9710,9 @@ make-dir@^2.0.0, make-dir@^2.1.0: semver "^5.6.0" make-dir@^3.0.0, make-dir@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -9779,12 +9735,12 @@ map-cache@^0.2.2: map-obj@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= map-visit@^1.0.0: @@ -9820,23 +9776,22 @@ mdast-squeeze-paragraphs@^4.0.0: dependencies: unist-util-remove "^2.0.0" -mdast-util-definitions@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-2.0.1.tgz#2c931d8665a96670639f17f98e32c3afcfee25f3" - integrity sha512-Co+DQ6oZlUzvUR7JCpP249PcexxygiaKk9axJh+eRzHDZJk2julbIdKB4PXHVxdBuLzvJ1Izb+YDpj2deGMOuA== +mdast-util-definitions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz#06af6c49865fc63d6d7d30125569e2f7ae3d0a86" + integrity sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA== dependencies: unist-util-visit "^2.0.0" -mdast-util-to-hast@8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-8.2.0.tgz#adf9f824defcd382e53dd7bace4282a45602ac67" - integrity sha512-WjH/KXtqU66XyTJQ7tg7sjvTw1OQcVV0hKdFh3BgHPwZ96fSBCQ/NitEHsN70Mmnggt+5eUUC7pCnK+2qGQnCA== +mdast-util-to-hast@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-9.1.1.tgz#953ff12aed57464b11d7e5549a45913e561909fa" + integrity sha512-vpMWKFKM2mnle+YbNgDXxx95vv0CoLU0v/l3F5oFAG5DV7qwkZVWA206LsAdOnEVyf5vQcLnb3cWJywu7mUxsQ== dependencies: - collapse-white-space "^1.0.0" - detab "^2.0.0" - mdast-util-definitions "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.3" + mdast-util-definitions "^3.0.0" mdurl "^1.0.0" - trim-lines "^1.0.0" unist-builder "^2.0.0" unist-util-generated "^1.0.0" unist-util-position "^3.0.0" @@ -9885,7 +9840,7 @@ memory-fs@^0.5.0: meow@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== dependencies: camelcase-keys "^4.0.0" @@ -9918,9 +9873,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3, merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mersenne-twister@^1.0.1: version "1.1.0" @@ -9972,16 +9927,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0: - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== - -mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +"mime-db@>= 1.43.0 < 2": + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" @@ -9994,14 +9949,7 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== - dependencies: - mime-db "1.43.0" - -mime-types@^2.1.26, mime-types@~2.1.17: +mime-types@^2.1.12, mime-types@^2.1.26, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -10013,12 +9961,7 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.4.5" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009" - integrity sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w== - -mime@^2.4.6: +mime@^2.4.4, mime@^2.4.6: version "2.4.6" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== @@ -10070,7 +10013,7 @@ minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.4: minimist-options@^3.0.1: version "3.0.2" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== dependencies: arrify "^1.0.1" @@ -10096,9 +10039,9 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-pipeline@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34" - integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" @@ -10151,7 +10094,7 @@ mixin-object@^2.0.1: mixme@^0.3.1: version "0.3.5" - resolved "https://registry.npmjs.org/mixme/-/mixme-0.3.5.tgz#304652cdaf24a3df0487205e61ac6162c6906ddd" + resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.3.5.tgz#304652cdaf24a3df0487205e61ac6162c6906ddd" integrity sha512-SyV9uPETRig5ZmYev0ANfiGeB+g6N2EnqqEfBbCGmmJ6MgZ3E4qv5aPbnHVdZ60KAHHXV+T3sXopdrnIXQdmjQ== mkdirp@1.0.4, mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: @@ -10159,7 +10102,7 @@ mkdirp@1.0.4, mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -10167,9 +10110,9 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: minimist "^1.2.5" moment@^2.15.2: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + version "2.29.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.0.tgz#fcbef955844d91deb55438613ddcec56e86a3425" + integrity sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA== move-concurrently@^1.0.1: version "1.0.1" @@ -10248,12 +10191,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -neo-async@^2.6.0: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -10306,10 +10244,10 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-forge@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" - integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== node-gyp-build@~3.7.0: version "3.7.0" @@ -10367,14 +10305,14 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.52, node-releases@^1.1.53: - version "1.1.55" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee" - integrity sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w== +node-releases@^1.1.52, node-releases@^1.1.61: + version "1.1.61" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" + integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -10487,20 +10425,20 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== object-is@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" + integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -10517,15 +10455,15 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" + integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.0" + has-symbols "^1.0.1" + object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: version "2.1.0" @@ -10577,29 +10515,29 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: wrappy "1" onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" open@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83" - integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ== + version "7.3.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.3.0.tgz#45461fdee46444f3645b6e14eb3ca94b82e1be69" + integrity sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" opencollective-postinstall@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" - integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== opener@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== opn@^5.5.0: version "5.5.0" @@ -10609,16 +10547,16 @@ opn@^5.5.0: is-wsl "^1.1.0" optimism@^0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.12.1.tgz#933f9467b9aef0e601655adb9638f893e486ad02" - integrity sha512-t8I7HM1dw0SECitBYAqFOVHoBAHEQBTeKjIL9y9ImHzAVkdyPK4ifTgM4VJRDtTUY4r/u5Eqxs4XcGPHaoPkeQ== + version "0.12.2" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.12.2.tgz#de9dc3d2c914d7b34e08957a768967c0605beda9" + integrity sha512-k7hFhlmfLl6HNThIuuvYMQodC1c+q6Uc6V9cLVsMWyW514QuaxVJH/khPu2vLRIoDTpFdJ5sojlARhg1rzyGbg== dependencies: "@wry/context" "^0.5.2" optimize-css-assets-webpack-plugin@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" - integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + version "5.0.4" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" + integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== dependencies: cssnano "^4.1.10" last-call-webpack-plugin "^3.0.0" @@ -10666,7 +10604,7 @@ os-tmpdir@~1.0.2: outdent@^0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" + resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== p-cancelable@^1.0.0: @@ -10681,7 +10619,7 @@ p-each-series@^2.1.0: p-filter@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== dependencies: p-map "^2.0.0" @@ -10747,7 +10685,7 @@ p-locate@^4.1.0: p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" @@ -10828,13 +10766,12 @@ parent-module@^1.0.0: callsites "^3.0.0" parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== dependencies: - asn1.js "^4.0.0" + asn1.js "^5.2.0" browserify-aes "^1.0.0" - create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" safe-buffer "^5.1.1" @@ -10867,13 +10804,13 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" parse-numeric-range@^0.0.2: @@ -10886,6 +10823,11 @@ parse5@5.1.1, parse5@^5.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -10906,7 +10848,7 @@ pascalcase@^0.1.1: patch-package@^6.2.2: version "6.2.2" - resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -11004,9 +10946,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -11019,7 +10961,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -11086,13 +11028,6 @@ pkg-up@3.1.0, pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= - dependencies: - find-up "^2.1.0" - please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -11108,13 +11043,13 @@ pnp-webpack-plugin@^1.6.4: ts-pnp "^1.1.6" portfinder@^1.0.26: - version "1.0.26" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" - integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== dependencies: async "^2.6.2" debug "^3.1.1" - mkdirp "^0.5.1" + mkdirp "^0.5.5" posix-character-classes@^0.1.0: version "0.1.1" @@ -11130,9 +11065,9 @@ postcss-attribute-case-insensitive@^4.0.1: postcss-selector-parser "^6.0.2" postcss-calc@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" - integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== dependencies: postcss "^7.0.27" postcss-selector-parser "^6.0.2" @@ -11328,9 +11263,9 @@ postcss-lab-function@^2.0.1: postcss-values-parser "^2.0.0" postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== dependencies: cosmiconfig "^5.0.0" import-cwd "^2.0.0" @@ -11429,14 +11364,14 @@ postcss-modules-extract-imports@^2.0.0: postcss "^7.0.5" postcss-modules-local-by-default@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" - integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: icss-utils "^4.1.1" - postcss "^7.0.16" + postcss "^7.0.32" postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.0" + postcss-value-parser "^4.1.0" postcss-modules-scope@^2.2.0: version "2.2.0" @@ -11686,13 +11621,14 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== dependencies: cssesc "^3.0.0" indexes-of "^1.0.1" uniq "^1.0.1" + util-deprecate "^1.0.2" postcss-svgo@^4.0.2: version "4.0.2" @@ -11718,7 +11654,7 @@ postcss-value-parser@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3, postcss-value-parser@^4.1.0: +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== @@ -11732,10 +11668,10 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2" - integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -11743,7 +11679,7 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.1 preferred-pm@^3.0.0: version "3.0.2" - resolved "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.2.tgz#bbdbef1014e34a7490349bf70d6d244b8d57a5e1" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.2.tgz#bbdbef1014e34a7490349bf70d6d244b8d57a5e1" integrity sha512-yGIxyBkK/OWOppgCXfOeOXOeNrddyK1DzqS6XpOokRZb2ogXTpHRhKDTO7d0pjF/2p2sV9pEkKL4e0tNZI1y2A== dependencies: find-up "^5.0.0" @@ -11778,7 +11714,7 @@ prettier@2.1.2: prettier@^1.18.2: version "1.19.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== pretty-error@^2.1.1: @@ -11789,12 +11725,12 @@ pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" -pretty-format@^25.2.1, pretty-format@^25.3.0: - version "25.3.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.3.0.tgz#d0a4f988ff4a6cd350342fdabbb809aeb4d49ad5" - integrity sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA== +pretty-format@^25.2.1, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== dependencies: - "@jest/types" "^25.3.0" + "@jest/types" "^25.5.0" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -11815,22 +11751,17 @@ pretty-time@^1.1.0: integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== prism-react-renderer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.1.0.tgz#6fe1b33f1de1b23afbdb07663d135f9026eef4ad" - integrity sha512-WZAw+mBoxk1qZDD1h1WOg0BVHgyk9zqbuIBFNgP+Z71i515jGL0WZIN1FIF8EgOyh06x8Rr7HAUXxsRsoUZKyg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.1.1.tgz#1c1be61b1eb9446a146ca7a50b7bcf36f2a70a44" + integrity sha512-MgMhSdHuHymNRqD6KM3eGS0PNqgK9q4QF5P0yoQQvpB6jNjeSAi3jcSAz0Sua/t9fa4xDOMar9HJbLa08gl9ug== prismjs@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.20.0.tgz#9b685fc480a3514ee7198eac6a3bf5024319ff03" - integrity sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ== + version "1.21.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.21.0.tgz#36c086ec36b45319ec4218ee164c110f9fc015a3" + integrity sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw== optionalDependencies: clipboard "^2.0.0" -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -11902,7 +11833,7 @@ prr@~1.0.1: pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: @@ -12013,13 +11944,13 @@ querystring@0.2.0: integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== quick-lru@^1.0.0: version "1.1.0" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: @@ -12132,19 +12063,19 @@ react-error-overlay@^6.0.7: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-fast-compare@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fast-compare@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== react-helmet@^6.0.0-beta: - version "6.0.0" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.0.0.tgz#fcb93ebaca3ba562a686eb2f1f9d46093d83b5f8" - integrity sha512-My6S4sa0uHN/IuVUn0HFmasW5xj9clTkB9qmMngscVycQ5vVG51Qp44BEvLJ4lixupTwDlU9qX1/sCrMN4AEPg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== dependencies: object-assign "^4.1.1" prop-types "^15.7.2" - react-fast-compare "^2.0.4" + react-fast-compare "^3.1.1" react-side-effect "^2.1.0" react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: @@ -12255,7 +12186,7 @@ read-pkg-up@^2.0.0: read-pkg-up@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: find-up "^2.0.0" @@ -12300,7 +12231,7 @@ read-pkg@^5.2.0: read-yaml-file@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" + resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== dependencies: graceful-fs "^4.1.5" @@ -12367,7 +12298,7 @@ recursive-readdir@2.2.2: redent@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: indent-string "^3.0.0" @@ -12381,22 +12312,21 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regenerator-transform@^0.14.2: - version "0.14.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" - integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" - private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -12420,9 +12350,9 @@ regexpp@^3.0.0, regexpp@^3.1.0: integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + version "4.7.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^8.2.0" @@ -12446,9 +12376,9 @@ registry-url@^5.0.0: rc "^1.2.8" regjsgen@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: version "0.6.4" @@ -12519,29 +12449,29 @@ remark-emoji@^2.1.0: node-emoji "^1.10.0" unist-util-visit "^2.0.2" -remark-footnotes@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-1.0.0.tgz#9c7a97f9a89397858a50033373020b1ea2aad011" - integrity sha512-X9Ncj4cj3/CIvLI2Z9IobHtVi8FVdUrdJkCNaL9kdX8ohfsi18DXHsCVd/A7ssARBdccdDb5ODnt62WuEWaM/g== +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== -remark-mdx@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.1.tgz#693aa40d0c98afdd556e7e50f2ca263d0a845e19" - integrity sha512-UyCqqYFv9l5dstX29QpdqMprBHyUYUEQHOUe0MdFUIm1XATxfVGHbRPtVBFz4ccd5NV1UL/rmsruo9WOswwmpQ== - dependencies: - "@babel/core" "7.9.0" - "@babel/helper-plugin-utils" "7.8.3" - "@babel/plugin-proposal-object-rest-spread" "7.9.5" - "@babel/plugin-syntax-jsx" "7.8.3" - "@mdx-js/util" "^1.6.1" +remark-mdx@1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.18.tgz#d8c76017c95824cc7fb853bb2759add8ba0cf319" + integrity sha512-xNhjv4kJZ8L6RV68yK8fQ6XWlvSIFOE5VPmM7wMKSwkvwBu6tlUJy0gRF2WiZ4fPPOj6jpqlVB9QakipvZuEqg== + dependencies: + "@babel/core" "7.11.6" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.11.0" + "@babel/plugin-syntax-jsx" "7.10.4" + "@mdx-js/util" "1.6.18" is-alphabetical "1.0.4" - remark-parse "8.0.2" - unified "9.0.0" + remark-parse "8.0.3" + unified "9.2.0" -remark-parse@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.2.tgz#5999bc0b9c2e3edc038800a64ff103d0890b318b" - integrity sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ== +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== dependencies: ccount "^1.0.0" collapse-white-space "^1.0.2" @@ -12603,19 +12533,19 @@ replaceall@^0.1.6: resolved "https://registry.yarnpkg.com/replaceall/-/replaceall-0.1.6.tgz#81d81ac7aeb72d7f5c4942adf2697a3220688d8e" integrity sha1-gdgax663LX9cSUKt8ml6MiBojY4= -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" request-promise-native@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -12850,24 +12780,10 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - -rxjs@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" - integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== - dependencies: - tslib "^1.9.0" - -rxjs@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" - integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== +rxjs@^6.5.3, rxjs@^6.6.0, rxjs@^6.6.2: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" @@ -12876,16 +12792,11 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -12898,7 +12809,7 @@ safe-resolve@^1.0.0: resolved "https://registry.yarnpkg.com/safe-resolve/-/safe-resolve-1.0.0.tgz#fe34f8d29d7a3becfd249d0aa8a799b5c3cf6559" integrity sha1-/jT40p16O+z9JJ0KqKeZtcPPZVk= -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -12947,24 +12858,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.0, schema-utils@^2.6.5, schema-utils@^2.6.6: - version "2.6.6" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" - integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA== - dependencies: - ajv "^6.12.0" - ajv-keywords "^3.4.1" - -schema-utils@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.7.1: +schema-utils@^2.0.0, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -12997,11 +12891,11 @@ select@^1.1.2: integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= selfsigned@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + version "1.10.8" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" + integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== dependencies: - node-forge "0.9.0" + node-forge "^0.10.0" semver-compare@^1.0.0: version "1.0.0" @@ -13059,11 +12953,6 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -13250,7 +13139,7 @@ slash@^1.0.0: slash@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slash@^3.0.0: @@ -13287,7 +13176,7 @@ slice-ansi@^4.0.0: smartwrap@^1.2.3: version "1.2.5" - resolved "https://registry.npmjs.org/smartwrap/-/smartwrap-1.2.5.tgz#45ee3e09ac234e5f7f17c16e916f511834f3cd23" + resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-1.2.5.tgz#45ee3e09ac234e5f7f17c16e916f511834f3cd23" integrity sha512-bzWRwHwu0RnWjwU7dFy7tF68pDAx/zMSu3g7xr9Nx5J0iSImYInglwEVExyHLxXljy6PWMjkSAbwF7t2mPnRmg== dependencies: breakword "^1.0.5" @@ -13377,15 +13266,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.12: +source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -13408,7 +13289,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: +source-map@^0.7.3, source-map@~0.7.2: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== @@ -13420,37 +13301,37 @@ space-separated-tokens@^1.0.0: spawndamnit@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" + resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== dependencies: cross-spawn "^5.1.0" signal-exit "^3.0.2" spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== spdy-transport@^3.0.0: version "3.0.0" @@ -13592,7 +13473,7 @@ stream-shift@^1.0.0: stream-transform@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/stream-transform/-/stream-transform-2.0.2.tgz#3cb7a14c802eb39bc40caaab0535e584f3a65caf" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.0.2.tgz#3cb7a14c802eb39bc40caaab0535e584f3a65caf" integrity sha512-J+D5jWPF/1oX+r9ZaZvEXFbu7znjxSkbNAHJ9L44bt/tCVuOEWZlDqU9qJk7N2xBU1S+K2DPpSKeR/MucmCA1Q== dependencies: mixme "^0.3.1" @@ -13622,7 +13503,7 @@ string-length@^4.0.1: string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -13646,7 +13527,7 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.0: +string.prototype.trimend@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== @@ -13654,25 +13535,7 @@ string.prototype.trimend@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: +string.prototype.trimstart@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== @@ -13719,7 +13582,7 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" @@ -13758,7 +13621,7 @@ strip-final-newline@^2.0.0: strip-indent@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: @@ -13771,20 +13634,13 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -style-to-object@0.3.0: +style-to-object@0.3.0, style-to-object@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== dependencies: inline-style-parser "0.1.1" -style-to-object@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.2.3.tgz#afcf42bc03846b1e311880c55632a26ad2780bcb" - integrity sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng== - dependencies: - inline-style-parser "0.1.1" - stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -13850,9 +13706,9 @@ supports-color@^6.1.0: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -13888,11 +13744,16 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@^1.0.4, symbol-observable@^1.2.0: +symbol-observable@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-observable@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" + integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -13927,7 +13788,7 @@ tar@^6.0.2: term-size@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= dependencies: execa "^0.7.0" @@ -13946,24 +13807,24 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^2.1.2" + serialize-javascript "^4.0.0" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" worker-farm "^1.7.0" terser-webpack-plugin@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.1.tgz#44b88ef4d7443129fb136a68b5ec3e80d63ec471" - integrity sha512-D0IZQNl1ZN/JivFNDFzOeU2Bk2LdQQESHJhKTHsodpUmISkaeRwVFk7gzHzX4OuQwanDGelOxIEsBt1SZ+s6nA== + version "4.2.2" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.2.tgz#d86200c700053bba637913fe4310ba1bdeb5568e" + integrity sha512-3qAQpykRTD5DReLu5/cwpsg7EZFzP3Q0Hp2XUWJUw2mpq2jfgOKTZr8IZKKnNieRVVo1UauROTdhbQJZveGKtQ== dependencies: cacache "^15.0.5" find-cache-dir "^3.3.1" @@ -13972,35 +13833,26 @@ terser-webpack-plugin@^4.1.0: schema-utils "^2.7.1" serialize-javascript "^5.0.1" source-map "^0.6.1" - terser "^5.3.1" + terser "^5.3.2" webpack-sources "^1.4.3" terser@^4.1.2, terser@^4.6.3: - version "4.7.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" - integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.1.tgz#f50fe20ab48b15234fe9bdd86b10148ad5fca787" - integrity sha512-yD80f4hdwCWTH5mojzxe1q8bN1oJbsK/vfJGLcPZM/fl+/jItIVNKhFIHqqR71OipFWMLgj3Kc+GIp6CeIqfnA== + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.2.tgz#f4bea90eb92945b2a028ceef79181b9bb586e7af" - integrity sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ== +terser@^5.2.0, terser@^5.3.2: + version "5.3.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.4.tgz#e510e05f86e0bd87f01835c3238839193f77a60c" + integrity sha512-dxuB8KQo8Gt6OVOeLg/rxfcxdNZI/V1G6ze1czFUzPeCFWZRtvZMgSzlZZ5OYBZ4HoG607F6pFPNLekJyV+yVw== dependencies: commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + source-map "~0.7.2" + source-map-support "~0.5.19" test-exclude@^6.0.0: version "6.0.0" @@ -14154,21 +14006,16 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@^2.0.0: +tr46@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== dependencies: punycode "^2.1.1" -trim-lines@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.3.tgz#839514be82428fd9e7ec89e35081afe8f6f93115" - integrity sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA== - trim-newlines@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= trim-trailing-lines@^1.0.0: @@ -14230,11 +14077,16 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@1.11.1, tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + tslib@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" @@ -14254,7 +14106,7 @@ tty-browserify@0.0.0: tty-table@^2.7.0: version "2.8.13" - resolved "https://registry.npmjs.org/tty-table/-/tty-table-2.8.13.tgz#d484a416381973eaebbdf19c79136b390e5c6d70" + resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-2.8.13.tgz#d484a416381973eaebbdf19c79136b390e5c6d70" integrity sha512-eVV/+kB6fIIdx+iUImhXrO22gl7f6VmmYh0Zbu6C196fe1elcHXd7U6LcLXu0YoVPc2kNesWiukYcdK8ZmJ6aQ== dependencies: chalk "^3.0.0" @@ -14329,9 +14181,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" - integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -14390,19 +14242,19 @@ typescript@^3.0.0: integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== ua-parser-js@^0.7.18: - version "0.7.21" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" - integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + version "0.7.22" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" + integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== uglify-js@^3.1.4: - version "3.10.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.0.tgz#397a7e6e31ce820bfd1cb55b804ee140c587a9e7" - integrity sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA== + version "3.11.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.11.1.tgz#32d274fea8aac333293044afd7f81409d5040d38" + integrity sha512-OApPSuJcxcnewwjSGGfWOjx3oix5XpmrK9Z2j0fTRlHGoZ49IU6kExfZTM0++fCArOOCet+vIfWwFHbvWqwp6g== underscore@>=1.8.3, underscore@^1.9.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" - integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== + version "1.11.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.11.0.tgz#dd7c23a195db34267186044649870ff1bab5929e" + integrity sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw== unherit@^1.0.4: version "1.1.3" @@ -14435,10 +14287,10 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== -unified@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.0.0.tgz#12b099f97ee8b36792dbad13d278ee2f696eed1d" - integrity sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -14509,11 +14361,6 @@ unist-util-generated@^1.0.0: resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.5.tgz#1e903e68467931ebfaea386dae9ea253628acd42" integrity sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw== -unist-util-is@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - unist-util-is@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" @@ -14546,17 +14393,17 @@ unist-util-stringify-position@^2.0.0: "@types/unist" "^2.0.2" unist-util-visit-parents@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz#d4076af3011739c71d2ce99d05de37d545f4351d" - integrity sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz#4dd262fb9dcfe44f297d53e882fc6ff3421173d5" + integrity sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.2, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.2.tgz#3843782a517de3d2357b4c193b24af2d9366afb7" - integrity sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ== +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" @@ -14603,9 +14450,9 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== update-notifier@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" - integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== + version "4.1.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" + integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== dependencies: boxen "^4.2.0" chalk "^3.0.0" @@ -14622,9 +14469,9 @@ update-notifier@^4.1.0: xdg-basedir "^4.0.0" uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== dependencies: punycode "^2.1.0" @@ -14697,7 +14544,7 @@ utf-8-validate@^5.0.2: dependencies: node-gyp-build "~3.7.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -14754,20 +14601,15 @@ uuid@^3.1.0, uuid@^3.3.2, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" - integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== - -uuid@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" - integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== +uuid@^8.0.0, uuid@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== v8-to-istanbul@^6.0.1: version "6.0.1" @@ -14816,9 +14658,9 @@ verror@1.10.0: extsprintf "^1.2.0" vfile-location@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" - integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.1.0.tgz#81cd8a04b0ac935185f4fce16f270503fc2f692f" + integrity sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g== vfile-message@^2.0.0: version "2.0.4" @@ -14829,9 +14671,9 @@ vfile-message@^2.0.0: unist-util-stringify-position "^2.0.0" vfile@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.1.1.tgz#282d28cebb609183ac51703001bc18b3e3f17de9" - integrity sha512-lRjkpyDGjVlBA7cDQhQ+gNcvB1BGaTHYuSOcY3S7OhDmBtnzX95FhtZZDecSTDm6aajFymyve6S5DN4ZHGezdQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01" + integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" @@ -14909,7 +14751,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: wcwidth@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= dependencies: defaults "^1.0.3" @@ -14935,9 +14777,9 @@ webidl-conversions@^6.1.0: integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== webpack-bundle-analyzer@^3.6.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.7.0.tgz#84da434e89442899b884d9ad38e466d0db02a56f" - integrity sha512-mETdjZ30a3Yf+NTB/wqTgACK7rAYQl5uxKK0WVTNmF0sM3Uv8s3R58YZMW7Rhu0Lk2Rmuhdj5dcH5Q76zCDVdA== + version "3.9.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" + integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA== dependencies: acorn "^7.1.1" acorn-walk "^7.1.1" @@ -14948,7 +14790,7 @@ webpack-bundle-analyzer@^3.6.1: express "^4.16.3" filesize "^3.6.1" gzip-size "^5.0.0" - lodash "^4.17.15" + lodash "^4.17.19" mkdirp "^0.5.1" opener "^1.5.1" ws "^6.0.0" @@ -15077,18 +14919,18 @@ websocket-driver@0.6.5: websocket-extensions ">=0.1.1" websocket-driver@>=0.5.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: - http-parser-js ">=0.4.0 <0.4.11" + http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== websocket@1.0.32: version "1.0.32" @@ -15129,13 +14971,13 @@ whatwg-url@^7.0.0: webidl-conversions "^4.0.2" whatwg-url@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871" - integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ== + version "8.3.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.3.0.tgz#d1e11e565334486cdb280d3101b9c3fd1c867582" + integrity sha512-BQRf/ej5Rp3+n7k0grQXZj9a1cHtsp4lqj01p59xBWFKdezR8sO37XnpafwNqiFac/v2Il12EIMjX/Y4VZtT8Q== dependencies: lodash.sortby "^4.7.0" - tr46 "^2.0.0" - webidl-conversions "^5.0.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" which-module@^2.0.0: version "2.0.0" @@ -15149,7 +14991,7 @@ which-pm-runs@^1.0.0: which-pm@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== dependencies: load-yaml-file "^0.2.0" @@ -15171,7 +15013,7 @@ which@^2.0.1, which@^2.0.2: widest-line@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: string-width "^2.1.1" @@ -15292,9 +15134,9 @@ ws@^6.0.0, ws@^6.2.1: async-limiter "~1.0.0" ws@^7.2.3: - version "7.2.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.5.tgz#abb1370d4626a5a9cd79d8de404aa18b3465d10d" - integrity sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA== + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== xdg-basedir@^4.0.0: version "4.0.0" @@ -15324,9 +15166,9 @@ xmlchars@^2.2.0: integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xss@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.7.tgz#a554cbd5e909324bd6893fb47fff441ad54e2a95" - integrity sha512-A9v7tblGvxu8TWXQC9rlpW96a+LN1lyw6wyhpTmmGW+FwRMactchBR3ROKSi33UPCUcUHSu8s9YP6F+K3Mw//w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.8.tgz#32feb87feb74b3dcd3d404b7a68ababf10700535" + integrity sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw== dependencies: commander "^2.20.3" cssfilter "0.0.10" @@ -15348,7 +15190,7 @@ yaeti@^0.0.6: yallist@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.2: @@ -15366,26 +15208,19 @@ yaml-ast-parser@^0.0.43: resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yaml@^1.7.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.9.2.tgz#f0cfa865f003ab707663e4f04b3956957ea564ed" - integrity sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg== - dependencies: - "@babel/runtime" "^7.9.2" - yargs-parser@20.x: - version "20.2.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.0.tgz#944791ca2be2e08ddadd3d87e9de4c6484338605" - integrity sha512-2agPoRFPoIcFzOIp6656gcvsg2ohtscpw2OINr/q46+Sq41xz2OYLqx5HRHabmFU1OARIPAYH5uteICE7mn/5A== + version "20.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.1.tgz#28f3773c546cdd8a69ddae68116b48a5da328e77" + integrity sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA== yargs-parser@^10.0.0: version "10.1.0" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" @@ -15400,13 +15235,13 @@ yargs-parser@^13.1.2: yargs-parser@^18.1.1, yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@15.3.1, yargs@^15.3.1: +yargs@15.3.1: version "15.3.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== @@ -15441,7 +15276,7 @@ yargs@^13.3.2: yargs@^15.1.0, yargs@^15.4.1: version "15.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0"