diff --git a/.eslintrc.json b/.eslintrc.json index 8ac45eef2..c93cefe75 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -36,7 +36,8 @@ "varsIgnorePattern": "^_" } ], - "@typescript-eslint/no-empty-function": "off" + "@typescript-eslint/no-empty-function": "off", + "no-prototype-builtins": "off" }, "overrides": [ diff --git a/examples/supermassive-todomvcs-apollo-style/.gitignore b/examples/supermassive-todomvcs-apollo-style/.gitignore new file mode 100644 index 000000000..ba7c5c01b --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +dist/ +yarn-error.log +stats/ \ No newline at end of file diff --git a/examples/supermassive-todomvcs-apollo-style/.prettierrc b/examples/supermassive-todomvcs-apollo-style/.prettierrc new file mode 100644 index 000000000..222861c34 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 2, + "useTabs": false +} diff --git a/examples/supermassive-todomvcs-apollo-style/CHANGELOG.json b/examples/supermassive-todomvcs-apollo-style/CHANGELOG.json new file mode 100644 index 000000000..4d202ab12 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/CHANGELOG.json @@ -0,0 +1,143 @@ +{ + "name": "supermassive-todomvc-apollo-style", + "entries": [ + { + "date": "Tue, 19 Dec 2023 10:42:14 GMT", + "tag": "supermassive-todomvc-apollo-style_v1.0.0", + "version": "1.0.0", + "comments": { + "undefined": [ + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/apollo-react-relay-duct-tape to v1.0.23", + "commit": "324dc87a3bb3b6c549e3316efca692072256dec7" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/graphql-js-tag to v0.9.1", + "commit": "324dc87a3bb3b6c549e3316efca692072256dec7" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/supermassive to v3.2.7", + "commit": "324dc87a3bb3b6c549e3316efca692072256dec7" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/ts-transform-graphql-js-tag to v1.2.0", + "commit": "324dc87a3bb3b6c549e3316efca692072256dec7" + } + ] + } + }, + { + "date": "Wed, 04 Oct 2023 14:49:50 GMT", + "tag": "supermassive-todomvc-apollo-style_v1.0.0", + "version": "1.0.0", + "comments": { + "undefined": [ + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/apollo-react-relay-duct-tape to v1.0.14", + "commit": "3e06badb76f78b85df97be32f596710627098870" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/graphql-js-tag to v0.9.1", + "commit": "3e06badb76f78b85df97be32f596710627098870" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/supermassive to v3.2.0", + "commit": "3e06badb76f78b85df97be32f596710627098870" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/ts-transform-graphql-js-tag to v1.1.1", + "commit": "3e06badb76f78b85df97be32f596710627098870" + } + ] + } + }, + { + "date": "Wed, 04 Oct 2023 13:51:41 GMT", + "tag": "supermassive-todomvc-apollo-style_v1.0.0", + "version": "1.0.0", + "comments": { + "undefined": [ + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/apollo-react-relay-duct-tape to v1.0.14", + "commit": "c9c50e4c6bfb1bc50376cd5228b5ad8fe9cc2274" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/graphql-js-tag to v0.9.1", + "commit": "c9c50e4c6bfb1bc50376cd5228b5ad8fe9cc2274" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/supermassive to v3.2.0", + "commit": "c9c50e4c6bfb1bc50376cd5228b5ad8fe9cc2274" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/ts-transform-graphql-js-tag to v1.1.1", + "commit": "c9c50e4c6bfb1bc50376cd5228b5ad8fe9cc2274" + } + ] + } + }, + { + "date": "Wed, 04 Oct 2023 10:42:36 GMT", + "tag": "supermassive-todomvc-apollo-style_v1.0.0", + "version": "1.0.0", + "comments": { + "none": [ + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/apollo-react-relay-duct-tape to v1.0.14", + "commit": "d73f011a40f790860efd1324823dbe5b24bf0927" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/graphql-js-tag to v0.9.1", + "commit": "d73f011a40f790860efd1324823dbe5b24bf0927" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/supermassive to v3.2.0", + "commit": "d73f011a40f790860efd1324823dbe5b24bf0927" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/ts-transform-graphql-js-tag to v1.1.1", + "commit": "d73f011a40f790860efd1324823dbe5b24bf0927" + }, + { + "author": "beachball", + "package": "supermassive-todomvc-apollo-style", + "comment": "Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.3.0", + "commit": "d73f011a40f790860efd1324823dbe5b24bf0927" + } + ] + } + } + ] +} diff --git a/examples/supermassive-todomvcs-apollo-style/codegen.yml b/examples/supermassive-todomvcs-apollo-style/codegen.yml new file mode 100644 index 000000000..a0c305516 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/codegen.yml @@ -0,0 +1,45 @@ +schema: "./src/schema/typeDefs.graphql" +documents: ["src/components/**/*.graphql"] +generates: + ./src/__generated__/types.ts: + plugins: + - typescript + - add: + content: > + // THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! + + // RUN `yarn generate:interfaces` from the package root to update it + + // See /codegen.yml for details + + /* eslint-disable */ + + // @ts-nocheck + ./src/components/: + preset: near-operation-file + presetConfig: + extension: .graphql.interface.ts + baseTypesPath: ./src/__generated__/types.ts + plugins: + - typescript-operations + - "@graphitation/graphql-codegen-relay-ir-plugin" + - add: + content: > + // THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! + + // RUN `yarn generate:interfaces` from the package root to update it + + // See /codegen.yml for details + + /* eslint-disable */ + + // @ts-nocheck + config: + noGraphQLTag: true + immutableTypes: true + preResolveTypes: true + namingConvention: "keep" + dedupeOperationSuffix: true + avoidOptionals: { field: true } + nonOptionalTypename: true + skipTypeNameForRoot: true diff --git a/examples/supermassive-todomvcs-apollo-style/package.json b/examples/supermassive-todomvcs-apollo-style/package.json new file mode 100644 index 000000000..cc546a127 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/package.json @@ -0,0 +1,76 @@ +{ + "name": "supermassive-todomvc-apollo-style", + "main": "index.js", + "private": true, + "version": "1.0.0", + "scripts": { + "start": "graphql-codegen && yarn serve --progress --color --mode=development", + "build": "", + "serve": "webpack serve --config webpack.config.ts", + "extract-schema": "supermassive extract-schema ./src/schema/typeDefs.graphql", + "codegen": "graphql-codegen" + }, + "dependencies": { + "@apollo/client": "^3.6.0", + "@babel/runtime": "^7.12.0", + "@graphitation/apollo-react-relay-duct-tape": "^0.7.0", + "@graphitation/graphql-codegen-supermassive-relay-ir-plugin": "link:../packages/graphql-codegen-supermassive-relay-ir-plugin", + "@graphitation/graphql-js-tag": "^0.9.0", + "@graphitation/supermassive": "^3.0.0", + "@graphitation/ts-transform-graphql-js-tag": "^1.1.0", + "concurrently": "^6.5.1", + "event-iterator": "^2.0.0", + "graphql": "^15.6.1", + "graphql-tools": "^8.2.0", + "html-webpack-plugin": "^5.3.2", + "lodash": "^4.17.21", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-relay": "^14.0.0", + "relay-compiler": "^12.0.0", + "relay-compiler-language-graphitation": "^0.8.2", + "relay-runtime": "^14.0.0", + "ts-loader": "^9.0.0", + "ts-node": "^10.4.0", + "uuid": "^8.3.2", + "webpack": "^5.76.0", + "webpack-cli": "^4.6.0", + "webpack-dev-server": "^3.1.14", + "webpack-graphql-loader": "^1.0.2", + "zen-observable": "^0.8.15" + }, + "resolutions": { + "ansi-html": "^0.0.9", + "ansi-regex": "^5.0.1", + "cross-fetch": "^3.1.5", + "eventsource": "^2.0.2", + "graphql": "^15.6.1", + "glob-parent": "^6.0.2", + "mem": "^4.3.0", + "minimist": "^1.2.6", + "node-fetch": "^2.6.7", + "node-forge": "^1.3.1", + "yargs-parser": ">=13.1.2", + "typescript": "^4.9.5" + }, + "devDependencies": { + "@graphitation/graphql-codegen-relay-ir-plugin": "^1.3.0", + "@graphql-codegen/cli": "^1.19.4", + "@graphql-codegen/import-types-preset": "^2.1.7", + "@graphql-codegen/near-operation-file-preset": "^2.4.1", + "@graphql-codegen/typed-document-node": "^2.3.3", + "@graphql-codegen/typescript": "^2.2.0", + "@graphql-codegen/typescript-operations": "^2.2.4", + "@graphql-codegen/typescript-react-apollo": "^3.3.3", + "@types/graphql": "^14.5.0", + "@types/lodash": "^4.14.175", + "@types/react": "^17.0.30", + "@types/react-dom": "^17.0.9", + "@types/react-relay": "14.1.1", + "@types/uuid": "^8.3.1", + "add": "^2.0.6", + "graphql-let": "^0.18.5", + "prettier": "^2.4.1", + "yarn": "^1.22.19" + } +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/App.tsx b/examples/supermassive-todomvcs-apollo-style/src/App.tsx new file mode 100644 index 000000000..cb77981a1 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/App.tsx @@ -0,0 +1,63 @@ +import { + ApolloClient, + InMemoryCache, + from, + ApolloProvider, +} from "@apollo/client"; +import { RelayApolloCache } from "../../../packages/relay-apollo-duct-tape/src/Cache"; +import React from "react"; +import { onError } from "@apollo/client/link/error"; +import TodoList from "./components/TodoList"; +import { asyncSplit } from "./schema/asyncSplit"; + +const isProduction = false; + +// Log any GraphQL errors or network error that occurred +const errorLink = onError(({ graphQLErrors, networkError }) => { + if (graphQLErrors) + graphQLErrors.forEach((error) => { + const { message, locations, path } = error; + console.log( + `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}` + ); + console.error(error); + }); + if (networkError) { + console.log(`[Network error]: ${networkError}`); + console.error(networkError); + } +}); + +const client = new ApolloClient({ + cache: new RelayApolloCache(), + link: from([ + errorLink, + asyncSplit( + () => isProduction, + async () => { + const { supermassiveSchemaLink } = await import( + /* webpackChunkName: "supermassiveLink" */ + "./schema/productionLink" + ); + return supermassiveSchemaLink; + }, + async () => { + const { executableSchemaLink } = await import( + /* webpackChunkName: "executableLink" */ + "./schema/link" + ); + return executableSchemaLink; + } + ), + ]), +}); + +function App() { + return ( + + + + ); +} + +export default App; diff --git a/examples/supermassive-todomvcs-apollo-style/src/__generated__/types.ts b/examples/supermassive-todomvcs-apollo-style/src/__generated__/types.ts new file mode 100644 index 000000000..233ec35e0 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/__generated__/types.ts @@ -0,0 +1,113 @@ +// THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! +// RUN `yarn generate:interfaces` from the package root to update it +// See /codegen.yml for details +/* eslint-disable */ +// @ts-nocheck + +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; +}; + +export type CreateTodoFailure = Failure & { + __typename?: 'CreateTodoFailure'; + reason: Scalars['String']; +}; + +export type CreateTodoInput = { + text: Scalars['String']; +}; + +export type CreateTodoResult = CreateTodoSuccess | CreateTodoFailure; + +export type CreateTodoSuccess = { + __typename?: 'CreateTodoSuccess'; + todo: Todo; +}; + +export type Failure = { + reason: Scalars['String']; +}; + +export type Mutation = { + __typename?: 'Mutation'; + createTodo: CreateTodoResult; + updateTodoText: UpdateTodoTextResult; + setTodoCompleted: SetTodoCompletedResult; +}; + + +export type MutationCreateTodoArgs = { + input: CreateTodoInput; +}; + + +export type MutationUpdateTodoTextArgs = { + input: UpdateTodoTextInput; +}; + + +export type MutationSetTodoCompletedArgs = { + input: SetTodoCompletedInput; +}; + +export type Query = { + __typename?: 'Query'; + allTodos: Array; +}; + +export type SetTodoCompletedFailure = Failure & { + __typename?: 'SetTodoCompletedFailure'; + reason: Scalars['String']; +}; + +export type SetTodoCompletedInput = { + id: Scalars['ID']; + isCompleted: Scalars['Boolean']; +}; + +export type SetTodoCompletedResult = SetTodoCompletedSuccess | SetTodoCompletedFailure; + +export type SetTodoCompletedSuccess = { + __typename?: 'SetTodoCompletedSuccess'; + todo: Todo; +}; + +export type Subscription = { + __typename?: 'Subscription'; + todoCreated?: Maybe; + todoUpdated?: Maybe; +}; + +export type Todo = { + __typename?: 'Todo'; + id: Scalars['ID']; + text: Scalars['String']; + isCompleted: Scalars['Boolean']; +}; + +export type UpdateTodoTextFailure = Failure & { + __typename?: 'UpdateTodoTextFailure'; + reason: Scalars['String']; +}; + +export type UpdateTodoTextInput = { + id: Scalars['ID']; + text: Scalars['String']; +}; + +export type UpdateTodoTextResult = UpdateTodoTextSuccess | UpdateTodoTextFailure; + +export type UpdateTodoTextSuccess = { + __typename?: 'UpdateTodoTextSuccess'; + todo: Todo; +}; diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/CreateTodo.tsx b/examples/supermassive-todomvcs-apollo-style/src/components/CreateTodo.tsx new file mode 100644 index 000000000..30facf0d5 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/CreateTodo.tsx @@ -0,0 +1,56 @@ +import React from "react"; +import { useMutation } from "@apollo/client"; +import { + CreateTodoMutation, + CreateTodoMutationDocument, +} from "./graphql/CreateTodoMutation.graphql.interface"; +import { + TodoListQuery, + TodoListQueryDocument, +} from "./graphql/TodoListQuery.graphql.interface"; +import { CreateTodoSuccess } from "../__generated__/types"; + +const CreateTodo: React.FC = () => { + const [createTodo] = useMutation( + CreateTodoMutationDocument, + { + update: (cache, { data }) => { + const existingData = cache.readQuery({ + query: TodoListQueryDocument, + }); + cache.writeQuery({ + query: TodoListQueryDocument, + data: { + ...existingData, + allTodos: [ + ...existingData!.allTodos, + (data!.createTodo as CreateTodoSuccess).todo, + ].sort((a, b) => { + return a.text.localeCompare(b.text); + }), + }, + }); + }, + } + ); + + return ( +
{ + event.preventDefault(); + createTodo({ + variables: { + input: { + text: (event.target as any).elements.text.value, + }, + }, + }); + }} + > + + +
+ ); +}; + +export default CreateTodo; diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/Todo.tsx b/examples/supermassive-todomvcs-apollo-style/src/components/Todo.tsx new file mode 100644 index 000000000..2c56c4cbf --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/Todo.tsx @@ -0,0 +1,37 @@ +import { useMutation } from "@apollo/client"; +import React from "react"; + +import { TodoFragment } from "./graphql/TodoListQuery.graphql.interface"; +import { + TodoUpdateStatusMutation, + TodoUpdateStatusMutationDocument, + TodoUpdateStatusMutationVariables, +} from "./graphql/TodoUpdateStatusMutation.graphql.interface"; + +const Todo = ({ todo }: { todo: TodoFragment }) => { + const [updateStatus] = useMutation< + TodoUpdateStatusMutation, + TodoUpdateStatusMutationVariables + >(TodoUpdateStatusMutationDocument); + return ( + <> + {todo.text} + { + updateStatus({ + variables: { + input: { + id: todo.id, + isCompleted: !todo.isCompleted, + }, + }, + }); + }} + /> + + ); +}; + +export default Todo; diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/TodoList.tsx b/examples/supermassive-todomvcs-apollo-style/src/components/TodoList.tsx new file mode 100644 index 000000000..77f822713 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/TodoList.tsx @@ -0,0 +1,53 @@ +import React from "react"; + +import { useQuery } from "@apollo/client"; +import Todo from "./Todo"; +import TodoUpdates from "./TodoUpdates"; +import { + TodoListQuery, + TodoListQueryDocument, +} from "./graphql/TodoListQuery.graphql.interface"; +import CreateTodo from "./CreateTodo"; +import { + TodoCreatedSubscription, + TodoCreatedSubscriptionDocument, +} from "./graphql/TodoCreatedSubscription.graphql.interface"; + +const TodoList = () => { + const { data, subscribeToMore } = useQuery( + TodoListQueryDocument + ); + subscribeToMore({ + document: TodoCreatedSubscriptionDocument, + updateQuery: (prev, { subscriptionData }) => { + const { todoCreated } = subscriptionData.data; + // Unsure why this event comes twice. + if (prev.allTodos.find((todo) => todo.id === todoCreated!.id)) { + return prev; + } + return { + ...prev, + allTodos: [...prev.allTodos, todoCreated!].sort((a, b) => + a.text.localeCompare(b.text) + ), + }; + }, + }); + return ( + <> + +

Todo List

+
    + {(data as any)?.allTodos?.map((todo: any) => ( +
  • + +
  • + ))} +
+
+ + + ); +}; + +export default TodoList; diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/TodoUpdates.tsx b/examples/supermassive-todomvcs-apollo-style/src/components/TodoUpdates.tsx new file mode 100644 index 000000000..d9663e195 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/TodoUpdates.tsx @@ -0,0 +1,23 @@ +import React from "react"; + +import { useSubscription } from "@apollo/client"; +import { + TodoUpdatesSubscription, + TodoUpdatesSubscriptionDocument, +} from "./graphql/TodoUpdatesSubscription.graphql.interface"; + +interface TodoSubscriptionProps { + onNext?: (response: any) => void; + onError?: () => void | null; +} + +const TodoUpdates: React.FC = ({ onNext, children }) => { + useSubscription(TodoUpdatesSubscriptionDocument, { + onSubscriptionData: onNext, + // onError: onError || undefined, + }); + + return <>{children}; +}; + +export default TodoUpdates; diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/CreateTodoMutation.graphql b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/CreateTodoMutation.graphql new file mode 100644 index 000000000..a3ae81c1e --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/CreateTodoMutation.graphql @@ -0,0 +1,20 @@ +mutation CreateTodoMutation($input: CreateTodoInput!) { + createTodo(input: $input) { + __typename + ... on CreateTodoSuccess { + todo { + ...CreateTodoMutationFragment + } + } + ... on CreateTodoFailure { + reason + } + } +} + +fragment CreateTodoMutationFragment on Todo { + __typename + id + text + isCompleted +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/CreateTodoMutation.graphql.interface.ts b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/CreateTodoMutation.graphql.interface.ts new file mode 100644 index 000000000..150640107 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/CreateTodoMutation.graphql.interface.ts @@ -0,0 +1,415 @@ +// THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! +// RUN `yarn generate:interfaces` from the package root to update it +// See /codegen.yml for details +/* eslint-disable */ +// @ts-nocheck + +import * as Types from '../src/__generated__/types.js'; + +import { DocumentNode } from "graphql"; +export type CreateTodoMutationVariables = Types.Exact<{ + input: Types.CreateTodoInput; +}>; + + +export type CreateTodoMutation = { readonly createTodo: { readonly __typename: 'CreateTodoSuccess', readonly todo: { readonly __typename: 'Todo', readonly id: string, readonly text: string, readonly isCompleted: boolean } } | { readonly __typename: 'CreateTodoFailure', readonly reason: string } }; + +export type CreateTodoMutationFragment = { readonly __typename: 'Todo', readonly id: string, readonly text: string, readonly isCompleted: boolean }; + +export const CreateTodoMutationDocument: DocumentNode = (function(){ +var v0 = { + "kind": "Name", + "value": "input" +}, +v1 = { + "kind": "Variable", + "name": (v0/*: any*/) +}, +v2 = { + "kind": "Field", + "name": { + "kind": "Name", + "value": "__typename" + }, + "arguments": ([]/*: any*/), + "directives": ([]/*: any*/) +}, +v3 = { + "kind": "Name", + "value": "CreateTodoMutationFragment" +}, +v4 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "input" + } +], +v5 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}, +v6 = [ + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "input", + "variableName": "input" + } + ], + "concreteType": null, + "kind": "LinkedField", + "name": "createTodo", + "plural": false, + "selections": [ + (v5/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Todo", + "kind": "LinkedField", + "name": "todo", + "plural": false, + "selections": [ + (v5/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "storageKey": null + } + ], + "type": "CreateTodoSuccess", + "abstractKey": null + }, + { + "kind": "InlineFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "reason", + "storageKey": null + } + ], + "type": "CreateTodoFailure", + "abstractKey": null + } + ], + "storageKey": null + } +]; +return { + "kind": "Document", + "definitions": [ + { + "kind": "OperationDefinition", + "operation": "mutation", + "name": { + "kind": "Name", + "value": "CreateTodoMutation" + }, + "variableDefinitions": [ + { + "kind": "VariableDefinition", + "variable": (v1/*: any*/), + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "CreateTodoInput" + } + } + }, + "directives": [] + } + ], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "createTodo" + }, + "arguments": [ + { + "kind": "Argument", + "name": (v0/*: any*/), + "value": (v1/*: any*/) + } + ], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + (v2/*: any*/), + { + "kind": "InlineFragment", + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "CreateTodoSuccess" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "todo" + }, + "arguments": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "FragmentSpread", + "name": (v3/*: any*/), + "directives": [] + } + ] + } + } + ] + } + }, + { + "kind": "InlineFragment", + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "CreateTodoFailure" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "reason" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ] + } + } + ] + } + }, + { + "kind": "FragmentDefinition", + "name": (v3/*: any*/), + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Todo" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + (v2/*: any*/), + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "text" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ], + "__relay": { + "fragment": { + "argumentDefinitions": (v4/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "CreateTodoMutation", + "selections": (v6/*: any*/), + "type": "Mutation", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v4/*: any*/), + "kind": "Operation", + "name": "CreateTodoMutation", + "selections": (v6/*: any*/) + }, + "params": { + "cacheID": "d41d8cd98f00b204e9800998ecf8427e", + "metadata": {}, + "name": "CreateTodoMutation", + "operationKind": "mutation", + "text": "" + } + } +}; +})(); +export const CreateTodoMutationFragmentDocument: DocumentNode = { + "kind": "Document", + "definitions": [ + { + "kind": "FragmentDefinition", + "name": { + "kind": "Name", + "value": "CreateTodoMutationFragment" + }, + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Todo" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "__typename" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "text" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ], + "__relay": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "CreateTodoMutationFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "type": "Todo", + "abstractKey": null + } +}; \ No newline at end of file diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoCreatedSubscription.graphql b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoCreatedSubscription.graphql new file mode 100644 index 000000000..6dd44aa4f --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoCreatedSubscription.graphql @@ -0,0 +1,8 @@ +subscription TodoCreatedSubscription { + todoCreated { + __typename + id + text + isCompleted + } +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoCreatedSubscription.graphql.interface.ts b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoCreatedSubscription.graphql.interface.ts new file mode 100644 index 000000000..65edb8a3e --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoCreatedSubscription.graphql.interface.ts @@ -0,0 +1,152 @@ +// THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! +// RUN `yarn generate:interfaces` from the package root to update it +// See /codegen.yml for details +/* eslint-disable */ +// @ts-nocheck + +import * as Types from '../src/__generated__/types.js'; + +import { DocumentNode } from "graphql"; +export type TodoCreatedSubscriptionVariables = Types.Exact<{ [key: string]: never; }>; + + +export type TodoCreatedSubscription = { readonly todoCreated: { readonly __typename: 'Todo', readonly id: string, readonly text: string, readonly isCompleted: boolean } | null }; + +export const TodoCreatedSubscriptionDocument: DocumentNode = (function(){ +var v0 = [ + { + "alias": null, + "args": null, + "concreteType": "Todo", + "kind": "LinkedField", + "name": "todoCreated", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "storageKey": null + } +]; +return { + "kind": "Document", + "definitions": [ + { + "kind": "OperationDefinition", + "operation": "subscription", + "name": { + "kind": "Name", + "value": "TodoCreatedSubscription" + }, + "variableDefinitions": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "todoCreated" + }, + "arguments": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "__typename" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "text" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ] + } + } + ], + "__relay": { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "TodoCreatedSubscription", + "selections": (v0/*: any*/), + "type": "Subscription", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "TodoCreatedSubscription", + "selections": (v0/*: any*/) + }, + "params": { + "cacheID": "d41d8cd98f00b204e9800998ecf8427e", + "metadata": {}, + "name": "TodoCreatedSubscription", + "operationKind": "subscription", + "text": "" + } + } +}; +})(); \ No newline at end of file diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoListQuery.graphql b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoListQuery.graphql new file mode 100644 index 000000000..6d8db46d4 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoListQuery.graphql @@ -0,0 +1,16 @@ +query TodoListQuery { + allTodos { + id + ...TodoFragment + } +} + +fragment TodoFragment on Todo { + id + text + ...TodoCompletedFragment +} + +fragment TodoCompletedFragment on Todo { + isCompleted +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoListQuery.graphql.interface.ts b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoListQuery.graphql.interface.ts new file mode 100644 index 000000000..6a18a5894 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoListQuery.graphql.interface.ts @@ -0,0 +1,323 @@ +// THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! +// RUN `yarn generate:interfaces` from the package root to update it +// See /codegen.yml for details +/* eslint-disable */ +// @ts-nocheck + +import * as Types from '../src/__generated__/types.js'; + +import { DocumentNode } from "graphql"; +export type TodoListQueryVariables = Types.Exact<{ [key: string]: never; }>; + + +export type TodoListQuery = { readonly allTodos: ReadonlyArray<{ readonly __typename: 'Todo', readonly id: string, readonly text: string, readonly isCompleted: boolean }> }; + +export type TodoFragment = { readonly __typename: 'Todo', readonly id: string, readonly text: string, readonly isCompleted: boolean }; + +export type TodoCompletedFragment = { readonly __typename: 'Todo', readonly isCompleted: boolean }; + +export const TodoListQueryDocument: DocumentNode = (function(){ +var v0 = { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": ([]/*: any*/), + "directives": ([]/*: any*/) +}, +v1 = { + "kind": "Name", + "value": "TodoFragment" +}, +v2 = { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Todo" + } +}, +v3 = { + "kind": "Name", + "value": "TodoCompletedFragment" +}, +v4 = [ + { + "alias": null, + "args": null, + "concreteType": "Todo", + "kind": "LinkedField", + "name": "allTodos", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "storageKey": null + } +]; +return { + "kind": "Document", + "definitions": [ + { + "kind": "OperationDefinition", + "operation": "query", + "name": { + "kind": "Name", + "value": "TodoListQuery" + }, + "variableDefinitions": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "allTodos" + }, + "arguments": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + (v0/*: any*/), + { + "kind": "FragmentSpread", + "name": (v1/*: any*/), + "directives": [] + } + ] + } + } + ] + } + }, + { + "kind": "FragmentDefinition", + "name": (v1/*: any*/), + "typeCondition": (v2/*: any*/), + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + (v0/*: any*/), + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "text" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "FragmentSpread", + "name": (v3/*: any*/), + "directives": [] + } + ] + } + }, + { + "kind": "FragmentDefinition", + "name": (v3/*: any*/), + "typeCondition": (v2/*: any*/), + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ], + "__relay": { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "TodoListQuery", + "selections": (v4/*: any*/), + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "TodoListQuery", + "selections": (v4/*: any*/) + }, + "params": { + "cacheID": "d41d8cd98f00b204e9800998ecf8427e", + "metadata": {}, + "name": "TodoListQuery", + "operationKind": "query", + "text": "" + } + } +}; +})(); +export const TodoFragmentDocument: DocumentNode = { + "kind": "Document", + "definitions": [ + { + "kind": "FragmentDefinition", + "name": { + "kind": "Name", + "value": "TodoFragment" + }, + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Todo" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "text" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ], + "__relay": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "TodoFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "type": "Todo", + "abstractKey": null + } +}; +export const TodoCompletedFragmentDocument: DocumentNode = { + "kind": "Document", + "definitions": [ + { + "kind": "FragmentDefinition", + "name": { + "kind": "Name", + "value": "TodoCompletedFragment" + }, + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Todo" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ], + "__relay": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "TodoCompletedFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "type": "Todo", + "abstractKey": null + } +}; \ No newline at end of file diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdateStatusMutation.graphql b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdateStatusMutation.graphql new file mode 100644 index 000000000..994a5a8e6 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdateStatusMutation.graphql @@ -0,0 +1,15 @@ +mutation TodoUpdateStatusMutation($input: SetTodoCompletedInput!) { + setTodoCompleted(input: $input) { + __typename + ... on SetTodoCompletedSuccess { + todo { + __typename + id + isCompleted + } + } + ... on SetTodoCompletedFailure { + reason + } + } +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdateStatusMutation.graphql.interface.ts b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdateStatusMutation.graphql.interface.ts new file mode 100644 index 000000000..69ef79b62 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdateStatusMutation.graphql.interface.ts @@ -0,0 +1,272 @@ +// THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! +// RUN `yarn generate:interfaces` from the package root to update it +// See /codegen.yml for details +/* eslint-disable */ +// @ts-nocheck + +import * as Types from '../src/__generated__/types.js'; + +import { DocumentNode } from "graphql"; +export type TodoUpdateStatusMutationVariables = Types.Exact<{ + input: Types.SetTodoCompletedInput; +}>; + + +export type TodoUpdateStatusMutation = { readonly setTodoCompleted: { readonly __typename: 'SetTodoCompletedSuccess', readonly todo: { readonly __typename: 'Todo', readonly id: string, readonly isCompleted: boolean } } | { readonly __typename: 'SetTodoCompletedFailure', readonly reason: string } }; + +export const TodoUpdateStatusMutationDocument: DocumentNode = (function(){ +var v0 = { + "kind": "Name", + "value": "input" +}, +v1 = { + "kind": "Variable", + "name": (v0/*: any*/) +}, +v2 = { + "kind": "Field", + "name": { + "kind": "Name", + "value": "__typename" + }, + "arguments": ([]/*: any*/), + "directives": ([]/*: any*/) +}, +v3 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "input" + } +], +v4 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}, +v5 = [ + { + "alias": null, + "args": [ + { + "kind": "Variable", + "name": "input", + "variableName": "input" + } + ], + "concreteType": null, + "kind": "LinkedField", + "name": "setTodoCompleted", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Todo", + "kind": "LinkedField", + "name": "todo", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "storageKey": null + } + ], + "type": "SetTodoCompletedSuccess", + "abstractKey": null + }, + { + "kind": "InlineFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "reason", + "storageKey": null + } + ], + "type": "SetTodoCompletedFailure", + "abstractKey": null + } + ], + "storageKey": null + } +]; +return { + "kind": "Document", + "definitions": [ + { + "kind": "OperationDefinition", + "operation": "mutation", + "name": { + "kind": "Name", + "value": "TodoUpdateStatusMutation" + }, + "variableDefinitions": [ + { + "kind": "VariableDefinition", + "variable": (v1/*: any*/), + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "SetTodoCompletedInput" + } + } + }, + "directives": [] + } + ], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "setTodoCompleted" + }, + "arguments": [ + { + "kind": "Argument", + "name": (v0/*: any*/), + "value": (v1/*: any*/) + } + ], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + (v2/*: any*/), + { + "kind": "InlineFragment", + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "SetTodoCompletedSuccess" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "todo" + }, + "arguments": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + (v2/*: any*/), + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ] + } + }, + { + "kind": "InlineFragment", + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "SetTodoCompletedFailure" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "reason" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ] + } + } + ] + } + } + ], + "__relay": { + "fragment": { + "argumentDefinitions": (v3/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "TodoUpdateStatusMutation", + "selections": (v5/*: any*/), + "type": "Mutation", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v3/*: any*/), + "kind": "Operation", + "name": "TodoUpdateStatusMutation", + "selections": (v5/*: any*/) + }, + "params": { + "cacheID": "d41d8cd98f00b204e9800998ecf8427e", + "metadata": {}, + "name": "TodoUpdateStatusMutation", + "operationKind": "mutation", + "text": "" + } + } +}; +})(); \ No newline at end of file diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdatesSubscription.graphql b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdatesSubscription.graphql new file mode 100644 index 000000000..642b18301 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdatesSubscription.graphql @@ -0,0 +1,13 @@ +subscription TodoUpdatesSubscription { + todoUpdated { + __typename + id + ...TodoSubscriptionFragment + } +} + +fragment TodoSubscriptionFragment on Todo { + id + text + isCompleted +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdatesSubscription.graphql.interface.ts b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdatesSubscription.graphql.interface.ts new file mode 100644 index 000000000..fec813eae --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/components/graphql/TodoUpdatesSubscription.graphql.interface.ts @@ -0,0 +1,265 @@ +// THIS FILE IS GENERATED BY graphql-codegen. DO NOT MODIFY! +// RUN `yarn generate:interfaces` from the package root to update it +// See /codegen.yml for details +/* eslint-disable */ +// @ts-nocheck + +import * as Types from '../src/__generated__/types.js'; + +import { DocumentNode } from "graphql"; +export type TodoUpdatesSubscriptionVariables = Types.Exact<{ [key: string]: never; }>; + + +export type TodoUpdatesSubscription = { readonly todoUpdated: { readonly __typename: 'Todo', readonly id: string, readonly text: string, readonly isCompleted: boolean } | null }; + +export type TodoSubscriptionFragment = { readonly __typename: 'Todo', readonly id: string, readonly text: string, readonly isCompleted: boolean }; + +export const TodoUpdatesSubscriptionDocument: DocumentNode = (function(){ +var v0 = { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": ([]/*: any*/), + "directives": ([]/*: any*/) +}, +v1 = { + "kind": "Name", + "value": "TodoSubscriptionFragment" +}, +v2 = [ + { + "alias": null, + "args": null, + "concreteType": "Todo", + "kind": "LinkedField", + "name": "todoUpdated", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "storageKey": null + } +]; +return { + "kind": "Document", + "definitions": [ + { + "kind": "OperationDefinition", + "operation": "subscription", + "name": { + "kind": "Name", + "value": "TodoUpdatesSubscription" + }, + "variableDefinitions": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "todoUpdated" + }, + "arguments": [], + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "__typename" + }, + "arguments": [], + "directives": [] + }, + (v0/*: any*/), + { + "kind": "FragmentSpread", + "name": (v1/*: any*/), + "directives": [] + } + ] + } + } + ] + } + }, + { + "kind": "FragmentDefinition", + "name": (v1/*: any*/), + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Todo" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + (v0/*: any*/), + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "text" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ], + "__relay": { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "TodoUpdatesSubscription", + "selections": (v2/*: any*/), + "type": "Subscription", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "TodoUpdatesSubscription", + "selections": (v2/*: any*/) + }, + "params": { + "cacheID": "d41d8cd98f00b204e9800998ecf8427e", + "metadata": {}, + "name": "TodoUpdatesSubscription", + "operationKind": "subscription", + "text": "" + } + } +}; +})(); +export const TodoSubscriptionFragmentDocument: DocumentNode = { + "kind": "Document", + "definitions": [ + { + "kind": "FragmentDefinition", + "name": { + "kind": "Name", + "value": "TodoSubscriptionFragment" + }, + "typeCondition": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Todo" + } + }, + "directives": [], + "selectionSet": { + "kind": "SelectionSet", + "selections": [ + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "text" + }, + "arguments": [], + "directives": [] + }, + { + "kind": "Field", + "name": { + "kind": "Name", + "value": "isCompleted" + }, + "arguments": [], + "directives": [] + } + ] + } + } + ], + "__relay": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "TodoSubscriptionFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "isCompleted", + "storageKey": null + } + ], + "type": "Todo", + "abstractKey": null + } +}; \ No newline at end of file diff --git a/examples/supermassive-todomvcs-apollo-style/src/graphql.d.ts b/examples/supermassive-todomvcs-apollo-style/src/graphql.d.ts new file mode 100644 index 000000000..954a3798a --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/graphql.d.ts @@ -0,0 +1,6 @@ +declare module "*.graphql" { + import { DocumentNode } from "graphql"; + const Schema: DocumentNode; + + export = Schema; +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/index.tsx b/examples/supermassive-todomvcs-apollo-style/src/index.tsx new file mode 100644 index 000000000..1bba979b0 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/index.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +import { render } from 'react-dom' + +import App from './App'; + +render(, document.body); \ No newline at end of file diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/__generated__/typeDefs.ts b/examples/supermassive-todomvcs-apollo-style/src/schema/__generated__/typeDefs.ts new file mode 100644 index 000000000..b851d6e00 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/__generated__/typeDefs.ts @@ -0,0 +1,55 @@ +import { GraphQLList, GraphQLNonNull, GraphQLID, GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLInputObjectType } from "graphql"; +import { Resolvers, ObjectTypeResolver, InterfaceTypeResolver, UnionTypeResolver, InputObjectTypeResolver } from "@graphitation/supermassive"; +const Query: ObjectTypeResolver = {}; +const Mutation: ObjectTypeResolver = {}; +const Subscription: ObjectTypeResolver = {}; +const Todo: ObjectTypeResolver = {}; +const CreateTodoResult: UnionTypeResolver = { __types: ["CreateTodoSuccess", "CreateTodoFailure"], __resolveType: undefined }; +const CreateTodoInput: InputObjectTypeResolver = new GraphQLInputObjectType({ + name: "CreateTodoInput", + description: "", + fields: () => ({ + text: { + type: new GraphQLNonNull(GraphQLString), + description: "" + } + }) +}); +const CreateTodoSuccess: ObjectTypeResolver = {}; +const CreateTodoFailure: ObjectTypeResolver = {}; +const UpdateTodoTextResult: UnionTypeResolver = { __types: ["UpdateTodoTextSuccess", "UpdateTodoTextFailure"], __resolveType: undefined }; +const UpdateTodoTextInput: InputObjectTypeResolver = new GraphQLInputObjectType({ + name: "UpdateTodoTextInput", + description: "", + fields: () => ({ + id: { + type: new GraphQLNonNull(GraphQLID), + description: "" + }, + text: { + type: new GraphQLNonNull(GraphQLString), + description: "" + } + }) +}); +const UpdateTodoTextSuccess: ObjectTypeResolver = {}; +const UpdateTodoTextFailure: ObjectTypeResolver = {}; +const SetTodoCompletedResult: UnionTypeResolver = { __types: ["SetTodoCompletedSuccess", "SetTodoCompletedFailure"], __resolveType: undefined }; +const SetTodoCompletedInput: InputObjectTypeResolver = new GraphQLInputObjectType({ + name: "SetTodoCompletedInput", + description: "", + fields: () => ({ + id: { + type: new GraphQLNonNull(GraphQLID), + description: "" + }, + isCompleted: { + type: new GraphQLNonNull(GraphQLBoolean), + description: "" + } + }) +}); +const SetTodoCompletedSuccess: ObjectTypeResolver = {}; +const SetTodoCompletedFailure: ObjectTypeResolver = {}; +const Failure: InterfaceTypeResolver = { __implementedBy: ["CreateTodoFailure", "UpdateTodoTextFailure", "SetTodoCompletedFailure"], __resolveType: undefined }; +export const resolvers: Resolvers = { Query, Mutation, Subscription, Todo, Failure, CreateTodoResult, CreateTodoInput, CreateTodoSuccess, CreateTodoFailure, UpdateTodoTextResult, UpdateTodoTextInput, UpdateTodoTextSuccess, UpdateTodoTextFailure, SetTodoCompletedResult, SetTodoCompletedInput, SetTodoCompletedSuccess, SetTodoCompletedFailure }; diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/asyncSplit.ts b/examples/supermassive-todomvcs-apollo-style/src/schema/asyncSplit.ts new file mode 100644 index 000000000..55c54267a --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/asyncSplit.ts @@ -0,0 +1,25 @@ +import { ApolloLink, Observable } from "@apollo/client"; + +export function asyncSplit( + test: () => Promise | boolean, + left: () => Promise, + right: () => Promise +): ApolloLink { + let link: ApolloLink; + return new ApolloLink((operation, forward) => { + if (link) { + return link.request(operation, forward); + } else { + return new Observable((observer) => { + (async () => { + if (await test()) { + link = await left(); + } else { + link = await right(); + } + link.request(operation, forward)?.subscribe(observer); + })(); + }); + } + }); +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/link.ts b/examples/supermassive-todomvcs-apollo-style/src/schema/link.ts new file mode 100644 index 000000000..e9a1d00e5 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/link.ts @@ -0,0 +1,51 @@ +import { execute as graphQLExecute, DocumentNode } from "graphql"; +import { + executeWithSchema as supermassiveExecute, + subscribeWithSchema as supermassiveSubscribe, + Resolvers, +} from "@graphitation/supermassive"; +import { ApolloLink, Observable } from "@apollo/client"; +import { resolvers as generatedResolvers } from "./__generated__/typeDefs"; +import { resolvers, TodoStorage } from "./resolvers"; +import typeDefs from "./typeDefs.graphql"; +import { getOperationDefinitionNode } from "./utils"; + +export const executableSchemaLink = new ApolloLink((operation) => { + return new Observable((observer) => { + (async () => { + try { + const operationDefinitionNode = getOperationDefinitionNode(operation); + if (operationDefinitionNode) { + let resolveFn; + if (operationDefinitionNode.operation === "subscription") { + resolveFn = supermassiveSubscribe; + } else { + resolveFn = supermassiveExecute; + } + + const result: any = await resolveFn({ + operationName: operation?.operationName, + variableValues: operation?.variables, + resolvers: { ...generatedResolvers, ...resolvers } as Resolvers, + document: operation.query as DocumentNode, + typeDefs, + contextValue: { + todoStorage: new TodoStorage(window.localStorage), + }, + }); + + if (typeof result?.[Symbol.asyncIterator] === "function") { + for await (const item of result) { + observer.next(item); + } + } else { + observer.next(result); + } + } + observer.complete(); + } catch (e) { + observer.error(e); + } + })(); + }); +}); diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/productionLink.ts b/examples/supermassive-todomvcs-apollo-style/src/schema/productionLink.ts new file mode 100644 index 000000000..4b11ccc98 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/productionLink.ts @@ -0,0 +1,49 @@ +import { ApolloLink, Observable } from "@apollo/client"; +import { + executeWithoutSchema as supermassiveExecute, + subscribeWithoutSchema as supermassiveSubscribe, + DocumentNode, + Resolvers, +} from "@graphitation/supermassive"; +import { resolvers, TodoStorage } from "./resolvers"; +import { resolvers as generatedResolvers } from "./__generated__/typeDefs"; +import { getOperationDefinitionNode } from "./utils"; + +export const supermassiveSchemaLink = new ApolloLink((operation) => { + return new Observable((observer) => { + (async () => { + try { + const operationDefinitionNode = getOperationDefinitionNode(operation); + if (operationDefinitionNode) { + let resolveFn; + if (operationDefinitionNode.operation === "subscription") { + resolveFn = supermassiveSubscribe; + } else { + resolveFn = supermassiveExecute; + } + const result: any = await resolveFn({ + operationName: operation?.operationName, + variableValues: operation?.variables, + document: operation?.query as DocumentNode, + resolvers: resolvers, + schemaResolvers: generatedResolvers, + contextValue: { + todoStorage: new TodoStorage(window.localStorage), + }, + }); + + if (typeof result?.[Symbol.asyncIterator] === "function") { + for await (const item of result) { + observer.next(item); + } + } else { + observer.next(result); + } + } + observer.complete(); + } catch (e) { + observer.error(e); + } + })(); + }); +}); diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/resolvers.ts b/examples/supermassive-todomvcs-apollo-style/src/schema/resolvers.ts new file mode 100644 index 000000000..d9dd479ab --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/resolvers.ts @@ -0,0 +1,240 @@ +import { v4 } from "uuid"; +import { subscribe as subscribeToEvents } from "event-iterator/lib/dom"; +// import { Resolvers } from "@graphitation/supermassive"; + +interface Todo { + id: string; + text: string; + isCompleted: boolean; +} + +type StorageMutationEvent = { + id: string; + type: "create" | "update" | "delete"; +}; +type SerializedStorage = { todos: Array; event: StorageMutationEvent }; + +const ALL_TODOS_KEY = "SUPERMASSIVE_ALL_TODOS"; + +export class TodoStorage { + localStorage: Storage; + + constructor(localStorage: Storage) { + this.localStorage = localStorage; + } + + getAllTodos(): Array { + const existingTodos = this.localStorage.getItem(ALL_TODOS_KEY); + if (existingTodos) { + return (JSON.parse(existingTodos) as SerializedStorage).todos.sort( + (a, b) => a.text.localeCompare(b.text) + ); + } else { + return []; + } + } + + getTodoById(id: string): Todo | null { + return this.getAllTodos().find((todo) => todo.id === id) || null; + } + + getLastEvent(): StorageMutationEvent | null { + const existingTodos = this.localStorage.getItem(ALL_TODOS_KEY); + if (existingTodos) { + return (JSON.parse(existingTodos) as SerializedStorage).event; + } else { + return null; + } + } + + saveTodos(todos: Array, event: StorageMutationEvent): void { + const data: SerializedStorage = { todos, event }; + this.localStorage.setItem(ALL_TODOS_KEY, JSON.stringify(data)); + } + + createTodo(text: string): Todo { + const todos = this.getAllTodos(); + const todo: Todo = { + id: v4(), + text, + isCompleted: false, + }; + todos.push(todo); + this.saveTodos(todos, { id: todo.id, type: "create" }); + return todo; + } + + updateTodo({ + id, + text, + isCompleted, + }: { + id: string; + text?: string; + isCompleted?: boolean; + }): Todo | null { + const todos = this.getAllTodos(); + const todoIndex = findIndex(todos, (otherTodo) => otherTodo.id === id); + if (todoIndex !== -1) { + if (text !== undefined) { + todos[todoIndex].text = text; + } + if (isCompleted !== undefined) { + todos[todoIndex].isCompleted = isCompleted; + } + this.saveTodos(todos, { id, type: "update" }); + } + return todos[todoIndex]; + } + + deleteTodo(id: string): void { + const todos = this.getAllTodos(); + const todoIndex = findIndex(todos, (otherTodo) => otherTodo.id === id); + if (todoIndex !== -1) { + todos.splice(todoIndex, 1); + this.saveTodos(todos, { id, type: "delete" }); + } + } +} + +export type Context = { + todoStorage: TodoStorage; +}; + +export const resolvers: any = { + Query: { + allTodos( + _source: any, + _args: any, + context: { todoStorage: { getAllTodos: () => any } }, + _info: any + ) { + return context.todoStorage.getAllTodos(); + }, + }, + Subscription: { + todoUpdated: { + subscribe: async function* ( + _source: unknown, + _args: unknown, + context: { + todoStorage: TodoStorage; + }, + _info: unknown + ) { + for await (const e of subscribeToEvents.call(window, "storage")) { + const event = e as StorageEvent; + if (event.storageArea === window.localStorage) { + const lastEvent = context.todoStorage.getLastEvent(); + if (lastEvent && lastEvent.type === "update") { + const todo = context.todoStorage.getTodoById(lastEvent.id); + yield { todoUpdated: todo }; + } + } + } + }, + }, + todoCreated: { + subscribe: async function* ( + _source: unknown, + _args: unknown, + context: { + todoStorage: TodoStorage; + }, + _info: unknown + ) { + for await (const e of subscribeToEvents.call(window, "storage")) { + const event = e as StorageEvent; + if (event.storageArea === window.localStorage) { + const lastEvent = context.todoStorage.getLastEvent(); + if (lastEvent && lastEvent.type === "create") { + const todo = context.todoStorage.getTodoById(lastEvent.id); + yield { todoCreated: todo }; + } + } + } + }, + }, + }, + Mutation: { + createTodo( + _source: any, + { input }: any, + context: { todoStorage: { createTodo: (arg0: any) => any } }, + _info: any + ) { + const result = context.todoStorage.createTodo(input.text); + if (result != null) { + return { + __typename: "CreateTodoSuccess", + todo: result, + }; + } else { + return { + __typename: "CreateTodoFailure", + reason: "haha", + }; + } + }, + updateTodoText( + _source: any, + { input }: any, + context: { + todoStorage: { updateTodo: (arg0: { id: any; text: any }) => any }; + }, + _info: any + ) { + const result = context.todoStorage.updateTodo({ + id: input.id, + text: input.text, + }); + if (result != null) { + return { + __typename: "UpdateTodoTextSuccess", + todo: result, + }; + } else { + return { + __typename: "UpdateTodoTextFailure", + reason: "haha", + }; + } + }, + setTodoCompleted( + _source: any, + { input }: any, + context: { + todoStorage: { + updateTodo: (arg0: { id: any; isCompleted: any }) => any; + }; + }, + _info: any + ) { + const result = context.todoStorage.updateTodo({ + id: input.id, + isCompleted: input.isCompleted, + }); + if (result != null) { + return { + __typename: "SetTodoCompletedSuccess", + todo: result, + }; + } else { + return { + __typename: "SetTodoCompletedFailure", + reason: "haha", + }; + } + }, + }, +}; + +function findIndex(arr: Array, finder: (element: A) => Boolean): number { + const result = []; + for (let i = 0; i < arr.length; i++) { + if (finder(arr[i])) { + return i; + } + } + return -1; +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/schema.ts b/examples/supermassive-todomvcs-apollo-style/src/schema/schema.ts new file mode 100644 index 000000000..52c403678 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/schema.ts @@ -0,0 +1,10 @@ +import typeDefs from "./typeDefs.graphql"; +import { resolvers } from "./resolvers"; +import { makeExecutableSchema } from "@graphql-tools/schema"; + +const schema = makeExecutableSchema({ + typeDefs, + resolvers, +}); + +export default schema; diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/typeDefs.graphql b/examples/supermassive-todomvcs-apollo-style/src/schema/typeDefs.graphql new file mode 100644 index 000000000..991dae171 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/typeDefs.graphql @@ -0,0 +1,68 @@ +type Query { + allTodos: [Todo!]! +} + +type Mutation { + createTodo(input: CreateTodoInput!): CreateTodoResult! + updateTodoText(input: UpdateTodoTextInput!): UpdateTodoTextResult! + setTodoCompleted(input: SetTodoCompletedInput!): SetTodoCompletedResult! +} + +type Subscription { + todoCreated: Todo + todoUpdated: Todo +} + +type Todo { + id: ID! + text: String! + isCompleted: Boolean! +} + +interface Failure { + reason: String! +} + +union CreateTodoResult = CreateTodoSuccess | CreateTodoFailure + +input CreateTodoInput { + text: String! +} + +type CreateTodoSuccess { + todo: Todo! +} + +type CreateTodoFailure implements Failure { + reason: String! +} + +union UpdateTodoTextResult = UpdateTodoTextSuccess | UpdateTodoTextFailure + +input UpdateTodoTextInput { + id: ID! + text: String! +} + +type UpdateTodoTextSuccess { + todo: Todo! +} + +type UpdateTodoTextFailure implements Failure { + reason: String! +} + +union SetTodoCompletedResult = SetTodoCompletedSuccess | SetTodoCompletedFailure + +input SetTodoCompletedInput { + id: ID! + isCompleted: Boolean! +} + +type SetTodoCompletedSuccess { + todo: Todo! +} + +type SetTodoCompletedFailure implements Failure { + reason: String! +} diff --git a/examples/supermassive-todomvcs-apollo-style/src/schema/utils.ts b/examples/supermassive-todomvcs-apollo-style/src/schema/utils.ts new file mode 100644 index 000000000..61e57f322 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/src/schema/utils.ts @@ -0,0 +1,18 @@ +import { Kind } from "graphql"; +import { OperationDefinitionNode } from "@graphitation/supermassive"; +import { Operation } from "@apollo/client"; + +export function getOperationDefinitionNode( + operation: Operation +): OperationDefinitionNode | null { + if (operation?.query?.definitions) { + const operationDefinitionNode = operation.query.definitions.find( + ({ kind }) => kind === Kind.OPERATION_DEFINITION + ) as OperationDefinitionNode | undefined; + + if (operationDefinitionNode?.operation) { + return operationDefinitionNode; + } + } + return null; +} diff --git a/examples/supermassive-todomvcs-apollo-style/tsconfig.json b/examples/supermassive-todomvcs-apollo-style/tsconfig.json new file mode 100644 index 000000000..e46a54703 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.json", + "ts-node": { + "transpileOnly": true, + "compilerOptions": { + "module": "ESNext", + "target": "ES5", + "moduleResolution": "Node" + }, + "moduleType": { + "webpack.config.ts": "cjs" + } + }, + "compilerOptions": { + "jsx": "react", + "target": "ES2019", + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true + } +} diff --git a/examples/supermassive-todomvcs-apollo-style/webpack.config.ts b/examples/supermassive-todomvcs-apollo-style/webpack.config.ts new file mode 100644 index 000000000..1a4726387 --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/webpack.config.ts @@ -0,0 +1,67 @@ +const webpack = require("webpack"); +const fs = require("fs"); +const path = require("path"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const { getTransformer } = require("@graphitation/ts-transform-graphql-js-tag"); +const { + annotateDocumentGraphQLTransform, +} = require("@graphitation/supermassive/lib/transforms/annotateDocumentGraphQLTransform.js"); +const { buildASTSchema, parse } = require("graphql"); + +const config: () => Promise = async () => { + return { + devtool: "inline-source-map", + entry: "./src/index.tsx", + output: { + filename: "[name].bundle.js", + path: path.resolve(__dirname, "dist"), + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: "ts-loader", + options: { + transpileOnly: true, + getCustomTransformers: () => ({ + before: [ + getTransformer({ + graphqlTagModuleExport: "graphql", + transformer: annotateDocumentGraphQLTransform( + buildASTSchema( + parse( + fs.readFileSync("./src/schema/typeDefs.graphql", { + encoding: "utf-8", + }) + ) + ) + ), + }), + ], + }), + }, + }, + // This generates AST for the typeDefs.graphql file + { + test: /\.graphql$/, + loader: "webpack-graphql-loader", + options: { + output: "document", + }, + }, + ], + }, + resolve: { + extensions: [".ts", ".tsx", ".js"], + }, + plugins: [new HtmlWebpackPlugin()], + optimization: { + // minimize: false, + splitChunks: { + chunks: "initial", + }, + }, + }; +}; + +module.exports = config; diff --git a/examples/supermassive-todomvcs-apollo-style/yarn.lock b/examples/supermassive-todomvcs-apollo-style/yarn.lock new file mode 100644 index 000000000..8a115614a --- /dev/null +++ b/examples/supermassive-todomvcs-apollo-style/yarn.lock @@ -0,0 +1,8280 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollo/client@^3.6.0": + version "3.6.9" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.6.9.tgz#ad0ee2e3a3c92dbed4acd6917b6158a492739d94" + integrity sha512-Y1yu8qa2YeaCUBVuw08x8NHenFi0sw2I3KCu7Kw9mDSu86HmmtHJkCAifKVrN2iPgDTW/BbP3EpSV8/EQCcxZA== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + +"@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0": + version "3.4.16" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.16.tgz#67090d5655aa843fa64d26f1913315e384a5fa0f" + integrity sha512-iF4zEYwvebkri0BZQyv8zfavPfVEafsK0wkOofa6eC2yZu50J18uTutKtC174rjHZ2eyxZ8tV7NvAPKRT+OtZw== + dependencies: + "@graphql-typed-document-node/core" "^3.0.0" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.3" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.9.0" + tslib "^2.3.0" + zen-observable-ts "~1.1.0" + +"@ardatan/aggregate-error@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz#fe6924771ea40fc98dc7a7045c2e872dc8527609" + integrity sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ== + dependencies: + tslib "~2.0.1" + +"@ardatan/relay-compiler@12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" + integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa" + integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew== + +"@babel/core@7.15.5": + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.14.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@7.0.0-beta.38": + version "7.0.0-beta.38" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.38.tgz#6115a66663e3adfd1d6844029ffb2354680182eb" + integrity sha512-aOHQPhsEyaB6p2n+AK981+onHoc+Ork9rcAQVSUJR33wUkGiWRpu6/C685knRyIZVsKeSdG5Q4xMiYeFUhuLzA== + dependencies: + "@babel/types" "7.0.0-beta.38" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.12.13": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.0.tgz#785596c06425e59334df2ccee63ab166b738419a" + integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== + dependencies: + "@babel/types" "^7.19.0" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/generator@^7.14.0", "@babel/generator@^7.15.4", "@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.15.4", "@babel/helper-compilation-targets@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz#01d615762e796c17952c29e3ede9d6de07d235a8" + integrity sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-function-name@^7.12.13": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-function-name@^7.15.4", "@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.15.4", "@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@7.14.5", "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.15.4", "@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.18.6": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helpers@^7.15.4", "@babel/helpers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.0.tgz#875519c979c232f41adfbd43a3b0398c2e388183" + integrity sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== + +"@babel/parser@7.15.5": + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.5.tgz#d33a58ca69facc05b26adfe4abebfed56c1c2dac" + integrity sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg== + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.16.0": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac" + integrity sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw== + +"@babel/parser@^7.12.13", "@babel/parser@^7.18.10": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c" + integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A== + +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + 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.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.0.tgz#07427021d093ed77019408221beaf0272bbcfaec" + integrity sha512-dH91yCo0RyqfzWgoM5Ji9ir8fQ+uFbt9KHM3d2x4jZOuHS6wNA+CRmRUP/BWCsHG2bjc7A2Way6AvH1eQk0wig== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@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" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@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.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@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.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.0.tgz#edd968dc2041c1b69e451a262e948d6654a79dc2" + integrity sha512-vs/F5roOaO/+WxKfp9PkvLsAyj0G+Q0zbFimHm9X2KDgabN2XmNFoAafmeGEYspUlIF9+MvVmyek9UyHiqeG/w== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-flow" "^7.16.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz#1b50765fc421c229819dc4c7cdb8911660b3c2d7" + integrity sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" + integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" + integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/runtime@^7.0.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b" + integrity sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.12.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.15.4", "@babel/template@^7.16.0", "@babel/template@^7.3.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/traverse@7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.14.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.0.tgz#965df6c6bfc0a958c1e739284d3c9fa4a6e3c45b" + integrity sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.0.0-beta.38": + version "7.0.0-beta.38" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.38.tgz#2ce2443f7dc6ad535a67db4940cbd34e64035a6f" + integrity sha512-SAtyEjmA7KiEoL2eAOAUM6M9arQJGWxJKK0S9x0WyPOosHS420RXoxPhn57u/8orRnK8Kxm0nHQQNTX203cP1Q== + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + +"@babel/types@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.16.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.12.13", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" + integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" + integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== + +"@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" + integrity sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA== + dependencies: + lodash.get "^4" + make-error "^1" + ts-node "^9" + tslib "^2" + +"@graphitation/apollo-react-relay-duct-tape@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@graphitation/apollo-react-relay-duct-tape/-/apollo-react-relay-duct-tape-0.7.0.tgz#9b1e7b50bfcc1cb96f039b3fbe74ea28efd7afe0" + integrity sha512-Ea/0Ujl7A71dNNzJHVilChl6Fpgd1dcRJY6hFKgTShv9AgAxxq62BxS6YHptPOwSY8HSpyvf/E7kKcZGN3B4mQ== + dependencies: + invariant "^2.2.4" + +"@graphitation/graphql-codegen-relay-ir-plugin@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@graphitation/graphql-codegen-relay-ir-plugin/-/graphql-codegen-relay-ir-plugin-1.1.0.tgz#de9a473c3b132ee7477dac0f194f0b52b704ed6a" + integrity sha512-ff2P4EAxeckj5upu275l0Zro4aF7O1D/Fqj9Zlkd/4EMNWZTC329FCD3jTeaUnqXbHZX0F9Ub8aDi1f7PWQu1Q== + +"@graphitation/graphql-codegen-supermassive-relay-ir-plugin@link:../packages/graphql-codegen-supermassive-relay-ir-plugin": + version "0.0.0" + uid "" + +"@graphitation/graphql-js-tag@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@graphitation/graphql-js-tag/-/graphql-js-tag-0.8.0.tgz#181face4982d9fa3a8258f143a53907c0725774a" + integrity sha512-Dls360bTmu/QCbiG+Bc/b3ybRh98ePzUAIIjS+jajA5P3ncwu0mIFvYyFWSAXgqIeVMYZNg6QktCfoWk+QZxPA== + dependencies: + invariant "^2.0.0" + +"@graphitation/supermassive@^0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@graphitation/supermassive/-/supermassive-0.8.3.tgz#ec1a1feeee13f9efb18c19c5f70e725e1497d47b" + integrity sha512-UYOpkyd9HbVi7AEJu9xKw3npjzNcOgZX2nDFhFCC9HDF8oZAaI+PW8p/c6RUphMBHx+n1KTi8ocBYvMUDVyQCQ== + dependencies: + commander "^8.3.0" + graphql "^15.6.1" + typescript "^4.4.3 <4.5.0" + +"@graphitation/ts-transform-graphql-js-tag@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@graphitation/ts-transform-graphql-js-tag/-/ts-transform-graphql-js-tag-0.4.0.tgz#12d093c8aa428940847776a14c8337c3db679c94" + integrity sha512-gp1dk+60jvrU29yfETsiahI+C/s+LYOuu5AKOatMbx4k7e3Hx9t3uZaV8ltoMGOWqCEIK4m/tg8gsRY5aH01Mw== + dependencies: + graphql "^15.6.1" + typescript "^4.4.3" + +"@graphql-codegen/add@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-3.1.0.tgz#cd02fd6d80a7f62839cb27160b62e48366a237c5" + integrity sha512-vRRHpuUFadYXnPrb5RNiIzm3Ao39UxjvrdX760lEfXh2qeG7YddM5QFC+ev2BH3X452R15gv/gf/rXy0+Hqm1A== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.1.0" + tslib "~2.3.0" + +"@graphql-codegen/add@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-3.2.1.tgz#f1109f36f194f88a6abcc51703abee43ebbb50a2" + integrity sha512-w82H/evh8SSGoD3K6K/Oh3kqSdbuU+TgHqMYmmHFxtH692v2xhN/cu1s/TotBQ7r4mO7OQutze7dde2tZEXGEQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.6.2" + tslib "~2.4.0" + +"@graphql-codegen/cli@^1.19.4": + version "1.21.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-1.21.8.tgz#b30190b5e7f851952f04e0e2bdc9ec00349ccac6" + integrity sha512-sxKUIvT2dGerFyvs6SsQpkHDyOnk+MRwqsnmsF22eAWHUbNLd429PKC71E26egXzT2BhHabUIfMV7xk9mkgWNg== + dependencies: + "@graphql-codegen/core" "1.17.10" + "@graphql-codegen/plugin-helpers" "^1.18.8" + "@graphql-tools/apollo-engine-loader" "^6.2.5" + "@graphql-tools/code-file-loader" "^6.3.1" + "@graphql-tools/git-loader" "^6.2.6" + "@graphql-tools/github-loader" "^6.2.5" + "@graphql-tools/graphql-file-loader" "^6.2.7" + "@graphql-tools/json-file-loader" "^6.2.6" + "@graphql-tools/load" "^6.2.8" + "@graphql-tools/prisma-loader" "6.3.0" + "@graphql-tools/url-loader" "^6.10.1" + "@graphql-tools/utils" "^7.9.1" + ansi-escapes "^4.3.1" + chalk "^4.1.0" + change-case-all "1.0.14" + chokidar "^3.5.2" + common-tags "^1.8.0" + cosmiconfig "^7.0.0" + debounce "^1.2.0" + dependency-graph "^0.11.0" + detect-indent "^6.0.0" + glob "^7.1.6" + graphql-config "^3.3.0" + inquirer "^7.3.3" + is-glob "^4.0.1" + json-to-pretty-yaml "^1.2.2" + latest-version "5.1.0" + listr "^0.14.3" + listr-update-renderer "^0.5.0" + log-symbols "^4.0.0" + minimatch "^3.0.4" + mkdirp "^1.0.4" + string-env-interpolation "^1.0.1" + ts-log "^2.2.3" + tslib "~2.3.0" + valid-url "^1.0.9" + wrap-ansi "^7.0.0" + yaml "^1.10.0" + yargs "^17.0.0" + +"@graphql-codegen/core@1.17.10": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-1.17.10.tgz#3b85b5bc2e84fcacbd25fced5af47a4bb2d7a8bd" + integrity sha512-RA3umgVDs/RI/+ztHh+H4GfJxrJUfWJQqoAkMfX4qPTVO5qsy3R4vPudE0oP8w+kFbL8dFsRfAAPUZxI4jV/hQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^1.18.7" + "@graphql-tools/merge" "^6.2.14" + "@graphql-tools/utils" "^7.9.1" + tslib "~2.2.0" + +"@graphql-codegen/import-types-preset@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@graphql-codegen/import-types-preset/-/import-types-preset-2.1.7.tgz#03ea00c8cbe3d35eb8cc7d1d13992d17082b76ba" + integrity sha512-CjsWVqV2ymqx6s1D7Q8dKchE31Ow85Z4C/X6dv8T9jfsh6rXycnQ6XJTvwYQ8KYOiKCVnrXrvIY9v9MTvISKIA== + dependencies: + "@graphql-codegen/add" "^3.1.0" + "@graphql-codegen/plugin-helpers" "^2.3.0" + "@graphql-codegen/visitor-plugin-common" "2.5.0" + tslib "~2.3.0" + +"@graphql-codegen/near-operation-file-preset@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/near-operation-file-preset/-/near-operation-file-preset-2.4.1.tgz#38277816239506335c2f843c92cd70b403a0a3ad" + integrity sha512-es3XeVbD8sraEJRXcnhWjrpLUXTiA2Hgfmbt/P4HPBPmMw6NQKL2p2EqK2fd5KEohij3qykUXp+7GffOx8CtAg== + dependencies: + "@graphql-codegen/add" "^3.2.1" + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-codegen/visitor-plugin-common" "2.12.1" + "@graphql-tools/utils" "^8.8.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + +"@graphql-codegen/plugin-helpers@^1.18.5", "@graphql-codegen/plugin-helpers@^1.18.7", "@graphql-codegen/plugin-helpers@^1.18.8": + version "1.18.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-1.18.8.tgz#39aac745b9e22e28c781cc07cf74836896a3a905" + integrity sha512-mb4I9j9lMGqvGggYuZ0CV+Hme08nar68xkpPbAVotg/ZBmlhZIok/HqW2BcMQi7Rj+Il5HQMeQ1wQ1M7sv/TlQ== + dependencies: + "@graphql-tools/utils" "^7.9.1" + common-tags "1.8.0" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.3.0" + +"@graphql-codegen/plugin-helpers@^2.1.0", "@graphql-codegen/plugin-helpers@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.3.0.tgz#e2d6538438e3eff1a68e59059dc9f5ab2eb52d43" + integrity sha512-IdIEtAFkAZrTgVbhMzYudIzcsFHkP2pUpZjg3X+x1XJfZ+asEVHf1SCwL9gOIM/BuG+fsHRZMenedfWHSyF/AQ== + dependencies: + "@graphql-tools/utils" "^8.1.1" + change-case-all "1.0.14" + common-tags "1.8.0" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.3.0" + +"@graphql-codegen/plugin-helpers@^2.6.2": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.0.tgz#54ba1d5fb3ddad8a3634bc2e09b023eb183e574c" + integrity sha512-+a2VP/4Ob0fwP8YLrQ/hhYlAA9UZUdDFNqwS543DmyiGFUkNIsa7TnTsE/mBDKJSMsCVWLw78949fCpzjyw/9Q== + dependencies: + "@graphql-tools/utils" "^8.8.0" + change-case-all "1.0.14" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.4.0" + +"@graphql-codegen/schema-ast@^2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-2.5.1.tgz#ce030ae6de5dacd745848009ba0ca18c9c30910c" + integrity sha512-tewa5DEKbglWn7kYyVBkh3J8YQ5ALqAMVmZwiVFIGOao5u66nd+e4HuFqp0u+Jpz4SJGGi0ap/oFrEvlqLjd2A== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-tools/utils" "^8.8.0" + tslib "~2.4.0" + +"@graphql-codegen/typed-document-node@^2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-2.3.3.tgz#898b36738ee5377d83bd381460faf4c32013afe8" + integrity sha512-0zUPMr1pAqzMyPvtpnlfCbwQgS22t2kPhhfGQs2Yw32O+0+vn1ACcvxt0x1TfUwspYfFJa8AAXJ8NjwmDVAFMQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-codegen/visitor-plugin-common" "2.12.1" + auto-bind "~4.0.0" + change-case-all "1.0.14" + tslib "~2.4.0" + +"@graphql-codegen/typescript-operations@^2.2.4": + version "2.5.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.3.tgz#c6fd3f209e3482b86b08050685af8fa45ab14297" + integrity sha512-s+pA+Erm0HeBb/D5cNrflwRM5KWhkiA5cbz4uA99l3fzFPveoQBPfRCBu0XAlJLP/kBDy64+o4B8Nfc7wdRtmA== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-codegen/typescript" "^2.7.3" + "@graphql-codegen/visitor-plugin-common" "2.12.1" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/typescript-react-apollo@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-react-apollo/-/typescript-react-apollo-3.3.3.tgz#93cb189904a9eacc61bb18b9e69b3d0efded2726" + integrity sha512-FixkcfEfChA1+VPkvdcK+JYnBfqhT+Nz7WJFJ3ZKVsHjwJbTWKu19cKn2nkd3EVgdhJXlNsE8DgenVMqi5X5Ug== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-codegen/visitor-plugin-common" "2.12.1" + auto-bind "~4.0.0" + change-case-all "1.0.14" + tslib "~2.4.0" + +"@graphql-codegen/typescript-resolvers@1.19.1": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-1.19.1.tgz#56677ec56c1ca7174d22a2f236e3fb7f6503e708" + integrity sha512-KdCVfg2u2RMbHu7eV9SOh5rmfnEQaMsQ0k8741bMbBmCESLnrWltujF2RT1OPN7WCn7xJejBtrFg/3UgT0fNug== + dependencies: + "@graphql-codegen/plugin-helpers" "^1.18.5" + "@graphql-codegen/typescript" "^1.22.0" + "@graphql-codegen/visitor-plugin-common" "^1.20.0" + "@graphql-tools/utils" "^7.0.0" + auto-bind "~4.0.0" + tslib "~2.2.0" + +"@graphql-codegen/typescript@^1.22.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-1.23.0.tgz#48a5372bcbe81a442c71c1bb032c312c6586a59a" + integrity sha512-ZfFgk5mGfuOy4kEpy+dcuvJMphigMfJ4AkiP1qWmWFufDW3Sg2yayTSNmzeFdcXMrWGgfNW2dKtuuTmbmQhS5g== + dependencies: + "@graphql-codegen/plugin-helpers" "^1.18.8" + "@graphql-codegen/visitor-plugin-common" "1.22.0" + auto-bind "~4.0.0" + tslib "~2.3.0" + +"@graphql-codegen/typescript@^2.2.0", "@graphql-codegen/typescript@^2.7.3": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-2.7.3.tgz#ad786a1c74e16eca8e01e7a8f28078e1c24eeb61" + integrity sha512-EzX/acijXtbG/AwPzho2ZZWaNo00+xAbsRDP+vnT2PwQV3AYq3/5bFvjq1XfAGWbTntdmlYlIwC9hf5bI85WVA== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-codegen/schema-ast" "^2.5.1" + "@graphql-codegen/visitor-plugin-common" "2.12.1" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/visitor-plugin-common@1.22.0", "@graphql-codegen/visitor-plugin-common@^1.20.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-1.22.0.tgz#75fc8b580143bccbec411eb92d5fef715ed22e42" + integrity sha512-2afJGb6d8iuZl9KizYsexPwraEKO1lAvt5eVHNM5Xew4vwz/AUHeqDR2uOeQgVV+27EzjjzSDd47IEdH0dLC2w== + dependencies: + "@graphql-codegen/plugin-helpers" "^1.18.8" + "@graphql-tools/optimize" "^1.0.1" + "@graphql-tools/relay-operation-optimizer" "^6.3.0" + array.prototype.flatmap "^1.2.4" + auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.3.0" + +"@graphql-codegen/visitor-plugin-common@2.12.1": + version "2.12.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.12.1.tgz#8d2d24b572afd396381dddef7e2032b0f73c05cc" + integrity sha512-dIUrX4+i/uazyPQqXyQ8cqykgNFe1lknjnfDWFo0gnk2W8+ruuL2JpSrj/7efzFHxbYGMQrCABDCUTVLi3DcVA== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.6.2" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^8.8.0" + auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + +"@graphql-codegen/visitor-plugin-common@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.5.0.tgz#e412fade4ca3178a19e7ea122a4cb3463f2bf585" + integrity sha512-a1kJ/5YBivCj9X20YuhNU2mPY9xjUVmJO0VjHBu06PyvC27GsR1PmvgRALIXrb6QwV+9DDUda3ewKzgne2Qc+A== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.3.0" + "@graphql-tools/optimize" "^1.0.1" + "@graphql-tools/relay-operation-optimizer" "^6.3.7" + "@graphql-tools/utils" "^8.3.0" + auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.3.0" + +"@graphql-tools/apollo-engine-loader@^6.2.5": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-6.2.5.tgz#b9e65744f522bb9f6ca50651e5622820c4f059a8" + integrity sha512-CE4uef6PyxtSG+7OnLklIr2BZZDgjO89ZXK47EKdY7jQy/BQD/9o+8SxPsgiBc+2NsDJH2I6P/nqoaJMOEat6g== + dependencies: + "@graphql-tools/utils" "^7.0.0" + cross-fetch "3.0.6" + tslib "~2.0.1" + +"@graphql-tools/batch-execute@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-7.1.2.tgz#35ba09a1e0f80f34f1ce111d23c40f039d4403a0" + integrity sha512-IuR2SB2MnC2ztA/XeTMTfWcA0Wy7ZH5u+nDkDNLAdX+AaSyDnsQS35sCmHqG0VOGTl7rzoyBWLCKGwSJplgtwg== + dependencies: + "@graphql-tools/utils" "^7.7.0" + dataloader "2.0.0" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@graphql-tools/code-file-loader@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-6.3.1.tgz#42dfd4db5b968acdb453382f172ec684fa0c34ed" + integrity sha512-ZJimcm2ig+avgsEOWWVvAaxZrXXhiiSZyYYOJi0hk9wh5BxZcLUNKkTp6EFnZE/jmGUwuos3pIjUD3Hwi3Bwhg== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.5.1" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/delegate@^7.0.1", "@graphql-tools/delegate@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-7.1.5.tgz#0b027819b7047eff29bacbd5032e34a3d64bd093" + integrity sha512-bQu+hDd37e+FZ0CQGEEczmRSfQRnnXeUxI/0miDV+NV/zCbEdIJj5tYFNrKT03W6wgdqx8U06d8L23LxvGri/g== + dependencies: + "@ardatan/aggregate-error" "0.0.6" + "@graphql-tools/batch-execute" "^7.1.2" + "@graphql-tools/schema" "^7.1.5" + "@graphql-tools/utils" "^7.7.1" + dataloader "2.0.0" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@graphql-tools/git-loader@^6.2.6": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-6.2.6.tgz#c2226f4b8f51f1c05c9ab2649ba32d49c68cd077" + integrity sha512-ooQTt2CaG47vEYPP3CPD+nbA0F+FYQXfzrB1Y1ABN9K3d3O2RK3g8qwslzZaI8VJQthvKwt0A95ZeE4XxteYfw== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/github-loader@^6.2.5": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-6.2.5.tgz#460dff6f5bbaa26957a5ea3be4f452b89cc6a44b" + integrity sha512-DLuQmYeNNdPo8oWus8EePxWCfCAyUXPZ/p1PWqjrX/NGPyH2ZObdqtDAfRHztljt0F/qkBHbGHCEk2TKbRZTRw== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + cross-fetch "3.0.6" + tslib "~2.0.1" + +"@graphql-tools/graphql-file-loader@^6.0.0", "@graphql-tools/graphql-file-loader@^6.2.7": + version "6.2.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.7.tgz#d3720f2c4f4bb90eb2a03a7869a780c61945e143" + integrity sha512-5k2SNz0W87tDcymhEMZMkd6/vs6QawDyjQXWtqkuLTBF3vxjxPD1I4dwHoxgWPIjjANhXybvulD7E+St/7s9TQ== + dependencies: + "@graphql-tools/import" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/graphql-tag-pluck@^6.2.6", "@graphql-tools/graphql-tag-pluck@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.5.1.tgz#5fb227dbb1e19f4b037792b50f646f16a2d4c686" + integrity sha512-7qkm82iFmcpb8M6/yRgzjShtW6Qu2OlCSZp8uatA3J0eMl87TxyJoUmL3M3UMMOSundAK8GmoyNVFUrueueV5Q== + dependencies: + "@babel/parser" "7.12.16" + "@babel/traverse" "7.12.13" + "@babel/types" "7.12.13" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/import@6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.3.1.tgz#731c47ab6c6ac9f7994d75c76b6c2fa127d2d483" + integrity sha512-1szR19JI6WPibjYurMLdadHKZoG9C//8I/FZ0Dt4vJSbrMdVNp8WFxg4QnZrDeMG4MzZc90etsyF5ofKjcC+jw== + dependencies: + resolve-from "5.0.0" + tslib "~2.2.0" + +"@graphql-tools/import@^6.2.6": + version "6.7.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.7.6.tgz#9bc0bb304a6fcc43aa2c9177631670b1fdfb2115" + integrity sha512-WtUyiO2qCaK/H4u81zAw/NbBvCOzwKl4N+Vl+FqrFCzYobscwL6x6roePyoXM1O3+JJIIn3CETv4kg4kwxaBVw== + dependencies: + "@graphql-tools/utils" "8.12.0" + resolve-from "5.0.0" + tslib "^2.4.0" + +"@graphql-tools/json-file-loader@^6.0.0", "@graphql-tools/json-file-loader@^6.2.6": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-6.2.6.tgz#830482cfd3721a0799cbf2fe5b09959d9332739a" + integrity sha512-CnfwBSY5926zyb6fkDBHnlTblHnHI4hoBALFYXnrg0Ev4yWU8B04DZl/pBRUc459VNgO2x8/mxGIZj2hPJG1EA== + dependencies: + "@graphql-tools/utils" "^7.0.0" + tslib "~2.0.1" + +"@graphql-tools/load@^6.0.0", "@graphql-tools/load@^6.2.8": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-6.2.8.tgz#16900fb6e75e1d075cad8f7ea439b334feb0b96a" + integrity sha512-JpbyXOXd8fJXdBh2ta0Q4w8ia6uK5FHzrTNmcvYBvflFuWly2LDTk2abbSl81zKkzswQMEd2UIYghXELRg8eTA== + dependencies: + "@graphql-tools/merge" "^6.2.12" + "@graphql-tools/utils" "^7.5.0" + globby "11.0.3" + import-from "3.0.0" + is-glob "4.0.1" + p-limit "3.1.0" + tslib "~2.2.0" + unixify "1.0.0" + valid-url "1.0.9" + +"@graphql-tools/merge@6.0.0 - 6.2.14": + version "6.2.14" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.14.tgz#694e2a2785ba47558e5665687feddd2935e9d94e" + integrity sha512-RWT4Td0ROJai2eR66NHejgf8UwnXJqZxXgDWDI+7hua5vNA2OW8Mf9K1Wav1ZkjWnuRp4ztNtkZGie5ISw55ow== + dependencies: + "@graphql-tools/schema" "^7.0.0" + "@graphql-tools/utils" "^7.7.0" + tslib "~2.2.0" + +"@graphql-tools/merge@8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" + integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== + dependencies: + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + +"@graphql-tools/merge@^6.2.12", "@graphql-tools/merge@^6.2.14": + version "6.2.17" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.17.tgz#4dedf87d8435a5e1091d7cc8d4f371ed1e029f1f" + integrity sha512-G5YrOew39fZf16VIrc49q3c8dBqQDD0ax5LYPiNja00xsXDi0T9zsEWVt06ApjtSdSF6HDddlu5S12QjeN8Tow== + dependencies: + "@graphql-tools/schema" "^8.0.2" + "@graphql-tools/utils" "8.0.2" + tslib "~2.3.0" + +"@graphql-tools/merge@^8.1.0": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.1.2.tgz#50f5763927c51de764d09c5bfd20261671976e24" + integrity sha512-kFLd4kKNJXYXnKIhM8q9zgGAtbLmsy3WmGdDxYq3YHBJUogucAxnivQYyRIseUq37KGmSAIWu3pBQ23TKGsGOw== + dependencies: + "@graphql-tools/utils" "^8.2.2" + tslib "~2.3.0" + +"@graphql-tools/optimize@^1.0.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.1.1.tgz#dcd59ba1ee34431e5e9b086b57fe0bdb1a176669" + integrity sha512-y0TEfPyGmJaQjnsTRs/UP7/ZHaB3i68VAsXW4H2doUFKY6rIOUz+ruME/uWsfy/VeTWBNqGX8/m/X7YFEi5OJQ== + dependencies: + tslib "~2.3.0" + +"@graphql-tools/optimize@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.3.1.tgz#29407991478dbbedc3e7deb8c44f46acb4e9278b" + integrity sha512-5j5CZSRGWVobt4bgRRg7zhjPiSimk+/zIuColih8E8DxuFOaJ+t0qu7eZS5KXWBkjcd4BPNuhUPpNlEmHPqVRQ== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/prisma-loader@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-6.3.0.tgz#c907e17751ff2b26e7c2bc75d0913ebf03f970da" + integrity sha512-9V3W/kzsFBmUQqOsd96V4a4k7Didz66yh/IK89B1/rrvy9rYj+ULjEqR73x9BYZ+ww9FV8yP8LasWAJwWaqqJQ== + dependencies: + "@graphql-tools/url-loader" "^6.8.2" + "@graphql-tools/utils" "^7.0.0" + "@types/http-proxy-agent" "^2.0.2" + "@types/js-yaml" "^4.0.0" + "@types/json-stable-stringify" "^1.0.32" + "@types/jsonwebtoken" "^8.5.0" + chalk "^4.1.0" + debug "^4.3.1" + dotenv "^8.2.0" + graphql-request "^3.3.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + isomorphic-fetch "^3.0.0" + js-yaml "^4.0.0" + json-stable-stringify "^1.0.1" + jsonwebtoken "^8.5.1" + lodash "^4.17.20" + replaceall "^0.1.6" + scuid "^1.1.0" + tslib "~2.1.0" + yaml-ast-parser "^0.0.43" + +"@graphql-tools/relay-operation-optimizer@^6.3.0", "@graphql-tools/relay-operation-optimizer@^6.3.7": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.4.1.tgz#28572444e2c00850c889a84472f3cc7405dc1ad8" + integrity sha512-2b9D5L+31sIBnvmcmIW5tfvNUV+nJFtbHpUyarTRDmFT6EZ2cXo4WZMm9XJcHQD/Z5qvMXfPHxzQ3/JUs4xI+w== + dependencies: + "@graphql-tools/utils" "^8.5.1" + relay-compiler "12.0.0" + tslib "~2.3.0" + +"@graphql-tools/relay-operation-optimizer@^6.5.0": + version "6.5.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.6.tgz#b0df15fc78fac95000f8d1b1419490822fe79f22" + integrity sha512-2KjaWYxD/NC6KtckbDEAbN46QO+74d1SBaZQ26qQjWhyoAjon12xlMW4HWxHEN0d0xuz0cnOVUVc+t4wVXePUg== + dependencies: + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "8.12.0" + tslib "^2.4.0" + +"@graphql-tools/schema@^7.0.0", "@graphql-tools/schema@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-7.1.5.tgz#07b24e52b182e736a6b77c829fc48b84d89aa711" + integrity sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA== + dependencies: + "@graphql-tools/utils" "^7.1.2" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@graphql-tools/schema@^8.0.2": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" + integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== + dependencies: + "@graphql-tools/merge" "8.3.1" + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + +"@graphql-tools/schema@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.2.0.tgz#ae75cbb2df6cee9ed6d89fce56be467ab23758dc" + integrity sha512-ufmI5mJQa8NJczzfkh0pUttKvspqDcT5LLakA3jUmOrrE4d4NVj6onZlazdTzF5sAepSNqanFnwhrxZpCAJMKg== + dependencies: + "@graphql-tools/merge" "^8.1.0" + "@graphql-tools/utils" "^8.2.0" + tslib "~2.3.0" + value-or-promise "1.0.10" + +"@graphql-tools/url-loader@^6.0.0", "@graphql-tools/url-loader@^6.10.1", "@graphql-tools/url-loader@^6.8.2": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.10.1.tgz#dc741e4299e0e7ddf435eba50a1f713b3e763b33" + integrity sha512-DSDrbhQIv7fheQ60pfDpGD256ixUQIR6Hhf9Z5bRjVkXOCvO5XrkwoWLiU7iHL81GB1r0Ba31bf+sl+D4nyyfw== + dependencies: + "@graphql-tools/delegate" "^7.0.1" + "@graphql-tools/utils" "^7.9.0" + "@graphql-tools/wrap" "^7.0.4" + "@microsoft/fetch-event-source" "2.0.1" + "@types/websocket" "1.0.2" + abort-controller "3.0.0" + cross-fetch "3.1.4" + extract-files "9.0.0" + form-data "4.0.0" + graphql-ws "^4.4.1" + is-promise "4.0.0" + isomorphic-ws "4.0.1" + lodash "4.17.21" + meros "1.1.4" + subscriptions-transport-ws "^0.9.18" + sync-fetch "0.3.0" + tslib "~2.2.0" + valid-url "1.0.9" + ws "7.4.5" + +"@graphql-tools/utils@8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.0.2.tgz#795a8383cdfdc89855707d62491c576f439f3c51" + integrity sha512-gzkavMOgbhnwkHJYg32Adv6f+LxjbQmmbdD5Hty0+CWxvaiuJq+nU6tzb/7VSU4cwhbNLx/lGu2jbCPEW1McZQ== + dependencies: + tslib "~2.3.0" + +"@graphql-tools/utils@8.12.0", "@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.2.0", "@graphql-tools/utils@^8.2.2", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.5.1", "@graphql-tools/utils@^8.8.0": + version "8.12.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.12.0.tgz#243bc4f5fc2edbc9e8fd1038189e57d837cbe31f" + integrity sha512-TeO+MJWGXjUTS52qfK4R8HiPoF/R7X+qmgtOYd8DTH0l6b+5Y/tlg5aGeUJefqImRq7nvi93Ms40k/Uz4D5CWw== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/utils@8.9.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" + integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.1.2", "@graphql-tools/utils@^7.5.0", "@graphql-tools/utils@^7.7.0", "@graphql-tools/utils@^7.7.1", "@graphql-tools/utils@^7.8.1", "@graphql-tools/utils@^7.9.0", "@graphql-tools/utils@^7.9.1": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-7.10.0.tgz#07a4cb5d1bec1ff1dc1d47a935919ee6abd38699" + integrity sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w== + dependencies: + "@ardatan/aggregate-error" "0.0.6" + camel-case "4.1.2" + tslib "~2.2.0" + +"@graphql-tools/wrap@^7.0.4": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-7.0.8.tgz#ad41e487135ca3ea1ae0ea04bb3f596177fb4f50" + integrity sha512-1NDUymworsOlb53Qfh7fonDi2STvqCtbeE68ntKY9K/Ju/be2ZNxrFSbrBHwnxWcN9PjISNnLcAyJ1L5tCUyhg== + dependencies: + "@graphql-tools/delegate" "^7.1.5" + "@graphql-tools/schema" "^7.1.5" + "@graphql-tools/utils" "^7.8.1" + tslib "~2.2.0" + value-or-promise "1.0.6" + +"@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== + +"@graphql-typed-document-node/core@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" + integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== + +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + +"@istanbuljs/load-nyc-config@^1.0.0": + 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" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/transform@^27.1.0": + version "27.3.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.3.1.tgz#ff80eafbeabe811e9025e4b6f452126718455220" + integrity sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.2.5" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.3.1" + jest-regex-util "^27.0.6" + jest-util "^27.3.1" + micromatch "^4.0.4" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.1.0", "@jest/types@^27.2.5": + version "27.2.5" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132" + integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@microsoft/fetch-event-source@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d" + integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" + integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== + dependencies: + any-observable "^0.3.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" + integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/glob@^7.1.1": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" + integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/graphql@^14.5.0": + version "14.5.0" + resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.5.0.tgz#a545fb3bc8013a3547cf2f07f5e13a33642b75d6" + integrity sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA== + dependencies: + graphql "*" + +"@types/html-minifier-terser@^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== + +"@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" + integrity sha512-2S6IuBRhqUnH1/AUx9k8KWtY3Esg4eqri946MnxTG5HwehF1S5mqLln8fcyMiuQkY72p2gH3W+rIPqp5li0LyQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + 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" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/js-yaml@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.4.tgz#cc38781257612581a1a0eb25f1709d2b06812fce" + integrity sha512-AuHubXUmg0AzkXH0Mx6sIxeY/1C110mm/EkE/gB1sTRz3h2dao2W/63q42SlVST+lICxz5Oki2hzYA6+KnnieQ== + +"@types/json-schema@*", "@types/json-schema@^7.0.8": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" + integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== + +"@types/json-schema@^7.0.6": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/json-stable-stringify@^1.0.32": + version "1.0.33" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz#099b0712d824d15e2660c20e1c16e6a8381f308c" + integrity sha512-qEWiQff6q2tA5gcJGWwzplQcXdJtm+0oy6IHGHzlOf3eFAkGE/FIPXZK9ofWgNSHVp8AFFI33PJJshS0ei3Gvw== + +"@types/jsonwebtoken@^8.5.0": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.5.tgz#da5f2f4baee88f052ef3e4db4c1a0afb46cff22c" + integrity sha512-OGqtHQ7N5/Ap/TUwO6IgHDuLiAoTmHhGpNvgkCm/F4N6pKzx/RBSfr2OXZSwC6vkfnsEdb6+7DNZVtiXiwdwFw== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.175": + version "4.14.175" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.175.tgz#b78dfa959192b01fae0ad90e166478769b215f45" + integrity sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/node@*": + version "16.4.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.1.tgz#9fad171a5b701613ee8a6f4ece3c88b1034b1b03" + integrity sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@types/react-dom@^17.0.9": + version "17.0.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.9.tgz#441a981da9d7be117042e1a6fd3dac4b30f55add" + integrity sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg== + dependencies: + "@types/react" "*" + +"@types/react-relay@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@types/react-relay/-/react-relay-14.1.1.tgz#78f50309a19cf92bfaece563cc3a6ba43fcb5e23" + integrity sha512-uUXlJOjWmLF1awJGTSuolsCU3d9Qf7+YChBo/UvlX/neLaMYuAjHvzqB8EkafIOJtLi0AaKKvDL047rnoino2A== + dependencies: + "@types/react" "*" + "@types/relay-runtime" "*" + +"@types/react@*", "@types/react@^17.0.30": + version "17.0.30" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.30.tgz#2f8e6f5ab6415c091cc5e571942ee9064b17609e" + integrity sha512-3Dt/A8gd3TCXi2aRe84y7cK1K8G+N9CZRDG8kDGguOKa0kf/ZkSwTmVIDPsm/KbQOVMaDJXwhBtuOXxqwdpWVg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/relay-runtime@*": + version "14.1.3" + resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-14.1.3.tgz#7b0bf67d3392caef90548a14dcbd93a1b0c3f25e" + integrity sha512-8RUPQYwySOUZTqX29K6doeLyeJIACvJWqotqg3ssVFBGqnQgsWjlpo00I2PeHa0f6dwim95fAhKz7ehaA46/Yw== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/uuid@^8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.1.tgz#1a32969cf8f0364b3d8c8af9cc3555b7805df14f" + integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== + +"@types/websocket@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.2.tgz#d2855c6a312b7da73ed16ba6781815bf30c6187a" + integrity sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@types/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa" + integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ== + +"@webpack-cli/info@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b" + integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278" + integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw== + +"@wry/context@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.6.1.tgz#c3c29c0ad622adb00f6a53303c4f965ee06ebeb2" + integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73" + integrity sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.1.tgz#2279b790f15032f8bcea7fc944d27988e5b3b139" + integrity sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw== + dependencies: + tslib "^2.3.0" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abort-controller@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== + +add@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" + integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-errors@^1.0.0: + version "1.0.1" + 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.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.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html@0.0.7, ansi-html@^0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.9.tgz#6512d02342ae2cc68131952644a129cb734cd3f0" + integrity sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg== + +ansi-regex@^2.0.0, ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apollo-codegen@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/apollo-codegen/-/apollo-codegen-0.19.1.tgz#30444de019f453c0d6ec167072b8e11b52d7f92e" + integrity sha512-jlxz/b5iinRWfh48hXdmMtrjTPn/rDok0Z3b7icvkiaD6I30w4sq9B+JDkFbLnkldzsFLV2BZtBDa/dkZhx8Ng== + dependencies: + "@babel/generator" "7.0.0-beta.38" + "@babel/types" "7.0.0-beta.38" + change-case "^3.0.1" + common-tags "^1.5.1" + core-js "^2.5.3" + glob "^7.1.2" + graphql "^0.13.1" + graphql-config "^1.1.1" + inflected "^2.0.3" + node-fetch "^1.7.3" + rimraf "^2.6.2" + source-map-support "^0.5.0" + yargs "^10.0.3" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flatmap@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +auto-bind@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + +babel-jest@27.1.0: + version "27.1.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.1.0.tgz#e96ca04554fd32274439869e2b6d24de9d91bc4e" + integrity sha512-6NrdqzaYemALGCuR97QkC/FkFIEBWP5pw5TMJoUHZTVXyOgocujp6A0JE2V6gE0HtqAAv6VKU/nI+OCR1Z4gHA== + dependencies: + "@jest/transform" "^27.1.0" + "@jest/types" "^27.1.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^27.0.6" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.2.0: + version "27.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz#79f37d43f7e5c4fdc4b2ca3e10cc6cf545626277" + integrity sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-preset-jest@^27.0.6: + version "27.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz#556bbbf340608fed5670ab0ea0c8ef2449fba885" + integrity sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg== + dependencies: + babel-plugin-jest-hoist "^27.2.0" + babel-preset-current-node-syntax "^1.0.0" + +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +browserslist@^4.16.6: + version "4.17.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.5.tgz#c827bbe172a4c22b123f5e337533ceebadfdd559" + integrity sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA== + dependencies: + caniuse-lite "^1.0.30001271" + electron-to-chromium "^1.3.878" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/caller/-/caller-1.0.1.tgz#b851860f70e195db3d277395aa1a7e23ea30ecf5" + integrity sha1-uFGGD3Dhlds9J3OVqhp+I+ow7PU= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@4.1.2, camel-case@^4.1.1, camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30001219: + version "1.0.30001247" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001247.tgz#105be7a8fb30cdd303275e769a9dfb87d4b3577a" + integrity sha512-4rS7co+7+AoOSPRPOPUt5/GdaqZc0EsUpWk66ofE3HJTAajUK2Ss2VwoNzVN69ghg8lYYlh0an0Iy4LIHHo9UQ== + +caniuse-lite@^1.0.30001271: + version "1.0.30001274" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz#26ca36204d15b17601ba6fc35dbdad950a647cc7" + integrity sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew== + +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case-all@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" + integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" + integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== + dependencies: + camel-case "^3.0.0" + constant-case "^2.0.0" + dot-case "^2.1.0" + header-case "^1.0.0" + is-lower-case "^1.1.0" + is-upper-case "^1.1.0" + lower-case "^1.1.1" + lower-case-first "^1.0.0" + no-case "^2.3.2" + param-case "^2.1.0" + pascal-case "^2.0.0" + path-case "^2.1.0" + sentence-case "^2.1.0" + snake-case "^2.1.0" + swap-case "^1.1.0" + title-case "^2.1.0" + upper-case "^1.1.1" + upper-case-first "^1.1.0" + +change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg== + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-tags@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +common-tags@1.8.2, common-tags@^1.5.1, common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concurrently@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.5.1.tgz#4518c67f7ac680cf5c34d5adf399a2a2047edc8c" + integrity sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag== + dependencies: + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + rxjs "^6.6.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^16.2.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +constant-case@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY= + dependencies: + snake-case "^2.1.0" + upper-case "^1.1.1" + +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^2.5.3: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig-toml-loader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-toml-loader/-/cosmiconfig-toml-loader-1.0.0.tgz#0681383651cceff918177debe9084c0d3769509b" + integrity sha512-H/2gurFWVi7xXvCyvsWRLCMekl4tITJcX0QEsDMpzxtuxDyM59xLatYNg4s/k9AA/HdtCYfj2su8mgA0GSDLDA== + dependencies: + "@iarna/toml" "^2.2.5" + +cosmiconfig@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@2.2.2, cross-fetch@3.0.6, cross-fetch@3.1.4, cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^5.0.1: + version "5.1.0" + 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" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.3: + 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" + which "^2.0.1" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-what@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== + +csstype@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== + +dataloader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f" + integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ== + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +date-fns@^2.16.1: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + +debounce@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4= + dependencies: + no-case "^2.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.723: + version "1.3.786" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.786.tgz#1fc572abc77e2f474725f8a61acf7e25ced9fbe2" + integrity sha512-AmvbLBj3hepRk8v/DHrFF8gINxOFfDbrn6Ts3PcK46/FBdQb5OMmpamSpZQXSkfi77FfBzYtQtAk+00LCLYMVw== + +electron-to-chromium@^1.3.878: + version "1.3.886" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.886.tgz#ac039c4001b665b1dd0f0ed9c2e4da90ff3c9267" + integrity sha512-+vYdeBosI63VkCtNWnEVFjgNd/IZwvnsWkKyPtWAvrhA+XfByKoBJcbsMgudVU/bUcGAF9Xp3aXn96voWlc3oQ== + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.0: + version "5.8.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" + integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +errno@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-module-lexer@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d" + integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +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.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +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== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-iterator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-2.0.0.tgz#10f06740cc1e9fd6bc575f334c2bc1ae9d2dbf62" + integrity sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource@^1.0.7, eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-files@9.0.0, extract-files@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" + integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== + +fast-deep-equal@^3.1.1: + 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@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.1.tgz#70a053d34a96c2b513b559eaea124daed49ace64" + integrity sha512-8+vkGyT4lNDRKHQNPp0yh/6E7FfkLg89XqQbOYnvntRh+8RiSD43yrh9E5ejp1muCizTL4nDVG+y8W4e+LROHg== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +fbjs@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +follow-redirects@^1.0.0: + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +form-data@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@1.0.0-beta.2, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +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-stream@^3.0.0: + version "3.0.0" + 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: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + 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" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0, glob-parent@^5.1.2, glob-parent@^6.0.2, glob-parent@~5.1.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.3, glob@^7.1.3: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.4: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +graphql-config@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-1.2.1.tgz#97b4403707db408feb335fbc159651f2a36cb558" + integrity sha512-BOtbEOn/fD13jT0peCy3Fzp1DSTsA/1AcZp266AQ5Sk3wFndKCEa/H7donbu5UriOw1V/N1WDirYPnr7rd8E7Q== + dependencies: + graphql "^0.12.3" + graphql-import "^0.4.0" + graphql-request "^1.4.0" + js-yaml "^3.10.0" + lodash "^4.17.4" + minimatch "^3.0.4" + +graphql-config@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-3.4.1.tgz#59f937a1b4d3a3c2dcdb27ddf5b4d4d4b2c6e9e1" + integrity sha512-g9WyK4JZl1Ko++FSyE5Ir2g66njfxGzrDDhBOwnkoWf/t3TnnZG6BBkWP+pkqVJ5pqMJGPKHNrbew8jRxStjhw== + dependencies: + "@endemolshinegroup/cosmiconfig-typescript-loader" "3.0.2" + "@graphql-tools/graphql-file-loader" "^6.0.0" + "@graphql-tools/json-file-loader" "^6.0.0" + "@graphql-tools/load" "^6.0.0" + "@graphql-tools/merge" "6.0.0 - 6.2.14" + "@graphql-tools/url-loader" "^6.0.0" + "@graphql-tools/utils" "^7.0.0" + cosmiconfig "7.0.0" + cosmiconfig-toml-loader "1.0.0" + minimatch "3.0.4" + string-env-interpolation "1.0.1" + +graphql-import@^0.4.0: + version "0.4.5" + resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.4.5.tgz#e2f18c28d335733f46df8e0733d8deb1c6e2a645" + integrity sha512-G/+I08Qp6/QGTb9qapknCm3yPHV0ZL7wbaalWFpxsfR8ZhZoTBe//LsbsCKlbALQpcMegchpJhpTSKiJjhaVqQ== + dependencies: + lodash "^4.17.4" + +graphql-let@^0.18.5: + version "0.18.5" + resolved "https://registry.yarnpkg.com/graphql-let/-/graphql-let-0.18.5.tgz#3b01f0b7ed8388dd3195ad1ae4f306296829c16c" + integrity sha512-/3tU9JFbO90o5zjQOo3ScqeCy2gHn28hhrLOK628jwO+YvYjveS27H0WQie/0MSPYpgD2ZRrexNnfEvYtLZpFA== + dependencies: + "@babel/core" "7.15.5" + "@babel/helper-plugin-utils" "7.14.5" + "@babel/parser" "7.15.5" + "@babel/traverse" "7.15.4" + "@graphql-tools/import" "6.3.1" + caller "1.0.1" + gensync "1.0.0-beta.2" + globby "11.0.4" + loader-utils "2.0.0" + log-update "4.0.0" + make-dir "3.1.0" + minimist "1.2.5" + schema-utils "3.0.0" + slash "3.0.0" + string-env-interpolation "1.0.1" + yaml "1.10.2" + optionalDependencies: + "@graphql-codegen/typescript-resolvers" "1.19.1" + babel-jest "27.1.0" + +graphql-request@^1.4.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.8.2.tgz#398d10ae15c585676741bde3fc01d5ca948f8fbe" + integrity sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg== + dependencies: + cross-fetch "2.2.2" + +graphql-request@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-3.7.0.tgz#c7406e537084f8b9788541e3e6704340ca13055b" + integrity sha512-dw5PxHCgBneN2DDNqpWu8QkbbJ07oOziy8z+bK/TAXufsOLaETuVO4GkXrbs0WjhdKhBMN3BkpN/RIvUHkmNUQ== + dependencies: + cross-fetch "^3.0.6" + extract-files "^9.0.0" + form-data "^3.0.0" + +graphql-tag@^2.11.0, graphql-tag@^2.12.3: + version "2.12.5" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f" + integrity sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ== + dependencies: + tslib "^2.1.0" + +graphql-tag@^2.12.6: + version "2.12.6" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql-tools@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-8.2.0.tgz#493edc2760469f39d8334c6f20aa75ae91a7ab86" + integrity sha512-9axT/0exEzVCk+vMPykOPannlrA4VQNo6nuWgh25IJ5arPf92OKxvjSHAbm7dQIFmcWxE0hVvyD2rWHjDqZCgQ== + dependencies: + "@graphql-tools/schema" "^8.2.0" + tslib "~2.3.0" + optionalDependencies: + "@apollo/client" "~3.2.5 || ~3.3.0 || ~3.4.0" + +graphql-ws@^4.4.1: + version "4.9.0" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-4.9.0.tgz#5cfd8bb490b35e86583d8322f5d5d099c26e365c" + integrity sha512-sHkK9+lUm20/BGawNEWNtVAeJzhZeBg21VmvmLoT5NdGVeZWv5PdIhkcayQIAgjSyyQ17WMKmbDijIPG2On+Ag== + +graphql@*, graphql@^0.12.3, graphql@^0.13.1, graphql@^15.6.1: + version "15.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "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.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +header-case@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.3" + +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-minifier-terser@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz#7b04bf80b1f6fe84a6d3f66c8b79d64739321b08" + integrity sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ== + dependencies: + "@types/html-minifier-terser" "^5.0.0" + html-minifier-terser "^5.0.1" + lodash "^4.17.21" + pretty-error "^3.0.4" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +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" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks= + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-from@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" + integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== + +inflected@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.1.0.tgz#2816ac17a570bbbc8303ca05bca8bf9b3f959687" + integrity sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +invariant@^2.0.0, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" + integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@4.0.1, is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-lower-case@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M= + dependencies: + lower-case "^1.1.0" + +is-lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" + integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== + dependencies: + tslib "^2.0.3" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-promise@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-upper-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8= + dependencies: + upper-case "^1.1.0" + +is-upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" + integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== + dependencies: + tslib "^2.0.3" + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + +isomorphic-ws@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +iterall@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + +jest-haste-map@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.3.1.tgz#7656fbd64bf48bda904e759fc9d93e2c807353ee" + integrity sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg== + dependencies: + "@jest/types" "^27.2.5" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^27.0.6" + jest-serializer "^27.0.6" + jest-util "^27.3.1" + jest-worker "^27.3.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-regex-util@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" + integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== + +jest-serializer@^27.0.6: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" + integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-util@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.3.1.tgz#a58cdc7b6c8a560caac9ed6bdfc4e4ff23f80429" + integrity sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw== + dependencies: + "@jest/types" "^27.2.5" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.4" + picomatch "^2.2.3" + +jest-worker@^27.0.2: + version "27.0.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.6.tgz#a5fdb1e14ad34eb228cfe162d9f729cdbfa28aed" + integrity sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^27.3.1: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2" + integrity sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.10.0, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-parse-better-errors@^1.0.2: + version "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" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-to-pretty-yaml@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" + integrity sha1-9M0L0KXo/h3yWq9boRiwmf2ZLVs= + dependencies: + remedial "^1.0.7" + remove-trailing-spaces "^1.0.6" + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +latest-version@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA== + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.get@^4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.0, lodash@~4.17.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== + dependencies: + chalk "^1.0.0" + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +loglevel@^1.6.8: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case-first@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E= + dependencies: + lower-case "^1.1.2" + +lower-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" + integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== + dependencies: + tslib "^2.0.3" + +lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^4.0.1: + version "4.1.5" + 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" + yallist "^2.1.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@3.1.0: + 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" + +make-error@^1, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^1.1.0, mem@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +meros@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948" + integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.48.0, "mime-db@>= 1.43.0 < 2": + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + +mime-db@1.50.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-types@^2.1.12: + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== + dependencies: + mime-db "1.50.0" + +mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + dependencies: + mime-db "1.48.0" + +mime@1.6.0: + version "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.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@1.2.5, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.2: + version "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.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0, no-case@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch@2.6.7, node-fetch@^1.7.3, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^0.10.0, node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-releases@^1.1.71: + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.0.1, 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#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +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== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0, onetime@^5.1.2: + 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" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimism@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.1.tgz#7c8efc1f3179f18307b887e18c15c5b7133f6e7d" + integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== + dependencies: + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@3.1.0, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +param-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +param-case@^3.0.3, param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-filepath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU= + dependencies: + no-case "^2.2.0" + +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +portfinder@^1.0.26: + 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.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + +prettier@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== + +pretty-error@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-3.0.4.tgz#94b1d54f76c1ed95b9c604b9de2194838e5b574e" + integrity sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.6" + +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" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8, rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-relay@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/react-relay/-/react-relay-14.1.0.tgz#2a2349d33ca6558543340a12b363ee2de3db06a6" + integrity sha512-U4oHb5wn1LEi17x3AcZOy66MXs83tnYbsK7/YE1/3cQKCPrXhyVUQbEOC9L7jMX659jtS1NACae+7b03bryMCQ== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.2" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "14.1.0" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.1, readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +registry-auth-token@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" + integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== + dependencies: + rc "1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +relay-compiler-language-graphitation@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/relay-compiler-language-graphitation/-/relay-compiler-language-graphitation-0.8.1.tgz#3d43d95f4b6449ffd57c84818ecfcf80aad859ef" + integrity sha512-YBMFBYfp+apx5ujGLOIAF7Xjx6RUWLmpoDAvFBZXdEBQzsnBSRmcZXv8QEYEbGHhQXgYblXQj8rKHXl/tQTNBQ== + dependencies: + relay-compiler-language-typescript ">=14.0.0" + typescript ">=4.2.3" + +relay-compiler-language-typescript@>=14.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/relay-compiler-language-typescript/-/relay-compiler-language-typescript-15.0.0.tgz#565900106eeb7150d70c5792ef092a2807a8e25e" + integrity sha512-vx6V+uBJLIyzTFz1fFiuS0J+L81juGUComb5emKNaYGZRWOPSalxyS+0/I6umrNChNDFB5uLuTnAqxia4+ZMBg== + dependencies: + invariant "^2.2.4" + +relay-compiler@12.0.0, relay-compiler@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-12.0.0.tgz#9f292d483fb871976018704138423a96c8a45439" + integrity sha512-SWqeSQZ+AMU/Cr7iZsHi1e78Z7oh00I5SvR092iCJq79aupqJ6Ds+I1Pz/Vzo5uY5PY0jvC4rBJXzlIN5g9boQ== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + +relay-runtime@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" + integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.0" + invariant "^2.2.4" + +relay-runtime@14.1.0, relay-runtime@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-14.1.0.tgz#44b317101f560a16caea2eef8a52e254b03908fa" + integrity sha512-t2DR2hZviHrdEQrOvFqwmvRWvZ0SjI/r4bS5f3qvMyXt4g1kw3RTb2RNVmbKGg6zEQhf7Na/brdqE4roApmclQ== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.2" + invariant "^2.2.4" + +remedial@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" + integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +remove-trailing-spaces@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" + integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== + +renderkid@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +replaceall@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/replaceall/-/replaceall-0.1.6.tgz#81d81ac7aeb72d7f5c4942adf2697a3220688d8e" + integrity sha512-sL26E4+8Kec7bwpRjHlQvbNZcpnGroT3PA7ywsgH6GjzxAg4IGNlNalLoRC/JmTed7cMhyDbi44pWw1kMhDxlw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.6.2, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.3.3, rxjs@^6.6.0, rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + 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.0.1, safe-buffer@^5.1.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-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^3.0.0, schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scuid@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" + integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +sentence-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ= + dependencies: + no-case "^2.2.0" + upper-case-first "^1.1.2" + +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +signal-exit@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== + +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo= + +slash@3.0.0, slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= + dependencies: + no-case "^2.2.0" + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" + integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.1" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.0, source-map-support@^0.5.17: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.12: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "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.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sponge-case@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" + integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== + dependencies: + tslib "^2.0.3" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string-env-interpolation@1.0.1, string-env-interpolation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" + integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + 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" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +subscriptions-transport-ws@^0.9.18: + version "0.9.19" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf" + integrity sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0 || ^6.0.0 || ^7.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + 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" + +supports-color@^8.0.0, supports-color@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +swap-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM= + dependencies: + lower-case "^1.1.1" + upper-case "^1.1.1" + +swap-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" + integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== + dependencies: + tslib "^2.0.3" + +symbol-observable@^1.0.4, symbol-observable@^1.1.0: + 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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +sync-fetch@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/sync-fetch/-/sync-fetch-0.3.0.tgz#77246da949389310ad978ab26790bb05f88d1335" + integrity sha512-dJp4qg+x4JwSEW1HibAuMi0IIrBI3wuQr2GimmqB7OXR50wmwzfdusG+p39R9w3R6aFtZ2mzvxvWKQ3Bd/vx3g== + dependencies: + buffer "^5.7.0" + node-fetch "^2.6.1" + +tapable@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== + +terser-webpack-plugin@^5.1.3: + version "5.1.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz#c369cf8a47aa9922bd0d8a94fe3d3da11a7678a1" + integrity sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA== + dependencies: + jest-worker "^27.0.2" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.0" + +terser@^4.6.3: + 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.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" + integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +title-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + +title-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" + integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== + dependencies: + tslib "^2.0.3" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + +ts-invariant@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.3.tgz#4b41e0a80c2530a56ce4b8fd4e14183aaac0efa8" + integrity sha512-HinBlTbFslQI0OHP07JLsSXPibSegec6r9ai5xxq/qHYCsIQbzpymLpDhAUsnXcSrDEcd0L62L8vsOEdzM0qlA== + dependencies: + tslib "^2.1.0" + +ts-loader@^9.0.0: + version "9.2.3" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.3.tgz#dc3b6362a4d4382493cd4f138d345f419656de68" + integrity sha512-sEyWiU3JMHBL55CIeC4iqJQadI0U70A5af0kvgbNLHVNz2ACztQg0j/9x10bjjIht8WfFYLKfn4L6tkZ+pu+8Q== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-log@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.4.tgz#d672cf904b33735eaba67a7395c93d45fba475b3" + integrity sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ== + +ts-node@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" + integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + +ts-node@^9: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2, tslib@^2.4.0, tslib@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tslib@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@>=4.2.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" + integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== + +typescript@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== + +"typescript@^4.4.3 <4.5.0": + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unixify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== + dependencies: + normalize-path "^2.1.1" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upper-case-first@^1.1.0, upper-case-first@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= + dependencies: + upper-case "^1.1.1" + +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +url-parse@^1.5.1: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, 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= + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +valid-url@1.0.9, valid-url@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA== + +value-or-promise@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.10.tgz#5bf041f1e9a8e7043911875547636768a836e446" + integrity sha512-1OwTzvcfXkAfabk60UVr5NdjtjJ0Fg0T5+B1bhxtrOEwSH2fe8y4DnLgoksfCyd8yZCOQQHB0qLMQnwgCjbXLQ== + +value-or-promise@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" + integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== + +value-or-promise@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.6.tgz#218aa4794aa2ee24dcf48a29aba4413ed584747f" + integrity sha512-9r0wQsWD8z/BxPOvnwbPf05ZvFngXyouE9EKB+5GbYix+BYnAwrIChCUyFIinfbf2FL/U71z+CPpbnmTdxrwBg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" + integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webpack-cli@^4.6.0: + version "4.7.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.2.tgz#a718db600de6d3906a4357e059ae584a89f4c1a5" + integrity sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.0.4" + "@webpack-cli/info" "^1.3.0" + "@webpack-cli/serve" "^1.5.1" + colorette "^1.2.1" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.1.14: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-graphql-loader@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/webpack-graphql-loader/-/webpack-graphql-loader-1.0.2.tgz#b7da119bea3063c1b13068c9c7bb01b203d3468b" + integrity sha512-tMcfC/IPMYO8RXsihjMcOplOnyTFqVUHXYZN5mRNIuDy8ADNvqYWVqs3Qi/YBP+U05uesdy9UUvf7N8QZtkc5Q== + dependencies: + apollo-codegen "^0.19.1" + loader-utils "^1.1.0" + pify "^3.0.0" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack@^5.0.0: + version "5.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.46.0.tgz#105d20d96f79db59b316b0ae54316f0f630314b5" + integrity sha512-qxD0t/KTedJbpcXUmvMxY5PUvXDbF8LsThCzqomeGaDlCA6k998D8yYVwZMvO8sSM3BTEOaD4uzFniwpHaTIJw== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.0" + es-module-lexer "^0.7.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.2.0" + webpack-sources "^2.3.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + 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.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-fetch@^3.4.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@7.4.5: + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== + +"ws@^5.2.0 || ^6.0.0 || ^7.0.0": + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml-ast-parser@^0.0.43: + version "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.2, yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@>=13.1.2, yargs-parser@^13.1.2, yargs-parser@^18.1.2, yargs-parser@^20.2.2, yargs-parser@^8.1.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.3.1: + version "15.4.1" + 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" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.0: + version "17.2.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" + integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yarn@^1.22.19: + version "1.22.19" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.19.tgz#4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" + integrity sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zen-observable-ts@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" + integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== + dependencies: + zen-observable "0.8.15" + +zen-observable-ts@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable@0.8.15, zen-observable@^0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/package.json b/package.json index ddeb6b684..5a5ba6f3b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "lint": "lage lint --continue", "lage": "lage", "ci": "yarn lage build types test lint && yarn checkchange", - "beachball": "beachball -b origin/main", + "beachball": "beachball -b origin/alloy/relay-apollo-duct-tape", "change": "yarn beachball change", "checkchange": "yarn beachball check", "release": "yarn beachball publish -t latest", @@ -33,8 +33,11 @@ "@graphql-eslint/eslint-plugin": "^3.7.0" }, "resolutions": { + "@types/relay-runtime": "^14.1.2", + "relay-runtime": "^15.0.0", "cross-fetch": "^3.1.5", "glob-parent": "^6.0.2", + "graphql": "^15.5.0", "minimist": "^1.2.6", "node-fetch": "^2.6.7", "node-forge": "^1.3.1", diff --git a/packages/apollo-mock-client/src/index.ts b/packages/apollo-mock-client/src/index.ts index d706064c0..399c38078 100644 --- a/packages/apollo-mock-client/src/index.ts +++ b/packages/apollo-mock-client/src/index.ts @@ -5,11 +5,13 @@ import { InMemoryCache, } from "@apollo/client"; import type { + ApolloCache, Operation, FetchResult, NormalizedCacheObject, InMemoryCacheConfig, } from "@apollo/client"; +import type { SubscriptionObserver } from "zen-observable-ts"; import { assertType, isAbstractType } from "graphql"; import type { DocumentNode, ExecutionResult, GraphQLSchema } from "graphql"; import invariant from "invariant"; @@ -179,7 +181,7 @@ class MockLink extends ApolloLink { function executeOperationMockResolver( resolver: OperationMockResolver, operation: OperationDescriptor, - observer: ZenObservable.SubscriptionObserver, + observer: SubscriptionObserver, ) { const resolved = resolver(operation); if (resolved) { @@ -197,7 +199,7 @@ function executeOperationMockResolver( class Mock implements MockFunctions { private operations: Map< OperationDescriptor, - ZenObservable.SubscriptionObserver + SubscriptionObserver >; private resolversQueue: OperationMockResolver[]; @@ -209,7 +211,7 @@ class Mock implements MockFunctions { public addOperation( operation: OperationDescriptor, - observer: ZenObservable.SubscriptionObserver, + observer: SubscriptionObserver, ) { for (const resolver of this.resolversQueue) { if (executeOperationMockResolver(resolver, operation, observer)) { @@ -318,20 +320,31 @@ class Mock implements MockFunctions { export function createMockClient( schema: GraphQLSchema, - options?: { cache?: InMemoryCacheConfig }, + options?: { + cache?: ApolloCache; + inMemoryCacheConfig?: InMemoryCacheConfig; + }, ): ApolloMockClient { - // Build a list of abstract types and their possible types. - // TODO: Cache this on the schema? - const possibleTypes: Record = {}; - Object.keys(schema.getTypeMap()).forEach((typeName) => { - const type = schema.getType(typeName); - assertType(type); - if (isAbstractType(type)) { - possibleTypes[typeName] = schema - .getPossibleTypes(type) - .map((possibleType) => possibleType.name); - } - }); + let cache = options?.cache; + if (!cache) { + // Build a list of abstract types and their possible types. + // TODO: Cache this on the schema? + const possibleTypes: Record = {}; + Object.keys(schema.getTypeMap()).forEach((typeName) => { + const type = schema.getType(typeName); + assertType(type); + if (isAbstractType(type)) { + possibleTypes[typeName] = schema + .getPossibleTypes(type) + .map((possibleType) => possibleType.name); + } + }); + cache = new InMemoryCache({ + addTypename: true, + possibleTypes, + ...options?.inMemoryCacheConfig, + }); + } const link = new MockLink(schema); @@ -340,11 +353,7 @@ export function createMockClient( ApolloClientExtension >( new ApolloClient({ - cache: new InMemoryCache({ - addTypename: true, - ...options?.cache, - possibleTypes, - }), + cache, link, }), { diff --git a/packages/apollo-react-relay-duct-tape/src/__tests__/hooks.test.tsx b/packages/apollo-react-relay-duct-tape/src/__tests__/hooks.test.tsx index c0988509d..67e4ab1c5 100644 --- a/packages/apollo-react-relay-duct-tape/src/__tests__/hooks.test.tsx +++ b/packages/apollo-react-relay-duct-tape/src/__tests__/hooks.test.tsx @@ -164,7 +164,9 @@ const MutationComponent: React.FC<{ let client: ApolloMockClient; beforeEach(() => { - client = createMockClient(schema, { cache: { addTypename: false } }); + client = createMockClient(schema, { + inMemoryCacheConfig: { addTypename: false }, + }); }); describe(useLazyLoadQuery, () => { diff --git a/packages/apollo-react-relay-duct-tape/src/storeObservation/__tests__/compiledHooks.test.tsx b/packages/apollo-react-relay-duct-tape/src/storeObservation/__tests__/compiledHooks.test.tsx index dd50e58e0..f839a8413 100644 --- a/packages/apollo-react-relay-duct-tape/src/storeObservation/__tests__/compiledHooks.test.tsx +++ b/packages/apollo-react-relay-duct-tape/src/storeObservation/__tests__/compiledHooks.test.tsx @@ -239,11 +239,7 @@ describe.each([ backwardUsePaginationFragmentResult = []; componentOnQueryTypeResult = []; client = createMockClient(schema, { - cache: { - possibleTypes: { - Node: ["User"], - NodeWithPetAvatarAndConversations: ["User"], - }, + inMemoryCacheConfig: { typePolicies, ...(typePolicies === typePoliciesWithDefaultApolloClientStoreKeys ? {} diff --git a/packages/graphql-codegen-relay-ir-plugin/.eslintrc.json b/packages/graphql-codegen-relay-ir-plugin/.eslintrc.json new file mode 100644 index 000000000..d70e13c4c --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": ["../../.eslintrc.json"], + "root": true +} diff --git a/packages/graphql-codegen-relay-ir-plugin/CHANGELOG.json b/packages/graphql-codegen-relay-ir-plugin/CHANGELOG.json new file mode 100644 index 000000000..bfce677dc --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/CHANGELOG.json @@ -0,0 +1,227 @@ +{ + "name": "@graphitation/graphql-codegen-relay-ir-plugin", + "entries": [ + { + "date": "Wed, 04 Oct 2023 10:42:36 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.3.0", + "version": "1.3.0", + "comments": { + "minor": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "c01a5584b549e1fde6a4554dc190e39c2ee82b5d", + "comment": "Alpha work progress" + } + ] + } + }, + { + "date": "Thu, 07 Sep 2023 13:06:12 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.2.5", + "version": "1.2.5", + "comments": { + "patch": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "1a6beb1dde3e356192b9fbee612b64ebe239c5f3", + "comment": "Continuing with stuff" + } + ] + } + }, + { + "date": "Sat, 28 Jan 2023 13:45:56 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.2.4", + "version": "1.2.4", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "c3a1eca7e724da31bc535a83826f879a8b3d6563", + "comment": "Inline fragments into operation IR" + }, + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "d3a6ce1ebecd942b25061a76f897152e4e92e6f4", + "comment": "Vendor inline transform and patch only that for our needs" + } + ] + } + }, + { + "date": "Thu, 26 Jan 2023 21:25:11 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.2.3", + "version": "1.2.3", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "25dc9b0a47ea0eb84a0dcdc2f6445d41a511023f", + "comment": "Emit complete Relay IR" + } + ] + } + }, + { + "date": "Mon, 23 Jan 2023 12:48:15 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.2.2", + "version": "1.2.2", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "c6476ca1546acc94452106530f5b2efbb6d951e0", + "comment": "Handle config where all docs are in single file" + } + ] + } + }, + { + "date": "Sat, 21 Jan 2023 13:26:03 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.2.1", + "version": "1.2.1", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "0707f94f9be3f875a5f97a8887ccbdfe285e14e3", + "comment": "Fix fragment name deduping" + } + ] + } + }, + { + "date": "Sat, 21 Jan 2023 12:52:10 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.2.0", + "version": "1.2.0", + "comments": { + "minor": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "0f9655645f91f873ce3d93db521c92effb16fc98", + "comment": "Rewrite IR plugin" + } + ] + } + }, + { + "date": "Fri, 23 Sep 2022 10:39:36 GMT", + "tag": "@graphitation/graphql-codegen-relay-ir-plugin_v1.1.0", + "version": "1.1.0", + "comments": { + "minor": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/graphql-codegen-relay-ir-plugin", + "commit": "bc7de70d50ffabdfe8e576950eeae74612d3bc5a", + "comment": "Codegen Relay IR" + } + ] + } + }, + { + "date": "Fri, 24 Jun 2022 11:59:47 GMT", + "tag": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin_v0.1.4", + "version": "0.1.4", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin", + "comment": "Bump @graphitation/supermassive to v0.8.5", + "commit": "b5bdd2ea6807e2fdd102eb1027878e2bda345c12" + } + ] + } + }, + { + "date": "Thu, 23 Jun 2022 14:40:50 GMT", + "tag": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin_v0.1.3", + "version": "0.1.3", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin", + "comment": "Bump @graphitation/supermassive to v0.8.4", + "commit": "5f6fbe36764d9e453f907c5840d04c1a00833416" + } + ] + } + }, + { + "date": "Mon, 20 Jun 2022 12:54:16 GMT", + "tag": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin_v0.1.2", + "version": "0.1.2", + "comments": { + "patch": [ + { + "author": "jakubvejr@microsoft.com", + "package": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin", + "commit": "68f1b925f86d314f156b9b9e42514e329f036046", + "comment": "version bump - npmignore modified" + } + ] + } + }, + { + "date": "Thu, 16 Jun 2022 21:57:11 GMT", + "tag": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin_v0.1.1", + "version": "0.1.1", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin", + "commit": "967f207d3a5e69bcfb4b2f146cec67179a453e48", + "comment": "No-op bump" + } + ] + } + }, + { + "date": "Mon, 13 Jun 2022 15:37:16 GMT", + "tag": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin_v0.1.0", + "version": "0.1.0", + "comments": { + "none": [ + { + "author": "beachball", + "package": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin", + "comment": "Bump @graphitation/supermassive to v0.8.3", + "commit": "a0a12b2193c85d419cf018560adce1370afa4121" + } + ] + } + }, + { + "date": "Fri, 10 Jun 2022 14:09:50 GMT", + "tag": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin_v0.1.0", + "version": "0.1.0", + "comments": { + "minor": [ + { + "author": "jakubvejr@microsoft.com", + "package": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin", + "commit": "9985dd0fb3e8b80807b3118e6b5f2d20df8397b3", + "comment": "Supermassive typed document node plugin added" + }, + { + "author": "beachball", + "package": "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin", + "comment": "Bump @graphitation/supermassive to v0.8.3", + "commit": "2f8bfe127192958c94261fd1e6ba998247204a31" + } + ] + } + } + ] +} diff --git a/packages/graphql-codegen-relay-ir-plugin/CHANGELOG.md b/packages/graphql-codegen-relay-ir-plugin/CHANGELOG.md new file mode 100644 index 000000000..0ffea0649 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/CHANGELOG.md @@ -0,0 +1,111 @@ +# Change Log - @graphitation/graphql-codegen-relay-ir-plugin + +This log was last generated on Wed, 04 Oct 2023 10:42:36 GMT and should not be manually modified. + + + +## 1.3.0 + +Wed, 04 Oct 2023 10:42:36 GMT + +### Minor changes + +- Alpha work progress (mnovikov@microsoft.com) + +## 1.2.5 + +Thu, 07 Sep 2023 13:06:12 GMT + +### Patches + +- Continuing with stuff (mnovikov@microsoft.com) + +## 1.2.4 + +Sat, 28 Jan 2023 13:45:56 GMT + +### Patches + +- Inline fragments into operation IR (eloy.de.enige@gmail.com) +- Vendor inline transform and patch only that for our needs (eloy.de.enige@gmail.com) + +## 1.2.3 + +Thu, 26 Jan 2023 21:25:11 GMT + +### Patches + +- Emit complete Relay IR (eloy.de.enige@gmail.com) + +## 1.2.2 + +Mon, 23 Jan 2023 12:48:15 GMT + +### Patches + +- Handle config where all docs are in single file (eloy.de.enige@gmail.com) + +## 1.2.1 + +Sat, 21 Jan 2023 13:26:03 GMT + +### Patches + +- Fix fragment name deduping (eloy.de.enige@gmail.com) + +## 1.2.0 + +Sat, 21 Jan 2023 12:52:10 GMT + +### Minor changes + +- Rewrite IR plugin (eloy.de.enige@gmail.com) + +## 1.1.0 + +Fri, 23 Sep 2022 10:39:36 GMT + +### Minor changes + +- Codegen Relay IR (mnovikov@microsoft.com) + +## 0.1.4 + +Fri, 24 Jun 2022 11:59:47 GMT + +### Patches + +- Bump @graphitation/supermassive to v0.8.5 + +## 0.1.3 + +Thu, 23 Jun 2022 14:40:50 GMT + +### Patches + +- Bump @graphitation/supermassive to v0.8.4 + +## 0.1.2 + +Mon, 20 Jun 2022 12:54:16 GMT + +### Patches + +- version bump - npmignore modified (jakubvejr@microsoft.com) + +## 0.1.1 + +Thu, 16 Jun 2022 21:57:11 GMT + +### Patches + +- No-op bump (eloy.de.enige@gmail.com) + +## 0.1.0 + +Fri, 10 Jun 2022 14:09:50 GMT + +### Minor changes + +- Supermassive typed document node plugin added (jakubvejr@microsoft.com) +- Bump @graphitation/supermassive to v0.8.3 diff --git a/packages/graphql-codegen-relay-ir-plugin/README.md b/packages/graphql-codegen-relay-ir-plugin/README.md new file mode 100644 index 000000000..22a2879ce --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/README.md @@ -0,0 +1,22 @@ +# Custom GraphQL codegen plugins + +## supermassive-relay-ir-plugin + +Add relay IR as one of the exports + +TODO: THIS IS YARN LINK FRIENDLY RN. +Remove graphql from app node_module before using +Update this package to be release friendly +Add transform possibility + +graphql imports should be resolved (see config obj of near operations) + +use ast instead of parsing when possible + +or add fragments directly to compiler context + +? have compiler context that's reused / cached? + +see why it's so f slow + +add addTypename option to RelayApolloCache to add the field selection to outgoing documents and ensure the Relay IR also includes it if it needs it diff --git a/packages/graphql-codegen-relay-ir-plugin/package.json b/packages/graphql-codegen-relay-ir-plugin/package.json new file mode 100644 index 000000000..9c8a85d28 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/package.json @@ -0,0 +1,50 @@ +{ + "name": "@graphitation/graphql-codegen-relay-ir-plugin", + "license": "MIT", + "version": "1.3.0", + "main": "./lib/index", + "repository": { + "type": "git", + "url": "https://github.com/microsoft/graphitation.git", + "directory": "packages/graphql-codegen-relay-ir-plugin" + }, + "scripts": { + "build": "monorepo-scripts build", + "lint": "monorepo-scripts lint", + "test": "monorepo-scripts test", + "types": "monorepo-scripts types", + "just": "monorepo-scripts" + }, + "devDependencies": { + "@graphitation/supermassive": "*", + "@graphql-codegen/plugin-helpers": "^1.18.2", + "@graphql-codegen/visitor-plugin-common": "^1.17.20", + "@types/jest": "^26.0.22", + "graphql-tag": "^2.11.0", + "@graphql-tools/optimize": "^1.0.1", + "monorepo-scripts": "*", + "@types/relay-compiler": "^8.0.0" + }, + "peerDependencies": { + "@graphql-codegen/plugin-helpers": ">= 1.18.0 < 2", + "@graphql-codegen/visitor-plugin-common": ">= ^1.17.0 < 2", + "graphql-tag": ">= 2.11.0 < 3", + "@graphql-tools/optimize": "^1.0.1" + }, + "dependencies": { + "relay-compiler": "^12.0.0" + }, + "sideEffects": false, + "access": "public", + "publishConfig": { + "main": "./lib/index", + "types": "./lib/index.d.ts", + "module": "./lib/index.mjs", + "exports": { + ".": { + "import": "./lib/index.mjs", + "require": "./lib/index.js" + } + } + } +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/AbstractType.graphql b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/AbstractType.graphql new file mode 100644 index 000000000..8e51d80cb --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/AbstractType.graphql @@ -0,0 +1,5 @@ +query AbstractType { + node(id: "42") { + id + } +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/Connection.graphql b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/Connection.graphql new file mode 100644 index 000000000..847fcf4db --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/Connection.graphql @@ -0,0 +1,16 @@ +query ConnectionQuery { + conversation(id: "42") { + ...Messages_conversation + } +} + +fragment Messages_conversation on Conversation { + messages(first: 10, sort: DESC, deferPresence: true) + @connection(key: "Connection_messages", filter: ["sort"]) { + edges { + node { + id + } + } + } +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/ConversationFragment.graphql b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/ConversationFragment.graphql new file mode 100644 index 000000000..1e0968f98 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/ConversationFragment.graphql @@ -0,0 +1,10 @@ +fragment ConversationFragment on Conversation { + id + messages(first: 10) { + edges { + node { + ...MessageFragment + } + } + } +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/MessageFragment.graphql b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/MessageFragment.graphql new file mode 100644 index 000000000..6bffe2a25 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/MessageFragment.graphql @@ -0,0 +1,3 @@ +fragment MessageFragment on Message { + text +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/MultipleOperations.graphql b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/MultipleOperations.graphql new file mode 100644 index 000000000..0dcc9c987 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/MultipleOperations.graphql @@ -0,0 +1,11 @@ +query QueryOne { + conversation(id: "42") { + __typename + } +} + +query QueryTwo { + conversation(id: "42") { + id + } +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/SomeQuery.graphql b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/SomeQuery.graphql new file mode 100644 index 000000000..df5ece2bc --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/SomeQuery.graphql @@ -0,0 +1,5 @@ +query SomeQuery { + conversation(id: "42") { + ...ConversationFragment + } +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/schema.graphql b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/schema.graphql new file mode 100644 index 000000000..037b266b1 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__fixtures__/schema.graphql @@ -0,0 +1,61 @@ +directive @connection(key: String!, filter: [String]) on FIELD + +type Query { + conversation(id: String!): Conversation! + node(id: ID!): Node +} + +type Mutation { + updateConversation(id: String!, title: String!): Conversation! + createMessage(conversationId: String!): Message! +} + +type Subscription { + messageCreated(conversationId: String!): Message! + conversationUpdated: Conversation! +} + +interface Node { + id: ID! +} + +enum Sort { + ASC + DESC +} + +type Conversation implements Node { + id: ID! + title: String! + hasUnreadMessages: Boolean! + messages( + first: Int! + after: String + sort: Sort + deferPresence: Boolean + ): MessagesConnection! +} + +type MessagesConnection { + edges: [MessagesConnectionEdge!]! + pageInfo: PageInfo +} + +type PageInfo { + startCursor: String + endCursor: String + hasNextPage: Boolean + hasPreviousPage: Boolean +} + +type MessagesConnectionEdge { + cursor: String + node: Message! +} + +type Message { + id: ID! + authorId: String! + text: String! + createdAt: String! +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__snapshots__/plugin.test.ts.snap b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__snapshots__/plugin.test.ts.snap new file mode 100644 index 000000000..683db4e8f --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/__snapshots__/plugin.test.ts.snap @@ -0,0 +1,750 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`plugin adds __typename selections for abstract types 1`] = ` +"(AbstractTypeDocument as any).__relay = (function(){ +var v0 = [ + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "id", + "value": "42" + } + ], + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null + } + ], + "storageKey": "node(id:\\"42\\")" + } +]; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "AbstractType", + "selections": (v0/*: any*/), + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "AbstractType", + "selections": (v0/*: any*/) + }, + "params": { + "cacheID": "b0e97e319cfdd8a7251be99fa78aa658", + "metadata": {}, + "name": "AbstractType", + "operationKind": "query", + "text": null + } +}; +})(); +(AbstractTypeDocument as any).__relay.hash = "b0e97e319cfdd8a7251be99fa78aa658";" +`; + +exports[`plugin emits connection metadata 1`] = ` +"(ConnectionQueryDocument as any).__relay = (function(){ +var v0 = [ + { + "kind": "Literal", + "name": "id", + "value": "42" + } +], +v1 = { + "kind": "Literal", + "name": "sort", + "value": "DESC" +}, +v2 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v3 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}, +v4 = [ + { + "alias": null, + "args": null, + "concreteType": "MessagesConnectionEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Message", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v3/*: any*/) + ], + "storageKey": null + }, + (v3/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + } + ], + "storageKey": null + }, + (v3/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "endCursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasNextPage", + "storageKey": null + } + ], + "storageKey": null + } +], +v5 = [ + { + "kind": "Literal", + "name": "deferPresence", + "value": true + }, + { + "kind": "Literal", + "name": "first", + "value": 10 + }, + (v1/*: any*/) +]; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "ConnectionQuery", + "selections": [ + { + "alias": null, + "args": (v0/*: any*/), + "concreteType": "Conversation", + "kind": "LinkedField", + "name": "conversation", + "plural": false, + "selections": [ + { + "alias": "messages", + "args": [ + (v1/*: any*/) + ], + "concreteType": "MessagesConnection", + "kind": "LinkedField", + "name": "__Connection_messages_connection", + "plural": false, + "selections": (v4/*: any*/), + "storageKey": "__Connection_messages_connection(sort:\\"DESC\\")" + }, + (v3/*: any*/) + ], + "storageKey": "conversation(id:\\"42\\")" + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "ConnectionQuery", + "selections": [ + { + "alias": null, + "args": (v0/*: any*/), + "concreteType": "Conversation", + "kind": "LinkedField", + "name": "conversation", + "plural": false, + "selections": [ + { + "alias": null, + "args": (v5/*: any*/), + "concreteType": "MessagesConnection", + "kind": "LinkedField", + "name": "messages", + "plural": false, + "selections": (v4/*: any*/), + "storageKey": "messages(deferPresence:true,first:10,sort:\\"DESC\\")" + }, + { + "alias": null, + "args": (v5/*: any*/), + "filters": [ + "sort" + ], + "handle": "connection", + "key": "Connection_messages", + "kind": "LinkedHandle", + "name": "messages" + }, + (v3/*: any*/), + (v2/*: any*/) + ], + "storageKey": "conversation(id:\\"42\\")" + } + ] + }, + "params": { + "cacheID": "dc085550152a35010da2467e00bb6516", + "metadata": {}, + "name": "ConnectionQuery", + "operationKind": "query", + "text": null + } +}; +})(); +(ConnectionQueryDocument as any).__relay.hash = "dc085550152a35010da2467e00bb6516"; +(Messages_conversationFragmentDoc as any).__relay = (function(){ +var v0 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}; +return { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": { + "connection": [ + { + "count": null, + "cursor": null, + "direction": "forward", + "path": [ + "messages" + ] + } + ] + }, + "name": "Messages_conversation", + "selections": [ + { + "alias": "messages", + "args": [ + { + "kind": "Literal", + "name": "sort", + "value": "DESC" + } + ], + "concreteType": "MessagesConnection", + "kind": "LinkedField", + "name": "__Connection_messages_connection", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "MessagesConnectionEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Message", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + (v0/*: any*/) + ], + "storageKey": null + }, + (v0/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + } + ], + "storageKey": null + }, + (v0/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "endCursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasNextPage", + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "__Connection_messages_connection(sort:\\"DESC\\")" + }, + (v0/*: any*/) + ], + "type": "Conversation", + "abstractKey": null +}; +})(); +(Messages_conversationFragmentDoc as any).__relay.hash = "24b79d122bbfb2fa8f8a86603c6dd84f";" +`; + +exports[`plugin generates a ConcreteRequest for an operation 1`] = ` +"(SomeQueryDocument as any).__relay = (function(){ +var v0 = [ + { + "kind": "Literal", + "name": "id", + "value": "42" + } +], +v1 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v2 = [ + { + "kind": "Literal", + "name": "first", + "value": 10 + } +], +v3 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null +}, +v4 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "SomeQuery", + "selections": [ + { + "alias": null, + "args": (v0/*: any*/), + "concreteType": "Conversation", + "kind": "LinkedField", + "name": "conversation", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": (v2/*: any*/), + "concreteType": "MessagesConnection", + "kind": "LinkedField", + "name": "messages", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "MessagesConnectionEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Message", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v3/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "messages(first:10)" + }, + (v4/*: any*/) + ], + "storageKey": "conversation(id:\\"42\\")" + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "SomeQuery", + "selections": [ + { + "alias": null, + "args": (v0/*: any*/), + "concreteType": "Conversation", + "kind": "LinkedField", + "name": "conversation", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": (v2/*: any*/), + "concreteType": "MessagesConnection", + "kind": "LinkedField", + "name": "messages", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "MessagesConnectionEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Message", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v3/*: any*/), + (v1/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "messages(first:10)" + }, + (v4/*: any*/) + ], + "storageKey": "conversation(id:\\"42\\")" + } + ] + }, + "params": { + "cacheID": "a9652ac0095a5cf48982c637e4cab192", + "metadata": {}, + "name": "SomeQuery", + "operationKind": "query", + "text": null + } +}; +})(); +(SomeQueryDocument as any).__relay.hash = "a9652ac0095a5cf48982c637e4cab192";" +`; + +exports[`plugin generates a ReaderFragment for a fragment 1`] = ` +"(ConversationFragmentFragmentDoc as any).__relay = (function(){ +var v0 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}; +return { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "ConversationFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 10 + } + ], + "concreteType": "MessagesConnection", + "kind": "LinkedField", + "name": "messages", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "MessagesConnectionEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Message", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "text", + "storageKey": null + }, + (v0/*: any*/) + ], + "storageKey": null + }, + (v0/*: any*/) + ], + "storageKey": null + }, + (v0/*: any*/) + ], + "storageKey": "messages(first:10)" + }, + (v0/*: any*/) + ], + "type": "Conversation", + "abstractKey": null +}; +})(); +(ConversationFragmentFragmentDoc as any).__relay.hash = "d9f91ad3ffab60368ac2293bffef7f57";" +`; + +exports[`plugin handles multiple operations in a single document 1`] = ` +"(QueryOneDocument as any).__relay = (function(){ +var v0 = [ + { + "kind": "Literal", + "name": "id", + "value": "42" + } +], +v1 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "QueryOne", + "selections": [ + { + "alias": null, + "args": (v0/*: any*/), + "concreteType": "Conversation", + "kind": "LinkedField", + "name": "conversation", + "plural": false, + "selections": [ + (v1/*: any*/) + ], + "storageKey": "conversation(id:\\"42\\")" + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "QueryOne", + "selections": [ + { + "alias": null, + "args": (v0/*: any*/), + "concreteType": "Conversation", + "kind": "LinkedField", + "name": "conversation", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + } + ], + "storageKey": "conversation(id:\\"42\\")" + } + ] + }, + "params": { + "cacheID": "2ce7aba0ae94e184e092aaa4b36cbf96", + "metadata": {}, + "name": "QueryOne", + "operationKind": "query", + "text": null + } +}; +})(); +(QueryOneDocument as any).__relay.hash = "2ce7aba0ae94e184e092aaa4b36cbf96"; +(QueryTwoDocument as any).__relay = (function(){ +var v0 = [ + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "id", + "value": "42" + } + ], + "concreteType": "Conversation", + "kind": "LinkedField", + "name": "conversation", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null + } + ], + "storageKey": "conversation(id:\\"42\\")" + } +]; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "QueryTwo", + "selections": (v0/*: any*/), + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "QueryTwo", + "selections": (v0/*: any*/) + }, + "params": { + "cacheID": "8632c780e7fb1f3def0041795d947440", + "metadata": {}, + "name": "QueryTwo", + "operationKind": "query", + "text": null + } +}; +})(); +(QueryTwoDocument as any).__relay.hash = "8632c780e7fb1f3def0041795d947440";" +`; diff --git a/packages/graphql-codegen-relay-ir-plugin/src/__tests__/plugin.test.ts b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/plugin.test.ts new file mode 100644 index 000000000..24c7391b8 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/__tests__/plugin.test.ts @@ -0,0 +1,97 @@ +import { plugin } from "../plugin"; +import { FragmentDefinitionNode } from "graphql"; +import { loadDocuments, loadSchemaSync } from "@graphql-tools/load"; +import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader"; +import * as path from "path"; +import { LoadedFragment } from "@graphql-codegen/visitor-plugin-common"; + +const schema = loadSchemaSync( + path.join(__dirname, "__fixtures__", "schema.graphql"), + { + loaders: [new GraphQLFileLoader()], + }, +); + +async function loadFixture(name: string) { + return loadDocuments(path.join(__dirname, "__fixtures__", name), { + loaders: [new GraphQLFileLoader()], + skipGraphQLImport: true, + }); +} + +describe(plugin, () => { + it("generates a ConcreteRequest for an operation", async () => { + const operation = await loadFixture("SomeQuery.graphql"); + const fragments = await loadFixture("*Fragment.graphql"); + + const { content } = await plugin(schema, operation, { + externalFragments: fragments.map( + (fragment) => + ({ + name: (fragment.document?.definitions[0] as FragmentDefinitionNode) + .name.value, + node: fragment.document?.definitions[0], + } as LoadedFragment), + ), + }); + + expect(content).toMatchSnapshot(); + }); + + it("generates a ReaderFragment for a fragment", async () => { + const mainFragment = await loadFixture("ConversationFragment.graphql"); + const fragments = await loadFixture("MessageFragment.graphql"); + + const { content } = await plugin(schema, mainFragment, { + externalFragments: fragments.map( + (fragment) => + ({ + name: (fragment.document?.definitions[0] as FragmentDefinitionNode) + .name.value, + node: fragment.document?.definitions[0], + } as LoadedFragment), + ), + }); + + expect(content).toMatchSnapshot(); + }); + + it("dedupes operation suffixes", async () => { + const mainFragment = await loadFixture("MessageFragment.graphql"); + const { content } = await plugin(schema, mainFragment, { + externalFragments: [], + dedupeOperationSuffix: true, + }); + expect(content).toMatch(/MessageFragmentDoc/); + }); + + it("handles multiple operations in a single document", async () => { + const operation = await loadFixture("MultipleOperations.graphql"); + + const { content } = await plugin(schema, operation, { + externalFragments: [], + }); + + expect(content).toMatchSnapshot(); + }); + + it("adds __typename selections for abstract types", async () => { + const operation = await loadFixture("AbstractType.graphql"); + + const { content } = await plugin(schema, operation, { + externalFragments: [], + }); + + expect(content).toMatchSnapshot(); + }); + + it("emits connection metadata", async () => { + const operation = await loadFixture("Connection.graphql"); + + const { content } = await plugin(schema, operation, { + externalFragments: [], + }); + + expect(content).toMatchSnapshot(); + }); +}); diff --git a/packages/graphql-codegen-relay-ir-plugin/src/index.ts b/packages/graphql-codegen-relay-ir-plugin/src/index.ts new file mode 100644 index 000000000..39b9a61b2 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/index.ts @@ -0,0 +1 @@ +export * from "./plugin"; diff --git a/packages/graphql-codegen-relay-ir-plugin/src/plugin.ts b/packages/graphql-codegen-relay-ir-plugin/src/plugin.ts new file mode 100644 index 000000000..1e9b07f8f --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/plugin.ts @@ -0,0 +1,288 @@ +import { printSchema, Source, visit as visitAST } from "graphql"; +import { create as createRelaySchema } from "relay-compiler/lib/core/Schema"; +import { transform as transformToIR } from "relay-compiler/lib/core/RelayParser"; +import * as IRTransformer from "relay-compiler/lib/core/IRTransformer"; +import CompilerContext, { + IRTransform, +} from "relay-compiler/lib/core/CompilerContext"; +import dedupeJSONStringify from "relay-compiler/lib/util/dedupeJSONStringify"; +import crypto from "crypto"; + +import compileRelayArtifacts from "relay-compiler/lib/codegen/compileRelayArtifacts"; +import * as InlineFragmentsTransform from "./vendor/relay-compiler-v12.0.0/lib/transforms/InlineFragmentsTransform"; +import * as RelayIRTransforms from "relay-compiler/lib/core/RelayIRTransforms"; + +import { PluginFunction, Types } from "@graphql-codegen/plugin-helpers"; +import type { RawClientSideBasePluginConfig } from "@graphql-codegen/visitor-plugin-common"; +import type { + ASTNode, + DocumentNode, + FragmentDefinitionNode, + OperationDefinitionNode, +} from "graphql"; +import type { Schema } from "relay-compiler/lib/core/Schema"; +import type { + GeneratedNode, + ConcreteRequest, + ReaderFragment, +} from "relay-runtime"; +import invariant from "invariant"; + +const SchemaCache = new WeakMap(); + +const SCHEMA_EXTENSIONS = ` + directive @connection(key: String!, filter: [String]) on FIELD +`; + +// Inline all fragments, including for ReaderFragments, but do not remove them. +const PluginIRTransforms = { + ...RelayIRTransforms, + relayPrintTransforms: RelayIRTransforms.printTransforms.filter( + (transform) => { + transform.name !== "filterDirectivesTransform"; + }, + ), + fragmentTransforms: [ + InlineFragmentsTransform.transform, + ...RelayIRTransforms.fragmentTransforms, + ], + codegenTransforms: RelayIRTransforms.codegenTransforms + .filter((transform) => { + console.log(transform.name); + return ( + transform.name !== "generateTypeNameTransform" && + transform.name !== "filterDirectivesTransform" + ); + }) + .map((transform) => + // FIXME: This isn't actually removing the transform, but unsure what the + // ramifications are of removing this now. + transform.name === "InlineFragmentsTransform" + ? InlineFragmentsTransform.transform + : transform, + ), +}; + +/** + * Changes the name of the "filter" argument to "filters" to match what + * relay-compiler expects. + */ +const ConnectionFilterPluralizationTransform: IRTransform = (context) => + IRTransformer.transform(context, { + Directive: (node) => + node.name === "connection" && + node.args.find((arg) => arg.name === "filter") + ? { + ...node, + args: node.args.map((arg) => + arg.name === "filter" ? { ...arg, name: "filters" } : arg, + ), + } + : node, + }); + +export const plugin: PluginFunction< + RawClientSideBasePluginConfig, + Types.ComplexPluginOutput +> = async (schema, documents, config, _info) => { + if (!SchemaCache.has(schema)) { + SchemaCache.set( + schema, + createRelaySchema( + new Source(SCHEMA_EXTENSIONS + "\n\n" + printSchema(schema)), + ), + ); + } + + const relaySchema = SchemaCache.get(schema); + const nodes = collectIRNodes(relaySchema, documents, config); + + let compilerContext = new CompilerContext(relaySchema); + for (const node of nodes) { + compilerContext = compilerContext.add(node); + } + compilerContext = compilerContext.applyTransform( + ConnectionFilterPluralizationTransform, + ); + + const generatedNodes = compileRelayArtifacts( + compilerContext, + PluginIRTransforms, + ).map(([_, node]) => + isConcreteRequest(node) + ? // We do not need to include the operation text, at this time. + { ...node, params: { ...node.params, text: null } } + : node, + ); + + console.log(JSON.stringify(generatedNodes, null, 2)); + + return { + content: generatedNodes + .filter(isNodePartOfMainDocuments(documents)) + .flatMap(generateVariableDefinitions(config)) + .join("\n"), + }; +}; + +const generateVariableDefinitions = (config: RawClientSideBasePluginConfig) => { + return (node: GeneratedNode): string[] => { + const variable = getVariableName(node, config); + const json = dedupeJSONStringify(node); + return [ + `(${variable} as any).__relay = ${json};`, + `(${variable} as any).__relay.hash = "${ + isConcreteRequest(node) && (node.params as any).cacheID + ? // For a ConcreteRequest we can re-use the cacheID and avoid some overhead + (node.params as any).cacheID + : // For a ReaderFragment we need to generate a hash ourselves + crypto.createHash("md5").update(json, "utf8").digest("hex") + }";`, + ]; + }; +}; + +function isNodePartOfMainDocuments(documents: Types.DocumentFile[]) { + const operationsInDocument = documents.flatMap((source) => + source + .document!.definitions.filter((def) => def.kind === "OperationDefinition") + .map((def) => (def as OperationDefinitionNode).name!.value), + ); + const fragmentsInDocument = documents.flatMap((source) => + source + .document!.definitions.filter((def) => def.kind === "FragmentDefinition") + .map((def) => (def as FragmentDefinitionNode).name!.value), + ); + return (node: GeneratedNode) => + isConcreteRequest(node) + ? operationsInDocument.includes(node.operation.name) + : isReaderFragment(node) + ? fragmentsInDocument.includes(node.name) + : false; +} + +function isConcreteRequest(node: GeneratedNode): node is ConcreteRequest { + return node.kind === "Request"; +} + +function isReaderFragment(node: GeneratedNode): node is ReaderFragment { + return node.kind === "Fragment"; +} + +// TODO: This name faffing in graphql-codegen isn't really clear to me. It +// would be great if we could just re-use their logic in BaseVisitor, but +// we don't have graphql-js AST nodes here. +function getVariableName( + node: GeneratedNode, + config: RawClientSideBasePluginConfig, +) { + if (isConcreteRequest(node)) { + const name = node.operation.name; + return `${name}${config.documentVariableSuffix || "Document"}`; + } else if (isReaderFragment(node)) { + const name = node.name; + return `${ + config.dedupeOperationSuffix ? name.replace(/Fragment$/, "") : name + }${config.fragmentVariableSuffix || "FragmentDoc"}`; + } else { + throw new Error("Unexpected node type"); + } +} + +function collectIRNodes( + schema: Schema, + documents: Types.DocumentFile[], + config: RawClientSideBasePluginConfig, +) { + const operationNodes = new Map(); + const fragmentNodes = new Map(); + + documents.forEach((doc) => { + invariant(doc.document, "Expected document to be parsed"); + const docWithTypenames = addTypename(doc.document); + ( + docWithTypenames.definitions as Array< + OperationDefinitionNode | FragmentDefinitionNode + > + ).forEach((definition) => { + if (definition.kind === "OperationDefinition") { + addNode(operationNodes, definition, doc.location); + } else { + addNode(fragmentNodes, definition, doc.location); + } + }); + }); + + config.externalFragments?.forEach((fragment) => { + addNode(fragmentNodes, fragment.node, fragment.importFrom); + }); + + return transformToIR(schema, [ + ...operationNodes.values(), + ...fragmentNodes.values(), + ]); +} + +function addNode( + nodes: Map, + definition: OperationDefinitionNode | FragmentDefinitionNode, + location: string | undefined | null, +) { + const name = definition.name!.value; + invariant( + nodes.get(name) === undefined || + nodes.get(name)?.loc?.source?.name === location, + "graphql-codegen-relay-ir-plugin: Duplicate definition %s in document %s and %s", + name, + location || "unknown", + nodes.get(name)?.loc?.source?.name || "unknown", + ); + nodes.set(name, definition); +} + +// Doing this on the graphql-js AST for now, because we do the same in our +// patched version of @graphql-codegen/typed-document-node and this will keep +// it in sync more easily. +function addTypename(document: DocumentNode): DocumentNode { + return visitAST(document, { + SelectionSet: { + leave(node, _, parent) { + if ( + parent && + !Array.isArray(parent) && + (parent as ASTNode).kind === "OperationDefinition" + ) { + return; + } + const { selections } = node; + if (!selections) { + return; + } + // Check if there already is an unaliased __typename selection + if ( + selections.some( + (selection) => + selection.kind === "Field" && + selection.name.value === "__typename" && + selection.alias === undefined, + ) + ) { + return; + } + return { + ...node, + selections: [ + ...selections, + { + kind: "Field", + name: { + kind: "Name", + value: "__typename", + }, + }, + ], + }; + }, + }, + }); +} diff --git a/packages/graphql-codegen-relay-ir-plugin/src/vendor/relay-compiler-v12.0.0/lib/transforms/InlineFragmentsTransform.ts b/packages/graphql-codegen-relay-ir-plugin/src/vendor/relay-compiler-v12.0.0/lib/transforms/InlineFragmentsTransform.ts new file mode 100644 index 000000000..22e6e8f06 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/src/vendor/relay-compiler-v12.0.0/lib/transforms/InlineFragmentsTransform.ts @@ -0,0 +1,87 @@ +// NOTE: This version does NOT remove the fragments. + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +// flowlint ambiguous-object-type:error + +"use strict"; + +// const IRTransformer = require('../core/IRTransformer'); +import IRTransformer from "relay-compiler/lib/core/IRTransformer"; + +// const invariant = require("invariant"); +import invariant from "invariant"; + +import type CompilerContext from "relay-compiler/lib/core/CompilerContext"; +import type { + InlineFragment, + Fragment, + FragmentSpread, +} from "relay-compiler/lib/core/IR"; + +type FragmentVisitorCache = Map; +type FragmentVisitor = ( + fragmentSpread: FragmentSpread, +) => FragmentSpread | undefined | null; +/** + * A transform that inlines all fragments and removes them. + */ +function inlineFragmentsTransform(context: CompilerContext): CompilerContext { + const visitFragmentSpread = fragmentSpreadVisitor(new Map()); + return IRTransformer.transform(context, { + // Fragment: visitFragment, + FragmentSpread: visitFragmentSpread, + }); +} + +// function visitFragment(fragment: Fragment): null { +// return null; +// } + +function fragmentSpreadVisitor(cache: FragmentVisitorCache): FragmentVisitor { + return function visitFragmentSpread( + this: any, + fragmentSpread: FragmentSpread, + ) { + let traverseResult = cache.get(fragmentSpread); + if (traverseResult != null) { + return traverseResult; + } + invariant( + fragmentSpread.args.length === 0, + "InlineFragmentsTransform: Cannot flatten fragment spread `%s` with " + + "arguments. Use the `ApplyFragmentArgumentTransform` before flattening", + fragmentSpread.name, + ); + // $FlowFixMe[incompatible-use] + const fragment: Fragment = this.getContext().getFragment( + fragmentSpread.name, + fragmentSpread.loc, + ); + const result: InlineFragment = { + kind: "InlineFragment", + directives: fragmentSpread.directives, + loc: { kind: "Derived", source: fragmentSpread.loc }, + metadata: fragmentSpread.metadata, + selections: fragment.selections, + typeCondition: fragment.type, + }; + // $FlowFixMe[incompatible-use] + traverseResult = this.traverse(result); + cache.set(fragmentSpread, traverseResult as FragmentSpread); + return traverseResult; + }; +} + +// module.exports = { +// transform: inlineFragmentsTransform, +// }; +export { inlineFragmentsTransform as transform }; diff --git a/packages/graphql-codegen-relay-ir-plugin/tsconfig.json b/packages/graphql-codegen-relay-ir-plugin/tsconfig.json new file mode 100644 index 000000000..8511ce7e1 --- /dev/null +++ b/packages/graphql-codegen-relay-ir-plugin/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": ".tsbuildinfo", + "rootDir": "src", + "outDir": "lib" + }, + "include": ["src"], + "references": [] +} diff --git a/packages/graphql-codegen-typescript-typemap-plugin/tsconfig.json b/packages/graphql-codegen-typescript-typemap-plugin/tsconfig.json index c74a4509a..e91027c2e 100644 --- a/packages/graphql-codegen-typescript-typemap-plugin/tsconfig.json +++ b/packages/graphql-codegen-typescript-typemap-plugin/tsconfig.json @@ -5,7 +5,8 @@ "composite": true, "tsBuildInfoFile": ".tsbuildinfo", "rootDir": "src", - "outDir": "lib" + "outDir": "lib", + "lib": ["dom", "ES2019"] }, "include": ["src"], "references": [] diff --git a/packages/relay-apollo-duct-tape/.eslintrc.json b/packages/relay-apollo-duct-tape/.eslintrc.json new file mode 100644 index 000000000..22ac11d8b --- /dev/null +++ b/packages/relay-apollo-duct-tape/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": ["../../.eslintrc.json"], + "rules": { + "@typescript-eslint/no-explicit-any": "warn" + }, + "root": true +} diff --git a/packages/relay-apollo-duct-tape/CHANGELOG.json b/packages/relay-apollo-duct-tape/CHANGELOG.json new file mode 100644 index 000000000..4b288c84b --- /dev/null +++ b/packages/relay-apollo-duct-tape/CHANGELOG.json @@ -0,0 +1,374 @@ +{ + "name": "@graphitation/relay-apollo-duct-tape", + "entries": [ + { + "date": "Tue, 19 Dec 2023 10:42:14 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.5.3", + "version": "0.5.3", + "comments": { + "patch": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "324dc87a3bb3b6c549e3316efca692072256dec7", + "comment": "New version" + }, + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/supermassive to v3.2.7", + "commit": "324dc87a3bb3b6c549e3316efca692072256dec7" + } + ] + } + }, + { + "date": "Wed, 04 Oct 2023 14:49:50 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.5.2", + "version": "0.5.2", + "comments": { + "patch": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "e0783201ea068864067c9d5e6dde81444f4c5e9d", + "comment": "More fixes" + }, + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "3e06badb76f78b85df97be32f596710627098870", + "comment": "Wrong doc to spread :/" + }, + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/supermassive to v3.2.0", + "commit": "3e06badb76f78b85df97be32f596710627098870" + } + ] + } + }, + { + "date": "Wed, 04 Oct 2023 13:51:41 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.5.1", + "version": "0.5.1", + "comments": { + "patch": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "c9c50e4c6bfb1bc50376cd5228b5ad8fe9cc2274", + "comment": "Keep adding typename" + }, + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/supermassive to v3.2.0", + "commit": "c9c50e4c6bfb1bc50376cd5228b5ad8fe9cc2274" + } + ] + } + }, + { + "date": "Wed, 04 Oct 2023 10:42:36 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.5.0", + "version": "0.5.0", + "comments": { + "minor": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "c01a5584b549e1fde6a4554dc190e39c2ee82b5d", + "comment": "Alpha work progress" + }, + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/supermassive to v3.2.0", + "commit": "d73f011a40f790860efd1324823dbe5b24bf0927" + } + ] + } + }, + { + "date": "Thu, 07 Sep 2023 13:06:12 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.11", + "version": "0.4.11", + "comments": { + "patch": [ + { + "author": "mnovikov@microsoft.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "0479db35aeafc1ebd1f999ef0ad9e100b9db3173", + "comment": "Type policies and jazz" + }, + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.5", + "commit": "1a6beb1dde3e356192b9fbee612b64ebe239c5f3" + } + ] + } + }, + { + "date": "Sat, 28 Jan 2023 13:45:56 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.10", + "version": "0.4.10", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "c3a1eca7e724da31bc535a83826f879a8b3d6563", + "comment": "Inline fragments into operation IR" + }, + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "d3a6ce1ebecd942b25061a76f897152e4e92e6f4", + "comment": "Vendor inline transform and patch only that for our needs" + }, + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.4", + "commit": "04717bc58d8898ce1f34ea969ac100c9c8633f59" + } + ] + } + }, + { + "date": "Thu, 26 Jan 2023 21:25:11 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.9", + "version": "0.4.9", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "25dc9b0a47ea0eb84a0dcdc2f6445d41a511023f", + "comment": "Use complete Relay IR" + }, + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.3", + "commit": "da535a33b18bcc3b39bbd036772e28fc2b0761fc" + } + ] + } + }, + { + "date": "Mon, 23 Jan 2023 12:48:15 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.8", + "version": "0.4.8", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@graphitation/relay-apollo-duct-tape", + "comment": "Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.2", + "commit": "c6476ca1546acc94452106530f5b2efbb6d951e0" + } + ] + } + }, + { + "date": "Sun, 22 Jan 2023 08:27:54 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.7", + "version": "0.4.7", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "6916e6b9e404459c1206b93faba4a303e478e57c", + "comment": "Use the codegen plugin" + } + ] + } + }, + { + "date": "Thu, 12 Jan 2023 17:17:13 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.6", + "version": "0.4.6", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "e4cd0b3db7dea0665cb60ee1a89eac87ef4182ec", + "comment": "Bunch of fixes" + } + ] + } + }, + { + "date": "Mon, 19 Dec 2022 22:50:16 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.5", + "version": "0.4.5", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "0b523f555cb17fed26193a63d1b4c18c7c59026c", + "comment": "Fix ESM support and filter dupes" + } + ] + } + }, + { + "date": "Fri, 16 Dec 2022 23:52:30 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.4", + "version": "0.4.4", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "92307f5c8c61d6c40f871a4d793a4c9dd73ea09f", + "comment": "Import original sources without babel stuff" + } + ] + } + }, + { + "date": "Fri, 16 Dec 2022 17:00:28 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.3", + "version": "0.4.3", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "02935181f595589819871075526025563bc91f20", + "comment": "Try to not compile the vendored js" + } + ] + } + }, + { + "date": "Fri, 16 Dec 2022 14:41:48 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.2", + "version": "0.4.2", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "30cc5586cf17e46368977a974c9ee289b2deeae4", + "comment": "Add missing dep" + } + ] + } + }, + { + "date": "Fri, 16 Dec 2022 11:02:42 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.1", + "version": "0.4.1", + "comments": { + "patch": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "5a87732aeac41f804d966bdc6b96c8a86579f134", + "comment": "Actually import vebdored files" + }, + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "0330dda32e75740a2d8755e6d61dfba67c138a95", + "comment": "More dep fixes" + }, + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "c894678e9bc0824ec7f81f0bff6c0ad334e04dd4", + "comment": "Deal with situation where document contains multiple definitions" + }, + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "cba5a0fee39834d9d82653b7345179d28af81133", + "comment": "Fix type errors" + }, + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "b14675e9d4656743ceb4e8cf4980171f3075c537", + "comment": "Fix type errors definitively" + }, + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "77398e05150c11e4b77aecb9da250110408f3082", + "comment": "[build] Include js files" + } + ] + } + }, + { + "date": "Wed, 14 Dec 2022 23:47:05 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.4.0", + "version": "0.4.0", + "comments": { + "minor": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "cc2d6dd567f4e196c9129eb8c63d2022d6f7a3b0", + "comment": "Vendor relay-compiler sources" + } + ] + } + }, + { + "date": "Wed, 14 Dec 2022 15:18:15 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.3.0", + "version": "0.3.0", + "comments": { + "minor": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "f6a8ac0e6a94a64ff68cb4b3bb4890d607931212", + "comment": "Add runtime generated IR" + } + ] + } + }, + { + "date": "Fri, 18 Nov 2022 00:17:49 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.2.0", + "version": "0.2.0", + "comments": { + "minor": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "f248258932b4f7c85e91af1bfc9f1f918a89b200", + "comment": "[relay-duct-tape] Add read memoization" + } + ] + } + }, + { + "date": "Thu, 22 Sep 2022 23:01:42 GMT", + "tag": "@graphitation/relay-apollo-duct-tape_v0.1.0", + "version": "0.1.0", + "comments": { + "minor": [ + { + "author": "eloy.de.enige@gmail.com", + "package": "@graphitation/relay-apollo-duct-tape", + "commit": "ddd4f926849f00a7979d87e90cb088fe4b5bf2d7", + "comment": "Initial release" + } + ] + } + } + ] +} diff --git a/packages/relay-apollo-duct-tape/CHANGELOG.md b/packages/relay-apollo-duct-tape/CHANGELOG.md new file mode 100644 index 000000000..7f92380cc --- /dev/null +++ b/packages/relay-apollo-duct-tape/CHANGELOG.md @@ -0,0 +1,171 @@ +# Change Log - @graphitation/relay-apollo-duct-tape + +This log was last generated on Tue, 19 Dec 2023 10:42:14 GMT and should not be manually modified. + + + +## 0.5.3 + +Tue, 19 Dec 2023 10:42:14 GMT + +### Patches + +- New version (mnovikov@microsoft.com) +- Bump @graphitation/supermassive to v3.2.7 + +## 0.5.2 + +Wed, 04 Oct 2023 14:49:50 GMT + +### Patches + +- More fixes (mnovikov@microsoft.com) +- Wrong doc to spread :/ (mnovikov@microsoft.com) +- Bump @graphitation/supermassive to v3.2.0 + +## 0.5.1 + +Wed, 04 Oct 2023 13:51:41 GMT + +### Patches + +- Keep adding typename (mnovikov@microsoft.com) +- Bump @graphitation/supermassive to v3.2.0 + +## 0.5.0 + +Wed, 04 Oct 2023 10:42:36 GMT + +### Minor changes + +- Alpha work progress (mnovikov@microsoft.com) +- Bump @graphitation/supermassive to v3.2.0 + +## 0.4.11 + +Thu, 07 Sep 2023 13:06:12 GMT + +### Patches + +- Type policies and jazz (mnovikov@microsoft.com) +- Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.5 + +## 0.4.10 + +Sat, 28 Jan 2023 13:45:56 GMT + +### Patches + +- Inline fragments into operation IR (eloy.de.enige@gmail.com) +- Vendor inline transform and patch only that for our needs (eloy.de.enige@gmail.com) +- Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.4 + +## 0.4.9 + +Thu, 26 Jan 2023 21:25:11 GMT + +### Patches + +- Use complete Relay IR (eloy.de.enige@gmail.com) +- Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.3 + +## 0.4.8 + +Mon, 23 Jan 2023 12:48:15 GMT + +### Patches + +- Bump @graphitation/graphql-codegen-relay-ir-plugin to v1.2.2 + +## 0.4.7 + +Sun, 22 Jan 2023 08:27:54 GMT + +### Patches + +- Use the codegen plugin (eloy.de.enige@gmail.com) + +## 0.4.6 + +Thu, 12 Jan 2023 17:17:13 GMT + +### Patches + +- Bunch of fixes (eloy.de.enige@gmail.com) + +## 0.4.5 + +Mon, 19 Dec 2022 22:50:16 GMT + +### Patches + +- Fix ESM support and filter dupes (eloy.de.enige@gmail.com) + +## 0.4.4 + +Fri, 16 Dec 2022 23:52:30 GMT + +### Patches + +- Import original sources without babel stuff (eloy.de.enige@gmail.com) + +## 0.4.3 + +Fri, 16 Dec 2022 17:00:28 GMT + +### Patches + +- Try to not compile the vendored js (eloy.de.enige@gmail.com) + +## 0.4.2 + +Fri, 16 Dec 2022 14:41:48 GMT + +### Patches + +- Add missing dep (eloy.de.enige@gmail.com) + +## 0.4.1 + +Fri, 16 Dec 2022 11:02:42 GMT + +### Patches + +- Actually import vebdored files (eloy.de.enige@gmail.com) +- More dep fixes (eloy.de.enige@gmail.com) +- Deal with situation where document contains multiple definitions (eloy.de.enige@gmail.com) +- Fix type errors (eloy.de.enige@gmail.com) +- Fix type errors definitively (eloy.de.enige@gmail.com) +- [build] Include js files (eloy.de.enige@gmail.com) + +## 0.4.0 + +Wed, 14 Dec 2022 23:47:05 GMT + +### Minor changes + +- Vendor relay-compiler sources (eloy.de.enige@gmail.com) + +## 0.3.0 + +Wed, 14 Dec 2022 15:18:15 GMT + +### Minor changes + +- Add runtime generated IR (eloy.de.enige@gmail.com) + +## 0.2.0 + +Fri, 18 Nov 2022 00:17:49 GMT + +### Minor changes + +- [relay-duct-tape] Add read memoization (eloy.de.enige@gmail.com) + +## 0.1.0 + +Thu, 22 Sep 2022 23:01:42 GMT + +### Minor changes + +- Initial release (eloy.de.enige@gmail.com) diff --git a/packages/relay-apollo-duct-tape/README.md b/packages/relay-apollo-duct-tape/README.md new file mode 100644 index 000000000..8714956de --- /dev/null +++ b/packages/relay-apollo-duct-tape/README.md @@ -0,0 +1,5 @@ +# relay-duct-tape + +## Setup + +- Apply relay-runtime patch to make non-optimistic source data available diff --git a/packages/relay-apollo-duct-tape/codegen.yml b/packages/relay-apollo-duct-tape/codegen.yml new file mode 100644 index 000000000..92c3d6ce3 --- /dev/null +++ b/packages/relay-apollo-duct-tape/codegen.yml @@ -0,0 +1,17 @@ +hooks: + afterAllFileWrite: + - prettier --write +schema: ./src/__tests__/__fixtures__/schema.graphql +documents: ./src/__tests__/__fixtures__/*.graphql +generates: + ./src/__generated__/operations.ts: + plugins: + - typescript + - "@graphitation/graphql-codegen-typescript-operations" + - "@graphitation/graphql-codegen-supermassive-typed-document-node-plugin" + - "@graphitation/graphql-codegen-relay-ir-plugin" + config: + omitOperationSuffix: true + dedupeOperationSuffix: true + documentVariableSuffix: Document + fragmentVariableSuffix: Fragment diff --git a/packages/relay-apollo-duct-tape/package.json b/packages/relay-apollo-duct-tape/package.json new file mode 100644 index 000000000..58123f33c --- /dev/null +++ b/packages/relay-apollo-duct-tape/package.json @@ -0,0 +1,52 @@ +{ + "name": "@graphitation/relay-apollo-duct-tape", + "license": "MIT", + "version": "0.5.3", + "main": "./src/index.ts", + "repository": { + "type": "git", + "url": "https://github.com/microsoft/graphitation.git", + "directory": "packages/relay-apollo-duct-tape" + }, + "scripts": { + "codegen": "graphql-codegen", + "build": "monorepo-scripts build", + "lint": "monorepo-scripts lint", + "test": "monorepo-scripts test", + "types": "monorepo-scripts types", + "just": "monorepo-scripts" + }, + "dependencies": { + "@babel/runtime": "^7.0.0", + "@emotion/hash": "^0.8.0", + "immutable": "~3.7.6", + "invariant": "^2.2.4", + "lru-cache": "^7.14.1", + "nullthrows": "^1.1.1", + "relay-runtime": "^15.0.0" + }, + "peerDependencies": { + "@apollo/client": "3.6.9" + }, + "devDependencies": { + "@apollo/client": "3.6.9", + "@graphitation/supermassive": "^3.1.0", + "@types/jest": "^26.0.22", + "@types/react-relay": "^14.1.1", + "@types/relay-runtime": "^14.1.2", + "monorepo-scripts": "*" + }, + "sideEffects": false, + "access": "public", + "publishConfig": { + "main": "./lib/index", + "types": "./lib/index.d.ts", + "module": "./lib/index.mjs", + "exports": { + ".": { + "import": "./lib/index.mjs", + "require": "./lib/index.js" + } + } + } +} diff --git a/packages/relay-apollo-duct-tape/relay.config.js b/packages/relay-apollo-duct-tape/relay.config.js new file mode 100644 index 000000000..7bd9b53fc --- /dev/null +++ b/packages/relay-apollo-duct-tape/relay.config.js @@ -0,0 +1,9 @@ +// relay.config.js +module.exports = { + // ... + // Configuration options accepted by the `relay-compiler` command-line tool and `babel-plugin-relay`. + src: "./src", + language: "typescript", // "javascript" | "typescript" | "flow" + schema: "./src/__tests__/schema.graphql", + exclude: ["**/node_modules/**", "**/__mocks__/**", "**/__generated__/**"], +}; diff --git a/packages/relay-apollo-duct-tape/src/Cache.ts b/packages/relay-apollo-duct-tape/src/Cache.ts new file mode 100644 index 000000000..52cfc5a4c --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/Cache.ts @@ -0,0 +1,952 @@ +/** + * BIG TODOs: + * + * - Do we need, and can we have, any merge logic from type-policies ported over? + * + * - Make GC work + * + * - Relay IR will only contain metadata upto a fragment boundary and so either + * we need to recursively get data from the store across these boundaries or + * when the IR is generated we inline all fragments into a query? I'm unsure + * how that would work for write/readFragment, though, so perhaps recursively + * getting the data is the way to go. + * + * Notes: + * + * - The RelayModernStore expects data to already be normalized. + * https://github.com/facebook/relay/blob/v14.1.0/packages/relay-runtime/store/RelayModernStore.js + * + * - Normalization and concurrent access to the store is handled by the + * RelayPublishQueue. + * https://github.com/facebook/relay/blob/v14.1.0/packages/relay-runtime/store/RelayPublishQueue.js#L69-L79 + * + * - The RelayModernEnvironment already holds a RelayPublishQueue instance and + * would get shared once we add Relay client proper to the app. So it would + * be best to access the store through the environment at that time, however + * there doesn't apear to be an exposed API to batch multiple updates, which + * the publish queue and store do support, so for now we'll side-step the + * environment and do the coordination ourselves. + * https://github.com/facebook/relay/blob/v14.1.0/packages/relay-runtime/store/RelayModernEnvironment.js + */ + +import { + Disposable, + ConcreteRequest, + PayloadData, + ReaderFragment, + OperationDescriptor, + ROOT_TYPE, + getSelector, + getFragment, + getRequest, + createOperationDescriptor, + ROOT_ID, + Environment, + ConnectionHandler, + MissingFieldHandler, +} from "relay-runtime"; +import { NormalizationFragmentSpread } from "relay-runtime/lib/util/NormalizationNode"; +import RelayRecordSource from "relay-runtime/lib/store/RelayRecordSource"; +import * as RelayModernRecord from "relay-runtime/lib/store/RelayModernRecord"; +import * as RelayResponseNormalizer from "relay-runtime/lib/store/RelayResponseNormalizer"; +import { + OptimisticUpdate, + PublishQueue, + RecordMap, + SingularReaderSelector, + Snapshot, + Store, +} from "relay-runtime/lib/store/RelayStoreTypes"; +import RelayPublishQueue from "relay-runtime/lib/store/RelayPublishQueue"; +import RelayModernStore from "relay-runtime/lib/store/RelayModernStore"; + +import { + ApolloCache, + Cache as ApolloCacheTypes, + isReference, + Reference, + Transaction, + TypePolicies, + TypePolicy, + FieldPolicy, +} from "@apollo/client"; +import { StoreObject, addTypenameToDocument } from "@apollo/client/utilities"; +import { KeySpecifier } from "@apollo/client/cache/inmemory/policies"; +export { TypePolicies }; + +import invariant from "invariant"; + +// TODO: In TMP we've added quick-lru, but it's an ESM JS module +// and annoyingly that's hard to configure with ts-jest. Figure +// out why we're using quick-lru there. +import LRUCache from "lru-cache"; +import { + transformDocument, + transformDocumentWithSupermassiveMVS, + transformSchema, +} from "./relayDocumentUtils"; + +import type { Schema } from "./vendor/relay-compiler/lib/core/Schema"; +import type { DefinitionNode, DocumentNode } from "graphql"; +import { HandlerProvider } from "relay-runtime/lib/handlers/RelayDefaultHandlerProvider"; + +declare global { + // eslint-disable-next-line no-var + var __RELAY_DEVTOOLS_HOOK__: + | undefined + | { + registerEnvironment: (environment: Environment) => void; + }; +} + +type ReadOptions = Omit; + +type OptimisticTransaction = WeakRef[]; + +type RecordLike = { + __typename?: string; + [key: string]: unknown; +}; + +const handlerProvider: HandlerProvider = (handle) => { + switch (handle) { + case "connection": + return ConnectionHandler; + } + invariant(false, "No handler provided for `%s`.", handle); +}; + +export type EntityReadFunction = ( + args: Record | null, +) => StoreObject; + +export type RelayApolloCacheMode = + | "RUNTIME_SCHEMA" + | "RUNTIME_SUPERMASSIVE" + | "BUILDTIME"; + +export class RelayApolloCache extends ApolloCache { + private store: Store; + private usingExternalStore: boolean; + private transactionStack: (boolean | OptimisticTransaction)[]; + private publishQueue: PublishQueue; + private optimisticTransactions: Map; + private typePolicies: TypePolicies; + private pessimism?: Map; + private schema?: Schema; + private transformedDocumentCache: WeakMap< + DocumentNode, + DocumentNode & { __relay?: any } + >; + private debugEnvironment?: Environment; + private missingFieldHandlers: MissingFieldHandler[]; + private mode: RelayApolloCacheMode; + + constructor( + options: { + store?: Store; + typePolicies?: TypePolicies; + resultCaching?: boolean; + resultCacheMaxSize?: number; + /** + * Specify this if Relay IR needs to be generated at runtime. + */ + schema?: DocumentNode; + mode?: RelayApolloCacheMode; + } = {}, + ) { + super(); + this.store = options.store || new RelayModernStore(new RelayRecordSource()); + this.usingExternalStore = !!options.store; + // this.inTransation = false; + this.transactionStack = []; + this.typePolicies = options.typePolicies || {}; + this.missingFieldHandlers = this.typePoliciesToMissingDocumentHandlers( + this.typePolicies, + ); + this.publishQueue = new RelayPublishQueue( + this.store, + handlerProvider, + this.getDataID, + ); + this.optimisticTransactions = new Map(); + this.pessimism = + options.resultCaching ?? true + ? options.resultCacheMaxSize === undefined + ? new Map() + : (new LRUCache({ + max: options.resultCacheMaxSize, + dispose: this.disposeMemoizedSnapshot.bind(this), + }) as unknown as Map) // TODO: Define actual default + : undefined; + + this.getDataID = this.getDataID.bind(this); + this.schema = options.schema && transformSchema(options.schema); + this.transformedDocumentCache = new WeakMap(); + + this.mode = + options.mode || (this.schema && "RUNTIME_SCHEMA") || "BUILDTIME"; + + const devToolsHook = globalThis.__RELAY_DEVTOOLS_HOOK__; + if (devToolsHook) { + this.debugEnvironment = new Environment({ + store: this.store, + network: { + execute: () => { + throw new Error("Not implemented"); + }, + }, + }); + devToolsHook.registerEnvironment(this.debugEnvironment); + } + } + + // TODO: This does not handle a Relay plural refs object, which looks like: { __refs: string[] } + identify(object: RecordLike | Reference): string | undefined { + if (isReference(object)) { + return object.__ref; + } + return this.getDataID(object as RecordLike, object.__typename); + } + + // We need to filter duplicate entries out in relayTransformDocuments, so ensure results here + // always return the same object. + transformDocument(document: DocumentNode): DocumentNode & { __relay?: any } { + let result = this.transformedDocumentCache.get(document); + if (!result) { + result = addTypenameToDocument(document); + result = { + ...result, + definitions: (result.definitions as DefinitionNode[]).filter( + uniqueFilter, + ), + }; + let taggedNode; + if (this.mode === "BUILDTIME" && (result as any).__relay) { + taggedNode = result.__relay; + } else if (this.mode === "RUNTIME_SCHEMA" && this.schema) { + taggedNode = transformDocument( + this.schema, + result, + true, + this.typePolicies, + ); + } else if (this.mode === "RUNTIME_SUPERMASSIVE") { + taggedNode = transformDocumentWithSupermassiveMVS( + result, + true, + this.typePolicies, + ); + } + (result as any).__relay = taggedNode; + + this.transformedDocumentCache.set(document, result); + this.transformedDocumentCache.set(result, result); + } + return result; + } + + /**************************************************************************** + * Read/write + ***************************************************************************/ + + read( + options: ApolloCacheTypes.ReadOptions, + ): TData | null { + return this.readWithRelayIR( + getRequest(this.getTaggedNode(options.query)), + options, + ); + } + + // TODO: This is ignoring rootId, is that ok? + // TODO: This version only supports 1 level of fragment atm. We would have to recurse into the data to fetch data of other fragments. Do we need this for TMP cases? + /** + * In case of partial data, this will still include the missing keys in the + * result, but with a value of `undefined`. + */ + private readWithRelayIR( + request: ConcreteRequest, + options: Omit, "query">, + ): TData | null { + const snapshot = this.getSnapshot(request, options); + // TODO: Is knowning that the store only saw the root record good enough? + if (!options.optimistic && snapshot.seenRecords.size === 1) { + return null; + } + if (snapshot.isMissingData && !options.returnPartialData) { + return null; + } + return snapshot.data as unknown as TData; + } + + write( + options: ApolloCacheTypes.WriteOptions, + ): Reference | undefined { + return this.writeWithRelayIR( + getRequest(this.getTaggedNode(options.query)), + options, + ); + } + + // TODO: When is Reference as return type used? + // TODO: This is ignoring dataId atm + private writeWithRelayIR( + request: ConcreteRequest, + options: Omit, "query">, + ): Reference | undefined { + const operation = createOperationDescriptor( + request, + options.variables || {}, + // undefined, + // options.dataId, + ); + + const selector = operation.root; + const source = RelayRecordSource.create(); + const record = RelayModernRecord.create(selector.dataID, ROOT_TYPE); + source.set(selector.dataID, record); + const relayPayload = RelayResponseNormalizer.normalize( + source, + selector, + options.result as PayloadData, + { + getDataID: this.getDataID, + request: operation.request, + // FIXME: Enabling this would actually break the possibility to check + // if the store is missing any data for a query when using diff. + // Seeing as it's only a warning, we can probably live with it + // or disable it in the code and patch it. + // + // This is to handle @client fields being present in the document, but + // not in the data. Ideally we figure out a way to only apply this for + // those @client fields, leaving the check/warning for other fields. + // + // treatMissingFieldsAsNull: true, + }, + ); + + if (typeof this.inTransation === "boolean") { + this.publishQueue.commitPayload(operation, relayPayload); + } else { + const updater: OptimisticUpdate = { + operation, + payload: relayPayload, + updater: null, + }; + this.inTransation.push(createWeakRef(updater)); + this.publishQueue.applyUpdate(updater); + } + + if (!this.inTransation) { + this.publishQueue.run(); + } + + return undefined; + } + + // TODO: When is Reference as return type used? + // TODO: Can we avoid the query write? I.e. how do we build the fragment ref? + // TODO: Add test for adding `id` value to data to write + writeFragment( + options: ApolloCacheTypes.WriteFragmentOptions, + ): Reference | undefined { + const fragment = getFragment(this.getTaggedNode(options.fragment)); + const id = options.id || ROOT_ID; + this.writeWithRelayIR(getNodeQuery(fragment, id), { + ...options, + result: { node: { ...options.data, id } }, + variables: { + ...options.variables, + id, + }, + }); + return undefined; + } + + // TODO: This version only supports 1 level of fragment atm. We would have to recurse into the data to fetch data of other fragments. Do we need this for TMP cases? + // TODO: Can we avoid the query read? I.e. how do we build the fragment ref? + /** + * In case of partial data, this will still include the missing keys in the + * result, but with a value of `undefined`. + */ + readFragment( + options: ApolloCacheTypes.ReadFragmentOptions, + optimistic = !!options.optimistic, + ): FragmentType | null { + const fragment = getFragment(this.getTaggedNode(options.fragment)); + const id = options.id || ROOT_ID; + const queryResult = this.readWithRelayIR( + getNodeQuery(fragment, options.id || ROOT_ID), + { + ...options, + variables: { + ...options.variables, + id, + }, + optimistic, + }, + ) as any; + if (!optimistic && queryResult === null) { + return null; + } + const fragmentRef = queryResult.node; + + const fragmentSelector = getSelector(fragment, fragmentRef); + invariant( + fragmentSelector.kind === "SingularReaderSelector", + "Only singular fragments are supported", + ); + const snapshot = this.store.lookup( + fragmentSelector as SingularReaderSelector, + ); + if (snapshot.isMissingData && !options.returnPartialData) { + return null; + } + return snapshot.data as unknown as FragmentType; + } + + // NOTE: Apollo Client's QueryManager uses this internally to keep track of + // ROOT_MUTATIONs, so can't throw here. + // + // modify(options: ApolloCacheTypes.ModifyOptions): boolean { + // throw new Error("Method not implemented."); + // } + + /**************************************************************************** + * Data changes + ***************************************************************************/ + + /** + * NOTE: This version will never return missing field errors. + */ + diff( + options: ApolloCacheTypes.DiffOptions, + ): ApolloCacheTypes.DiffResult { + const snapshot = this.getSnapshot( + getRequest(this.getTaggedNode(options.query)), + options, + ); + return { + result: snapshot.data as unknown as TData, + complete: !snapshot.isMissingData, + }; + } + + // TODO: Data selected by any fragment in a query should trigger notifications for the query. + watch( + options: ApolloCacheTypes.WatchOptions, + ): () => void { + const request = getRequest(this.getTaggedNode(options.query)); + const operation = createOperationDescriptor( + request, + options.variables || {}, + ); + const cacheIdentifier = getQueryCacheIdentifier(operation); + const queryResult = getQueryResult(operation, cacheIdentifier); + + const fragmentSelector = getSelector( + queryResult.fragmentNode, + queryResult.fragmentRef, + ); + invariant( + fragmentSelector.kind === "SingularReaderSelector", + "Only singular fragments are supported", + ); + let lastSnapshot = this.store.lookup( + fragmentSelector as SingularReaderSelector, + ); + + const disposable = this.store.subscribe(lastSnapshot, (nextSnapshot) => { + options.callback( + { + result: nextSnapshot.data as unknown as TData, + complete: !nextSnapshot.isMissingData, + }, + lastSnapshot.data === undefined || lastSnapshot.isMissingData + ? undefined + : { + result: lastSnapshot.data as unknown as TData, + complete: !lastSnapshot.isMissingData, + }, + ); + lastSnapshot = nextSnapshot; + }); + + return () => { + disposable.dispose(); + }; + } + + /**************************************************************************** + * Optimistic + ***************************************************************************/ + + removeOptimistic(id: string): void { + const optimisticTransaction = this.optimisticTransactions.get(id); + invariant( + optimisticTransaction, + "No optimistic transaction exists with id: %s", + id, + ); + optimisticTransaction.forEach((updaterRef) => { + const optimisticUpdate = updaterRef.deref(); + invariant( + optimisticUpdate, + "Optimistic update was already released but not removed in transaction with id: %s", + id, + ); + this.publishQueue.revertUpdate(optimisticUpdate); + }); + this.publishQueue.run(); + } + + performTransaction( + callback: Transaction, + optimisticId?: string | null, + ): void { + try { + if (optimisticId) { + invariant( + !this.optimisticTransactions.has(optimisticId), + "An optimistic transaction already exists with id: %s", + optimisticId, + ); + const transaction: OptimisticTransaction = []; + this.optimisticTransactions.set(optimisticId, transaction); + this.transactionStack.push(transaction); + } else { + this.transactionStack.push(true); + } + callback(this); + this.transactionStack.pop(); + if (this.transactionStack.length === 0) { + this.publishQueue.run(); + } + } catch (e) { + // TODO: Do we need to clean the publishQueue in case of exception? + this.transactionStack = []; + } + } + + // TODO: Test nested transactions + private get inTransation(): boolean | OptimisticTransaction { + return this.transactionStack[this.transactionStack.length - 1] ?? false; + } + + /**************************************************************************** + * Serialization + ***************************************************************************/ + + extract(optimistic = false): RecordMap { + return this.store.getSource(optimistic).toJSON(); + } + + // TODO: Check if we need this for react hot-reloads + // TODO: Do we need to do cleanups first? + /** + * This version does not support restoring when an external store was passed + * in the constructor, as that might indicate it is owned and used elsewhere + * and would lead to an inconsistent state if we were to only change this. + */ + restore(serializedState: RecordMap): ApolloCache { + invariant( + !this.usingExternalStore, + "Can't restore when using external store, as this could lead to inconsistent state.", + ); + this.store = new RelayModernStore( + RelayRecordSource.create(serializedState), + ); + this.publishQueue = new RelayPublishQueue(this.store, null, this.getDataID); + return this; + } + + /**************************************************************************** + * TODO: Unimplemented + ***************************************************************************/ + + // https://github.com/facebook/relay/issues/233#issuecomment-1054489769 + reset(_options?: ApolloCacheTypes.ResetOptions): Promise { + throw new Error("Method not implemented."); + } + + evict(_options: ApolloCacheTypes.EvictOptions): boolean { + throw new Error("Method not implemented."); + } + + /**************************************************************************** + * Private + ***************************************************************************/ + + private getTaggedNode(document: DocumentNode & { __relay?: any }) { + const taggedNode = this.transformDocument(document).__relay; + invariant( + taggedNode, + "RelayApolloCache: Expected document to contain Relay IR.", + ); + return taggedNode; + } + + private _getSnapshot( + request: ConcreteRequest, + options: ReadOptions, + ): Snapshot { + const operation = createOperationDescriptor( + request, + options.variables || {}, + ); + const target = RelayRecordSource.create(); + this.store.check(operation, { + handlers: this.missingFieldHandlers, + getTargetForActor: () => target, + }); + if (target.size() > 0) { + this.publishQueue.commitSource(target); + this.publishQueue.run(); + } + return this.store.lookup(operation.fragment, options.optimistic); + } + + /** + * Memoized version + */ + private getSnapshot( + request: ConcreteRequest, + options: ReadOptions, + ): Snapshot { + if (this.pessimism === undefined) { + return this._getSnapshot(request, options); + } + + const hash = (request as any).hash; + invariant(hash !== undefined, "Expected request to have a hash property."); + const cacheKey = JSON.stringify( + [ + hash, + options.variables, + options.optimistic, + options.id, + options.rootId, + ].filter((x) => x !== undefined), + ); + + const memoizedSnapshot = this.pessimism.get(cacheKey); + if (memoizedSnapshot) { + return memoizedSnapshot[0]; + } + + const snapshot = this._getSnapshot(request, options); + + const disposable = this.store.subscribe(snapshot, (nextSnapshot) => { + this.pessimism!.set(cacheKey, [nextSnapshot, disposable]); + }); + this.pessimism.set(cacheKey, [snapshot, disposable]); + + return snapshot; + } + + private disposeMemoizedSnapshot([_, disposable]: [ + Snapshot, + Disposable, + ]): void { + disposable.dispose(); + } + + // TODO: + // + // - Support keyArgs. + // - In the future, we want to support returning just the id value, + // which we'll do only for types that implement the Node interface. + // This to ensure that the same store can be used for client code + // that uses react-relay and its `node` based features. + private getDataID( + fieldValue: Record, + typeName?: string, + ): string | undefined { + if (!typeName) { + return undefined; + } + return getDataIDFromKeyFields( + this.typePolicies[typeName]?.keyFields, + fieldValue, + typeName, + ); + } + + private typePoliciesToMissingDocumentHandlers( + typePolicies: TypePolicies, + ): MissingFieldHandler[] { + const handlers: MissingFieldHandler[] = [ + { + kind: "linked", + handle(field, record, argValues) { + if ( + record != null && + record.getType() === ROOT_TYPE && + field.name === "node" && + argValues.hasOwnProperty("id") + ) { + return argValues.id; + } + return undefined; + }, + }, + ]; + for (const [type, typePolicy] of Object.entries(typePolicies)) { + const typeName = type === "Query" ? ROOT_TYPE : type; + if (typePolicy.fields) { + for (const [fieldName, fieldPolicy] of Object.entries( + typePolicy.fields, + )) { + const readFunction = + fieldPolicy && + ( + fieldPolicy as FieldPolicy & { + readFunction?: EntityReadFunction; + } + ).readFunction; + if (readFunction) { + handlers.push( + this.createMissingFieldHandler(typeName, fieldName, readFunction), + ); + } + } + } + } + return handlers; + } + + private createMissingFieldHandler( + typeName: string, + fieldName: string, + readFunction: EntityReadFunction, + ): MissingFieldHandler { + return { + kind: "linked", + handle: (field, record, argValues) => { + if ( + record != null && + record.getType() === typeName && + field.name === fieldName + ) { + const obj = readFunction(argValues); + if (obj) { + return this.getDataID(obj, obj.__typename); + } + } + return undefined; + }, + }; + } +} + +function getDataIDFromKeyFields( + keyFields: TypePolicy["keyFields"], + fieldValue: Record, + typeName: string, +): string | undefined { + if (keyFields === undefined) { + if (fieldValue.id) { + return `${typeName}:${fieldValue.id}`; + } else { + return undefined; + } + } else if (keyFields === false) { + return undefined; + } else if (typeof keyFields === "function") { + const keyFieldsFnResult = keyFields(fieldValue as any, { + typename: typeName, + readField: () => { + throw new Error("Not implemented"); + }, + storeObject: fieldValue as any, + }); + return getDataIDFromKeyFields( + typeof keyFieldsFnResult === "string" + ? [keyFieldsFnResult] + : keyFieldsFnResult, + fieldValue, + typeName, + ); + } + return ( + typeName + + ":" + + JSON.stringify( + flattenKeySpecifier(keyFields).reduce>( + (acc, keyField) => { + const value = fieldValue[keyField]; + invariant( + value, + "Missing field '%s' while computing key fields", + keyField, + ); + acc[keyField] = value; + return acc; + }, + {}, + ), + ) + ); +} + +function flattenKeySpecifier(keySpecifier: KeySpecifier): string[] { + return keySpecifier.flatMap((key) => + typeof key === "string" ? key : flattenKeySpecifier(key), + ); +} + +function createWeakRef(value: T): WeakRef { + if (typeof WeakRef === "function") { + return new WeakRef(value); + } + return { + deref() { + return value; + }, + } as WeakRef; +} + +function getQueryResult( + operation: OperationDescriptor, + cacheIdentifier: string, +): { + cacheIdentifier: string; + fragmentNode: ReaderFragment; + fragmentRef: unknown; + operation: OperationDescriptor; +} { + const rootFragmentRef = { + __id: operation.fragment.dataID, + __fragments: { + [operation.fragment.node.name]: operation.request.variables, + }, + __fragmentOwner: operation.request, + }; + return { + cacheIdentifier, + fragmentNode: operation.request.node.fragment, + fragmentRef: rootFragmentRef, + operation, + }; +} + +function getQueryCacheIdentifier( + // environment: IEnvironment, + operation: OperationDescriptor, + // maybeFetchPolicy: ?FetchPolicy, + // maybeRenderPolicy: ?RenderPolicy, + cacheBreaker?: string | number, +): string { + const fetchPolicy = "fetchPolicy"; // maybeFetchPolicy ?? DEFAULT_FETCH_POLICY; + const renderPolicy = "full"; // maybeRenderPolicy ?? environment.UNSTABLE_getDefaultRenderPolicy(); + const cacheIdentifier = `${fetchPolicy}-${renderPolicy}-${operation.request.identifier}`; + if (cacheBreaker != null) { + return `${cacheIdentifier}-${cacheBreaker}`; + } + return cacheIdentifier; +} + +// ---- + +function getNodeQuery( + fragment: ReaderFragment, + id: string, +): ConcreteRequest & { hash: string } { + const v0 = [ + { + defaultValue: null, + kind: "LocalArgument", + name: "id", + }, + ], + v1 = [ + { + kind: "Variable", + name: "id", + variableName: "id", + }, + ]; + return { + hash: (fragment as any).hash, + fragment: { + argumentDefinitions: v0 /*: any*/, + kind: "Fragment", + metadata: null, + name: "CacheTestNodeQuery", + selections: [ + { + alias: null, + args: v1 /*: any*/, + concreteType: null, + kind: "LinkedField", + name: "node", + plural: false, + selections: [ + { + args: null, + kind: "FragmentSpread", + name: fragment.name, + }, + ], + storageKey: null, + }, + ], + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: v0 /*: any*/, + kind: "Operation", + name: "CacheTestNodeQuery", + selections: [ + { + alias: null, + args: v1 /*: any*/, + concreteType: null, + kind: "LinkedField", + name: "node", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + kind: "FragmentSpread", + name: fragment.name, + storageKey: null, + fragment: fragment, + } as NormalizationFragmentSpread, + ], + storageKey: null, + }, + ], + }, + params: { + // cacheID: "90613d3754cd5400b0b29433387dbb42", // TODO: What does this do specifically? + id: id, // TODO: Is this actually the id value? + metadata: {}, + name: "CacheTestNodeQuery", + operationKind: "query", + text: null, + // text: + // "query CacheTestNodeQuery(\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...CacheTestFragment\n id\n }\n}\n\nfragment CacheTestFragment on Conversation {\n id\n title\n}\n", + }, + }; +} + +function uniqueFilter(value: T, index: number, array: T[]) { + return array.indexOf(value) === index; +} diff --git a/packages/relay-apollo-duct-tape/src/__generated__/operations.ts b/packages/relay-apollo-duct-tape/src/__generated__/operations.ts new file mode 100644 index 000000000..d7de33ccc --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__generated__/operations.ts @@ -0,0 +1,3670 @@ +import { TypedDocumentNode as DocumentNode } from "@graphql-typed-document-node/core"; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { + [K in keyof T]: T[K]; +}; +export type MakeOptional = Omit & { + [SubKey in K]?: Maybe; +}; +export type MakeMaybe = Omit & { + [SubKey in K]: Maybe; +}; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; +}; + +export type Conversation = Node & { + __typename?: "Conversation"; + id: Scalars["ID"]; + title: Scalars["String"]; + hasUnreadMessages: Scalars["Boolean"]; + messages: MessagesConnection; + messagesWithExtraField: MessagesConnection; +}; + +export type ConversationMessagesArgs = { + first: Scalars["Int"]; + after?: InputMaybe; + sort?: InputMaybe; +}; + +export type ConversationMessagesWithExtraFieldArgs = { + first?: InputMaybe; + after?: InputMaybe; + sort?: InputMaybe; + callerInfo?: InputMaybe; +}; + +export type ConversationFilter = { + id: Scalars["String"]; + callerInfo?: InputMaybe; +}; + +export type Message = Node & { + __typename?: "Message"; + id: Scalars["ID"]; + authorId: Scalars["String"]; + text: Scalars["String"]; + createdAt: Scalars["String"]; +}; + +export type MessagesConnection = { + __typename?: "MessagesConnection"; + edges: Array; + pageInfo?: Maybe; +}; + +export type MessagesConnectionEdge = { + __typename?: "MessagesConnectionEdge"; + cursor?: Maybe; + node: Message; +}; + +export type Mutation = { + __typename?: "Mutation"; + updateConversation: Conversation; + createMessage: Message; +}; + +export type MutationUpdateConversationArgs = { + id: Scalars["String"]; + title: Scalars["String"]; +}; + +export type MutationCreateMessageArgs = { + conversationId: Scalars["String"]; +}; + +export type Node = { + id: Scalars["ID"]; +}; + +export type PageInfo = { + __typename?: "PageInfo"; + startCursor?: Maybe; + endCursor?: Maybe; + hasNextPage?: Maybe; + hasPreviousPage?: Maybe; +}; + +export type Query = { + __typename?: "Query"; + conversation: Conversation; + message: Message; + node?: Maybe; + conversationWithGarbage: Conversation; + conversationWithNested: Conversation; +}; + +export type QueryConversationArgs = { + id: Scalars["String"]; +}; + +export type QueryMessageArgs = { + messageId: Scalars["String"]; +}; + +export type QueryNodeArgs = { + id: Scalars["ID"]; +}; + +export type QueryConversationWithGarbageArgs = { + id: Scalars["String"]; + callerInfo?: InputMaybe; +}; + +export type QueryConversationWithNestedArgs = { + input?: InputMaybe; + moreCallerInfo?: InputMaybe; +}; + +export enum Sort { + Asc = "ASC", + Desc = "DESC", +} + +export type Subscription = { + __typename?: "Subscription"; + messageCreated: Message; + conversationUpdated: Conversation; +}; + +export type SubscriptionMessageCreatedArgs = { + conversationId: Scalars["String"]; +}; + +export type CacheTestConversationKeyFieldsVariables = Exact<{ + id: Scalars["String"]; + callerInfo?: Maybe; +}>; + +export type CacheTestConversationKeyFields = { __typename?: "Query" } & { + conversationWithGarbage: { __typename?: "Conversation" } & Pick< + Conversation, + "id" | "title" + >; +}; + +export type CacheTestConversationKeyFieldsWithConnectionLikeVariables = Exact<{ + id: Scalars["String"]; + first?: Maybe; + after?: Maybe; + sort?: Maybe; + callerInfo?: Maybe; +}>; + +export type CacheTestConversationKeyFieldsWithConnectionLike = { + __typename?: "Query"; +} & { + conversation: { __typename?: "Conversation" } & Pick< + Conversation, + "id" | "title" + > & { + messagesWithExtraField: { __typename?: "MessagesConnection" } & { + edges: Array< + { __typename?: "MessagesConnectionEdge" } & { + node: { __typename?: "Message" } & Pick; + } + >; + }; + }; +}; + +export type CacheTestConversationKeyFieldsWithGarbageInputVariables = Exact<{ + id: Scalars["String"]; + callerInfo?: Maybe; + moreCallerInfo?: Maybe; +}>; + +export type CacheTestConversationKeyFieldsWithGarbageInput = { + __typename?: "Query"; +} & { + conversationWithNested: { __typename?: "Conversation" } & Pick< + Conversation, + "id" | "title" + >; +}; + +export type CacheTestConversationKeyFieldsWithGarbageInputOneVarVariables = + Exact<{ + filter?: Maybe; + moreCallerInfo?: Maybe; + }>; + +export type CacheTestConversationKeyFieldsWithGarbageInputOneVar = { + __typename?: "Query"; +} & { + conversationWithNested: { __typename?: "Conversation" } & Pick< + Conversation, + "id" | "title" + >; +}; + +export type CacheTestFragment = { __typename?: "Conversation" } & Pick< + Conversation, + "id" | "title" +>; + +export type CacheTestMessageFragment = { __typename?: "Message" } & Pick< + Message, + "id" | "text" +>; + +export type CacheTestMessageQueryVariables = Exact<{ + id: Scalars["String"]; +}>; + +export type CacheTestMessageQuery = { __typename?: "Query" } & { + message: { __typename?: "Message" } & Pick; +}; + +export type CacheTestQueryVariables = Exact<{ + conversationId: Scalars["String"]; + includeNestedData?: Maybe; +}>; + +export type CacheTestQuery = { __typename?: "Query" } & { + conversation: { __typename?: "Conversation" } & Pick< + Conversation, + "id" | "title" + > & { + messages: { __typename?: "MessagesConnection" } & { + edges: Array< + { __typename?: "MessagesConnectionEdge" } & { + node: { __typename?: "Message" } & Pick< + Message, + "id" | "authorId" | "text" | "createdAt" + >; + } + >; + }; + } & CacheTestFragment; +}; + +export type ApolloClientIntegrationTestQueryVariables = Exact<{ + id: Scalars["String"]; + cursor?: Maybe; +}>; + +export type ApolloClientIntegrationTestQuery = { __typename?: "Query" } & { + conversation: { __typename: "Conversation" } & Pick< + Conversation, + "id" | "title" + > & { + messages: { __typename?: "MessagesConnection" } & { + pageInfo?: Maybe< + { __typename?: "PageInfo" } & Pick< + PageInfo, + "hasNextPage" | "endCursor" + > + >; + edges: Array< + { __typename?: "MessagesConnectionEdge" } & Pick< + MessagesConnectionEdge, + "cursor" + > & { + node: { + __typename?: "Message"; + } & ApolloClientIntegrationTestMessageFragment; + } + >; + }; + }; +}; + +export type ApolloClientIntegrationTestMessageFragment = { + __typename: "Message"; +} & Pick; + +export type ApolloClientIntegrationTestMutationVariables = Exact<{ + id: Scalars["String"]; + title: Scalars["String"]; +}>; + +export type ApolloClientIntegrationTestMutation = { + __typename?: "Mutation"; +} & { + updateConversation: { __typename: "Conversation" } & Pick< + Conversation, + "id" | "title" + >; +}; + +export type ApolloClientIntegrationTestCreateMessageMutationVariables = Exact<{ + conversationId: Scalars["String"]; +}>; + +export type ApolloClientIntegrationTestCreateMessageMutation = { + __typename?: "Mutation"; +} & { createMessage: { __typename: "Message" } & Pick }; + +export type ApolloClientIntegrationTestConversationUpdatedSubscriptionVariables = + Exact<{ [key: string]: never }>; + +export type ApolloClientIntegrationTestConversationUpdatedSubscription = { + __typename?: "Subscription"; +} & { + conversationUpdated: { __typename: "Conversation" } & Pick< + Conversation, + "id" | "title" + >; +}; + +export type ApolloClientIntegrationTestMessageCreatedSubscriptionVariables = + Exact<{ + conversationId: Scalars["String"]; + }>; + +export type ApolloClientIntegrationTestMessageCreatedSubscription = { + __typename?: "Subscription"; +} & { + messageCreated: { __typename: "Message" } & Pick; +}; + +export const CacheTestFragment = { + kind: "Document", + definitions: [ + { + kind: "FragmentDefinition", + name: { kind: "Name", value: "CacheTestFragment" }, + typeCondition: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { kind: "NamedType", name: { kind: "Name", value: "ID" } }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __defs: { types: { Conversation: [2, { id: 10, title: 6 }, ["Node"]] } }, + }, + ], +} as unknown as DocumentNode; +export const CacheTestMessageFragment = { + kind: "Document", + definitions: [ + { + kind: "FragmentDefinition", + name: { kind: "Name", value: "CacheTestMessageFragment" }, + typeCondition: { + kind: "NamedType", + name: { kind: "Name", value: "Message" }, + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { kind: "NamedType", name: { kind: "Name", value: "ID" } }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "text" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __defs: { types: { Message: [2, { id: 10, text: 6 }, ["Node"]] } }, + }, + ], +} as unknown as DocumentNode; +export const ApolloClientIntegrationTestMessageFragment = { + kind: "Document", + definitions: [ + { + kind: "FragmentDefinition", + name: { + kind: "Name", + value: "ApolloClientIntegrationTestMessageFragment", + }, + typeCondition: { + kind: "NamedType", + name: { kind: "Name", value: "Message" }, + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "__typename" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { kind: "NamedType", name: { kind: "Name", value: "ID" } }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "text" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __defs: { types: { Message: [2, { id: 10, text: 6 }, ["Node"]] } }, + }, + ], +} as unknown as DocumentNode< + ApolloClientIntegrationTestMessageFragment, + unknown +>; +export const CacheTestConversationKeyFieldsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "CacheTestConversationKeyFields" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "id" } }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "callerInfo" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "conversationWithGarbage" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "id" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "callerInfo" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "callerInfo" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { kind: "Name", value: "keyArgs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "args" }, + value: { + kind: "ListValue", + values: [ + { kind: "StringValue", value: "id", block: false }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Query: [ + 2, + { + conversationWithGarbage: [ + "Conversation!", + { id: 6, callerInfo: 1 }, + ], + }, + ], + Conversation: [2, { id: 10, title: 6 }, ["Node"]], + }, + directives: [["keyArgs", [4], { args: 26 }]], + }, + }, + ], +} as unknown as DocumentNode< + CacheTestConversationKeyFields, + CacheTestConversationKeyFieldsVariables +>; +export const CacheTestConversationKeyFieldsWithConnectionLikeDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { + kind: "Name", + value: "CacheTestConversationKeyFieldsWithConnectionLike", + }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "id" } }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "Int" } }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "after" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, + }, + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "sort" } }, + type: { kind: "NamedType", name: { kind: "Name", value: "Sort" } }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "callerInfo" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "conversation" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "id" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "messagesWithExtraField" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "after" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "after" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "sort" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "sort" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "Sort" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "callerInfo" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "callerInfo" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { kind: "Name", value: "keyArgs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "args" }, + value: { + kind: "ListValue", + values: [ + { + kind: "StringValue", + value: "sort", + block: false, + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "edges" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "node" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Message" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "MessagesConnectionEdge", + }, + }, + }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "MessagesConnection" }, + }, + }, + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Query: [2, { conversation: ["Conversation!", { id: 6 }] }], + Conversation: [ + 2, + { + id: 10, + title: 6, + messagesWithExtraField: [ + "MessagesConnection!", + { first: 3, after: 1, sort: "Sort", callerInfo: 1 }, + ], + }, + ["Node"], + ], + MessagesConnection: [2, { edges: "[MessagesConnectionEdge!]!" }], + Sort: [5, ["ASC", "DESC"]], + MessagesConnectionEdge: [2, { node: "Message!" }], + Message: [2, { id: 10 }, ["Node"]], + }, + directives: [["keyArgs", [4], { args: 26 }]], + }, + }, + ], +} as unknown as DocumentNode< + CacheTestConversationKeyFieldsWithConnectionLike, + CacheTestConversationKeyFieldsWithConnectionLikeVariables +>; +export const CacheTestConversationKeyFieldsWithGarbageInputDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { + kind: "Name", + value: "CacheTestConversationKeyFieldsWithGarbageInput", + }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "id" } }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "callerInfo" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "moreCallerInfo" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "conversationWithNested" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "input" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { kind: "Name", value: "id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "id" }, + }, + }, + { + kind: "ObjectField", + name: { kind: "Name", value: "callerInfo" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "callerInfo" }, + }, + }, + ], + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "ConversationFilter" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "moreCallerInfo" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "moreCallerInfo" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { kind: "Name", value: "keyArgs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "args" }, + value: { + kind: "ListValue", + values: [ + { kind: "StringValue", value: "input", block: false }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Query: [ + 2, + { + conversationWithNested: [ + "Conversation!", + { input: "ConversationFilter", moreCallerInfo: 1 }, + ], + }, + ], + Conversation: [2, { id: 10, title: 6 }, ["Node"]], + ConversationFilter: [6, { id: 6, callerInfo: 1 }], + }, + directives: [["keyArgs", ["FIELD"], { args: 26 }]], + }, + }, + ], +} as unknown as DocumentNode< + CacheTestConversationKeyFieldsWithGarbageInput, + CacheTestConversationKeyFieldsWithGarbageInputVariables +>; +export const CacheTestConversationKeyFieldsWithGarbageInputOneVarDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { + kind: "Name", + value: "CacheTestConversationKeyFieldsWithGarbageInputOneVar", + }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "filter" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "ConversationFilter" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "moreCallerInfo" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "conversationWithNested" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "input" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "filter" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "ConversationFilter" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "moreCallerInfo" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "moreCallerInfo" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { kind: "Name", value: "keyArgs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "args" }, + value: { + kind: "ListValue", + values: [ + { kind: "StringValue", value: "input", block: false }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Query: [ + 2, + { + conversationWithNested: [ + "Conversation!", + { input: "ConversationFilter", moreCallerInfo: 1 }, + ], + }, + ], + Conversation: [2, { id: 10, title: 6 }, ["Node"]], + ConversationFilter: [6, { id: 6, callerInfo: 1 }], + }, + directives: [["keyArgs", { args: 26 }, ["FIELD"]]], + }, + }, + ], +} as unknown as DocumentNode< + CacheTestConversationKeyFieldsWithGarbageInputOneVar, + CacheTestConversationKeyFieldsWithGarbageInputOneVarVariables +>; +export const CacheTestMessageQueryDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "CacheTestMessageQuery" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "id" } }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "message" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "messageId" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "id" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "text" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Message" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Query: [2, { message: ["Message!", { messageId: 6 }] }], + Message: [2, { id: 10, text: 6 }, ["Node"]], + }, + }, + }, + ], +} as unknown as DocumentNode< + CacheTestMessageQuery, + CacheTestMessageQueryVariables +>; +export const CacheTestQueryDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "CacheTestQuery" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "conversationId" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "includeNestedData" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "Boolean" } }, + defaultValue: { kind: "BooleanValue", value: false }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "conversation" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "conversationId" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "InlineFragment", + typeCondition: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + directives: [ + { + kind: "Directive", + name: { kind: "Name", value: "include" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "if" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "includeNestedData" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Boolean" }, + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "messages" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "IntValue", value: "10" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "edges" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "node" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "ID", + }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { + kind: "Name", + value: "authorId", + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "String", + }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "text" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "String", + }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { + kind: "Name", + value: "createdAt", + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "String", + }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "Message", + }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "MessagesConnectionEdge", + }, + }, + }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "MessagesConnection" }, + }, + }, + }, + ], + }, + }, + { + kind: "FragmentSpread", + name: { kind: "Name", value: "CacheTestFragment" }, + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Query: [2, { conversation: ["Conversation!", { id: 6 }] }], + Conversation: [ + 2, + { + id: 10, + title: 6, + messages: ["MessagesConnection!", { first: 8 }], + }, + ["Node"], + ], + MessagesConnection: [2, { edges: "[MessagesConnectionEdge!]!" }], + MessagesConnectionEdge: [2, { node: "Message!" }], + Message: [ + 2, + { id: 10, authorId: 6, text: 6, createdAt: 6 }, + ["Node"], + ], + }, + }, + }, + ...CacheTestFragment.definitions, + ], +} as unknown as DocumentNode; +export const ApolloClientIntegrationTestQueryDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ApolloClientIntegrationTestQuery" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "id" } }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "cursor" }, + }, + type: { kind: "NamedType", name: { kind: "Name", value: "String" } }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "conversation" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "id" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "__typename" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "messages" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "first" }, + value: { kind: "IntValue", value: "10" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "after" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "cursor" }, + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { kind: "Name", value: "connection" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "key" }, + value: { + kind: "StringValue", + value: "IntegrationTest_messages", + block: false, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "pageInfo" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "hasNextPage" }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "Boolean" }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "endCursor" }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "PageInfo" }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "edges" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "cursor" }, + __type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "node" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "FragmentSpread", + name: { + kind: "Name", + value: + "ApolloClientIntegrationTestMessageFragment", + }, + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Message" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { + kind: "Name", + value: "MessagesConnectionEdge", + }, + }, + }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "MessagesConnection" }, + }, + }, + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Query: [2, { conversation: ["Conversation!", { id: 6 }] }], + Conversation: [ + 2, + { + id: 10, + title: 6, + messages: ["MessagesConnection!", { first: 8, after: 1 }], + }, + ["Node"], + ], + MessagesConnection: [ + 2, + { pageInfo: "PageInfo", edges: "[MessagesConnectionEdge!]!" }, + ], + PageInfo: [2, { hasNextPage: 2, endCursor: 1 }], + MessagesConnectionEdge: [2, { cursor: 1, node: "Message!" }], + Message: [2, {}, ["Node"]], + }, + directives: [["connection", [4], { key: 6 }]], + }, + }, + ...ApolloClientIntegrationTestMessageFragment.definitions, + ], +} as unknown as DocumentNode< + ApolloClientIntegrationTestQuery, + ApolloClientIntegrationTestQueryVariables +>; +export const ApolloClientIntegrationTestMutationDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "mutation", + name: { kind: "Name", value: "ApolloClientIntegrationTestMutation" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { kind: "Variable", name: { kind: "Name", value: "id" } }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "title" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "updateConversation" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "id" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "title" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "title" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "__typename" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Mutation: [ + 2, + { updateConversation: ["Conversation!", { id: 6, title: 6 }] }, + ], + Conversation: [2, { id: 10, title: 6 }, ["Node"]], + }, + }, + }, + ], +} as unknown as DocumentNode< + ApolloClientIntegrationTestMutation, + ApolloClientIntegrationTestMutationVariables +>; +export const ApolloClientIntegrationTestCreateMessageMutationDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "mutation", + name: { + kind: "Name", + value: "ApolloClientIntegrationTestCreateMessageMutation", + }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "conversationId" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "createMessage" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "conversationId" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "conversationId" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "__typename" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "text" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Message" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Mutation: [2, { createMessage: ["Message!", { conversationId: 6 }] }], + Message: [2, { id: 10, text: 6 }, ["Node"]], + }, + }, + }, + ], +} as unknown as DocumentNode< + ApolloClientIntegrationTestCreateMessageMutation, + ApolloClientIntegrationTestCreateMessageMutationVariables +>; +export const ApolloClientIntegrationTestConversationUpdatedSubscriptionDocument = + { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "subscription", + name: { + kind: "Name", + value: "ApolloClientIntegrationTestConversationUpdatedSubscription", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "conversationUpdated" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "__typename" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "title" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Conversation" }, + }, + }, + arguments: [], + }, + ], + }, + __defs: { + types: { + Subscription: [2, { conversationUpdated: "Conversation!" }], + Conversation: [2, { id: 10, title: 6 }, ["Node"]], + }, + }, + }, + ], + } as unknown as DocumentNode< + ApolloClientIntegrationTestConversationUpdatedSubscription, + ApolloClientIntegrationTestConversationUpdatedSubscriptionVariables + >; +export const ApolloClientIntegrationTestMessageCreatedSubscriptionDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "subscription", + name: { + kind: "Name", + value: "ApolloClientIntegrationTestMessageCreatedSubscription", + }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "conversationId" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "messageCreated" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "conversationId" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "conversationId" }, + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "__typename" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "id" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "ID" }, + }, + }, + arguments: [], + }, + { + kind: "Field", + name: { kind: "Name", value: "text" }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + arguments: [], + }, + ], + }, + __type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Message" }, + }, + }, + }, + ], + }, + __defs: { + types: { + Subscription: [ + 2, + { messageCreated: ["Message!", { conversationId: 6 }] }, + ], + Message: [2, { id: 10, text: 6 }, ["Node"]], + }, + }, + }, + ], +} as unknown as DocumentNode< + ApolloClientIntegrationTestMessageCreatedSubscription, + ApolloClientIntegrationTestMessageCreatedSubscriptionVariables +>; +(CacheTestConversationKeyFieldsDocument as any).__relay = (function () { + var v0 = { + defaultValue: null, + kind: "LocalArgument", + name: "callerInfo", + }, + v1 = { + defaultValue: null, + kind: "LocalArgument", + name: "id", + }, + v2 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "callerInfo", + variableName: "callerInfo", + }, + { + kind: "Variable", + name: "id", + variableName: "id", + }, + ], + concreteType: "Conversation", + kind: "LinkedField", + name: "conversationWithGarbage", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: [v0 /*: any*/, v1 /*: any*/], + kind: "Fragment", + metadata: null, + name: "CacheTestConversationKeyFields", + selections: v2 /*: any*/, + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: [v1 /*: any*/, v0 /*: any*/], + kind: "Operation", + name: "CacheTestConversationKeyFields", + selections: v2 /*: any*/, + }, + params: { + cacheID: "6b1ed36aae40e21f47e4e8eaf86ea466", + metadata: {}, + name: "CacheTestConversationKeyFields", + operationKind: "query", + text: null, + }, + }; +})(); +(CacheTestConversationKeyFieldsDocument as any).__relay.hash = + "6b1ed36aae40e21f47e4e8eaf86ea466"; +(CacheTestConversationKeyFieldsWithConnectionLikeDocument as any).__relay = + (function () { + var v0 = { + defaultValue: null, + kind: "LocalArgument", + name: "after", + }, + v1 = { + defaultValue: null, + kind: "LocalArgument", + name: "callerInfo", + }, + v2 = { + defaultValue: null, + kind: "LocalArgument", + name: "first", + }, + v3 = { + defaultValue: null, + kind: "LocalArgument", + name: "id", + }, + v4 = { + defaultValue: null, + kind: "LocalArgument", + name: "sort", + }, + v5 = { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + v6 = { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + v7 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "id", + variableName: "id", + }, + ], + concreteType: "Conversation", + kind: "LinkedField", + name: "conversation", + plural: false, + selections: [ + v5 /*: any*/, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + { + alias: null, + args: [ + { + kind: "Variable", + name: "after", + variableName: "after", + }, + { + kind: "Variable", + name: "callerInfo", + variableName: "callerInfo", + }, + { + kind: "Variable", + name: "first", + variableName: "first", + }, + { + kind: "Variable", + name: "sort", + variableName: "sort", + }, + ], + concreteType: "MessagesConnection", + kind: "LinkedField", + name: "messagesWithExtraField", + plural: false, + selections: [ + { + alias: null, + args: null, + concreteType: "MessagesConnectionEdge", + kind: "LinkedField", + name: "edges", + plural: true, + selections: [ + { + alias: null, + args: null, + concreteType: "Message", + kind: "LinkedField", + name: "node", + plural: false, + selections: [v5 /*: any*/, v6 /*: any*/], + storageKey: null, + }, + v6 /*: any*/, + ], + storageKey: null, + }, + v6 /*: any*/, + ], + storageKey: null, + }, + v6 /*: any*/, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: [ + v0 /*: any*/, + v1 /*: any*/, + v2 /*: any*/, + v3 /*: any*/, + v4 /*: any*/, + ], + kind: "Fragment", + metadata: null, + name: "CacheTestConversationKeyFieldsWithConnectionLike", + selections: v7 /*: any*/, + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: [ + v3 /*: any*/, + v2 /*: any*/, + v0 /*: any*/, + v4 /*: any*/, + v1 /*: any*/, + ], + kind: "Operation", + name: "CacheTestConversationKeyFieldsWithConnectionLike", + selections: v7 /*: any*/, + }, + params: { + cacheID: "29e4dfb554ffb49606a45ebda4868be6", + metadata: {}, + name: "CacheTestConversationKeyFieldsWithConnectionLike", + operationKind: "query", + text: null, + }, + }; + })(); +(CacheTestConversationKeyFieldsWithConnectionLikeDocument as any).__relay.hash = + "29e4dfb554ffb49606a45ebda4868be6"; +(CacheTestConversationKeyFieldsWithGarbageInputDocument as any).__relay = + (function () { + var v0 = { + defaultValue: null, + kind: "LocalArgument", + name: "callerInfo", + }, + v1 = { + defaultValue: null, + kind: "LocalArgument", + name: "id", + }, + v2 = { + defaultValue: null, + kind: "LocalArgument", + name: "moreCallerInfo", + }, + v3 = [ + { + alias: null, + args: [ + { + fields: [ + { + kind: "Variable", + name: "callerInfo", + variableName: "callerInfo", + }, + { + kind: "Variable", + name: "id", + variableName: "id", + }, + ], + kind: "ObjectValue", + name: "input", + }, + { + kind: "Variable", + name: "moreCallerInfo", + variableName: "moreCallerInfo", + }, + ], + concreteType: "Conversation", + kind: "LinkedField", + name: "conversationWithNested", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: [v0 /*: any*/, v1 /*: any*/, v2 /*: any*/], + kind: "Fragment", + metadata: null, + name: "CacheTestConversationKeyFieldsWithGarbageInput", + selections: v3 /*: any*/, + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: [v1 /*: any*/, v0 /*: any*/, v2 /*: any*/], + kind: "Operation", + name: "CacheTestConversationKeyFieldsWithGarbageInput", + selections: v3 /*: any*/, + }, + params: { + cacheID: "47ba4d53f15eaecfdcecc14e8d36a0b9", + metadata: {}, + name: "CacheTestConversationKeyFieldsWithGarbageInput", + operationKind: "query", + text: null, + }, + }; + })(); +(CacheTestConversationKeyFieldsWithGarbageInputDocument as any).__relay.hash = + "47ba4d53f15eaecfdcecc14e8d36a0b9"; +(CacheTestConversationKeyFieldsWithGarbageInputOneVarDocument as any).__relay = + (function () { + var v0 = [ + { + defaultValue: null, + kind: "LocalArgument", + name: "filter", + }, + { + defaultValue: null, + kind: "LocalArgument", + name: "moreCallerInfo", + }, + ], + v1 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "input", + variableName: "filter", + }, + { + kind: "Variable", + name: "moreCallerInfo", + variableName: "moreCallerInfo", + }, + ], + concreteType: "Conversation", + kind: "LinkedField", + name: "conversationWithNested", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: v0 /*: any*/, + kind: "Fragment", + metadata: null, + name: "CacheTestConversationKeyFieldsWithGarbageInputOneVar", + selections: v1 /*: any*/, + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: v0 /*: any*/, + kind: "Operation", + name: "CacheTestConversationKeyFieldsWithGarbageInputOneVar", + selections: v1 /*: any*/, + }, + params: { + cacheID: "7b67aab0a234143a63a7e02adcf3bfb0", + metadata: {}, + name: "CacheTestConversationKeyFieldsWithGarbageInputOneVar", + operationKind: "query", + text: null, + }, + }; + })(); +( + CacheTestConversationKeyFieldsWithGarbageInputOneVarDocument as any +).__relay.hash = "7b67aab0a234143a63a7e02adcf3bfb0"; +(CacheTestMessageQueryDocument as any).__relay = (function () { + var v0 = [ + { + defaultValue: null, + kind: "LocalArgument", + name: "id", + }, + ], + v1 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "messageId", + variableName: "id", + }, + ], + concreteType: "Message", + kind: "LinkedField", + name: "message", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "text", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: v0 /*: any*/, + kind: "Fragment", + metadata: null, + name: "CacheTestMessageQuery", + selections: v1 /*: any*/, + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: v0 /*: any*/, + kind: "Operation", + name: "CacheTestMessageQuery", + selections: v1 /*: any*/, + }, + params: { + cacheID: "93e521a727fe591c031511104268d32d", + metadata: {}, + name: "CacheTestMessageQuery", + operationKind: "query", + text: null, + }, + }; +})(); +(CacheTestMessageQueryDocument as any).__relay.hash = + "93e521a727fe591c031511104268d32d"; +(CacheTestQueryDocument as any).__relay = (function () { + var v0 = [ + { + defaultValue: null, + kind: "LocalArgument", + name: "conversationId", + }, + { + defaultValue: false, + kind: "LocalArgument", + name: "includeNestedData", + }, + ], + v1 = { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + v2 = { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + v3 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "id", + variableName: "conversationId", + }, + ], + concreteType: "Conversation", + kind: "LinkedField", + name: "conversation", + plural: false, + selections: [ + v1 /*: any*/, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + v2 /*: any*/, + { + condition: "includeNestedData", + kind: "Condition", + passingValue: true, + selections: [ + { + alias: null, + args: [ + { + kind: "Literal", + name: "first", + value: 10, + }, + ], + concreteType: "MessagesConnection", + kind: "LinkedField", + name: "messages", + plural: false, + selections: [ + { + alias: null, + args: null, + concreteType: "MessagesConnectionEdge", + kind: "LinkedField", + name: "edges", + plural: true, + selections: [ + { + alias: null, + args: null, + concreteType: "Message", + kind: "LinkedField", + name: "node", + plural: false, + selections: [ + v1 /*: any*/, + { + alias: null, + args: null, + kind: "ScalarField", + name: "authorId", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "text", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "createdAt", + storageKey: null, + }, + v2 /*: any*/, + ], + storageKey: null, + }, + v2 /*: any*/, + ], + storageKey: null, + }, + v2 /*: any*/, + ], + storageKey: "messages(first:10)", + }, + ], + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: v0 /*: any*/, + kind: "Fragment", + metadata: null, + name: "CacheTestQuery", + selections: v3 /*: any*/, + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: v0 /*: any*/, + kind: "Operation", + name: "CacheTestQuery", + selections: v3 /*: any*/, + }, + params: { + cacheID: "5798e3e323d1f1cd5132ebc2754202f3", + metadata: {}, + name: "CacheTestQuery", + operationKind: "query", + text: null, + }, + }; +})(); +(CacheTestQueryDocument as any).__relay.hash = + "5798e3e323d1f1cd5132ebc2754202f3"; +(ApolloClientIntegrationTestQueryDocument as any).__relay = (function () { + var v0 = { + defaultValue: null, + kind: "LocalArgument", + name: "cursor", + }, + v1 = { + defaultValue: null, + kind: "LocalArgument", + name: "id", + }, + v2 = [ + { + kind: "Variable", + name: "id", + variableName: "id", + }, + ], + v3 = { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + v4 = { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + v5 = { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + v6 = [ + { + alias: null, + args: null, + concreteType: "PageInfo", + kind: "LinkedField", + name: "pageInfo", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "hasNextPage", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "endCursor", + storageKey: null, + }, + v3 /*: any*/, + ], + storageKey: null, + }, + { + alias: null, + args: null, + concreteType: "MessagesConnectionEdge", + kind: "LinkedField", + name: "edges", + plural: true, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "cursor", + storageKey: null, + }, + { + alias: null, + args: null, + concreteType: "Message", + kind: "LinkedField", + name: "node", + plural: false, + selections: [ + v3 /*: any*/, + v4 /*: any*/, + { + alias: null, + args: null, + kind: "ScalarField", + name: "text", + storageKey: null, + }, + ], + storageKey: null, + }, + v3 /*: any*/, + ], + storageKey: null, + }, + v3 /*: any*/, + ], + v7 = [ + { + kind: "Variable", + name: "after", + variableName: "cursor", + }, + { + kind: "Literal", + name: "first", + value: 10, + }, + ]; + return { + fragment: { + argumentDefinitions: [v0 /*: any*/, v1 /*: any*/], + kind: "Fragment", + metadata: null, + name: "ApolloClientIntegrationTestQuery", + selections: [ + { + alias: null, + args: v2 /*: any*/, + concreteType: "Conversation", + kind: "LinkedField", + name: "conversation", + plural: false, + selections: [ + v3 /*: any*/, + v4 /*: any*/, + v5 /*: any*/, + { + alias: "messages", + args: null, + concreteType: "MessagesConnection", + kind: "LinkedField", + name: "__IntegrationTest_messages_connection", + plural: false, + selections: v6 /*: any*/, + storageKey: null, + }, + ], + storageKey: null, + }, + ], + type: "Query", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: [v1 /*: any*/, v0 /*: any*/], + kind: "Operation", + name: "ApolloClientIntegrationTestQuery", + selections: [ + { + alias: null, + args: v2 /*: any*/, + concreteType: "Conversation", + kind: "LinkedField", + name: "conversation", + plural: false, + selections: [ + v3 /*: any*/, + v4 /*: any*/, + v5 /*: any*/, + { + alias: null, + args: v7 /*: any*/, + concreteType: "MessagesConnection", + kind: "LinkedField", + name: "messages", + plural: false, + selections: v6 /*: any*/, + storageKey: null, + }, + { + alias: null, + args: v7 /*: any*/, + filters: null, + handle: "connection", + key: "IntegrationTest_messages", + kind: "LinkedHandle", + name: "messages", + }, + ], + storageKey: null, + }, + ], + }, + params: { + cacheID: "346f76ab523d3fbc64255f0891256273", + metadata: { + connection: [ + { + count: null, + cursor: "cursor", + direction: "forward", + path: ["conversation", "messages"], + }, + ], + }, + name: "ApolloClientIntegrationTestQuery", + operationKind: "query", + text: null, + }, + }; +})(); +(ApolloClientIntegrationTestQueryDocument as any).__relay.hash = + "346f76ab523d3fbc64255f0891256273"; +(ApolloClientIntegrationTestMutationDocument as any).__relay = (function () { + var v0 = [ + { + defaultValue: null, + kind: "LocalArgument", + name: "id", + }, + { + defaultValue: null, + kind: "LocalArgument", + name: "title", + }, + ], + v1 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "id", + variableName: "id", + }, + { + kind: "Variable", + name: "title", + variableName: "title", + }, + ], + concreteType: "Conversation", + kind: "LinkedField", + name: "updateConversation", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: v0 /*: any*/, + kind: "Fragment", + metadata: null, + name: "ApolloClientIntegrationTestMutation", + selections: v1 /*: any*/, + type: "Mutation", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: v0 /*: any*/, + kind: "Operation", + name: "ApolloClientIntegrationTestMutation", + selections: v1 /*: any*/, + }, + params: { + cacheID: "5acee6fe38dfd1e26c5664267a7bbc0e", + metadata: {}, + name: "ApolloClientIntegrationTestMutation", + operationKind: "mutation", + text: null, + }, + }; +})(); +(ApolloClientIntegrationTestMutationDocument as any).__relay.hash = + "5acee6fe38dfd1e26c5664267a7bbc0e"; +(ApolloClientIntegrationTestCreateMessageMutationDocument as any).__relay = + (function () { + var v0 = [ + { + defaultValue: null, + kind: "LocalArgument", + name: "conversationId", + }, + ], + v1 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "conversationId", + variableName: "conversationId", + }, + ], + concreteType: "Message", + kind: "LinkedField", + name: "createMessage", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "text", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: v0 /*: any*/, + kind: "Fragment", + metadata: null, + name: "ApolloClientIntegrationTestCreateMessageMutation", + selections: v1 /*: any*/, + type: "Mutation", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: v0 /*: any*/, + kind: "Operation", + name: "ApolloClientIntegrationTestCreateMessageMutation", + selections: v1 /*: any*/, + }, + params: { + cacheID: "eb72077c8db0425239fbab1f2ba870b6", + metadata: {}, + name: "ApolloClientIntegrationTestCreateMessageMutation", + operationKind: "mutation", + text: null, + }, + }; + })(); +(ApolloClientIntegrationTestCreateMessageMutationDocument as any).__relay.hash = + "eb72077c8db0425239fbab1f2ba870b6"; +( + ApolloClientIntegrationTestConversationUpdatedSubscriptionDocument as any +).__relay = (function () { + var v0 = [ + { + alias: null, + args: null, + concreteType: "Conversation", + kind: "LinkedField", + name: "conversationUpdated", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: [], + kind: "Fragment", + metadata: null, + name: "ApolloClientIntegrationTestConversationUpdatedSubscription", + selections: v0 /*: any*/, + type: "Subscription", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: [], + kind: "Operation", + name: "ApolloClientIntegrationTestConversationUpdatedSubscription", + selections: v0 /*: any*/, + }, + params: { + cacheID: "0391827416e2014e9019f1df748963bf", + metadata: {}, + name: "ApolloClientIntegrationTestConversationUpdatedSubscription", + operationKind: "subscription", + text: null, + }, + }; +})(); +( + ApolloClientIntegrationTestConversationUpdatedSubscriptionDocument as any +).__relay.hash = "0391827416e2014e9019f1df748963bf"; +(ApolloClientIntegrationTestMessageCreatedSubscriptionDocument as any).__relay = + (function () { + var v0 = [ + { + defaultValue: null, + kind: "LocalArgument", + name: "conversationId", + }, + ], + v1 = [ + { + alias: null, + args: [ + { + kind: "Variable", + name: "conversationId", + variableName: "conversationId", + }, + ], + concreteType: "Message", + kind: "LinkedField", + name: "messageCreated", + plural: false, + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "text", + storageKey: null, + }, + ], + storageKey: null, + }, + ]; + return { + fragment: { + argumentDefinitions: v0 /*: any*/, + kind: "Fragment", + metadata: null, + name: "ApolloClientIntegrationTestMessageCreatedSubscription", + selections: v1 /*: any*/, + type: "Subscription", + abstractKey: null, + }, + kind: "Request", + operation: { + argumentDefinitions: v0 /*: any*/, + kind: "Operation", + name: "ApolloClientIntegrationTestMessageCreatedSubscription", + selections: v1 /*: any*/, + }, + params: { + cacheID: "c8266ff3a7444766771efa2046974854", + metadata: {}, + name: "ApolloClientIntegrationTestMessageCreatedSubscription", + operationKind: "subscription", + text: null, + }, + }; + })(); +( + ApolloClientIntegrationTestMessageCreatedSubscriptionDocument as any +).__relay.hash = "c8266ff3a7444766771efa2046974854"; +(CacheTestFragment as any).__relay = { + argumentDefinitions: [], + kind: "Fragment", + metadata: null, + name: "CacheTestFragment", + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "title", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + ], + type: "Conversation", + abstractKey: null, +}; +(CacheTestFragment as any).__relay.hash = "2422c9a6443eb2bb444fe2aed19d30b1"; +(CacheTestMessageFragment as any).__relay = { + argumentDefinitions: [], + kind: "Fragment", + metadata: null, + name: "CacheTestMessageFragment", + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "text", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + ], + type: "Message", + abstractKey: null, +}; +(CacheTestMessageFragment as any).__relay.hash = + "35e09585ad08828cac27df4e00748495"; +(ApolloClientIntegrationTestMessageFragment as any).__relay = { + argumentDefinitions: [], + kind: "Fragment", + metadata: null, + name: "ApolloClientIntegrationTestMessageFragment", + selections: [ + { + alias: null, + args: null, + kind: "ScalarField", + name: "__typename", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "id", + storageKey: null, + }, + { + alias: null, + args: null, + kind: "ScalarField", + name: "text", + storageKey: null, + }, + ], + type: "Message", + abstractKey: null, +}; +(ApolloClientIntegrationTestMessageFragment as any).__relay.hash = + "23b8d08c9cc9330e87e5a823e658754d"; diff --git a/packages/relay-apollo-duct-tape/src/__tests__/ApolloClient.integration.test.tsx b/packages/relay-apollo-duct-tape/src/__tests__/ApolloClient.integration.test.tsx new file mode 100644 index 000000000..977704693 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/ApolloClient.integration.test.tsx @@ -0,0 +1,310 @@ +import { RelayApolloCache } from "../Cache"; + +import { + ApolloCache, + ApolloProvider, + useMutation, + useQuery, + useSubscription, +} from "@apollo/client"; +import { getOperationName } from "@apollo/client/utilities"; +import * as ReactTestRenderer from "react-test-renderer"; +import { + ApolloMockClient, + createMockClient, + OperationDescriptor, +} from "@graphitation/apollo-mock-client"; +import * as React from "react"; +import { readFileSync } from "fs"; +import { buildSchema } from "graphql"; +import * as MockPayloadGenerator from "@graphitation/graphql-js-operation-payload-generator"; + +import { + ApolloClientIntegrationTestQueryDocument as ApolloClientIntegrationTestQuery, + ApolloClientIntegrationTestMutationDocument as ApolloClientIntegrationTestMutation, + ApolloClientIntegrationTestCreateMessageMutationDocument as TestCreateMessageMutation, + ApolloClientIntegrationTestConversationUpdatedSubscriptionDocument as TestConversationUpdatedSubscription, + ApolloClientIntegrationTestMessageCreatedSubscriptionDocument as TestMessageCreatedSubscription, +} from "../__generated__/operations"; + +const schema = buildSchema( + readFileSync(require.resolve("./__fixtures__/schema.graphql"), "utf8"), +); + +const TestComponent: React.FC = () => { + useSubscription(TestConversationUpdatedSubscription); + const { + data: props, + error, + subscribeToMore, + fetchMore, + } = useQuery(ApolloClientIntegrationTestQuery, { + variables: { id: "42" }, + }); + if (props) { + subscribeToMore({ + document: TestMessageCreatedSubscription, + variables: { conversationId: "42" }, + updateQuery: (prev, { subscriptionData }) => { + return { + ...prev, + conversation: { + ...prev.conversation, + messages: { + ...prev.conversation.messages, + edges: [ + { + node: subscriptionData.data.messageCreated, + cursor: `${subscriptionData.data.messageCreated.id}-cursor`, + }, + ...prev.conversation.messages.edges, + ], + }, + }, + }; + }, + }); + return ( + <> +
{props.conversation.title}
+
    + {props.conversation.messages.edges.map(({ node }, i) => ( +
  • {node.text}
  • + ))} +
+ + + ); + } else if (error) { + return
{error.message}
; + } + return
Loading...
; +}; + +const TestComponentWrapper: React.FC = () => { + return ( + <> + + + + ); +}; + +const TestMutationComponent: React.FC = () => { + const [updateConversation] = useMutation(ApolloClientIntegrationTestMutation); + const [createMessage] = useMutation(TestCreateMessageMutation, { + update(cache, { data }) { + if (data?.createMessage) { + const existingData = cache.readQuery({ + query: ApolloClientIntegrationTestQuery, + variables: { id: "42" }, + }); + cache.writeQuery({ + query: ApolloClientIntegrationTestQuery, + variables: { id: "42" }, + data: { + conversation: { + ...existingData!.conversation, + messages: { + ...existingData!.conversation.messages, + edges: [ + { + node: data.createMessage, + cursor: `${data.createMessage.id}-cursor`, + }, + ...existingData!.conversation.messages!.edges, + ], + }, + }, + }, + }); + } + }, + }); + return ( + <> + + + + ); +}; + +describe.each([ + { cache: () => new RelayApolloCache(), scenario: "RelayApolloCache" }, + // { cache: undefined, scenario: "InMemoryCache" }, +] as { cache?: () => ApolloCache; scenario: string }[])( + "ApolloClient integration with $scenario", + ({ cache }) => { + let client: ApolloMockClient; + let testComponentTree: ReactTestRenderer.ReactTestRenderer; + + beforeEach(async () => { + client = createMockClient(schema as any, { + cache: cache?.(), + }); + ReactTestRenderer.act(() => { + testComponentTree = ReactTestRenderer.create( + + + , + ); + }); + await ReactTestRenderer.act(() => + client.mock.resolveMostRecentOperation((operation) => + MockPayloadGenerator.generate(operation, { + Conversation: () => ({ + id: "42", + title: "Original title", + }), + }), + ), + ); + }); + + function itUpdatesTheCacheAutomatically( + getOperationDescriptor: () => OperationDescriptor, + ) { + it("updates the cache automatically and re-renders", async () => { + await ReactTestRenderer.act(() => { + const operation = getOperationDescriptor(); + return client.mock.resolve( + operation, + MockPayloadGenerator.generate(operation, { + Conversation: () => ({ + id: "42", + title: "Mutated title", + }), + }), + ); + }); + const div = testComponentTree.root.findByType("div"); + expect(div.children[0]).toEqual("Mutated title"); + }); + } + + function itUpdatesTheCacheWithUpdater( + getOperationDescriptor: () => OperationDescriptor, + ) { + it("updates the cache using an updater and re-renders", async () => { + await ReactTestRenderer.act(() => { + const operation = getOperationDescriptor(); + return client.mock.resolve( + operation, + MockPayloadGenerator.generate(operation, { + Message: () => ({ + id: "message-42", + text: "New message", + }), + }), + ); + }); + const ul = testComponentTree.root.findByType("ul"); + expect(ul.children.length).toBe(2); + expect( + (ul.children[0] as ReactTestRenderer.ReactTestInstance).children[0], + ).toEqual("New message"); + }); + } + + describe("concerning mutations", () => { + itUpdatesTheCacheAutomatically(() => { + testComponentTree.root + .findAllByType("button") + .find((button) => button.props.children === "Mutate title")! + .props.onClick(); + const operation = client.mock.getMostRecentOperation(); + expect(getOperationName(operation.request.node)).toEqual( + "ApolloClientIntegrationTestMutation", + ); + return operation; + }); + + itUpdatesTheCacheWithUpdater(() => { + testComponentTree.root + .findAllByType("button") + .find((button) => button.props.children === "Create message")! + .props.onClick(); + const operation = client.mock.getMostRecentOperation(); + expect(getOperationName(operation.request.node)).toEqual( + "ApolloClientIntegrationTestCreateMessageMutation", + ); + return operation; + }); + }); + + describe("concerning subscriptions", () => { + itUpdatesTheCacheAutomatically(() => { + const [operation] = client.mock.getAllOperations(); + expect(getOperationName(operation.request.node)).toEqual( + "ApolloClientIntegrationTestConversationUpdatedSubscription", + ); + return operation; + }); + + itUpdatesTheCacheWithUpdater(() => { + const [_, operation] = client.mock.getAllOperations(); + expect(getOperationName(operation.request.node)).toEqual( + "ApolloClientIntegrationTestMessageCreatedSubscription", + ); + return operation; + }); + }); + + describe("concerning connections", () => { + it("updates the cache automatically and re-renders", async () => { + testComponentTree.root + .findAllByType("button") + .find((button) => button.props.children === "Load More")! + .props.onClick(); + await ReactTestRenderer.act(() => + client.mock.resolveMostRecentOperation((operation) => + MockPayloadGenerator.generate(operation, { + Conversation: () => ({ + id: "42", + title: "Original title", + }), + MessagesConnectionEdge: () => ({ + cursor: "new-message-cursor", + node: { + id: "new-message", + text: "New message", + }, + }), + }), + ), + ); + const ul = testComponentTree.root.findByType("ul"); + expect(ul.children.length).toBe(2); + expect( + (ul.children[1] as ReactTestRenderer.ReactTestInstance).children[0], + ).toEqual("New message"); + }); + }); + }, +); diff --git a/packages/relay-apollo-duct-tape/src/__tests__/Cache.test.ts b/packages/relay-apollo-duct-tape/src/__tests__/Cache.test.ts new file mode 100644 index 000000000..d721e361b --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/Cache.test.ts @@ -0,0 +1,949 @@ +import { EntityReadFunction, RelayApolloCache, TypePolicies } from "../Cache"; +import { FieldReadFunction, InMemoryCache } from "@apollo/client"; + +import { + CacheTestQuery as CacheTestQueryType, + CacheTestQueryDocument, + CacheTestFragment, + CacheTestMessageQueryDocument as CacheTestMessageQueryDocument, + CacheTestMessageFragment as CacheTestMessageFragment, + CacheTestConversationKeyFields as CacheTestConversationKeyFieldsType, + CacheTestConversationKeyFieldsDocument, + CacheTestConversationKeyFieldsWithConnectionLike as CacheTestConversationKeyFieldsWithConnectionLikeType, + CacheTestConversationKeyFieldsWithConnectionLikeDocument, + // CacheTestConversationKeyFieldsWithGarbageInput as CacheTestConversationKeyFieldsWithGarbageInputType, + // CacheTestConversationKeyFieldsWithGarbageInputDocument, +} from "../__generated__/operations"; +import RelayModernStore from "relay-runtime/lib/store/RelayModernStore"; +import RelayRecordSource from "relay-runtime/lib/store/RelayRecordSource"; + +import fs from "fs"; +import path from "path"; +import { parse } from "graphql"; + +const schema = parse( + fs.readFileSync( + path.resolve(__dirname, "__fixtures__/schema.graphql"), + "utf8", + ), +); + +const RESPONSE: CacheTestQueryType = { + conversation: { + __typename: "Conversation" as const, + id: "42", + title: "Hello World", + messages: { + edges: [], + }, + }, +}; + +function apollo(typePolicies?: TypePolicies, addTypename = true) { + return new InMemoryCache({ typePolicies, addTypename }); +} + +function relayWithBuildtimeGeneratedIR(typePolicies?: TypePolicies) { + return new RelayApolloCache({ typePolicies }); +} + +function relayWithRuntimeGeneratedIR(typePolicies?: TypePolicies) { + return new RelayApolloCache({ typePolicies, schema }); +} + +function relayWithSupermassiveRuntimeGeneratedIR(typePolicies?: TypePolicies) { + return new RelayApolloCache({ + typePolicies, + schema, + mode: "RUNTIME_SUPERMASSIVE", + }); +} + +const TEST_VARIANTS = [ + { client: apollo }, + { client: relayWithBuildtimeGeneratedIR }, + { client: relayWithRuntimeGeneratedIR }, + { client: relayWithSupermassiveRuntimeGeneratedIR }, +]; + +// describe("transformDocument", () => { +// it.each([{ client: apollo }, { client: relayWithRuntimeGeneratedIR }])( +// "adds __typename to documents with $client.name", +// ({ client }) => { +// const cache = client(undefined, true); +// const transformed = cache.transformDocument(CacheTestQueryDocument); +// expect(printGraphQL(transformed)).toMatchSnapshot(); +// }, +// ); + +// it("does not add __typename at runtime when build-time IR is present", () => { +// const cache = relayWithBuildtimeGeneratedIR(); +// const transformed = cache.transformDocument(CacheTestQueryDocument); +// expect(printGraphQL(transformed)).not.toMatch("__typename"); +// }); +// }); + +describe("writeQuery/readQuery", () => { + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(); + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + expect( + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + }), + ).toMatchSnapshot(); + }); + + describe("concerning missing data", () => { + beforeAll(() => { + jest.spyOn(console, "error").mockImplementation(() => {}); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(); + cache.writeQuery({ + query: CacheTestQueryDocument, + data: { + conversation: { + ...RESPONSE.conversation, + title: undefined as any, + }, + }, + variables: { conversationId: "42" }, + }); + expect( + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + }), + ).toBeNull(); + expect( + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + returnPartialData: true, + }), + ).toMatchObject({ + conversation: { + id: "42", + }, + }); + expect(console.error).toHaveBeenCalledWith( + expect.stringContaining("title"), + ); + }); + }); + + describe("concerning optimistic updates", () => { + it.each(TEST_VARIANTS)("applies update with $client.name", ({ client }) => { + const cache = client(); + cache.recordOptimisticTransaction((c) => { + c.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + }, "some-id"); + expect( + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + // optimistic: false, // This is the default + }), + ).toBeNull(); + expect( + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + optimistic: true, + }), + ).toMatchSnapshot(); + }); + + it.each(TEST_VARIANTS)("applies update with $client.name", ({ client }) => { + const cache = client(); + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + cache.recordOptimisticTransaction((c) => { + c.writeQuery({ + query: CacheTestQueryDocument, + data: { + conversation: { + ...RESPONSE.conversation, + title: "Hello Optimistic World", + }, + }, + variables: { conversationId: "42" }, + }); + }, "some-transaction-id"); + cache.removeOptimistic("some-transaction-id"); + expect( + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + optimistic: true, + }), + ).toMatchSnapshot(); + }); + }); +}); + +describe("writeFragment/readFragment", () => { + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(); + cache.writeFragment({ + fragment: CacheTestFragment, + id: "Conversation:42", + data: RESPONSE.conversation, + }); + expect( + cache.readFragment({ + id: "Conversation:42", + fragment: CacheTestFragment, + }), + ).toMatchSnapshot(); + }); + + it.each(TEST_VARIANTS)( + "works with $client.name and optimistic data", + ({ client }) => { + const cache = client(); + cache.recordOptimisticTransaction((c) => { + c.writeFragment({ + fragment: CacheTestFragment, + id: "Conversation:42", + data: RESPONSE.conversation, + }); + }, "some-id"); + expect( + cache.readFragment({ + id: "Conversation:42", + fragment: CacheTestFragment, + }), + ).toBeNull(); + expect( + cache.readFragment({ + id: "Conversation:42", + fragment: CacheTestFragment, + optimistic: true, + }), + ).toMatchSnapshot(); + }, + ); + + it.each(TEST_VARIANTS)( + "works with writeQuery for $client.name", + ({ client }) => { + const cache = client(); + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + expect( + cache.readFragment({ + id: "Conversation:42", + fragment: CacheTestFragment, + }), + ).toMatchSnapshot(); + }, + ); + + describe("concerning missing data", () => { + beforeAll(() => { + jest.spyOn(console, "error").mockImplementation(() => {}); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(); + cache.writeFragment({ + fragment: CacheTestFragment, + id: "Conversation:42", + data: { ...RESPONSE.conversation, title: undefined as any }, + }); + expect( + cache.readFragment({ + id: "Conversation:42", + fragment: CacheTestFragment, + }), + ).toBeNull(); + expect( + cache.readFragment({ + id: "Conversation:42", + fragment: CacheTestFragment, + returnPartialData: true, + }), + ).toMatchObject({ + id: expect.stringMatching(/42/), + }); + expect(console.error).toHaveBeenCalledWith( + expect.stringContaining("title"), + ); + }); + }); +}); + +describe("watch", () => { + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + expect.assertions(4); + const cache = client(); + let count = 0; + let disposeWatcher: () => void; + const promise = new Promise((resolve) => { + disposeWatcher = cache.watch({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + optimistic: false, + callback: (diff, lastDiff) => { + switch (++count) { + case 1: { + expect(diff.result).toMatchSnapshot(); + expect(lastDiff).toBeUndefined(); + break; + } + case 2: { + expect(diff.result).toMatchSnapshot(); + expect(lastDiff!.result).toMatchSnapshot(); + resolve(); + } + } + }, + }); + }); + setImmediate(() => { + cache.writeQuery({ + query: CacheTestQueryDocument, + data: { + conversation: { + ...RESPONSE.conversation, + title: "Hello World 1", + }, + }, + variables: { conversationId: "42" }, + }); + setImmediate(() => { + cache.writeQuery({ + query: CacheTestQueryDocument, + data: { + conversation: { + ...RESPONSE.conversation, + title: "Hello World 2", + }, + }, + variables: { conversationId: "42" }, + }); + }); + }); + return promise.finally(disposeWatcher!); + }); +}); + +describe("batch", () => { + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + expect.assertions(1); + const cache = client(); + let count = 0; + const disposeWatcher = cache.watch({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + optimistic: false, + callback: (_diff, _lastDiff) => { + count++; + }, + }); + cache.batch({ + update: (c) => { + c.writeQuery({ + query: CacheTestQueryDocument, + data: { + conversation: { + ...RESPONSE.conversation, + title: "Hello World 1", + }, + }, + variables: { conversationId: "42" }, + }); + c.writeQuery({ + query: CacheTestQueryDocument, + data: { + conversation: { + ...RESPONSE.conversation, + title: "Hello World 2", + }, + }, + variables: { conversationId: "42" }, + }); + }, + }); + return new Promise((resolve) => setImmediate(resolve)) + .then(() => expect(count).toEqual(1)) + .finally(disposeWatcher); + }); +}); + +describe("diff", () => { + beforeAll(() => { + jest.spyOn(console, "error").mockImplementation(() => {}); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(); + cache.writeQuery({ + query: CacheTestQueryDocument, + data: { + conversation: { + ...RESPONSE.conversation, + title: undefined as any, + }, + }, + variables: { conversationId: "42" }, + }); + expect( + cache.diff({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + optimistic: false, + }), + ).toMatchObject({ + complete: false, + }); + + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + expect( + cache.diff({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + optimistic: false, + }), + ).toMatchObject({ + complete: true, + }); + expect(console.error).toHaveBeenCalledWith( + expect.stringContaining("title"), + ); + }); +}); + +describe("extract/restore", () => { + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(); + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + const data = cache.extract(); + const newCache = client(); + newCache.restore(data as any); + expect(newCache.extract()).toEqual(cache.extract()); + }); +}); + +function defaultReadFunction(entityFn: EntityReadFunction): FieldReadFunction { + return function readFunction(existing, { args, toReference, canRead }) { + if (canRead(existing)) { + return existing; + } + + const entity = entityFn(args); + + if (canRead(entity)) { + return toReference(entity); + } + }; +} +describe("Type Policies", () => { + describe("key-fields", () => { + describe("concerning identification", () => { + it.each(TEST_VARIANTS)( + "by default uses typename+id with $client.name", + ({ client }) => { + const cache = client(); + expect(cache.identify({ id: "42" })).toBeUndefined(); + expect( + cache.identify({ __typename: "Conversation" }), + ).toBeUndefined(); + expect( + cache.identify({ __typename: "Conversation", id: "42" }), + ).toEqual("Conversation:42"); + }, + ); + + it.todo( + "uses only the id if the type implements the Node interface with relay", + ); + }); + + describe("concerning normalization", () => { + describe.each([ + { + scenario: "with default key-fields", + typePolicies: { + Conversation: { + keyFields: undefined, + }, + Message: { + keyFields: undefined, + }, + } as TypePolicies, + }, + { + scenario: "without key-fields", + typePolicies: { + Conversation: { + keyFields: false, + }, + Message: { + keyFields: false, + }, + } as TypePolicies, + }, + { + scenario: "with custom key-fields", + typePolicies: { + Conversation: { + keyFields: ["id", "title"], + }, + Message: { + keyFields: ["authorId", "createdAt", "id"], + }, + } as TypePolicies, + }, + ])("$scenario", ({ typePolicies }) => { + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(typePolicies); + const response: CacheTestQueryType = { + conversation: { + ...RESPONSE.conversation, + messages: { + edges: [ + { + node: { + __typename: "Message", + id: "message-42", + authorId: "author-42", + text: "Hello World", + createdAt: "2020-01-01T00:00:00.000Z", + }, + }, + ], + }, + }, + }; + cache.writeQuery({ + query: CacheTestQueryDocument, + data: response as any, + variables: { conversationId: "42", includeNestedData: true }, + }); + expect( + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42", includeNestedData: true }, + }), + ).toMatchSnapshot(); + expect(cache.extract()).toMatchSnapshot(); + }); + }); + }); + }); + + describe("read functions / missing field handlers", () => { + const messageReadFunction: EntityReadFunction = (args) => { + return { + __typename: "Message", + id: args?.messageId, + }; + }; + + const typePolicies = { + Query: { + fields: { + message: { + read: defaultReadFunction(messageReadFunction), + readFunction: messageReadFunction, + }, + }, + }, + }; + it.each(TEST_VARIANTS)("works with $client.name", ({ client }) => { + const cache = client(typePolicies); + const response: CacheTestQueryType = { + conversation: { + ...RESPONSE.conversation, + messages: { + edges: [ + { + node: { + __typename: "Message", + id: "message-42", + authorId: "author-42", + text: "Hello World", + createdAt: "2020-01-01T00:00:00.000Z", + }, + }, + ], + }, + }, + }; + cache.writeQuery({ + query: CacheTestQueryDocument, + data: response, + variables: { conversationId: "42", includeNestedData: true }, + }); + expect( + cache.readFragment({ + fragment: CacheTestMessageFragment, + id: "Message:message-42", + }), + ).toMatchSnapshot(); + expect( + cache.readQuery({ + query: CacheTestMessageQueryDocument, + variables: { + id: "message-42", + }, + }), + ).toMatchSnapshot(); + }); + }); + + describe("keyArgs", () => { + const typePolicies = { + Query: { + fields: { + conversationWithGarbage: { + keyArgs: ["id"], + }, + conversationWithNested: { + keyArgs: ["input", ["id"]], + }, + }, + }, + Conversation: { + fields: { + messagesWithExtraField: { + keyArgs: ["sort"], + }, + }, + }, + }; + + it.each(TEST_VARIANTS)("plain keyArg with $client.name", ({ client }) => { + if (client === relayWithBuildtimeGeneratedIR) { + // TODO + expect(true).toBe(true); + return; + } + const cache = client(typePolicies); + const response1: CacheTestConversationKeyFieldsType = { + conversationWithGarbage: { + ...RESPONSE.conversation, + title: "no-caller-info", + }, + }; + const response2: CacheTestConversationKeyFieldsType = { + conversationWithGarbage: { + ...RESPONSE.conversation, + title: "caller-info", + }, + }; + cache.writeQuery({ + query: CacheTestConversationKeyFieldsDocument, + data: response1, + variables: { id: "42" }, + }); + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsDocument, + variables: { id: "42" }, + }), + ).toMatchSnapshot(); + // ignore var when reading + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsDocument, + variables: { id: "42" }, + }), + ).toEqual( + cache.readQuery({ + query: CacheTestConversationKeyFieldsDocument, + variables: { id: "42", callerInfo: "bar-baz" }, + }), + ); + // overwrite with new value + cache.writeQuery({ + query: CacheTestConversationKeyFieldsDocument, + data: response2, + variables: { id: "42", callerInfo: "bar-baz" }, + }); + + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsDocument, + variables: { id: "42" }, + }), + ).toMatchSnapshot(); + + // ignore var when reading + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsDocument, + variables: { id: "42" }, + }), + ).toEqual( + cache.readQuery({ + query: CacheTestConversationKeyFieldsDocument, + variables: { id: "42", callerInfo: "bar-baz" }, + }), + ); + }); + // it.each(TEST_VARIANTS)( + // "input field keyArg with $client.name", + // ({ client }) => { + // const cache = client(typePolicies); + // const response1: CacheTestConversationKeyFieldsWithGarbageInputType = { + // conversationWithNested: { + // ...RESPONSE.conversation, + // title: "no-caller-info", + // }, + // }; + // const response2: CacheTestConversationKeyFieldsWithGarbageInputType = { + // conversationWithNested: { + // ...RESPONSE.conversation, + // title: "caller-info", + // }, + // }; + // cache.writeQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // data: response1, + // variables: { id: "42" }, + // }); + // expect( + // cache.readQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // variables: { id: "42" }, + // }), + // ).toMatchSnapshot(); + // // ignore var when reading + // expect( + // cache.readQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // variables: { id: "42" }, + // }), + // ).toEqual( + // cache.readQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // variables: { id: "42", callerInfo: "bar-baz" }, + // }), + // ); + // // overwrite with new value + // cache.writeQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // data: response2, + // variables: { id: "42", callerInfo: "bar-baz" }, + // }); + + // expect( + // cache.readQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // variables: { id: "42" }, + // }), + // ).toMatchSnapshot(); + + // // ignore var when reading + // expect( + // cache.readQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // variables: { id: "42" }, + // }), + // ).toEqual( + // cache.readQuery({ + // query: CacheTestConversationKeyFieldsWithGarbageInputDocument, + // variables: { id: "42", callerInfo: "bar-baz" }, + // }), + // ); + // }, + // ); + it.each(TEST_VARIANTS)( + "connection-like with $client.name", + ({ client }) => { + if (client === relayWithBuildtimeGeneratedIR) { + // TODO + expect(true).toBe(true); + return; + } + const cache = client(typePolicies); + const response1: CacheTestConversationKeyFieldsWithConnectionLikeType = + { + conversation: { + ...RESPONSE.conversation, + messagesWithExtraField: { + edges: [ + { + node: { + __typename: "Message", + id: "message-42", + }, + }, + ], + }, + title: "no-caller-info", + }, + }; + const response2: CacheTestConversationKeyFieldsWithConnectionLikeType = + { + conversation: { + ...RESPONSE.conversation, + messagesWithExtraField: { + edges: [ + { + node: { + __typename: "Message", + id: "message-42", + }, + }, + { + node: { + __typename: "Message", + id: "message-43", + }, + }, + ], + }, + title: "caller-info", + }, + }; + cache.writeQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + data: response1, + variables: { id: "42", first: 1 }, + }); + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + variables: { id: "42" }, + }), + ).toMatchSnapshot(); + // ignore var when reading + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + variables: { id: "42", first: 1 }, + }), + ).toEqual( + cache.readQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + variables: { id: "42", callerInfo: "bar-baz" }, + }), + ); + // overwrite with new value + cache.writeQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + data: response2, + variables: { id: "42", first: 2 }, + }); + + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + variables: { id: "42" }, + }), + ).toMatchSnapshot(); + + // ignore var when reading + expect( + cache.readQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + variables: { id: "42" }, + }), + ).toEqual( + cache.readQuery({ + query: CacheTestConversationKeyFieldsWithConnectionLikeDocument, + variables: { id: "42", callerInfo: "bar-baz" }, + }), + ); + }, + ); + }); +}); +describe("read memoization", () => { + it("does not actually hit the store again for the same query/variables", () => { + const store = new RelayModernStore(new RelayRecordSource()); + const cache = new RelayApolloCache({ store }); + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + const read = () => { + return cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + }); + }; + const spy = jest.spyOn(store, "lookup"); + const response1 = read(); + const response2 = read(); + expect(response1).toBe(response2); + expect(spy).toHaveBeenCalledTimes(1); + }); + + it.todo( + "removes the entry from the memoization cache when the store evicts the snapshot", + ); + + it("disposes the store subscription when the memoization cache evicts the entry", () => { + const store = new RelayModernStore(new RelayRecordSource()); + const cache = new RelayApolloCache({ store, resultCacheMaxSize: 1 }); + const subscribe = jest.spyOn(store, "subscribe"); + + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "42" }, + }); + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "42" }, + }); + + const disposable = subscribe.mock.results[0].value; + const dispose = jest.spyOn(disposable, "dispose"); + + cache.writeQuery({ + query: CacheTestQueryDocument, + data: RESPONSE, + variables: { conversationId: "43" }, + }); + cache.readQuery({ + query: CacheTestQueryDocument, + variables: { conversationId: "43" }, + }); + + expect(dispose).toHaveBeenCalled(); + }); +}); diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFields.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFields.graphql new file mode 100644 index 000000000..237586b55 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFields.graphql @@ -0,0 +1,7 @@ +query CacheTestConversationKeyFields($id: String!, $callerInfo: String) { + conversationWithGarbage(id: $id, callerInfo: $callerInfo) + @keyArgs(args: ["id"]) { + id + title + } +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithConnectionLike.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithConnectionLike.graphql new file mode 100644 index 000000000..8d155d364 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithConnectionLike.graphql @@ -0,0 +1,24 @@ +query CacheTestConversationKeyFieldsWithConnectionLike( + $id: String! + $first: Int + $after: String + $sort: Sort + $callerInfo: String +) { + conversation(id: $id) { + id + title + messagesWithExtraField( + first: $first + after: $after + sort: $sort + callerInfo: $callerInfo + ) @keyArgs(args: ["sort"]) { + edges { + node { + id + } + } + } + } +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithGarbageInput.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithGarbageInput.graphql new file mode 100644 index 000000000..a42af08ff --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithGarbageInput.graphql @@ -0,0 +1,13 @@ +query CacheTestConversationKeyFieldsWithGarbageInput( + $id: String! + $callerInfo: String + $moreCallerInfo: String +) { + conversationWithNested( + input: { id: $id, callerInfo: $callerInfo } + moreCallerInfo: $moreCallerInfo + ) @keyArgs(args: ["input"]) { + id + title + } +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithGarbageInputOneVar.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithGarbageInputOneVar.graphql new file mode 100644 index 000000000..443b66213 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestConversationKeyFieldsWithGarbageInputOneVar.graphql @@ -0,0 +1,10 @@ +query CacheTestConversationKeyFieldsWithGarbageInputOneVar( + $filter: ConversationFilter + $moreCallerInfo: String +) { + conversationWithNested(input: $filter, moreCallerInfo: $moreCallerInfo) + @keyArgs(args: ["input"]) { + id + title + } +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestFragment.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestFragment.graphql new file mode 100644 index 000000000..348e27594 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestFragment.graphql @@ -0,0 +1,4 @@ +fragment CacheTestFragment on Conversation { + id + title +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestMessageFragment.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestMessageFragment.graphql new file mode 100644 index 000000000..6ce8601df --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestMessageFragment.graphql @@ -0,0 +1,4 @@ +fragment CacheTestMessageFragment on Message { + id + text +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestMessageQuery.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestMessageQuery.graphql new file mode 100644 index 000000000..c0fef1973 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestMessageQuery.graphql @@ -0,0 +1,6 @@ +query CacheTestMessageQuery($id: String!) { + message(messageId: $id) { + id + text + } +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestQuery.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestQuery.graphql new file mode 100644 index 000000000..f5c55348e --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/CacheTestQuery.graphql @@ -0,0 +1,24 @@ +query CacheTestQuery( + $conversationId: String! + $includeNestedData: Boolean = false +) { + conversation(id: $conversationId) { + # NOTE: These /should/ be included in the build-time generated IR. + id + title + ... on Conversation @include(if: $includeNestedData) { + messages(first: 10) { + edges { + node { + id + authorId + text + createdAt + } + } + } + } + # NOTE: This should not be included in the build-time generated IR. + ...CacheTestFragment + } +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/IntegrationTest.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/IntegrationTest.graphql new file mode 100644 index 000000000..e103136c1 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/IntegrationTest.graphql @@ -0,0 +1,62 @@ +query ApolloClientIntegrationTestQuery($id: String!, $cursor: String) { + conversation(id: $id) { + __typename + id + title + messages(first: 10, after: $cursor) + @connection(key: "IntegrationTest_messages") { + pageInfo { + hasNextPage + endCursor + } + edges { + cursor # TODO: Check if in TMP these are already being specified + node { + ...ApolloClientIntegrationTestMessageFragment + } + } + } + } +} + +fragment ApolloClientIntegrationTestMessageFragment on Message { + __typename + id + text +} + +mutation ApolloClientIntegrationTestMutation($id: String!, $title: String!) { + updateConversation(id: $id, title: $title) { + __typename + id + title + } +} + +mutation ApolloClientIntegrationTestCreateMessageMutation( + $conversationId: String! +) { + createMessage(conversationId: $conversationId) { + __typename + id + text + } +} + +subscription ApolloClientIntegrationTestConversationUpdatedSubscription { + conversationUpdated { + __typename + id + title + } +} + +subscription ApolloClientIntegrationTestMessageCreatedSubscription( + $conversationId: String! +) { + messageCreated(conversationId: $conversationId) { + __typename + id + text + } +} diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/schema.graphql b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/schema.graphql new file mode 100644 index 000000000..97c2ec7aa --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__fixtures__/schema.graphql @@ -0,0 +1,81 @@ +type Query { + conversation(id: String!): Conversation! + message(messageId: String!): Message! + node(id: ID!): Node + conversationWithGarbage(id: String!, callerInfo: String): Conversation! + conversationWithNested( + input: ConversationFilter + moreCallerInfo: String + ): Conversation! +} + +type Mutation { + updateConversation(id: String!, title: String!): Conversation! + createMessage(conversationId: String!): Message! +} + +type Subscription { + messageCreated(conversationId: String!): Message! + conversationUpdated: Conversation! +} + +interface Node { + id: ID! +} + +type Conversation implements Node { + id: ID! + title: String! + hasUnreadMessages: Boolean! + messages(first: Int!, after: String, sort: Sort): MessagesConnection! + messagesWithExtraField( + first: Int + after: String + sort: Sort + callerInfo: String + ): MessagesConnection! +} + +enum Sort { + ASC + DESC +} + +type MessagesConnection { + edges: [MessagesConnectionEdge!]! + pageInfo: PageInfo +} + +type PageInfo { + startCursor: String + endCursor: String + hasNextPage: Boolean + hasPreviousPage: Boolean +} + +type MessagesConnectionEdge { + cursor: String + node: Message! +} + +type Message implements Node { + id: ID! + authorId: String! + text: String! + createdAt: String! +} + +input ConversationFilter { + id: String! + callerInfo: String +} + +directive @connection( + key: String! + filter: [String] + filters: [String] + handler: String + dynamicKey_UNSTABLE: String +) on FIELD + +directive @keyArgs(args: [String!]!) on FIELD diff --git a/packages/relay-apollo-duct-tape/src/__tests__/__snapshots__/Cache.test.ts.snap b/packages/relay-apollo-duct-tape/src/__tests__/__snapshots__/Cache.test.ts.snap new file mode 100644 index 000000000..24d1fa972 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/__tests__/__snapshots__/Cache.test.ts.snap @@ -0,0 +1,1406 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with apollo 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "edges": [ + { + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with apollo 2`] = ` +{ + "Conversation:{"id":"42","title":"Hello World"}": { + "__typename": "Conversation", + "id": "42", + "messages({"first":10})": { + "edges": [ + { + "node": { + "__ref": "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}", + }, + }, + ], + }, + "title": "Hello World", + }, + "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "ROOT_QUERY": { + "__typename": "Query", + "conversation({"id":"42"})": { + "__ref": "Conversation:{"id":"42","title":"Hello World"}", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with relayWithBuildtimeGeneratedIR 2`] = ` +{ + "Conversation:{"id":"42","title":"Hello World"}": { + "__id": "Conversation:{"id":"42","title":"Hello World"}", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)", + }, + "title": "Hello World", + }, + "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}": { + "__id": "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)": { + "__id": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0", + ], + }, + }, + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0": { + "__id": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}", + }, + }, + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "Conversation:{"id":"42","title":"Hello World"}", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with relayWithRuntimeGeneratedIR 2`] = ` +{ + "Conversation:{"id":"42","title":"Hello World"}": { + "__id": "Conversation:{"id":"42","title":"Hello World"}", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)", + }, + "title": "Hello World", + }, + "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}": { + "__id": "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)": { + "__id": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0", + ], + }, + }, + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0": { + "__id": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}", + }, + }, + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "Conversation:{"id":"42","title":"Hello World"}", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with custom key-fields works with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "Conversation:{"id":"42","title":"Hello World"}": { + "__id": "Conversation:{"id":"42","title":"Hello World"}", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)", + }, + "title": "Hello World", + }, + "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}": { + "__id": "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)": { + "__id": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0", + ], + }, + }, + "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0": { + "__id": "client:Conversation:{"id":"42","title":"Hello World"}:messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "Message:{"authorId":"author-42","createdAt":"2020-01-01T00:00:00.000Z","id":"message-42"}", + }, + }, + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "Conversation:{"id":"42","title":"Hello World"}", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with apollo 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "edges": [ + { + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with apollo 2`] = ` +{ + "Conversation:42": { + "__typename": "Conversation", + "id": "42", + "messages({"first":10})": { + "edges": [ + { + "node": { + "__ref": "Message:message-42", + }, + }, + ], + }, + "title": "Hello World", + }, + "Message:message-42": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "ROOT_QUERY": { + "__typename": "Query", + "conversation({"id":"42"})": { + "__ref": "Conversation:42", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with relayWithBuildtimeGeneratedIR 2`] = ` +{ + "Conversation:42": { + "__id": "Conversation:42", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:Conversation:42:messages(first:10)", + }, + "title": "Hello World", + }, + "Message:message-42": { + "__id": "Message:message-42", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "client:Conversation:42:messages(first:10)": { + "__id": "client:Conversation:42:messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:Conversation:42:messages(first:10):edges:0", + ], + }, + }, + "client:Conversation:42:messages(first:10):edges:0": { + "__id": "client:Conversation:42:messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "Message:message-42", + }, + }, + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "Conversation:42", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with relayWithRuntimeGeneratedIR 2`] = ` +{ + "Conversation:42": { + "__id": "Conversation:42", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:Conversation:42:messages(first:10)", + }, + "title": "Hello World", + }, + "Message:message-42": { + "__id": "Message:message-42", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "client:Conversation:42:messages(first:10)": { + "__id": "client:Conversation:42:messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:Conversation:42:messages(first:10):edges:0", + ], + }, + }, + "client:Conversation:42:messages(first:10):edges:0": { + "__id": "client:Conversation:42:messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "Message:message-42", + }, + }, + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "Conversation:42", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization with default key-fields works with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "Conversation:42": { + "__id": "Conversation:42", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:Conversation:42:messages(first:10)", + }, + "title": "Hello World", + }, + "Message:message-42": { + "__id": "Message:message-42", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + "client:Conversation:42:messages(first:10)": { + "__id": "client:Conversation:42:messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:Conversation:42:messages(first:10):edges:0", + ], + }, + }, + "client:Conversation:42:messages(first:10):edges:0": { + "__id": "client:Conversation:42:messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "Message:message-42", + }, + }, + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "Conversation:42", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with apollo 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "edges": [ + { + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with apollo 2`] = ` +{ + "ROOT_QUERY": { + "__typename": "Query", + "conversation({"id":"42"})": { + "__typename": "Conversation", + "id": "42", + "messages({"first":10})": { + "edges": [ + { + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with relayWithBuildtimeGeneratedIR 2`] = ` +{ + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "client:root:conversation(id:"42")", + }, + }, + "client:root:conversation(id:"42")": { + "__id": "client:root:conversation(id:"42")", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:root:conversation(id:"42"):messages(first:10)", + }, + "title": "Hello World", + }, + "client:root:conversation(id:"42"):messages(first:10)": { + "__id": "client:root:conversation(id:"42"):messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:root:conversation(id:"42"):messages(first:10):edges:0", + ], + }, + }, + "client:root:conversation(id:"42"):messages(first:10):edges:0": { + "__id": "client:root:conversation(id:"42"):messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "client:root:conversation(id:"42"):messages(first:10):edges:0:node", + }, + }, + "client:root:conversation(id:"42"):messages(first:10):edges:0:node": { + "__id": "client:root:conversation(id:"42"):messages(first:10):edges:0:node", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with relayWithRuntimeGeneratedIR 2`] = ` +{ + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "client:root:conversation(id:"42")", + }, + }, + "client:root:conversation(id:"42")": { + "__id": "client:root:conversation(id:"42")", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:root:conversation(id:"42"):messages(first:10)", + }, + "title": "Hello World", + }, + "client:root:conversation(id:"42"):messages(first:10)": { + "__id": "client:root:conversation(id:"42"):messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:root:conversation(id:"42"):messages(first:10):edges:0", + ], + }, + }, + "client:root:conversation(id:"42"):messages(first:10):edges:0": { + "__id": "client:root:conversation(id:"42"):messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "client:root:conversation(id:"42"):messages(first:10):edges:0:node", + }, + }, + "client:root:conversation(id:"42"):messages(first:10):edges:0:node": { + "__id": "client:root:conversation(id:"42"):messages(first:10):edges:0:node", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messages": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, + }, + ], + }, + "title": "Hello World", + }, +} +`; + +exports[`Type Policies key-fields concerning normalization without key-fields works with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "client:root": { + "__id": "client:root", + "__typename": "__Root", + "conversation(id:"42")": { + "__ref": "client:root:conversation(id:"42")", + }, + }, + "client:root:conversation(id:"42")": { + "__id": "client:root:conversation(id:"42")", + "__typename": "Conversation", + "id": "42", + "messages(first:10)": { + "__ref": "client:root:conversation(id:"42"):messages(first:10)", + }, + "title": "Hello World", + }, + "client:root:conversation(id:"42"):messages(first:10)": { + "__id": "client:root:conversation(id:"42"):messages(first:10)", + "__typename": "MessagesConnection", + "edges": { + "__refs": [ + "client:root:conversation(id:"42"):messages(first:10):edges:0", + ], + }, + }, + "client:root:conversation(id:"42"):messages(first:10):edges:0": { + "__id": "client:root:conversation(id:"42"):messages(first:10):edges:0", + "__typename": "MessagesConnectionEdge", + "node": { + "__ref": "client:root:conversation(id:"42"):messages(first:10):edges:0:node", + }, + }, + "client:root:conversation(id:"42"):messages(first:10):edges:0:node": { + "__id": "client:root:conversation(id:"42"):messages(first:10):edges:0:node", + "__typename": "Message", + "authorId": "author-42", + "createdAt": "2020-01-01T00:00:00.000Z", + "id": "message-42", + "text": "Hello World", + }, +} +`; + +exports[`Type Policies keyArgs connection-like with apollo 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messagesWithExtraField": { + "edges": [ + { + "node": { + "__typename": "Message", + "id": "message-42", + }, + }, + ], + }, + "title": "no-caller-info", + }, +} +`; + +exports[`Type Policies keyArgs connection-like with apollo 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messagesWithExtraField": { + "edges": [ + { + "node": { + "__typename": "Message", + "id": "message-42", + }, + }, + { + "node": { + "__typename": "Message", + "id": "message-43", + }, + }, + ], + }, + "title": "caller-info", + }, +} +`; + +exports[`Type Policies keyArgs connection-like with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messagesWithExtraField": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "id": "message-42", + }, + }, + ], + }, + "title": "no-caller-info", + }, +} +`; + +exports[`Type Policies keyArgs connection-like with relayWithRuntimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messagesWithExtraField": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "id": "message-42", + }, + }, + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "id": "message-43", + }, + }, + ], + }, + "title": "caller-info", + }, +} +`; + +exports[`Type Policies keyArgs connection-like with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messagesWithExtraField": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "id": "message-42", + }, + }, + ], + }, + "title": "no-caller-info", + }, +} +`; + +exports[`Type Policies keyArgs connection-like with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "messagesWithExtraField": { + "__typename": "MessagesConnection", + "edges": [ + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "id": "message-42", + }, + }, + { + "__typename": "MessagesConnectionEdge", + "node": { + "__typename": "Message", + "id": "message-43", + }, + }, + ], + }, + "title": "caller-info", + }, +} +`; + +exports[`Type Policies keyArgs plain keyArg with apollo 1`] = ` +{ + "conversationWithGarbage": { + "__typename": "Conversation", + "id": "42", + "title": "no-caller-info", + }, +} +`; + +exports[`Type Policies keyArgs plain keyArg with apollo 2`] = ` +{ + "conversationWithGarbage": { + "__typename": "Conversation", + "id": "42", + "title": "caller-info", + }, +} +`; + +exports[`Type Policies keyArgs plain keyArg with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversationWithGarbage": { + "__typename": "Conversation", + "id": "42", + "title": "no-caller-info", + }, +} +`; + +exports[`Type Policies keyArgs plain keyArg with relayWithRuntimeGeneratedIR 2`] = ` +{ + "conversationWithGarbage": { + "__typename": "Conversation", + "id": "42", + "title": "caller-info", + }, +} +`; + +exports[`Type Policies keyArgs plain keyArg with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversationWithGarbage": { + "__typename": "Conversation", + "id": "42", + "title": "no-caller-info", + }, +} +`; + +exports[`Type Policies keyArgs plain keyArg with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "conversationWithGarbage": { + "__typename": "Conversation", + "id": "42", + "title": "caller-info", + }, +} +`; + +exports[`Type Policies read functions / missing field handlers works with apollo 1`] = ` +{ + "__typename": "Message", + "id": "message-42", + "text": "Hello World", +} +`; + +exports[`Type Policies read functions / missing field handlers works with apollo 2`] = ` +{ + "message": { + "__typename": "Message", + "id": "message-42", + "text": "Hello World", + }, +} +`; + +exports[`Type Policies read functions / missing field handlers works with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "__typename": "Message", + "id": "message-42", + "text": "Hello World", +} +`; + +exports[`Type Policies read functions / missing field handlers works with relayWithBuildtimeGeneratedIR 2`] = ` +{ + "message": { + "__typename": "Message", + "id": "message-42", + "text": "Hello World", + }, +} +`; + +exports[`Type Policies read functions / missing field handlers works with relayWithRuntimeGeneratedIR 1`] = ` +{ + "__typename": "Message", + "id": "message-42", + "text": "Hello World", +} +`; + +exports[`Type Policies read functions / missing field handlers works with relayWithRuntimeGeneratedIR 2`] = ` +{ + "message": { + "__typename": "Message", + "id": "message-42", + "text": "Hello World", + }, +} +`; + +exports[`Type Policies read functions / missing field handlers works with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "__typename": "Message", + "id": "message-42", + "text": "Hello World", +} +`; + +exports[`Type Policies read functions / missing field handlers works with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "message": { + "__typename": "Message", + "id": "message-42", + "text": "Hello World", + }, +} +`; + +exports[`watch works with apollo 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`watch works with apollo 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 2", + }, +} +`; + +exports[`watch works with apollo 3`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`watch works with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`watch works with relayWithBuildtimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 2", + }, +} +`; + +exports[`watch works with relayWithBuildtimeGeneratedIR 3`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`watch works with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`watch works with relayWithRuntimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 2", + }, +} +`; + +exports[`watch works with relayWithRuntimeGeneratedIR 3`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`watch works with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`watch works with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 2", + }, +} +`; + +exports[`watch works with relayWithSupermassiveRuntimeGeneratedIR 3`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World 1", + }, +} +`; + +exports[`writeFragment/readFragment works with apollo 1`] = ` +{ + "__typename": "Conversation", + "id": "42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with apollo and optimistic data 1`] = ` +{ + "__typename": "Conversation", + "id": "42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "__typename": "Conversation", + "id": "Conversation:42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with relayWithBuildtimeGeneratedIR and optimistic data 1`] = ` +{ + "__typename": "Conversation", + "id": "Conversation:42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with relayWithRuntimeGeneratedIR 1`] = ` +{ + "__typename": "Conversation", + "id": "Conversation:42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with relayWithRuntimeGeneratedIR and optimistic data 1`] = ` +{ + "__typename": "Conversation", + "id": "Conversation:42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "__typename": "Conversation", + "id": "Conversation:42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with relayWithSupermassiveRuntimeGeneratedIR and optimistic data 1`] = ` +{ + "__typename": "Conversation", + "id": "Conversation:42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with writeQuery for apollo 1`] = ` +{ + "__typename": "Conversation", + "id": "42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with writeQuery for relayWithBuildtimeGeneratedIR 1`] = ` +{ + "__typename": "Conversation", + "id": "42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with writeQuery for relayWithRuntimeGeneratedIR 1`] = ` +{ + "__typename": "Conversation", + "id": "42", + "title": "Hello World", +} +`; + +exports[`writeFragment/readFragment works with writeQuery for relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "__typename": "Conversation", + "id": "42", + "title": "Hello World", +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with apollo 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with apollo 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with relayWithBuildtimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with relayWithRuntimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery concerning optimistic updates applies update with relayWithSupermassiveRuntimeGeneratedIR 2`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery works with apollo 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery works with relayWithBuildtimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery works with relayWithRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; + +exports[`writeQuery/readQuery works with relayWithSupermassiveRuntimeGeneratedIR 1`] = ` +{ + "conversation": { + "__typename": "Conversation", + "id": "42", + "title": "Hello World", + }, +} +`; diff --git a/packages/relay-apollo-duct-tape/src/index.ts b/packages/relay-apollo-duct-tape/src/index.ts new file mode 100644 index 000000000..325616048 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/index.ts @@ -0,0 +1 @@ +export * from "./Cache"; diff --git a/packages/relay-apollo-duct-tape/src/relayDocumentUtils.ts b/packages/relay-apollo-duct-tape/src/relayDocumentUtils.ts new file mode 100644 index 000000000..56ee5f5ef --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/relayDocumentUtils.ts @@ -0,0 +1,217 @@ +import { transform as transformToIR } from "./vendor/relay-compiler/lib/core/RelayParser"; +import CompilerContext from "./vendor/relay-compiler/lib/core/CompilerContext"; +import { create as createSchema } from "./vendor/relay-compiler/lib/core/Schema"; +import * as FlattenTransform from "./vendor/relay-compiler/lib/transforms/FlattenTransform"; +import * as InlineFragmentsTransform from "./vendor/relay-compiler/lib/transforms/InlineFragmentsTransform"; +import { generate as generateIRDocument } from "./vendor/relay-compiler/lib/codegen/RelayCodeGenerator"; +import { + SchemaDefinitions, + decodeASTSchema, + mergeSchemaDefinitions, +} from "@graphitation/supermassive"; + +import { Source, print as printGraphQLJS } from "graphql"; +import hash from "@emotion/hash"; + +import type { DefinitionNode, DocumentNode } from "graphql"; +import type { Schema } from "./vendor/relay-compiler/lib/core/Schema"; +import type { Request } from "relay-compiler/lib/core/IR"; +import { keyArgsTransform } from "./transforms/keyArgsTransform"; +import { TypePolicies } from "@apollo/client"; +import { GraphQLTaggedNode } from "relay-runtime"; + +export function transformRelayIRForTypePolicies( + document: DocumentNode & { __relay?: any }, + addHash: boolean, + typePolicies: TypePolicies, +): GraphQLTaggedNode { + const defs: SchemaDefinitions[] = [ + document.definitions && (document.definitions[0] as any).__defs, + ]; + if (!defs) { + return document.__relay as any; + } else { + const schema = transformSchema(decodeASTSchema(defs)); + const nodes = transformToIR( + schema, + // TODO: Add test with multiple references to the same fragment + // And is this still necessary if we already do it in Cache.transformDocument + // NOTE: graphql-codegen operations plugin has a dedupeFragments option for this, is it helpful? + (document.definitions as DefinitionNode[]).filter(uniqueFilter), + ); + let compilerContext = new CompilerContext(schema); + for (const node of nodes) { + compilerContext = compilerContext.add(node); + } + compilerContext = applyCommonTransforms(compilerContext, typePolicies); + + const res: any[] = []; + compilerContext.forEachDocument((node) => { + if (node.kind === "Root") { + const fragment = compilerContext.getRoot(node.name); + const name = fragment.name; + const request: Request = { + kind: "Request", + fragment: { + kind: "Fragment", + name, + argumentDefinitions: fragment.argumentDefinitions, + directives: fragment.directives, + loc: { kind: "Derived", source: node.loc }, + metadata: undefined, + selections: fragment.selections as any, + type: fragment.type, + }, + id: undefined, + loc: node.loc, + metadata: node.metadata || {}, + name: fragment.name, + root: node, + text: "", + }; + const generatedNode = generateIRDocument(schema, request); + res.push(generatedNode); + } + }); + // This is for read/writing with just fragments + compilerContext.forEachDocument((node) => { + if (node.kind === "Fragment") { + res.push(generateIRDocument(schema, node)); + } + }); + const x = res[0]; + if (addHash) { + x.hash = hash(JSON.stringify(x)); + } + return x; + } +} + +export function transformDocumentWithSupermassiveMVS( + document: DocumentNode, + addHash: boolean, + typePolicies: TypePolicies, +): GraphQLTaggedNode { + const defs: SchemaDefinitions[] = + document.definitions && + document.definitions.map((node) => (node as any).__defs).filter((x) => !!x); + + if (!defs) { + return null as any; + } + const schema = transformSchema( + decodeASTSchema([ + mergeSchemaDefinitions({ types: {}, directives: [] }, defs), + ]), + ); + return transformDocument(schema, document, addHash, typePolicies); +} + +// TODO: Hash input document instead, which means memoization can skip +// actually applying this transform. +export function transformDocument( + schema: Schema, + document: DocumentNode, + addHash: boolean, + typePolicies: TypePolicies, +): GraphQLTaggedNode { + const nodes = transformToIR( + schema, + // TODO: Add test with multiple references to the same fragment + // And is this still necessary if we already do it in Cache.transformDocument + // NOTE: graphql-codegen operations plugin has a dedupeFragments option for this, is it helpful? + (document.definitions as DefinitionNode[]).filter(uniqueFilter), + ); + let compilerContext = new CompilerContext(schema); + for (const node of nodes) { + compilerContext = compilerContext.add(node); + } + const operationCompilerContext = applyOperationTransforms( + compilerContext, + typePolicies, + ); + const fragmentCompilerContext = applyFragmentTransforms( + compilerContext, + typePolicies, + ); + + const res: any[] = []; + operationCompilerContext.forEachDocument((node) => { + if (node.kind === "Root") { + const fragment = operationCompilerContext.getRoot(node.name); + const name = fragment.name; + const request: Request = { + kind: "Request", + fragment: { + kind: "Fragment", + name, + argumentDefinitions: fragment.argumentDefinitions, + directives: fragment.directives, + loc: { kind: "Derived", source: node.loc }, + metadata: undefined, + selections: fragment.selections as any, + type: fragment.type, + }, + id: undefined, + loc: node.loc, + metadata: node.metadata || {}, + name: fragment.name, + root: node, + text: "", + }; + const generatedNode = generateIRDocument(schema, request); + res.push(generatedNode); + } + }); + // This is for read/writing with just fragments + fragmentCompilerContext.forEachDocument((node) => { + if (node.kind === "Fragment") { + res.push(generateIRDocument(schema, node)); + } + }); + const x = res[0]; + if (addHash) { + x.hash = hash(JSON.stringify(x)); + } + return x; +} + +function applyOperationTransforms( + compilerContext: CompilerContext, + typePolicies: TypePolicies, +): CompilerContext { + return applyCommonTransforms( + compilerContext.applyTransform(InlineFragmentsTransform.transform), + typePolicies, + ); +} + +function applyFragmentTransforms( + compilerContext: CompilerContext, + typePolicies: TypePolicies, +): CompilerContext { + return applyCommonTransforms( + compilerContext.applyTransform( + FlattenTransform.transformWithOptions({ + isForCodegen: true, + } as any), + ), + typePolicies, + ); +} + +function applyCommonTransforms( + compilerContext: CompilerContext, + typePolicies: TypePolicies, +): CompilerContext { + return compilerContext.applyTransform(keyArgsTransform(typePolicies)); + // .applyTransform(addTypenameTransform()); +} + +function uniqueFilter(value: T, index: number, array: T[]) { + return array.indexOf(value) === index; +} + +export function transformSchema(schema: DocumentNode) { + return createSchema(new Source(printGraphQLJS(schema))); +} diff --git a/packages/relay-apollo-duct-tape/src/transforms/keyArgsTransform.ts b/packages/relay-apollo-duct-tape/src/transforms/keyArgsTransform.ts new file mode 100644 index 000000000..51f7eb97e --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/transforms/keyArgsTransform.ts @@ -0,0 +1,114 @@ +import { Node, Argument } from "relay-compiler/lib/core/IR"; +import type { TypeID, CompositeTypeID } from "relay-compiler/lib/core/Schema"; + +import { FieldPolicy, TypePolicies } from "@apollo/client"; +import { KeySpecifier } from "@apollo/client/cache/inmemory/policies"; +import CompilerContext from "../vendor/relay-compiler/lib/core/CompilerContext"; +import * as IRTransformer from "../vendor/relay-compiler/lib/core/IRTransformer"; + +type KeyArgsTransformState = { + parentTypeName: string | null; + nextParentTypeName: string | null; + fieldName: string | null; + keyArgsFromDirective: KeySpecifier | null; +}; + +export function keyArgsTransform( + typePolicies: TypePolicies, +): (context: CompilerContext) => CompilerContext { + return function keyArgsTransformFn(context: CompilerContext) { + return keyArgsTransformImpl(context, typePolicies); + }; +} + +function keyArgsTransformImpl( + context: CompilerContext, + typePolicies: TypePolicies, +): CompilerContext { + const state: KeyArgsTransformState = { + parentTypeName: null, + nextParentTypeName: null, + fieldName: null, + keyArgsFromDirective: null, + }; + return IRTransformer.transform( + context, + { + Fragment: setParentTypeStateFactory(), + InlineFragment: setParentTypeStateFactory(), + LinkedField: setParentTypeStateFactory(), + Root: setParentTypeStateFactory(), + SplitOperation: setParentTypeStateFactory(), + Argument: visitArgumentFactory(typePolicies), + }, + () => state, + ); +} + +function setParentTypeStateFactory
() { + return function setParentTypeStateFactoryFn( + node: A, + state: KeyArgsTransformState, + ) { + const type = + node.kind === "LinkedField" || + node.kind === "Fragment" || + node.kind === "Root" || + node.kind === "SplitOperation" + ? node.type + : node.kind === "InlineFragment" + ? node.typeCondition + : null; + if (node.kind === "LinkedField") { + if (state.nextParentTypeName) { + state.parentTypeName = state.nextParentTypeName; + } + state.nextParentTypeName = unwrap(type).name; + state.fieldName = node.name; + const keyArgDirective = node.directives.find((d) => d.name === "keyArgs"); + if (keyArgDirective) { + state.keyArgsFromDirective = + (keyArgDirective.args?.find((arg) => (arg.name = "args")) + ?.value as any as KeySpecifier) || null; + } else { + state.keyArgsFromDirective = null; + } + } else { + state.parentTypeName = type.name; + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return this.traverse(node, state); + }; +} + +function visitArgumentFactory(typePolicies: TypePolicies) { + return (node: Argument, state: KeyArgsTransformState) => { + if (state.parentTypeName && state.fieldName) { + const fieldPolicies = + typePolicies[state.parentTypeName]?.fields?.[state.fieldName]; + + if (fieldPolicies && (fieldPolicies as FieldPolicy).keyArgs) { + const keyArgs = + ((fieldPolicies as FieldPolicy).keyArgs as KeySpecifier) || + state.keyArgsFromDirective; + + if (Array.isArray(keyArgs) && keyArgs.includes(node.name)) { + return node; + } else if (!Array.isArray(keyArgs)) { + return node; + } else { + return null; + } + } + } + return node; + }; +} + +function unwrap(type: TypeID): CompositeTypeID { + if (type.ofType) { + return unwrap(type.ofType); + } + return type; +} diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/NormalizationCodeGenerator.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/NormalizationCodeGenerator.ts new file mode 100644 index 000000000..db12d3655 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/NormalizationCodeGenerator.ts @@ -0,0 +1,533 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import argumentContainsVariables from "../util/argumentContainsVariables"; + +import generateAbstractTypeRefinementKey from "../util/generateAbstractTypeRefinementKey"; + +import partitionArray from "../util/partitionArray"; + +import sortObjectByKey from "./sortObjectByKey"; + +import { createCompilerError, createUserError } from "../core/CompilerError"; + +import { getStorageKey, stableCopy } from "relay-runtime"; +/** + * @public + * + * Converts an IR node into a plain JS object representation that can be + * used at runtime. + */ + +function generate(schema, node) { + switch (node.kind) { + case "Root": + return generateRoot(schema, node); + + case "SplitOperation": + return generateSplitOperation(schema, node); + + default: + throw createCompilerError( + `NormalizationCodeGenerator: Unsupported AST kind '${node.kind}'.`, + [node.loc], + ); + } +} + +function generateRoot(schema, node) { + return { + argumentDefinitions: generateArgumentDefinitions( + schema, + node.argumentDefinitions, + ), + kind: "Operation", + name: node.name, + selections: generateSelections(schema, node.selections), + }; +} + +function generateSplitOperation(schema, node) { + return { + kind: "SplitOperation", + metadata: sortObjectByKey(node.metadata), + name: node.name, + selections: generateSelections(schema, node.selections), + }; +} + +function generateSelections(schema, selections) { + const normalizationSelections = []; + selections.forEach((selection) => { + switch (selection.kind) { + case "Condition": + normalizationSelections.push(generateCondition(schema, selection)); + break; + + case "ClientExtension": + normalizationSelections.push( + generateClientExtension(schema, selection), + ); + break; + + case "ScalarField": + // NOTE: Inline fragments in normalization ast have the abstractKey + // but we skip the corresponding ScalarField for the type discriminator + // selection, since it's guaranteed to be a duplicate of a parent __typename + // selection. + const abstractKey = selection.metadata?.abstractKey; + + if (typeof abstractKey === "string") { + normalizationSelections.push(generateTypeDiscriminator(abstractKey)); + } else { + normalizationSelections.push(...generateScalarField(selection)); + } + + break; + + case "ModuleImport": + normalizationSelections.push(generateModuleImport(selection)); + break; + + case "InlineFragment": + normalizationSelections.push(generateInlineFragment(schema, selection)); + break; + + case "LinkedField": + normalizationSelections.push(...generateLinkedField(schema, selection)); + break; + + case "Defer": + normalizationSelections.push(generateDefer(schema, selection)); + break; + + case "Stream": + normalizationSelections.push(generateStream(schema, selection)); + break; + + case "InlineDataFragmentSpread": + case "FragmentSpread": + throw new createCompilerError( + `NormalizationCodeGenerator: Unexpected IR node ${selection.kind}.`, + [selection.loc], + ); + + default: + selection; + throw new Error(); + } + }); + return normalizationSelections; +} + +function generateArgumentDefinitions(schema, nodes) { + return nodes.map((node) => { + return { + defaultValue: stableCopy(node.defaultValue), + kind: "LocalArgument", + name: node.name, + }; + }); +} + +function generateClientExtension(schema, node) { + return { + kind: "ClientExtension", + selections: generateSelections(schema, node.selections), + }; +} + +function generateCondition(schema, node) { + if (node.condition.kind !== "Variable") { + throw createCompilerError( + "NormalizationCodeGenerator: Expected 'Condition' with static " + + "value to be pruned or inlined", + [node.condition.loc], + ); + } + + return { + condition: node.condition.variableName, + kind: "Condition", + passingValue: node.passingValue, + selections: generateSelections(schema, node.selections), + }; +} + +function generateDefer(schema, node) { + if ( + !( + node.if == null || + node.if.kind === "Variable" || + (node.if.kind === "Literal" && node.if.value === true) + ) + ) { + throw createCompilerError( + "NormalizationCodeGenerator: Expected @defer `if` condition to be " + + "a variable, unspecified, or the literal `true`.", + [node.if?.loc ?? node.loc], + ); + } + + return { + if: + node.if != null && node.if.kind === "Variable" + ? node.if.variableName + : null, + kind: "Defer", + label: node.label, + selections: generateSelections(schema, node.selections), + }; +} + +function generateInlineFragment(schema, node) { + const rawType = schema.getRawType(node.typeCondition); + const isAbstractType = schema.isAbstractType(rawType); + const abstractKey = isAbstractType + ? generateAbstractTypeRefinementKey(schema, rawType) + : null; + let selections = generateSelections(schema, node.selections); + + if (isAbstractType) { + // Maintain a few invariants: + // - InlineFragment (and `selections` arrays generally) cannot be empty + // - Don't emit a TypeDiscriminator under an InlineFragment unless it has + // a different abstractKey + // This means we have to handle two cases: + // - The inline fragment only contains a TypeDiscriminator with the same + // abstractKey: replace the Fragment w the Discriminator + // - The inline fragment contains other selections: return all the selections + // minus any Discriminators w the same key + const [discriminators, otherSelections] = partitionArray( + selections, + (selection) => + selection.kind === "TypeDiscriminator" && + selection.abstractKey === abstractKey, + ); + const discriminator = discriminators[0]; + + if (discriminator != null && otherSelections.length === 0) { + return discriminator; + } else { + selections = otherSelections; + } + } + + return { + kind: "InlineFragment", + selections, + type: schema.getTypeString(rawType), + abstractKey, + }; +} + +function generateLinkedField(schema, node) { + // Note: it is important that the arguments of this field be sorted to + // ensure stable generation of storage keys for equivalent arguments + // which may have originally appeared in different orders across an app. + const handles = + (node.handles && + node.handles.map((handle) => { + let handleNode = { + alias: node.alias === node.name ? null : node.alias, + args: generateArgs(node.args), + filters: handle.filters, + handle: handle.name, + key: handle.key, + kind: "LinkedHandle", + name: node.name, + }; // NOTE: this intentionally adds a dynamic key in order to avoid + // triggering updates to existing queries that do not use dynamic + // keys. + + if (handle.dynamicKey != null) { + const dynamicKeyArgName = "__dynamicKey"; + handleNode = { + ...handleNode, + dynamicKey: { + kind: "Variable", + name: dynamicKeyArgName, + variableName: handle.dynamicKey.variableName, + }, + }; + } + + if (handle.handleArgs != null) { + const handleArgs = generateArgs(handle.handleArgs); + + if (handleArgs != null) { + handleNode = { ...handleNode, handleArgs }; + } + } + + return handleNode; + })) || + []; + const type = schema.getRawType(node.type); + let field = { + alias: node.alias === node.name ? null : node.alias, + args: generateArgs(node.args), + concreteType: !schema.isAbstractType(type) + ? schema.getTypeString(type) + : null, + kind: "LinkedField", + name: node.name, + plural: isPlural(schema, node.type), + selections: generateSelections(schema, node.selections), + storageKey: null, + }; // Precompute storageKey if possible + + const storageKey = getStaticStorageKey(field, node.metadata); + + if (storageKey != null) { + field = { ...field, storageKey }; + } + + return [field].concat(handles); +} + +function generateModuleImport(node) { + const fragmentName = node.name; + const regExpMatch = fragmentName.match( + /^([a-zA-Z][a-zA-Z0-9]*)(?:_([a-zA-Z][_a-zA-Z0-9]*))?$/, + ); + + if (!regExpMatch) { + throw createCompilerError( + "NormalizationCodeGenerator: @module fragments should be named " + + `'FragmentName_propName', got '${fragmentName}'.`, + [node.loc], + ); + } + + const fragmentPropName = regExpMatch[2]; + + if (typeof fragmentPropName !== "string") { + throw createCompilerError( + "NormalizationCodeGenerator: @module fragments should be named " + + `'FragmentName_propName', got '${fragmentName}'.`, + [node.loc], + ); + } + + return { + args: null, + documentName: node.key, + fragmentName, + fragmentPropName, + kind: "ModuleImport", + }; +} + +function generateTypeDiscriminator(abstractKey) { + return { + kind: "TypeDiscriminator", + abstractKey, + }; +} + +function generateScalarField(node) { + // flowlint-next-line sketchy-null-mixed:off + if (node.metadata?.skipNormalizationNode) { + return []; + } // Note: it is important that the arguments of this field be sorted to + // ensure stable generation of storage keys for equivalent arguments + // which may have originally appeared in different orders across an app. + + const handles = + (node.handles && + node.handles.map((handle) => { + if (handle.dynamicKey != null) { + throw createUserError( + "Dynamic key values are not supported on scalar fields.", + [handle.dynamicKey.loc], + ); + } + + const nodeHandle = { + alias: node.alias === node.name ? null : node.alias, + args: generateArgs(node.args), + filters: handle.filters, + handle: handle.name, + key: handle.key, + kind: "ScalarHandle", + name: node.name, + }; + + if (handle.handleArgs != null) { + // $FlowFixMe handleArgs exists in Handle + nodeHandle.handleArgs = generateArgs(handle.handleArgs); + } + + return nodeHandle; + })) || + []; + let field = { + alias: node.alias === node.name ? null : node.alias, + args: generateArgs(node.args), + kind: "ScalarField", + name: node.name, + storageKey: null, + }; // Precompute storageKey if possible + + const storageKey = getStaticStorageKey(field, node.metadata); + + if (storageKey != null) { + field = { ...field, storageKey }; + } + + if (node.metadata?.flight === true) { + field = { ...field, kind: "FlightField" }; + } + + return [field].concat(handles); +} + +function generateStream(schema, node) { + if ( + !( + node.if == null || + node.if.kind === "Variable" || + (node.if.kind === "Literal" && node.if.value === true) + ) + ) { + throw createCompilerError( + "NormalizationCodeGenerator: Expected @stream `if` condition to be " + + "a variable, unspecified, or the literal `true`.", + [node.if?.loc ?? node.loc], + ); + } + + return { + if: + node.if != null && node.if.kind === "Variable" + ? node.if.variableName + : null, + kind: "Stream", + label: node.label, + selections: generateSelections(schema, node.selections), + }; +} + +function generateArgumentValue(name, value) { + switch (value.kind) { + case "Variable": + return { + kind: "Variable", + name: name, + variableName: value.variableName, + }; + + case "Literal": + return value.value === null + ? null + : { + kind: "Literal", + name: name, + value: stableCopy(value.value), + }; + + case "ObjectValue": { + const objectKeys = value.fields.map((field) => field.name).sort(); + const objectValues = new Map( + value.fields.map((field) => { + return [field.name, field.value]; + }), + ); + return { + fields: objectKeys.map((fieldName) => { + const fieldValue = objectValues.get(fieldName); + + if (fieldValue == null) { + throw createCompilerError("Expected to have object field value"); + } + + return ( + generateArgumentValue(fieldName, fieldValue) ?? { + kind: "Literal", + name: fieldName, + value: null, + } + ); + }), + kind: "ObjectValue", + name: name, + }; + } + + case "ListValue": { + return { + items: value.items.map((item, index) => { + return generateArgumentValue(`${name}.${index}`, item); + }), + kind: "ListValue", + name: name, + }; + } + + default: + throw createUserError( + "NormalizationCodeGenerator: Complex argument values (Lists or " + + "InputObjects with nested variables) are not supported.", + [value.loc], + ); + } +} + +function generateArgs(args) { + const concreteArguments = []; + args.forEach((arg) => { + const concreteArgument = generateArgumentValue(arg.name, arg.value); + + if (concreteArgument !== null) { + concreteArguments.push(concreteArgument); + } + }); + return concreteArguments.length === 0 + ? null + : concreteArguments.sort(nameComparator); +} + +function nameComparator(a, b) { + return a.name < b.name ? -1 : a.name > b.name ? 1 : 0; +} +/** + * Pre-computes storage key if possible and advantageous. Storage keys are + * generated for fields with supplied arguments that are all statically known + * (ie. literals, no variables) at build time. + */ + +function getStaticStorageKey(field, metadata) { + const metadataStorageKey = metadata?.storageKey; + + if (typeof metadataStorageKey === "string") { + return metadataStorageKey; + } + + if ( + !field.args || + field.args.length === 0 || + field.args.some(argumentContainsVariables) + ) { + return null; + } + + return getStorageKey(field, {}); +} + +function isPlural(schema, type) { + return schema.isList(schema.getNullableType(type)); +} + +export { generate }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/ReaderCodeGenerator.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/ReaderCodeGenerator.ts new file mode 100644 index 000000000..deeaac8f8 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/ReaderCodeGenerator.ts @@ -0,0 +1,482 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import CodeMarker from "../util/CodeMarker"; + +import argumentContainsVariables from "../util/argumentContainsVariables"; + +import generateAbstractTypeRefinementKey from "../util/generateAbstractTypeRefinementKey"; + +import { createCompilerError, createUserError } from "../core/CompilerError"; + +import { getStorageKey, stableCopy } from "relay-runtime"; + +/** + * @public + * + * Converts an IR node into a plain JS object representation that can be + * used at runtime. + */ +function generate(schema, node) { + if (node == null) { + return node; + } + + let metadata = null; + + if (node.metadata != null) { + const { mask, plural, connection, refetch } = node.metadata; + + if (Array.isArray(connection)) { + metadata = metadata ?? {}; + metadata.connection = connection; + } + + if (typeof mask === "boolean") { + metadata = metadata ?? {}; + metadata.mask = mask; + } + + if (plural === true) { + metadata = metadata ?? {}; + metadata.plural = true; + } + + if (refetch != null && typeof refetch === "object") { + metadata = metadata ?? {}; + metadata.refetch = { + connection: refetch.connection, + fragmentPathInResult: refetch.fragmentPathInResult, + operation: CodeMarker.moduleDependency( + // $FlowFixMe[unclear-addition] + refetch.operation + ".graphql", + ), + }; + + if (typeof refetch.identifierField === "string") { + metadata.refetch = { + ...metadata.refetch, + identifierField: refetch.identifierField, + }; + } + } + } + + const rawType = schema.getRawType(node.type); + return { + argumentDefinitions: generateArgumentDefinitions( + schema, + node.argumentDefinitions, + ), + kind: "Fragment", + // $FlowFixMe[incompatible-return] + metadata, + name: node.name, + selections: generateSelections(schema, node.selections), + type: schema.getTypeString(rawType), + abstractKey: schema.isAbstractType(rawType) + ? generateAbstractTypeRefinementKey(schema, rawType) + : null, + }; +} + +function generateSelections(schema, selections) { + return selections + .map((selection) => { + switch (selection.kind) { + case "ClientExtension": + return generateClientExtension(schema, selection); + + case "FragmentSpread": + return generateFragmentSpread(schema, selection); + + case "Condition": + return generateCondition(schema, selection); + + case "ScalarField": + // NOTE: The type discriminator is used only for the + // normalization ast. + const isTypeDiscriminator = selection.metadata?.abstractKey != null; + + if (isTypeDiscriminator) { + return null; + } + + return generateScalarField(schema, selection); + + case "ModuleImport": + return generateModuleImport(schema, selection); + + case "InlineDataFragmentSpread": + return generateInlineDataFragmentSpread(schema, selection); + + case "InlineFragment": + return generateInlineFragment(schema, selection); + + case "LinkedField": + return generateLinkedField(schema, selection); + + case "Defer": + return generateDefer(schema, selection); + + case "Stream": + return generateStream(schema, selection); + + default: + selection; + throw new Error(); + } + }) + .filter(Boolean); +} + +function generateArgumentDefinitions(schema, nodes) { + return nodes + .map((node) => { + switch (node.kind) { + case "LocalArgumentDefinition": + return { + defaultValue: stableCopy(node.defaultValue), + kind: "LocalArgument", + name: node.name, + }; + + case "RootArgumentDefinition": + return { + kind: "RootArgument", + name: node.name, + }; + + default: + throw new Error(); + } + }) + .sort((nodeA, nodeB) => { + if (nodeA.name > nodeB.name) { + return 1; + } + + if (nodeA.name < nodeB.name) { + return -1; + } + + return 0; + }); +} + +function generateClientExtension(schema, node) { + return { + kind: "ClientExtension", + selections: generateSelections(schema, node.selections), + }; +} + +function generateDefer(schema, node) { + return { + kind: "Defer", + selections: generateSelections(schema, node.selections), + }; +} + +function generateStream(schema, node) { + return { + kind: "Stream", + selections: generateSelections(schema, node.selections), + }; +} + +function generateCondition(schema, node) { + if (node.condition.kind !== "Variable") { + throw createCompilerError( + "ReaderCodeGenerator: Expected 'Condition' with static value to be " + + "pruned or inlined", + [node.condition.loc], + ); + } + + return { + condition: node.condition.variableName, + kind: "Condition", + passingValue: node.passingValue, + selections: generateSelections(schema, node.selections), + }; +} + +function generateFragmentSpread(schema, node) { + return { + args: generateArgs(node.args), + kind: "FragmentSpread", + name: node.name, + }; +} + +function generateInlineFragment(schema, node) { + const rawType = schema.getRawType(node.typeCondition); + return { + kind: "InlineFragment", + selections: generateSelections(schema, node.selections), + type: schema.getTypeString(rawType), + abstractKey: schema.isAbstractType(rawType) + ? generateAbstractTypeRefinementKey(schema, rawType) + : null, + }; +} + +function generateInlineDataFragmentSpread(schema, node) { + return { + kind: "InlineDataFragmentSpread", + name: node.name, + selections: generateSelections(schema, node.selections), + }; +} + +function generateLinkedField(schema, node) { + // Note: it is important that the arguments of this field be sorted to + // ensure stable generation of storage keys for equivalent arguments + // which may have originally appeared in different orders across an app. + // TODO(T37646905) enable this invariant after splitting the + // RelayCodeGenerator-test and running the FieldHandleTransform on + // Reader ASTs. + // + // invariant( + // node.handles == null, + // 'ReaderCodeGenerator: unexpected handles', + // ); + const rawType = schema.getRawType(node.type); + let field = { + alias: node.alias === node.name ? null : node.alias, + args: generateArgs(node.args), + concreteType: !schema.isAbstractType(rawType) + ? schema.getTypeString(rawType) + : null, + kind: "LinkedField", + name: node.name, + plural: isPlural(schema, node.type), + selections: generateSelections(schema, node.selections), + storageKey: null, + }; // Precompute storageKey if possible + + const storageKey = getStaticStorageKey(field, node.metadata); + + if (storageKey) { + field = { ...field, storageKey }; + } + + const requiredMetadata = node.metadata?.required; + + if (requiredMetadata != null) { + return createRequiredField(field, requiredMetadata); + } + + return field; +} + +function createRequiredField(field, requiredMetadata) { + return { + kind: "RequiredField", + field, + action: requiredMetadata.action, + path: requiredMetadata.path, + }; +} + +function generateModuleImport(schema, node) { + const fragmentName = node.name; + const regExpMatch = fragmentName.match( + /^([a-zA-Z][a-zA-Z0-9]*)(?:_([a-zA-Z][_a-zA-Z0-9]*))?$/, + ); + + if (!regExpMatch) { + throw createCompilerError( + "ReaderCodeGenerator: @match fragments should be named " + + `'FragmentName_propName', got '${fragmentName}'.`, + [node.loc], + ); + } + + const fragmentPropName = regExpMatch[2]; + + if (typeof fragmentPropName !== "string") { + throw createCompilerError( + "ReaderCodeGenerator: @module fragments should be named " + + `'FragmentName_propName', got '${fragmentName}'.`, + [node.loc], + ); + } + + return { + documentName: node.key, + fragmentName, + fragmentPropName, + kind: "ModuleImport", + }; +} + +function generateScalarField(schema, node) { + // Note: it is important that the arguments of this field be sorted to + // ensure stable generation of storage keys for equivalent arguments + // which may have originally appeared in different orders across an app. + // TODO(T37646905) enable this invariant after splitting the + // RelayCodeGenerator-test and running the FieldHandleTransform on + // Reader ASTs. + // + // invariant( + // node.handles == null, + // 'ReaderCodeGenerator: unexpected handles', + // ); + let field = { + alias: node.alias === node.name ? null : node.alias, + args: generateArgs(node.args), + kind: "ScalarField", + name: node.name, + storageKey: null, + }; // Precompute storageKey if possible + + const storageKey = getStaticStorageKey(field, node.metadata); + + if (storageKey) { + field = { ...field, storageKey }; + } + + if (node.metadata?.flight === true) { + field = { ...field, kind: "FlightField" }; + } + + const requiredMetadata = node.metadata?.required; + + if (requiredMetadata != null) { + if (field.kind === "FlightField") { + throw new createUserError( + "@required cannot be used on a ReactFlightComponent.", + [node.loc], + ); + } + + return createRequiredField(field, requiredMetadata); + } + + return field; +} + +function generateArgument(name, value) { + switch (value.kind) { + case "Variable": + return { + kind: "Variable", + name: name, + variableName: value.variableName, + }; + + case "Literal": + return value.value === null + ? null + : { + kind: "Literal", + name: name, + value: stableCopy(value.value), + }; + + case "ObjectValue": { + const objectKeys = value.fields.map((field) => field.name).sort(); + const objectValues = new Map( + value.fields.map((field) => { + return [field.name, field.value]; + }), + ); + return { + fields: objectKeys.map((fieldName) => { + const fieldValue = objectValues.get(fieldName); + + if (fieldValue == null) { + throw createCompilerError("Expected to have object field value"); + } + + return ( + generateArgument(fieldName, fieldValue) ?? { + kind: "Literal", + name: fieldName, + value: null, + } + ); + }), + kind: "ObjectValue", + name: name, + }; + } + + case "ListValue": { + return { + items: value.items.map((item, index) => { + return generateArgument(`${name}.${index}`, item); + }), + kind: "ListValue", + name: name, + }; + } + + default: + throw createUserError( + "ReaderCodeGenerator: Complex argument values (Lists or " + + "InputObjects with nested variables) are not supported.", + [value.loc], + ); + } +} + +function generateArgs(args) { + const concreteArguments = []; + args.forEach((arg) => { + const concreteArgument = generateArgument(arg.name, arg.value); + + if (concreteArgument !== null) { + concreteArguments.push(concreteArgument); + } + }); + return concreteArguments.length === 0 + ? null + : concreteArguments.sort(nameComparator); +} + +function nameComparator(a, b) { + return a.name < b.name ? -1 : a.name > b.name ? 1 : 0; +} +/** + * Pre-computes storage key if possible and advantageous. Storage keys are + * generated for fields with supplied arguments that are all statically known + * (ie. literals, no variables) at build time. + */ + +function getStaticStorageKey(field, metadata) { + const metadataStorageKey = metadata?.storageKey; + + if (typeof metadataStorageKey === "string") { + return metadataStorageKey; + } + + if ( + !field.args || + field.args.length === 0 || + field.args.some(argumentContainsVariables) + ) { + return null; + } + + return getStorageKey(field, {}); +} + +function isPlural(schema, type) { + return schema.isList(schema.getNullableType(type)); +} + +export { generate }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/RelayCodeGenerator.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/RelayCodeGenerator.ts new file mode 100644 index 000000000..d5c3c0530 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/RelayCodeGenerator.ts @@ -0,0 +1,71 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import * as NormalizationCodeGenerator from "./NormalizationCodeGenerator"; + +import * as ReaderCodeGenerator from "./ReaderCodeGenerator"; + +import sortObjectByKey from "./sortObjectByKey"; + +import md5 from "../util/md5"; + +import nullthrows from "nullthrows"; + +import { createCompilerError } from "../core/CompilerError"; + +function generate(schema, node) { + switch (node.kind) { + case "Fragment": + if (node.metadata?.inlineData === true) { + return { + kind: "InlineDataFragment", + name: node.name, + }; + } + + return ReaderCodeGenerator.generate(schema, node); + + case "Request": + return { + fragment: ReaderCodeGenerator.generate(schema, node.fragment), + kind: "Request", + operation: NormalizationCodeGenerator.generate(schema, node.root), + params: + node.id != null + ? { + id: node.id, + metadata: sortObjectByKey(node.metadata), + name: node.name, + operationKind: node.root.operation, + } + : { + cacheID: md5(nullthrows(node.text)), + metadata: sortObjectByKey(node.metadata), + name: node.name, + operationKind: node.root.operation, + text: node.text, + }, + }; + + case "SplitOperation": + return NormalizationCodeGenerator.generate(schema, node); + } + + throw createCompilerError( + `RelayCodeGenerator: Unknown AST kind '${node.kind}'.`, + [node.loc], + ); +} + +export { generate }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/sortObjectByKey.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/sortObjectByKey.ts new file mode 100644 index 000000000..16157ec03 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/codegen/sortObjectByKey.ts @@ -0,0 +1,28 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +"use strict"; + +function sortObjectByKey(obj) { + if (obj == null) { + return obj; + } + + const result = {}; + + for (const key of Object.keys(obj).sort()) { + result[key] = obj[key]; + } // $FlowFixMe[incompatible-return] + + return result; +} + +export default sortObjectByKey; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/CompilerContext.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/CompilerContext.ts new file mode 100644 index 000000000..884f05465 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/CompilerContext.ts @@ -0,0 +1,206 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +// import Profiler from "./GraphQLCompilerProfiler"; + +import invariant from "invariant"; + +import { createUserError } from "./CompilerError"; // $FlowFixMe[untyped-import] - immutable.js is not flow-typed + +import { OrderedMap as ImmutableOrderedMap } from "immutable"; + +import { Root, Fragment, SplitOperation } from "./IR"; +export type CompilerContextDocument = Fragment | Root | SplitOperation; + +/** + * An immutable representation of a corpus of documents being compiled together. + * For each document, the context stores the IR and any validation errors. + */ +class CompilerContext { + // $FlowFixMe[value-as-type] + constructor(schema) { + this._isMutable = false; + this._documents = new ImmutableOrderedMap(); + this._withTransform = new WeakMap(); + this._schema = schema; + } + /** + * Returns the documents for the context in the order they were added. + */ + + documents() { + return this._documents.toArray(); + } + + forEachDocument(fn: (doc: CompilerContextDocument) => void) { + this._documents.forEach(fn); + } + + replace(node) { + // FIXME: TMP has duplicate definition names, but that is really only a + // problem when they are fragments. Right here the name in the + // map does not matter outside of the implementation of + // transforming to IR, so we can just make operations named + // uniquely. + // Bug #2809718 + const nodeName = node.kind === "Root" ? node.name + "$root" : node.name; + return this._update( + this._documents.update(nodeName, (existing) => { + invariant( + existing, + "CompilerContext: Expected to replace existing node %s, but " + + "one was not found in the context.", + nodeName, + ); + return node; + }), + ); + } + + add(node) { + // FIXME: TMP has duplicate definition names, but that is really only a + // problem when they are fragments. Right here the name in the + // map does not matter outside of the implementation of + // transforming to IR, so we can just make operations named + // uniquely. + // Bug #2809718 + const nodeName = node.kind === "Root" ? node.name + "$root" : node.name; + return this._update( + this._documents.update(nodeName, (existing) => { + invariant( + !existing, + "CompilerContext: Duplicate document named `%s`. GraphQL " + + "fragments and roots must have unique names.", + nodeName, + ); + return node; + }), + ); + } + + addAll(nodes) { + return this.withMutations((mutable) => + nodes.reduce((ctx, definition) => ctx.add(definition), mutable), + ); + } + /** + * Apply a list of compiler transforms and return a new compiler context. + */ + + applyTransforms(transforms, reporter) { + // return Profiler.run("applyTransforms", () => + transforms.reduce( + (ctx, transform) => ctx.applyTransform(transform, reporter), + this, + ); //, + // ); + } + /** + * Applies a transform to this context, returning a new context. + * + * This is memoized such that applying the same sequence of transforms will + * not result in duplicated work. + */ + + // applyTransform(transform, reporter) { + applyTransform(transform): CompilerContext { + let transformed = this._withTransform.get(transform); + + if (!transformed) { + // const start = process.hrtime(); + // transformed = Profiler.instrument(transform)(this); + transformed = transform(this); + // const delta = process.hrtime(start); + // const deltaMs = Math.round((delta[0] * 1e9 + delta[1]) / 1e6); + // reporter && reporter.reportTime(transform.name, deltaMs); + + this._withTransform.set(transform, transformed); + } + + return transformed; + } + + get(name) { + return this._documents.get(name); + } + + getFragment(name, referencedFrom) { + const node = this._documents.get(name); + + if (node == null) { + throw createUserError( + `Cannot find fragment '${name}'.`, + referencedFrom != null ? [referencedFrom] : null, + ); + } else if (node.kind !== "Fragment") { + throw createUserError( + `Cannot find fragment '${name}', a document with this name exists ` + + "but is not a fragment.", + [node.loc, referencedFrom].filter(Boolean), + ); + } + + return node; + } + + getRoot(name) { + // FIXME: TMP has duplicate definition names, but that is really only a + // problem when they are fragments. Right here the name in the + // map does not matter outside of the implementation of + // transforming to IR, so we can just make operations named + // uniquely. + // Bug #2809718 + const node = this._documents.get(name + "$root"); + + if (node == null) { + throw createUserError(`Cannot find root '${name}'.`); + } else if (node.kind !== "Root") { + throw createUserError( + `Cannot find root '${name}', a document with this name exists but ` + + "is not a root.", + [node.loc], + ); + } + + return node; + } + + remove(name) { + return this._update(this._documents.delete(name)); + } + + withMutations(fn) { + const mutableCopy = this._update(this._documents.asMutable()); + + mutableCopy._isMutable = true; + const result = fn(mutableCopy); + result._isMutable = false; + result._documents = result._documents.asImmutable(); + return this._documents === result._documents ? this : result; + } + + _update(documents) { + const context = this._isMutable + ? this + : new CompilerContext(this.getSchema()); + context._documents = documents; + return context; + } + + getSchema() { + return this._schema; + } +} + +export default CompilerContext; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/CompilerError.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/CompilerError.ts new file mode 100644 index 000000000..da6598feb --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/CompilerError.ts @@ -0,0 +1,240 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import { GraphQLError } from "graphql"; + +/** + * Creates an error describing invalid application code (GraphQL/Schema) + * that must be fixed by the end developer. This should only be used + * for local errors that don't affect processing of other user code. + */ +function createUserError(message, locations, nodes) { + let messageWithLocations = message; + + if (locations != null) { + const printedLocations = printLocations(locations); + messageWithLocations = + printedLocations.length === 0 + ? message + : [message, ...printedLocations].join("\n\n") + "\n"; + } + + return new GraphQLError(messageWithLocations, nodes ?? []); +} +/** + * Similar to createUserError but for errors that are *not* recoverable: + * the compiler should not continue to process other inputs because their + * validity can't be determined. + */ + +function createNonRecoverableUserError(message, locations, nodes) { + let messageWithLocations = message; + + if (locations != null) { + const printedLocations = printLocations(locations); + messageWithLocations = + printedLocations.length === 0 + ? message + : [message, ...printedLocations].join("\n\n") + "\n"; + } + + const error = new GraphQLError(messageWithLocations, nodes ?? []); + return new Error(error.message); +} +/** + * Creates an error describing a problem with the compiler itself - such + * as a broken invariant - that must be fixed within the compiler. + */ + +function createCompilerError(message, locations, nodes) { + let messageWithLocations = message; + + if (locations != null) { + const printedLocations = printLocations(locations); + messageWithLocations = + printedLocations.length === 0 + ? message + : [message, ...printedLocations].join("\n\n") + "\n"; + } + + const error = new GraphQLError( + `Internal Error: ${messageWithLocations}`, + nodes ?? [], + ); + return new Error(error.message); +} +/** + * Iterates over the elements of some iterable value, calling the + * supplied callback for each item with a guard for user errors. + * + * Non-user errors abort the iteration and are instantly rethrown. + * User errors are collected and rethrown at the end, if multiple user errors + * occur, a combined error is thrown. + */ + +function eachWithCombinedError(iterable, fn) { + const errors = []; + + for (const item of iterable) { + try { + fn(item); + } catch (error) { + if (error instanceof GraphQLError) { + errors.push(error); + } else { + throw error; + } + } + } + + if (errors.length > 0) { + if (errors.length === 1) { + throw createUserError( + String(errors[0]) + .split("\n") + .map((line, index) => (index === 0 ? `- ${line}` : ` ${line}`)) + .join("\n"), + ); + } + + throw createUserError( + `Encountered ${errors.length} errors:\n` + + errors + .map((error) => + String(error) + .split("\n") + .map((line, index) => (index === 0 ? `- ${line}` : ` ${line}`)) + .join("\n"), + ) + .join("\n"), + ); + } +} + +function printLocations(locations) { + const printedLocations = []; + + for (const location of locations) { + let sourceLocation = location; + + while (sourceLocation.kind === "Derived") { + sourceLocation = sourceLocation.source; + } + + switch (sourceLocation.kind) { + case "Source": { + // source location + const prefix = + sourceLocation === location ? "Source: " : "Source (derived): "; + printedLocations.push( + prefix + + highlightSourceAtLocation( + sourceLocation.source, + getLocation(sourceLocation.source, sourceLocation.start), + ), + ); + break; + } + + case "Generated": { + printedLocations.push("Source: (generated)"); + break; + } + + case "Unknown": { + printedLocations.push("Source: (unknown)"); + break; + } + + default: { + sourceLocation; + throw createCompilerError( + `CompilerError: cannot print location '${String(sourceLocation)}'.`, + ); + } + } + } + + return printedLocations; +} +/** + * Render a helpful description of the location of the error in the GraphQL + * Source document. + */ + +function highlightSourceAtLocation(source, location) { + const firstLineColumnOffset = source.locationOffset.column - 1; + const body = whitespace(firstLineColumnOffset) + source.body; + const lineIndex = location.line - 1; + const lineOffset = source.locationOffset.line - 1; + const lineNum = location.line + lineOffset; + const columnOffset = location.line === 1 ? firstLineColumnOffset : 0; + const columnNum = location.column + columnOffset; + const lines = body.split(/\r\n|[\n\r]/g); + return ( + `${source.name} (${lineNum}:${columnNum})\n` + + printPrefixedLines([ + // Lines specified like this: ["prefix", "string"], + [`${lineNum - 1}: `, lines[lineIndex - 1]], + [`${lineNum}: `, lines[lineIndex]], + ["", whitespace(columnNum - 1) + "^"], + [`${lineNum + 1}: `, lines[lineIndex + 1]], + ]) + ); +} + +function printPrefixedLines(lines) { + const existingLines = lines.filter(([_, line]) => line !== undefined); + let padLen = 0; + + for (const [prefix] of existingLines) { + padLen = Math.max(padLen, prefix.length); + } + + return existingLines + .map(([prefix, line]) => lpad(padLen, prefix) + line) + .join("\n"); +} + +function whitespace(len) { + return Array(len + 1).join(" "); +} + +function lpad(len, str) { + return whitespace(len - str.length) + str; +} + +function getLocation(source, position) { + const lineRegexp = /\r\n|[\n\r]/g; + let line = 1; + let column = position + 1; + let match; + + while ((match = lineRegexp.exec(source.body)) && match.index < position) { + line += 1; + column = position + 1 - (match.index + match[0].length); + } + + return { + line, + column, + }; +} + +export { + createCompilerError, + createNonRecoverableUserError, + createUserError, + eachWithCombinedError, +}; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/IRPrinter.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/IRPrinter.ts new file mode 100644 index 000000000..305d89aed --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/IRPrinter.ts @@ -0,0 +1,454 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import invariant from "invariant"; + +import { DEFAULT_HANDLE_KEY } from "../util/DefaultHandleKey"; + +const INDENT = " "; +/** + * Converts an IR node into a GraphQL string. Custom Relay + * extensions (directives) are not supported; to print fragments with + * variables or fragment spreads with arguments, transform the node + * prior to printing. + */ + +function print(schema, node) { + switch (node.kind) { + case "Fragment": + return ( + `fragment ${node.name} on ${schema.getTypeString(node.type)}` + + printFragmentArgumentDefinitions(schema, node.argumentDefinitions) + + printDirectives(schema, node.directives) + + printSelections(schema, node, "", {}) + + "\n" + ); + + case "Root": + return ( + `${node.operation} ${node.name}` + + printArgumentDefinitions(schema, node.argumentDefinitions) + + printDirectives(schema, node.directives) + + printSelections(schema, node, "", {}) + + "\n" + ); + + case "SplitOperation": + return ( + `SplitOperation ${node.name} on ${schema.getTypeString(node.type)}` + + printSelections(schema, node, "", {}) + + "\n" + ); + + default: + node; + invariant(false, "IRPrinter: Unsupported IR node `%s`.", node.kind); + } +} + +function printSelections(schema, node, indent, options) { + const selections = node.selections; + + if (selections == null) { + return ""; + } + + const printed = selections.map((selection) => + printSelection(schema, selection, indent, options), + ); + return printed.length + ? ` {\n${indent + INDENT}${printed.join( + "\n" + indent + INDENT, + )}\n${indent}${options?.isClientExtension === true ? "# " : ""}}` + : ""; +} +/** + * Prints a field without subselections. + */ + +function printField(schema, field, options) { + const parentDirectives = options?.parentDirectives ?? ""; + const isClientExtension = options?.isClientExtension === true; + return ( + (isClientExtension ? "# " : "") + + (field.alias === field.name + ? field.name + : field.alias + ": " + field.name) + + printArguments(schema, field.args) + + parentDirectives + + printDirectives(schema, field.directives) + + printHandles(schema, field) + ); +} + +function printSelection(schema, selection, indent, options) { + let str; + const parentDirectives = options?.parentDirectives ?? ""; + const isClientExtension = options?.isClientExtension === true; + + if (selection.kind === "LinkedField") { + str = printField(schema, selection, { + parentDirectives, + isClientExtension, + }); + str += printSelections(schema, selection, indent + INDENT, { + isClientExtension, + }); + } else if (selection.kind === "ModuleImport") { + str = selection.selections + .map((matchSelection) => + printSelection(schema, matchSelection, indent, { + parentDirectives, + isClientExtension, + }), + ) + .join("\n" + indent + INDENT); + } else if (selection.kind === "ScalarField") { + str = printField(schema, selection, { + parentDirectives, + isClientExtension, + }); + } else if (selection.kind === "InlineFragment") { + str = ""; + + if (isClientExtension) { + str += "# "; + } + + str += "... on " + schema.getTypeString(selection.typeCondition); + str += parentDirectives; + str += printDirectives(schema, selection.directives); + str += printSelections(schema, selection, indent + INDENT, { + isClientExtension, + }); + } else if (selection.kind === "FragmentSpread") { + str = ""; + + if (isClientExtension) { + str += "# "; + } + + str += "..." + selection.name; + str += parentDirectives; + str += printFragmentArguments(schema, selection.args); + str += printDirectives(schema, selection.directives); + } else if (selection.kind === "InlineDataFragmentSpread") { + str = + `# ${selection.name} @inline` + + `\n${indent}${INDENT}...` + + parentDirectives + + printSelections(schema, selection, indent + INDENT, {}); + } else if (selection.kind === "Condition") { + const value = printValue(schema, selection.condition, null); // For Flow + + invariant( + value != null, + "IRPrinter: Expected a variable for condition, got a literal `null`.", + ); + let condStr = selection.passingValue ? " @include" : " @skip"; + condStr += "(if: " + value + ")"; + condStr += parentDirectives; // For multi-selection conditions, pushes the condition down to each + + const subSelections = selection.selections.map((sel) => + printSelection(schema, sel, indent, { + parentDirectives: condStr, + isClientExtension, + }), + ); + str = subSelections.join("\n" + indent + INDENT); + } else if (selection.kind === "Stream") { + let streamStr = parentDirectives; + streamStr += ` @stream(label: "${selection.label}"`; + + if (selection.if !== null) { + streamStr += `, if: ${printValue(schema, selection.if, null) ?? ""}`; + } + + if (selection.initialCount !== null) { + streamStr += `, initial_count: ${ + printValue(schema, selection.initialCount, null) ?? "" + }`; + } + + if (selection.useCustomizedBatch !== null) { + streamStr += `, use_customized_batch: ${ + printValue(schema, selection.useCustomizedBatch, null) ?? "false" + }`; + } + + streamStr += ")"; + const subSelections = selection.selections.map((sel) => + printSelection(schema, sel, indent, { + parentDirectives: streamStr, + isClientExtension, + }), + ); + str = subSelections.join("\n" + INDENT); + } else if (selection.kind === "Defer") { + let deferStr = parentDirectives; + deferStr += ` @defer(label: "${selection.label}"`; + + if (selection.if !== null) { + deferStr += `, if: ${printValue(schema, selection.if, null) ?? ""}`; + } + + deferStr += ")"; + + if ( + selection.selections.every( + (subSelection) => + subSelection.kind === "InlineFragment" || + subSelection.kind === "FragmentSpread", + ) + ) { + const subSelections = selection.selections.map((sel) => + printSelection(schema, sel, indent, { + parentDirectives: deferStr, + isClientExtension, + }), + ); + str = subSelections.join("\n" + INDENT); + } else { + str = "..." + deferStr; + str += printSelections(schema, selection, indent + INDENT, { + isClientExtension, + }); + } + } else if (selection.kind === "ClientExtension") { + invariant( + isClientExtension === false, + "IRPrinter: Did not expect to encounter a ClientExtension node " + + "as a descendant of another ClientExtension node.", + ); + str = + "# Client-only selections:\n" + + indent + + INDENT + + selection.selections + .map((sel) => + printSelection(schema, sel, indent, { + parentDirectives, + isClientExtension: true, + }), + ) + .join("\n" + indent + INDENT); + } else { + selection; + invariant(false, "IRPrinter: Unknown selection kind `%s`.", selection.kind); + } + + return str; +} + +function printArgumentDefinitions(schema, argumentDefinitions) { + const printed = argumentDefinitions.map((def) => { + let str = `$${def.name}: ${schema.getTypeString(def.type)}`; + + if (def.defaultValue != null) { + str += " = " + printLiteral(schema, def.defaultValue, def.type); + } + + return str; + }); + return printed.length ? `(\n${INDENT}${printed.join("\n" + INDENT)}\n)` : ""; +} + +function printFragmentArgumentDefinitions(schema, argumentDefinitions) { + let printed; + argumentDefinitions.forEach((def) => { + if (def.kind !== "LocalArgumentDefinition") { + return; + } + + printed = printed || []; + let str = `${def.name}: {type: "${schema.getTypeString(def.type)}"`; + + if (def.defaultValue != null) { + str += `, defaultValue: ${printLiteral( + schema, + def.defaultValue, + def.type, + )}`; + } + + str += "}"; // $FlowFixMe[incompatible-use] + + printed.push(str); + }); + return printed && printed.length + ? ` @argumentDefinitions(\n${INDENT}${printed.join("\n" + INDENT)}\n)` + : ""; +} + +function printHandles(schema, field) { + if (!field.handles) { + return ""; + } + + const printed = field.handles.map((handle) => { + // For backward compatibility. + const key = + handle.key === DEFAULT_HANDLE_KEY ? "" : `, key: "${handle.key}"`; + const filters = + handle.filters == null + ? "" + : `, filters: ${JSON.stringify(Array.from(handle.filters).sort())}`; + const handleArgs = + handle.handleArgs == null + ? "" + : `, handleArgs: ${printArguments(schema, handle.handleArgs)}`; + return `@__clientField(handle: "${handle.name}"${key}${filters}${handleArgs})`; + }); + return printed.length ? " " + printed.join(" ") : ""; +} + +function printDirectives(schema, directives) { + const printed = directives.map((directive) => { + return "@" + directive.name + printArguments(schema, directive.args); + }); + return printed.length ? " " + printed.join(" ") : ""; +} + +function printFragmentArguments(schema, args) { + const printedArgs = printArguments(schema, args); + + if (!printedArgs.length) { + return ""; + } + + return ` @arguments${printedArgs}`; +} + +function printArguments(schema, args) { + const printed = []; + args.forEach((arg) => { + const printedValue = printValue(schema, arg.value, arg.type); + + if (printedValue != null) { + printed.push(arg.name + ": " + printedValue); + } + }); + return printed.length ? "(" + printed.join(", ") + ")" : ""; +} + +function printValue(schema, value, type) { + if (type != null && schema.isNonNull(type)) { + type = schema.getNullableType(type); + } + + if (value.kind === "Variable") { + return "$" + value.variableName; + } else if (value.kind === "ObjectValue") { + const inputType = type != null ? schema.asInputObjectType(type) : null; + const pairs = value.fields + .map((field) => { + const fieldConfig = + inputType != null + ? schema.hasField(inputType, field.name) + ? schema.getFieldConfig(schema.expectField(inputType, field.name)) + : null + : null; + const innerValue = printValue(schema, field.value, fieldConfig?.type); + return innerValue == null ? null : field.name + ": " + innerValue; + }) + .filter(Boolean); + return "{" + pairs.join(", ") + "}"; + } else if (value.kind === "ListValue") { + invariant( + type && schema.isList(type), + "GraphQLIRPrinter: Need a type in order to print arrays.", + ); + const innerType = schema.getListItemType(type); + return `[${value.items + .map((i) => printValue(schema, i, innerType)) + .join(", ")}]`; + } else if (value.value != null) { + return printLiteral(schema, value.value, type); + } else { + return null; + } +} + +function printLiteral(schema, value, type) { + if (value == null) { + return JSON.stringify(value) ?? "null"; + } + + if (type != null && schema.isNonNull(type)) { + type = schema.getNullableType(type); + } + + if (type && schema.isEnum(type)) { + let result = schema.serialize(schema.assertEnumType(type), value); + + if (result == null && typeof value === "string") { + // For backwards compatibility, print invalid input values as-is. This + // can occur with literals defined as an @argumentDefinitions + // defaultValue. + result = value; + } + + invariant( + typeof result === "string", + "IRPrinter: Expected value of type %s to be a valid enum value, got `%s`.", + schema.getTypeString(type), + JSON.stringify(value) ?? "null", + ); + return result; + } else if (type && (schema.isId(type) || schema.isInt(type))) { + return JSON.stringify(value) ?? ""; + } else if (type && schema.isScalar(type)) { + const result = schema.serialize(schema.assertScalarType(type), value); + return JSON.stringify(result) ?? ""; + } else if (Array.isArray(value)) { + invariant( + type && schema.isList(type), + "IRPrinter: Need a type in order to print arrays.", + ); + const itemType = schema.getListItemType(type); + return ( + "[" + + value.map((item) => printLiteral(schema, item, itemType)).join(", ") + + "]" + ); + } else if (type && schema.isList(type) && value != null) { + // Not an array, but still a list. Treat as list-of-one as per spec 3.1.7: + // http://facebook.github.io/graphql/October2016/#sec-Lists + return printLiteral(schema, value, schema.getListItemType(type)); + } else if (typeof value === "object" && value != null) { + const fields = []; + invariant( + type && schema.isInputObject(type), + "IRPrinter: Need an InputObject type to print objects.", + ); + const inputType = schema.assertInputObjectType(type); + + for (const key in value) { + if (value.hasOwnProperty(key)) { + const fieldConfig = schema.getFieldConfig( + schema.expectField(inputType, key), + ); + fields.push( + key + ": " + printLiteral(schema, value[key], fieldConfig.type), + ); + } + } + + return "{" + fields.join(", ") + "}"; + } else { + return JSON.stringify(value) ?? "null"; + } +} + +export { print, printField, printArguments, printDirectives }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/IRTransformer.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/IRTransformer.ts new file mode 100644 index 000000000..4de589b3d --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/IRTransformer.ts @@ -0,0 +1,358 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import invariant from "invariant"; + +import { eachWithCombinedError } from "./CompilerError"; + +/** + * @public + * + * Helper for writing compiler transforms that apply "map" and/or "filter"-style + * operations to compiler contexts. The `visitor` argument accepts a map of IR + * kinds to user-defined functions that can map nodes of that kind to new values + * (of the same kind). + * + * If a visitor function is defined for a kind, the visitor function is + * responsible for traversing its children (by calling `this.traverse(node)`) + * and returning either the input (to indicate no changes), a new node (to + * indicate changes), or null/undefined (to indicate the removal of that node + * from the output). + * + * If a visitor function is *not* defined for a kind, a default traversal is + * used to evaluate its children. + * + * The `stateInitializer` argument accepts an optional function to construct the + * state for each document (fragment or root) in the context. Any documents for + * which the initializer returns null/undefined is deleted from the context + * without being traversed. + * + * Example: Alias all scalar fields with the reverse of their name: + * + * ``` + * transform(context, { + * ScalarField: visitScalarField, + * }); + * + * function visitScalarField(field: ScalarField, state: State): ?ScalarField { + * // Traverse child nodes - for a scalar field these are the arguments & + * // directives. + * const nextField = this.traverse(field, state); + * // Return a new node with a different alias. + * return { + * ...nextField, + * alias: nextField.name.split('').reverse().join(''), + * }; + * } + * ``` + */ +function transform(context, visitor, stateInitializer) { + const transformer = new Transformer(context, visitor); + return context.withMutations((ctx) => { + let nextContext = ctx; + eachWithCombinedError(context.documents(), (prevNode) => { + let nextNode; + + if (stateInitializer === undefined) { + nextNode = transformer.visit(prevNode, undefined); + } else { + const state = stateInitializer(prevNode); + + if (state != null) { + nextNode = transformer.visit(prevNode, state); + } + } + + if (!nextNode) { + nextContext = nextContext.remove(prevNode.name); + } else if (nextNode !== prevNode) { + nextContext = nextContext.replace(nextNode); + } + }); + return nextContext; + }); +} +/** + * @internal + */ + +class Transformer { + constructor(context, visitor) { + this._context = context; + this._states = []; + this._visitor = visitor; + } + /** + * @public + * + * Returns the original compiler context that is being transformed. This can + * be used to look up fragments by name, for example. + */ + + getContext() { + return this._context; + } + /** + * @public + * + * Transforms the node, calling a user-defined visitor function if defined for + * the node's kind. Uses the given state for this portion of the traversal. + * + * Note: This differs from `traverse` in that it calls a visitor function for + * the node itself. + */ + + visit(node, state) { + this._states.push(state); + + const nextNode = this._visit(node); + + this._states.pop(); + + return nextNode; + } + /** + * @public + * + * Transforms the children of the given node, skipping the user-defined + * visitor function for the node itself. Uses the given state for this portion + * of the traversal. + * + * Note: This differs from `visit` in that it does not call a visitor function + * for the node itself. + */ + + traverse(node, state) { + this._states.push(state); + + const nextNode = this._traverse(node); + + this._states.pop(); + + return nextNode; + } + + _visit(node) { + const nodeVisitor = this._visitor[node.kind]; + + if (nodeVisitor) { + // If a handler for the kind is defined, it is responsible for calling + // `traverse` to transform children as necessary. + const state = this._getState(); + + const nextNode = nodeVisitor.call(this, node, state); + return nextNode; + } // Otherwise traverse is called automatically. + + return this._traverse(node); + } + + _traverse(prevNode) { + let nextNode; + + switch (prevNode.kind) { + case "Argument": + nextNode = this._traverseChildren(prevNode, null, ["value"]); + break; + + case "Literal": + case "LocalArgumentDefinition": + case "RootArgumentDefinition": + case "Variable": + nextNode = prevNode; + break; + + case "Defer": + nextNode = this._traverseChildren(prevNode, ["selections"], ["if"]); + break; + + case "Stream": + nextNode = this._traverseChildren( + prevNode, + ["selections"], + ["if", "initialCount"], + ); + break; + + case "ClientExtension": + nextNode = this._traverseChildren(prevNode, ["selections"]); + break; + + case "Directive": + nextNode = this._traverseChildren(prevNode, ["args"]); + break; + + case "ModuleImport": + nextNode = this._traverseChildren(prevNode, ["selections"]); + + if (!nextNode.selections.length) { + nextNode = null; + } + + break; + + case "FragmentSpread": + case "ScalarField": + nextNode = this._traverseChildren(prevNode, ["args", "directives"]); + break; + + case "InlineDataFragmentSpread": + nextNode = this._traverseChildren(prevNode, ["selections"]); + break; + + case "LinkedField": + nextNode = this._traverseChildren(prevNode, [ + "args", + "directives", + "selections", + ]); + + if (!nextNode.selections.length) { + nextNode = null; + } + + break; + + case "ListValue": + nextNode = this._traverseChildren(prevNode, ["items"]); + break; + + case "ObjectFieldValue": + nextNode = this._traverseChildren(prevNode, null, ["value"]); + break; + + case "ObjectValue": + nextNode = this._traverseChildren(prevNode, ["fields"]); + break; + + case "Condition": + nextNode = this._traverseChildren( + prevNode, + ["directives", "selections"], + ["condition"], + ); + + if (!nextNode.selections.length) { + nextNode = null; + } + + break; + + case "InlineFragment": + nextNode = this._traverseChildren(prevNode, [ + "directives", + "selections", + ]); + + if (!nextNode.selections.length) { + nextNode = null; + } + + break; + + case "Fragment": + case "Root": + nextNode = this._traverseChildren(prevNode, [ + "argumentDefinitions", + "directives", + "selections", + ]); + break; + + case "Request": + nextNode = this._traverseChildren(prevNode, null, ["fragment", "root"]); + break; + + case "SplitOperation": + nextNode = this._traverseChildren(prevNode, ["selections"]); + break; + + default: + prevNode; + invariant(false, "IRTransformer: Unknown kind `%s`.", prevNode.kind); + } + + return nextNode; + } + + _traverseChildren(prevNode, pluralKeys, singularKeys) { + let nextNode; + pluralKeys && + pluralKeys.forEach((key) => { + const prevItems = prevNode[key]; + + if (!prevItems) { + return; + } + + invariant( + Array.isArray(prevItems), + "IRTransformer: Expected data for `%s` to be an array, got `%s`.", + key, + prevItems, + ); + + const nextItems = this._map(prevItems); + + if (nextNode || nextItems !== prevItems) { + nextNode = nextNode || { ...prevNode }; + nextNode[key] = nextItems; + } + }); + singularKeys && + singularKeys.forEach((key) => { + const prevItem = prevNode[key]; + + if (!prevItem) { + return; + } + + const nextItem = this._visit(prevItem); + + if (nextNode || nextItem !== prevItem) { + nextNode = nextNode || { ...prevNode }; + nextNode[key] = nextItem; + } + }); + return nextNode || prevNode; + } + + _map(prevItems) { + let nextItems; + prevItems.forEach((prevItem, index) => { + const nextItem = this._visit(prevItem); + + if (nextItems || nextItem !== prevItem) { + nextItems = nextItems || prevItems.slice(0, index); + + if (nextItem) { + nextItems.push(nextItem); + } + } + }); + return nextItems || prevItems; + } + + _getState() { + invariant( + this._states.length, + "IRTransformer: Expected a current state to be set but found none. " + + "This is usually the result of mismatched number of pushState()/popState() " + + "calls.", + ); + return this._states[this._states.length - 1]; + } +} + +export { transform }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/RelayParser.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/RelayParser.ts new file mode 100644 index 000000000..d8ac9edbb --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/RelayParser.ts @@ -0,0 +1,1732 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +// import Profiler from "./GraphQLCompilerProfiler"; + +import orList from "../util/orList"; + +import partitionArray from "../util/partitionArray"; + +import { DEFAULT_HANDLE_KEY } from "../util/DefaultHandleKey"; + +import { + createCompilerError, + createUserError, + eachWithCombinedError, +} from "./CompilerError"; + +import { isExecutableDefinitionAST } from "./SchemaUtils"; + +import { getFieldDefinitionLegacy } from "./getFieldDefinition"; + +import { parse as parseGraphQL, parseType, print, Source } from "graphql"; + +const ARGUMENT_DEFINITIONS = "argumentDefinitions"; +const ARGUMENTS = "arguments"; +const DEPRECATED_UNCHECKED_ARGUMENTS = "uncheckedArguments_DEPRECATED"; +const DIRECTIVE_WHITELIST = new Set([ + ARGUMENT_DEFINITIONS, + DEPRECATED_UNCHECKED_ARGUMENTS, + ARGUMENTS, +]); +/** + * @internal + * + * This directive is not intended for use by developers directly. To set a field + * handle in product code use a compiler plugin. + */ + +const CLIENT_FIELD = "__clientField"; +const CLIENT_FIELD_HANDLE = "handle"; +const CLIENT_FIELD_KEY = "key"; +const CLIENT_FIELD_FILTERS = "filters"; +const INCLUDE = "include"; +const SKIP = "skip"; +const IF = "if"; +/** + * Transforms GraphQL text into Relay Compiler's internal, strongly-typed + * intermediate representation (IR). + */ + +function parse(schema, text, filename) { + const ast = parseGraphQL(new Source(text, filename)); + const parser = new RelayParser(schema.extend(ast), ast.definitions); + return parser.transform(); +} +/** + * Transforms untyped GraphQL parse trees (ASTs) into Relay Compiler's + * internal, strongly-typed intermediate representation (IR). + */ + +function transform(schema, definitions) { + // return Profiler.run("RelayParser.transform", () => { + const parser = new RelayParser(schema, definitions); + return parser.transform(); + // }); +} +/** + * @private + */ + +class RelayParser { + constructor(schema, definitions) { + this._definitions = new Map(); // leaving this configurable to make it easy to experiment w changing later + + this._getFieldDefinition = getFieldDefinitionLegacy; + this._schema = schema; + const duplicated = new Set(); + definitions.forEach((def) => { + if (isExecutableDefinitionAST(def)) { + let name = getName(def); + // FIXME: TMP has duplicate definition names, but that is really only a + // problem when they are fragments. Right here the name in the + // map does not matter outside of the implementation of + // transforming to IR, so we can just make operations named + // uniquely. + // Bug #2809718 + if (def.kind === "OperationDefinition") { + name = `${name}$${def.operation}`; + } + + if (this._definitions.has(name)) { + duplicated.add(name); + return; + } + + this._definitions.set(name, def); + } + }); + + if (duplicated.size) { + throw createUserError( + "RelayParser: Encountered duplicate definitions for one or more " + + "documents: each document must have a unique name. Duplicated documents:\n" + + Array.from(duplicated, (name) => `- ${name}`).join("\n"), + ); + } + } + + transform() { + const nodes = []; + const entries = new Map(); // Construct a mapping of name to definition ast + variable definitions. + // This allows the subsequent AST -> IR tranformation to reference the + // defined arguments of referenced fragments. + + eachWithCombinedError(this._definitions, ([name, definition]) => { + const variableDefinitions = this._buildArgumentDefinitions(definition); + + entries.set(name, { + definition, + variableDefinitions, + }); + }); // Convert the ASTs to IR. + + eachWithCombinedError( + entries.values(), + ({ definition, variableDefinitions }) => { + const node = parseDefinition( + this._schema, + this._getFieldDefinition, + entries, + definition, + variableDefinitions, + ); + nodes.push(node); + }, + ); + return nodes; + } + /** + * Constructs a mapping of variable names to definitions for the given + * operation/fragment definition. + */ + + _buildArgumentDefinitions(definition) { + switch (definition.kind) { + case "OperationDefinition": + return this._buildOperationArgumentDefinitions(definition); + + case "FragmentDefinition": + return this._buildFragmentArgumentDefinitions(definition); + + default: + definition; + throw createCompilerError(`Unexpected ast kind '${definition.kind}'.`, [ + definition, + ]); + } + } + /** + * Constructs a mapping of variable names to definitions using the + * variables defined in `@argumentDefinitions`. + */ + + _buildFragmentArgumentDefinitions(fragment) { + const variableDirectives = (fragment.directives || []).filter( + (directive) => getName(directive) === ARGUMENT_DEFINITIONS, + ); + + if (!variableDirectives.length) { + return new Map(); + } + + if (variableDirectives.length !== 1) { + throw createUserError( + `Directive @${ARGUMENT_DEFINITIONS} may be defined at most once per ` + + "fragment.", + null, + variableDirectives, + ); + } + + const variableDirective = variableDirectives[0]; // work, below accesses all report arguments could still be null/undefined. + + const args = variableDirective.arguments; + + if (variableDirective == null || !Array.isArray(args)) { + return new Map(); + } + + if (!args.length) { + throw createUserError( + `Directive @${ARGUMENT_DEFINITIONS} requires arguments: remove the ` + + "directive to skip defining local variables for this fragment.", + null, + [variableDirective], + ); + } + + const variables = new Map(); + args.forEach((arg) => { + const argName = getName(arg); + const previousVariable = variables.get(argName); + + if (previousVariable != null) { + throw createUserError( + `Duplicate definition for variable '\$${argName}'.`, + null, + [previousVariable.ast, arg], + ); + } + + if (arg.value.kind !== "ObjectValue") { + throw createUserError( + `Expected definition for variable '\$${argName}' to be an object ` + + "with the shape: '{type: string, defaultValue?: mixed}.", + null, + [arg.value], + ); + } + + let defaultValueNode; + let typeString; + arg.value.fields.forEach((field) => { + const name = getName(field); + + if (name === "type") { + typeString = transformLiteralValue(field.value, field); + } else if (name === "defaultValue") { + defaultValueNode = field.value; + } else { + throw createUserError( + `Expected definition for variable '\$${argName}' to be an object ` + + "with the shape: '{type: string, defaultValue?: mixed}.", + null, + [arg.value], + ); + } + }); + + if (typeof typeString !== "string") { + throw createUserError( + `Expected definition for variable '\$${argName}' to be an object ` + + "with the shape: '{type: string, defaultValue?: mixed}.", + null, + [arg.value], + ); + } + + const typeFromAST = this._schema.getTypeFromAST(parseType(typeString)); + + if (typeFromAST == null) { + throw createUserError( + // $FlowFixMe[incompatible-type] + `Unknown type "${typeString}" referenced in the argument definitions.`, + null, + [arg], + ); + } + + const type = this._schema.asInputType(typeFromAST); + + if (type == null) { + throw createUserError( + // $FlowFixMe[incompatible-type] + `Expected type "${typeString}" to be an input type in the "${arg.name.value}" argument definitions.`, + null, + [arg.value], + ); + } + + const defaultValue = + defaultValueNode != null + ? transformValue( + this._schema, + defaultValueNode, + type, + (variableAst) => { + throw createUserError( + "Expected 'defaultValue' to be a literal, got a variable.", + null, + [variableAst], + ); + }, + ) + : null; + + if (defaultValue != null && defaultValue.kind !== "Literal") { + throw createUserError( + "Expected 'defaultValue' to be a literal, got a variable.", + [defaultValue.loc], + ); + } + + variables.set(argName, { + ast: arg, + defaultValue: defaultValue?.value ?? null, + defined: true, + name: argName, + type, + }); + }); + return variables; + } + /** + * Constructs a mapping of variable names to definitions using the + * standard GraphQL syntax for variable definitions. + */ + + _buildOperationArgumentDefinitions(operation) { + const schema = this._schema; + const variableDefinitions = new Map(); + (operation.variableDefinitions || []).forEach((def) => { + const name = getName(def.variable); + const typeFromAST = schema.getTypeFromAST(def.type); + + if (typeFromAST == null) { + throw createUserError( + `Unknown type: '${getTypeName(def.type)}'.`, + null, + [def.type], + ); + } + + const type = schema.asInputType(typeFromAST); + + if (type == null) { + throw createUserError( + `Expected type "${getTypeName(def.type)}" to be an input type.`, + null, + [def.type], + ); + } + + const defaultValue = def.defaultValue + ? transformLiteralValue(def.defaultValue, def) + : null; + const previousDefinition = variableDefinitions.get(name); + + if (previousDefinition != null) { + throw createUserError( + `Duplicate definition for variable '\$${name}'.`, + null, + [previousDefinition.ast, def], + ); + } + + variableDefinitions.set(name, { + ast: def, + defaultValue, + defined: true, + name, + type, + }); + }); + return variableDefinitions; + } +} +/** + * @private + */ + +function parseDefinition( + schema, + getFieldDefinition, + entries, + definition, + variableDefinitions, +) { + const parser = new GraphQLDefinitionParser( + schema, + getFieldDefinition, + entries, + definition, + variableDefinitions, + ); + return parser.transform(); +} +/** + * @private + */ + +class GraphQLDefinitionParser { + constructor( + schema, + getFieldDefinition, + entries, + definition, + variableDefinitions, + ) { + this._definition = definition; + this._entries = entries; + this._getFieldDefinition = getFieldDefinition; + this._schema = schema; + this._variableDefinitions = variableDefinitions; + this._unknownVariables = new Map(); + } + + transform() { + const definition = this._definition; + + switch (definition.kind) { + case "OperationDefinition": + return this._transformOperation(definition); + + case "FragmentDefinition": + return this._transformFragment(definition); + + default: + definition; + throw createCompilerError( + `Unsupported definition type ${definition.kind}`, + [definition], + ); + } + } + + _recordAndVerifyVariableReference(variable, name, usedAsType) { + // Special case for variables used in @arguments where we currently + // aren't guaranteed to be able to resolve the type. + if (usedAsType == null) { + if ( + !this._variableDefinitions.has(name) && + !this._unknownVariables.has(name) + ) { + this._unknownVariables.set(name, { + ast: variable, + type: null, + }); + } + + return; + } + + const variableDefinition = this._variableDefinitions.get(name); + + if (variableDefinition != null) { + // If the variable is defined, all usages must be compatible + let effectiveType = variableDefinition.type; + + if (variableDefinition.defaultValue != null) { + // If a default value is defined then it is guaranteed to be used + // at runtime such that the effective type of the variable is non-null + effectiveType = this._schema.getNonNullType( + this._schema.getNullableType(effectiveType), + ); + } + + if (!this._schema.isTypeSubTypeOf(effectiveType, usedAsType)) { + throw createUserError( + `Variable '\$${name}' was defined as type '${String( + variableDefinition.type, + )}' but used in a location expecting the type '${String( + usedAsType, + )}'`, + null, + [variableDefinition.ast, variable], + ); + } + } else { + const previous = this._unknownVariables.get(name); + + if (!previous || !previous.type) { + // No previous usage, current type is strongest + this._unknownVariables.set(name, { + ast: variable, + type: usedAsType, + }); + } else { + const { ast: previousVariable, type: previousType } = previous; + + if ( + !( + this._schema.isTypeSubTypeOf(usedAsType, previousType) || + this._schema.isTypeSubTypeOf(previousType, usedAsType) + ) + ) { + throw createUserError( + `Variable '\$${name}' was used in locations expecting the conflicting types '${String( + previousType, + )}' and '${String(usedAsType)}'.`, + null, + [previousVariable, variable], + ); + } // If the new used type has stronger requirements, use that type as reference, + // otherwise keep referencing the previous type + + if (this._schema.isTypeSubTypeOf(usedAsType, previousType)) { + this._unknownVariables.set(name, { + ast: variable, + type: usedAsType, + }); + } + } + } + } + + _getDirectiveLocations() { + if (!this._directiveLocations) { + const directiveDefs = this._schema.getDirectives(); + + this._directiveLocations = new Map(); + + for (const def of directiveDefs) { + this._directiveLocations.set(def.name, def.locations); + } + } + + return this._directiveLocations; + } + + _validateDirectivesLocation(directives, allowedLocaction) { + if (!directives || !directives.length) { + return; + } + + const directiveLocs = this._getDirectiveLocations(); + + const mismatches = directives.filter((directive) => { + const name = getName(directive); + + if (DIRECTIVE_WHITELIST.has(name)) { + return false; + } + + const locs = directiveLocs.get(name); + + if (locs == null) { + throw createUserError(`Unknown directive '${name}'.`, null, [ + directive, + ]); + } + + return !locs.some((loc) => loc === allowedLocaction); + }); + + if (mismatches.length) { + const invalidDirectives = mismatches + .map((directive) => "@" + getName(directive)) + .join(", "); + throw createUserError( + `Invalid directives ${invalidDirectives} found on ${allowedLocaction}.`, + null, + mismatches, + ); + } + } + + _transformFragment(fragment) { + const directives = this._transformDirectives( + (fragment.directives || []).filter( + (directive) => getName(directive) !== ARGUMENT_DEFINITIONS, + ), + "FRAGMENT_DEFINITION", + ); + + const typeFromAST = this._schema.getTypeFromAST(fragment.typeCondition); + + if (typeFromAST == null) { + throw createUserError( + `Fragment "${fragment.name.value}" cannot condition on unknown ` + + `type "${String(fragment.typeCondition.name.value)}".`, + null, + [fragment.typeCondition], + ); + } + + const type = this._schema.asCompositeType(typeFromAST); + + if (type == null) { + throw createUserError( + `Fragment "${fragment.name.value}" cannot condition on non composite ` + + `type "${String(type)}".`, + null, + [fragment.typeCondition], + ); + } + + const selections = this._transformSelections( + fragment.selectionSet, + type, + fragment.typeCondition, + ); + + const argumentDefinitions = [ + ...buildArgumentDefinitions(this._variableDefinitions), + ]; + + for (const [name, variableReference] of this._unknownVariables) { + argumentDefinitions.push({ + kind: "RootArgumentDefinition", + loc: buildLocation(variableReference.ast.loc), + name, + type: variableReference.type, + }); + } + + return { + kind: "Fragment", + directives, + loc: buildLocation(fragment.loc), + metadata: null, + name: getName(fragment), + selections, + type, + // $FlowFixMe[incompatible-return] - could be null + argumentDefinitions, + }; + } + + _getLocationFromOperation(definition) { + switch (definition.operation) { + case "query": + return "QUERY"; + + case "mutation": + return "MUTATION"; + + case "subscription": + return "SUBSCRIPTION"; + + default: + definition.operation; + throw createCompilerError( + `Unknown operation type '${definition.operation}'.`, + null, + [definition], + ); + } + } + + _transformOperation(definition) { + const name = getName(definition); + + const directives = this._transformDirectives( + definition.directives || [], + this._getLocationFromOperation(definition), + ); + + let type; + let operation; + const schema = this._schema; + + switch (definition.operation) { + case "query": + operation = "query"; + type = schema.expectQueryType(); + break; + + case "mutation": + operation = "mutation"; + type = schema.expectMutationType(); + break; + + case "subscription": + operation = "subscription"; + type = schema.expectSubscriptionType(); + break; + + default: + definition.operation; + throw createCompilerError( + `Unknown operation type '${definition.operation}'.`, + null, + [definition], + ); + } + + if (!definition.selectionSet) { + throw createUserError("Expected operation to have selections.", null, [ + definition, + ]); + } + + const selections = this._transformSelections(definition.selectionSet, type); + + const argumentDefinitions = buildArgumentDefinitions( + this._variableDefinitions, + ); + + if (this._unknownVariables.size !== 0) { + throw createUserError( + `Query '${name}' references undefined variables.`, + null, + Array.from( + this._unknownVariables.values(), + (variableReference) => variableReference.ast, + ), + ); + } + + return { + kind: "Root", + operation, + loc: buildLocation(definition.loc), + metadata: null, + name, + argumentDefinitions, + directives, + selections, + // $FlowFixMe[incompatible-return] + type, + }; + } + + _transformSelections(selectionSet, parentType, parentTypeAST) { + return selectionSet.selections.map((selection) => { + let node; + + if (selection.kind === "Field") { + node = this._transformField(selection, parentType); + } else if (selection.kind === "FragmentSpread") { + node = this._transformFragmentSpread( + selection, + parentType, + parentTypeAST, + ); + } else if (selection.kind === "InlineFragment") { + node = this._transformInlineFragment( + selection, + parentType, + parentTypeAST, + ); + } else { + selection.kind; + throw createCompilerError(`Unknown ast kind '${selection.kind}'.`, [ + selection, + ]); + } + + const [conditions, directives] = this._splitConditions(node.directives); + + const conditionalNodes = applyConditions( + conditions, // $FlowFixMe[incompatible-call] + [{ ...node, directives }], + ); + + if (conditionalNodes.length !== 1) { + throw createCompilerError( + "Expected exactly one condition node.", + null, + selection.directives, + ); + } + + return conditionalNodes[0]; + }); + } + + _transformInlineFragment(fragment, parentType, parentTypeAST) { + const schema = this._schema; + let typeCondition = + fragment.typeCondition != null + ? schema.getTypeFromAST(fragment.typeCondition) + : parentType; + + if (typeCondition == null) { + throw createUserError( + "Inline fragments can only be on object, interface or union types" + + `, got unknown type '${getTypeName(fragment.typeCondition)}'.`, + null, + [fragment.typeCondition ?? fragment], + ); + } + + const typeConditionName = schema.getTypeString(typeCondition); + typeCondition = schema.asCompositeType(typeCondition); + + if (typeCondition == null) { + throw createUserError( + "Inline fragments can only be on object, interface or union types" + + `, got '${typeConditionName}'.`, + null, + [fragment.typeCondition ?? fragment], + ); + } + + const rawParentType = this._schema.assertCompositeType( + this._schema.getRawType(parentType), + ); + + checkFragmentSpreadTypeCompatibility( + this._schema, + typeCondition, + rawParentType, + null, + fragment.typeCondition, + parentTypeAST, + ); + + const directives = this._transformDirectives( + fragment.directives || [], + "INLINE_FRAGMENT", + ); + + const selections = this._transformSelections( + fragment.selectionSet, + typeCondition, + fragment.typeCondition, + ); + + return { + kind: "InlineFragment", + directives, + loc: buildLocation(fragment.loc), + metadata: null, + selections, + typeCondition, + }; + } + + _transformFragmentSpread(fragmentSpread, parentType, parentTypeAST) { + const fragmentName = getName(fragmentSpread); + const [argumentDirectives, otherDirectives] = partitionArray( + fragmentSpread.directives || [], + (directive) => { + const name = getName(directive); + return name === ARGUMENTS || name === DEPRECATED_UNCHECKED_ARGUMENTS; + }, + ); + + if (argumentDirectives.length > 1) { + throw createUserError( + `Directive @${ARGUMENTS} may be used at most once per a fragment spread.`, + null, + argumentDirectives, + ); + } + + const fragmentDefinition = this._entries.get(fragmentName); + + if (fragmentDefinition == null) { + throw createUserError(`Unknown fragment '${fragmentName}'.`, null, [ + fragmentSpread.name, + ]); + } + + const fragmentTypeNode = getFragmentType(fragmentDefinition.definition); + + const fragmentType = this._schema.assertCompositeType( + this._schema.expectTypeFromAST(fragmentTypeNode), + ); + + const rawParentType = this._schema.assertCompositeType( + this._schema.getRawType(parentType), + ); + + checkFragmentSpreadTypeCompatibility( + this._schema, + fragmentType, + rawParentType, + fragmentSpread.name.value, + fragmentSpread, + parentTypeAST, + ); + const fragmentArgumentDefinitions = fragmentDefinition.variableDefinitions; + const argumentsDirective = argumentDirectives[0]; + let args; + + if (argumentsDirective != null) { + const isDeprecatedUncheckedArguments = + getName(argumentsDirective) === DEPRECATED_UNCHECKED_ARGUMENTS; + let hasInvalidArgument = false; + args = (argumentsDirective.arguments || []).map((arg) => { + const argName = getName(arg); + const argValue = arg.value; + const argumentDefinition = fragmentArgumentDefinitions.get(argName); + const argumentType = argumentDefinition?.type ?? null; + + if (argValue.kind === "Variable") { + if (argumentDefinition == null && !isDeprecatedUncheckedArguments) { + throw createUserError( + `Variable @${ARGUMENTS} values are only supported when the ` + + `argument is defined with @${ARGUMENT_DEFINITIONS}. Check ` + + `the definition of fragment '${fragmentName}'.`, + null, + [arg.value, fragmentDefinition.definition], + ); + } + + hasInvalidArgument = hasInvalidArgument || argumentDefinition == null; // TODO: check the type of the variable and use the type + + return { + kind: "Argument", + loc: buildLocation(arg.loc), + name: argName, + value: this._transformVariable(argValue, null), + type: null, + }; + } else { + if (argumentType == null) { + throw createUserError( + `Literal @${ARGUMENTS} values are only supported when the ` + + `argument is defined with @${ARGUMENT_DEFINITIONS}. Check ` + + `the definition of fragment '${fragmentName}'.`, + null, + [arg.value, fragmentDefinition.definition], + ); + } + + const value = this._transformValue(argValue, argumentType); + + return { + kind: "Argument", + loc: buildLocation(arg.loc), + name: argName, + value, + type: argumentType, + }; + } + }); + + if (isDeprecatedUncheckedArguments && !hasInvalidArgument) { + throw createUserError( + `Invalid use of @${DEPRECATED_UNCHECKED_ARGUMENTS}: all arguments ` + + `are defined, use @${ARGUMENTS} instead.`, + null, + [argumentsDirective], + ); + } + } + + const directives = this._transformDirectives( + otherDirectives, + "FRAGMENT_SPREAD", + ); + + return { + kind: "FragmentSpread", + args: args || [], + metadata: null, + loc: buildLocation(fragmentSpread.loc), + name: fragmentName, + directives, + }; + } + + _transformField(field, parentType) { + const schema = this._schema; + const name = getName(field); + + const fieldDef = this._getFieldDefinition(schema, parentType, name, field); + + if (fieldDef == null) { + throw createUserError( + `Unknown field '${name}' on type '${schema.getTypeString( + parentType, + )}'.`, + null, + [field], + ); + } + + const alias = field.alias?.value ?? name; + + const args = this._transformArguments( + field.arguments || [], + schema.getFieldArgs(fieldDef), + fieldDef, + ); + + const [otherDirectives, clientFieldDirectives] = partitionArray( + field.directives || [], + (directive) => getName(directive) !== CLIENT_FIELD, + ); + + const directives = this._transformDirectives(otherDirectives, "FIELD"); + + const type = schema.getFieldType(fieldDef); + + const handles = this._transformHandle(name, args, clientFieldDirectives); + + if (schema.isLeafType(schema.getRawType(type))) { + if ( + field.selectionSet && + field.selectionSet.selections && + field.selectionSet.selections.length + ) { + throw createUserError( + `Expected no selections for scalar field '${name}'.`, + null, + [field], + ); + } + + return { + kind: "ScalarField", + alias, + args, + directives, + handles, + loc: buildLocation(field.loc), + metadata: null, + name, + type: schema.assertScalarFieldType(type), + }; + } else { + const selections = field.selectionSet + ? this._transformSelections(field.selectionSet, type) + : null; + + if (selections == null || selections.length === 0) { + throw createUserError( + `Expected at least one selection for non-scalar field '${name}' on type '${schema.getTypeString( + type, + )}'.`, + null, + [field], + ); + } + + return { + kind: "LinkedField", + alias, + args, + connection: false, + directives, + handles, + loc: buildLocation(field.loc), + metadata: null, + name, + selections, + type: schema.assertLinkedFieldType(type), + }; + } + } + + _transformHandle(fieldName, fieldArgs, clientFieldDirectives) { + let handles = null; + clientFieldDirectives.forEach((clientFieldDirective) => { + const handleArgument = (clientFieldDirective.arguments || []).find( + (arg) => getName(arg) === CLIENT_FIELD_HANDLE, + ); + + if (handleArgument) { + let name = null; + let key = DEFAULT_HANDLE_KEY; + let filters = null; + const maybeHandle = transformLiteralValue( + handleArgument.value, + handleArgument, + ); + + if (typeof maybeHandle !== "string") { + throw createUserError( + `Expected a string literal argument for the @${CLIENT_FIELD} directive.`, + null, + [handleArgument.value], + ); + } + + name = maybeHandle; + const keyArgument = (clientFieldDirective.arguments || []).find( + (arg) => getName(arg) === CLIENT_FIELD_KEY, + ); + + if (keyArgument) { + const maybeKey = transformLiteralValue( + keyArgument.value, + keyArgument, + ); + + if (typeof maybeKey !== "string") { + throw createUserError( + `Expected a string literal argument for the @${CLIENT_FIELD} directive.`, + null, + [keyArgument.value], + ); + } + + key = maybeKey; + } + + const filtersArgument = (clientFieldDirective.arguments || []).find( + (arg) => getName(arg) === CLIENT_FIELD_FILTERS, + ); + + if (filtersArgument) { + const maybeFilters = transformLiteralValue( + filtersArgument.value, + filtersArgument, + ); + + if ( + !( + Array.isArray(maybeFilters) && + maybeFilters.every( + (filter) => + typeof filter === "string" && + fieldArgs.some((fieldArg) => fieldArg.name === filter), + ) + ) + ) { + throw createUserError( + `Expected an array of argument names on field '${fieldName}'.`, + null, + [filtersArgument.value], + ); + } // $FlowFixMe[incompatible-cast] + + filters = maybeFilters; + } + + const dynamicKeyArgument = (clientFieldDirective.arguments || []).find( + (arg) => getName(arg) === "dynamicKey_UNSTABLE", + ); + + if (dynamicKeyArgument != null) { + throw createUserError( + "Dynamic keys are only supported with @connection.", + null, + [dynamicKeyArgument.value], + ); + } + + handles = handles || []; + handles.push({ + name, + key, + filters, + dynamicKey: null, + }); + } + }); + return handles; + } + + _transformDirectives(directives, location) { + this._validateDirectivesLocation(directives, location); + + return directives.map((directive) => { + const name = getName(directive); + + const directiveDef = this._schema.getDirective(name); + + if (directiveDef == null) { + throw createUserError(`Unknown directive '${name}'.`, null, [ + directive, + ]); + } + + const args = this._transformArguments( + directive.arguments || [], + directiveDef.args.map((item) => { + return { + name: item.name, + type: item.type, + defaultValue: item.defaultValue, + }; + }), + null, + name, + ); + + return { + kind: "Directive", + loc: buildLocation(directive.loc), + name, + args, + }; + }); + } + + _transformArguments(args, argumentDefinitions, field, directiveName) { + return args.map((arg) => { + const argName = getName(arg); + const argDef = argumentDefinitions.find((def) => def.name === argName); + + if (argDef == null) { + const message = + `Unknown argument '${argName}'` + + (field + ? ` on field '${this._schema.getFieldName(field)}'` + + ` of type '${this._schema.getTypeString( + this._schema.getFieldParentType(field), + )}'.` + : directiveName != null + ? ` on directive '@${directiveName}'.` + : "."); + throw createUserError(message, null, [arg]); + } + + const value = this._transformValue(arg.value, argDef.type); + + return { + kind: "Argument", + loc: buildLocation(arg.loc), + name: argName, + value, + type: argDef.type, + }; + }); + } + + _splitConditions(mixedDirectives) { + const [conditionDirectives, otherDirectives] = partitionArray( + mixedDirectives, + (directive) => directive.name === INCLUDE || directive.name === SKIP, + ); + const conditions = conditionDirectives.map((directive) => { + const passingValue = directive.name === INCLUDE; + const arg = directive.args[0]; + + if (arg == null || arg.name !== IF) { + throw createUserError( + `Expected an 'if' argument to @${directive.name}.`, + [directive.loc], + ); + } + + if (!(arg.value.kind === "Variable" || arg.value.kind === "Literal")) { + throw createUserError( + `Expected the 'if' argument to @${directive.name} to be a variable or literal.`, + [directive.loc], + ); + } + + return { + kind: "Condition", + condition: arg.value, + loc: directive.loc, + passingValue, + selections: [], + }; + }); + const sortedConditions = conditions.sort((a, b) => { + if (a.condition.kind === "Variable" && b.condition.kind === "Variable") { + return a.condition.variableName < b.condition.variableName + ? -1 + : a.condition.variableName > b.condition.variableName + ? 1 + : 0; + } else { + // sort literals earlier, variables later + return a.condition.kind === "Variable" + ? 1 + : b.condition.kind === "Variable" + ? -1 + : 0; + } + }); + return [sortedConditions, otherDirectives]; + } + + _transformVariable(ast, usedAsType) { + const variableName = getName(ast); + + this._recordAndVerifyVariableReference(ast, variableName, usedAsType); + + return { + kind: "Variable", + loc: buildLocation(ast.loc), + variableName, + type: usedAsType, + }; + } + + _transformValue(ast, type) { + return transformValue( + this._schema, + ast, + type, + (variableAst, variableType) => + this._transformVariable(variableAst, variableType), + ); + } +} +/** + * Transforms and validates argument values according to the expected + * type. + */ + +function transformValue(schema, ast, type, transformVariable) { + if (ast.kind === "Variable") { + // Special case variables since there is no value to parse + return transformVariable(ast, type); + } else if (ast.kind === "NullValue") { + // Special case null literals since there is no value to parse + if (schema.isNonNull(type)) { + throw createUserError( + `Expected a value matching type '${String(type)}'.`, + null, + [ast], + ); + } + + return { + kind: "Literal", + loc: buildLocation(ast.loc), + value: null, + }; + } else { + return transformNonNullLiteral(schema, ast, type, transformVariable); + } +} +/** + * Transforms and validates non-null literal (non-variable) values + * according to the expected type. + */ + +function transformNonNullLiteral(schema, ast, type, transformVariable) { + // Transform the value based on the type without a non-null wrapper. + // Note that error messages should still use the original `type` + // since that accurately describes to the user what the expected + // type is (using nullableType would suggest that `null` is legal + // even when it may not be, for example). + const nullableType = schema.getNullableType(type); + + if (schema.isList(nullableType)) { + if (ast.kind !== "ListValue") { + // Parse singular (non-list) values flowing into a list type + // as scalars, ie without wrapping them in an array. + if (!schema.isInputType(schema.getListItemType(nullableType))) { + throw createUserError( + `Expected type ${schema.getTypeString( + nullableType, + )} to be an input type.`, + null, + [ast], + ); + } + + return transformValue( + schema, + ast, + schema.assertInputType(schema.getListItemType(nullableType)), + transformVariable, + ); + } + + const itemType = schema.assertInputType( + schema.getListItemType(nullableType), + ); + const literalList = []; + const items = []; + let areAllItemsScalar = true; + ast.values.forEach((item) => { + const itemValue = transformValue( + schema, + item, + itemType, + transformVariable, + ); + + if (itemValue.kind === "Literal") { + literalList.push(itemValue.value); + } + + items.push(itemValue); + areAllItemsScalar = areAllItemsScalar && itemValue.kind === "Literal"; + }); + + if (areAllItemsScalar) { + return { + kind: "Literal", + loc: buildLocation(ast.loc), + value: literalList, + }; + } else { + return { + kind: "ListValue", + loc: buildLocation(ast.loc), + items, + }; + } + } else if (schema.isInputObject(nullableType)) { + if (ast.kind !== "ObjectValue") { + throw createUserError( + `Expected a value matching type '${schema.getTypeString(type)}'.`, + null, + [ast], + ); + } + + const literalObject = {}; + const fields = []; + let areAllFieldsScalar = true; + const inputType = schema.assertInputObjectType(nullableType); + const requiredFieldNames = new Set( + schema + .getFields(inputType) + .filter((field) => { + return schema.isNonNull(schema.getFieldType(field)); + }) + .map((field) => schema.getFieldName(field)), + ); + const seenFields = new Map(); + ast.fields.forEach((field) => { + const fieldName = getName(field); + const seenField = seenFields.get(fieldName); + + if (seenField) { + throw createUserError( + `Duplicated field name '${fieldName}' in the input object.`, + null, + [field, seenField], + ); + } + + const fieldID = schema.getFieldByName(inputType, fieldName); + + if (!fieldID) { + throw createUserError( + `Unknown field '${fieldName}' on type '${schema.getTypeString( + inputType, + )}'.`, + null, + [field], + ); + } + + const fieldConfig = schema.getFieldConfig(fieldID); + const fieldType = schema.assertInputType(fieldConfig.type); + const fieldValue = transformValue( + schema, + field.value, + fieldType, + transformVariable, + ); + + if (fieldValue.kind === "Literal") { + literalObject[field.name.value] = fieldValue.value; + } + + fields.push({ + kind: "ObjectFieldValue", + loc: buildLocation(field.loc), + name: fieldName, + value: fieldValue, + }); + seenFields.set(fieldName, field); + requiredFieldNames.delete(fieldName); + areAllFieldsScalar = areAllFieldsScalar && fieldValue.kind === "Literal"; + }); + + if (requiredFieldNames.size > 0) { + const requiredFieldStr = Array.from(requiredFieldNames) + .map((item) => `'${item}'`) + .join(", "); + throw createUserError( + `Missing non-optional field${ + requiredFieldNames.size > 1 ? "s:" : "" + } ${requiredFieldStr} for input type '${schema.getTypeString( + inputType, + )}'.`, + null, + [ast], + ); + } + + if (areAllFieldsScalar) { + return { + kind: "Literal", + loc: buildLocation(ast.loc), + value: literalObject, + }; + } else { + return { + kind: "ObjectValue", + loc: buildLocation(ast.loc), + fields, + }; + } + } else if (schema.isId(nullableType)) { + // GraphQLID's parseLiteral() always returns the string value. However + // the int/string distinction may be important at runtime, so this + // transform parses int/string literals into the corresponding JS types. + if (ast.kind === "IntValue") { + return { + kind: "Literal", + loc: buildLocation(ast.loc), + value: parseInt(ast.value, 10), + }; + } else if (ast.kind === "StringValue") { + return { + kind: "Literal", + loc: buildLocation(ast.loc), + value: ast.value, + }; + } else { + throw createUserError( + `Invalid value, expected a value matching type '${schema.getTypeString( + type, + )}'.`, + null, + [ast], + ); + } + } else if (schema.isEnum(nullableType)) { + const enumType = schema.assertEnumType(nullableType); + const value = schema.parseLiteral(enumType, ast); + + if (value == null) { + const suggestions = schema.getEnumValues(enumType); // parseLiteral() should return a non-null JavaScript value + // if the ast value is valid for the type. + + throw createUserError( + `Expected a value matching type '${schema.getTypeString( + type, + )}'. Possible values: ${orList(suggestions)}?'`, + null, + [ast], + ); + } + + return { + kind: "Literal", + loc: buildLocation(ast.loc), + value, + }; + } else if (schema.isScalar(nullableType)) { + const value = schema.parseLiteral( + schema.assertScalarType(nullableType), + ast, + ); + + if (value == null) { + // parseLiteral() should return a non-null JavaScript value + // if the ast value is valid for the type. + throw createUserError( + `Expected a value matching type '${schema.getTypeString(type)}'.`, + null, + [ast], + ); + } + + return { + kind: "Literal", + loc: buildLocation(ast.loc), + value, + }; + } else { + throw createCompilerError( + `Unsupported type '${schema.getTypeString( + type, + )}' for input value, expected a GraphQLList, ` + + "GraphQLInputObjectType, GraphQLEnumType, or GraphQLScalarType.", + null, + [ast], + ); + } +} +/** + * @private + */ + +function transformLiteralValue(ast, context) { + switch (ast.kind) { + case "IntValue": + return parseInt(ast.value, 10); + + case "FloatValue": + return parseFloat(ast.value); + + case "StringValue": + return ast.value; + + case "BooleanValue": + // Note: duplicated because Flow does not understand fall-through cases + return ast.value; + + case "EnumValue": + // Note: duplicated because Flow does not understand fall-through cases + return ast.value; + + case "ListValue": + return ast.values.map((item) => transformLiteralValue(item, context)); + + case "NullValue": + return null; + + case "ObjectValue": { + const objectValue = {}; + ast.fields.forEach((field) => { + const fieldName = getName(field); + const value = transformLiteralValue(field.value, context); + objectValue[fieldName] = value; + }); + return objectValue; + } + + case "Variable": + throw createUserError( + "Unexpected variable where a literal (static) value is required.", + null, + [ast, context], + ); + + default: + ast.kind; + throw createCompilerError(`Unknown ast kind '${ast.kind}'.`, [ast]); + } +} +/** + * @private + */ + +function buildArgumentDefinitions(variables) { + return Array.from(variables.values(), ({ ast, name, defaultValue, type }) => { + return { + kind: "LocalArgumentDefinition", + loc: buildLocation(ast.loc), + name, + type, + defaultValue, + }; + }); +} +/** + * @private + */ + +function buildLocation(loc) { + if (loc == null) { + return { + kind: "Unknown", + }; + } + + return { + kind: "Source", + start: loc.start, + end: loc.end, + source: loc.source, + }; +} +/** + * @private + */ + +function applyConditions(conditions, selections) { + let nextSelections = selections; + conditions.forEach((condition) => { + nextSelections = [{ ...condition, selections: nextSelections }]; + }); + return nextSelections; +} +/** + * @private + */ + +function getName(ast) { + const name = ast.name?.value; + + if (typeof name !== "string") { + throw createCompilerError("Expected ast node to have a 'name'.", null, [ + ast, + ]); + } + + return name; +} + +function getTypeName(ast) { + return ast ? print(ast) : "Undefined Type Name"; +} +/** + * @private + */ + +function getFragmentType(ast) { + if (ast.kind === "FragmentDefinition") { + return ast.typeCondition; + } + + throw createCompilerError( + "Expected ast node to be a FragmentDefinition node.", + null, + [ast], + ); +} + +function checkFragmentSpreadTypeCompatibility( + schema, + fragmentType, + parentType, + fragmentName, + fragmentTypeAST, + parentTypeAST, +) { + if ( + !schema.doTypesOverlap(fragmentType, schema.assertCompositeType(parentType)) + ) { + const nodes = []; + + if (parentTypeAST) { + nodes.push(parentTypeAST); + } + + if (fragmentTypeAST) { + nodes.push(fragmentTypeAST); + } + + const possibleConcreteTypes = schema.isAbstractType(parentType) + ? Array.from( + schema.getPossibleTypes(schema.assertAbstractType(parentType)), + ) + : []; + let suggestedTypesMessage = ""; + + if (possibleConcreteTypes.length !== 0) { + suggestedTypesMessage = ` Possible concrete types include ${possibleConcreteTypes + .sort() + .slice(0, 3) + .map((type) => `'${schema.getTypeString(type)}'`) + .join(", ")}, etc.`; + } + + throw createUserError( + (fragmentName != null + ? `Fragment '${fragmentName}' cannot be spread here as objects of ` + : "Fragment cannot be spread here as objects of ") + + `type '${schema.getTypeString(parentType)}' ` + + `can never be of type '${schema.getTypeString(fragmentType)}'.` + + suggestedTypesMessage, + null, + nodes, + ); + } +} + +export { parse, transform }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/Schema.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/Schema.ts new file mode 100644 index 000000000..65e993dad --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/Schema.ts @@ -0,0 +1,1997 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + * @emails oncall+relay + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import { createCompilerError } from "./CompilerError"; + +import { isSchemaDefinitionAST } from "./SchemaUtils"; + +import { + GraphQLFloat, + GraphQLInt, + GraphQLBoolean, + GraphQLString, + GraphQLID, + parse, + parseType, + print, + valueFromASTUntyped, +} from "graphql"; + +/** + * @private + */ +class Type { + constructor(name, isClient) { + this.name = name; + this.isClient = isClient; + } + + toString() { + return this.name; + } + + toJSON() { + return String(this); + } +} +/** + * @private + */ + +class ScalarType extends Type {} +/** + * @private + */ + +class EnumType extends Type { + constructor(name, values, isClient) { + super(name, isClient); + this.values = values; + } +} +/** + * @private + */ + +class UnionType extends Type {} +/** + * @private + */ + +class ObjectType extends Type {} +/** + * @private + */ + +class InputObjectType extends Type {} +/** + * @private + */ + +class InterfaceType extends Type {} +/** + * @private + */ + +class List { + constructor(type) { + this.ofType = type; + this._typeString = `[${String(this.ofType)}]`; + } + + toString() { + return this._typeString; + } + + toJSON() { + return this.toString(); + } +} +/** + * @private + */ + +class NonNull { + constructor(type) { + this.ofType = type; + this._typeString = `${String(this.ofType)}!`; + } + + toString() { + return this._typeString; + } + + toJSON() { + return this.toString(); + } +} +/** + * @private + */ + +class Field { + constructor(schema, name, type, belongsTo, args, directives, isClient) { + this.name = name; + this.type = type; + this.belongsTo = belongsTo; + this.isClient = isClient; + this.args = parseInputArgumentDefinitionsMap(schema, args); + this.directives = directives; + } +} +/** + * @private + */ + +function unwrap(type) { + if (type instanceof NonNull || type instanceof List) { + return unwrap(type.ofType); + } + + return type; +} +/** + * @private + */ + +function hasConcreteTypeThatImplements(schema, type, interfaceType) { + return ( + isAbstractType(type) && + getConcreteTypes(schema, type).some((concreteType) => + schema.implementsInterface( + schema.assertCompositeType(concreteType), + interfaceType, + ), + ) + ); +} +/** + * @private + */ + +function getConcreteTypes(schema, type) { + const concreteTypes = new Set(); + schema.getPossibleTypes(type).forEach((possibleType) => { + if (isObject(possibleType)) { + concreteTypes.add(possibleType); + } + }); + return Array.from(concreteTypes); +} + +const TYPENAME_FIELD = "__typename"; +const CLIENT_ID_FIELD = "__id"; +const QUERY_TYPE_KEY = Symbol("Query"); +const MUTATION_TYPE_KEY = Symbol("Mutation"); +const SUBSCRIPTION_TYPE_KEY = Symbol("Subscription"); + +function isScalar(type) { + return type instanceof ScalarType; +} + +function isObject(type) { + return type instanceof ObjectType; +} + +function isEnum(type) { + return type instanceof EnumType; +} + +function isUnion(type) { + return type instanceof UnionType; +} + +function isInputObject(type) { + return type instanceof InputObjectType; +} + +function isInterface(type) { + return type instanceof InterfaceType; +} + +function isWrapper(type) { + return type instanceof List || type instanceof NonNull; +} + +function isBaseType(type) { + return ( + type instanceof ScalarType || + type instanceof ObjectType || + type instanceof EnumType || + type instanceof UnionType || + type instanceof InputObjectType || + type instanceof InterfaceType + ); +} + +function isAbstractType(type) { + return type instanceof UnionType || type instanceof InterfaceType; +} + +function isCompositeType(type) { + return ( + type instanceof ObjectType || + type instanceof UnionType || + type instanceof InterfaceType + ); +} + +function isInputType(type) { + return ( + type instanceof InputObjectType || + type instanceof ScalarType || + type instanceof EnumType + ); +} + +export class Schema { + /** + * @private + */ + constructor(typeMap) { + this._typeMap = typeMap; + this._typeWrappersMap = new Map(); + this._fieldsMap = new Map(); + this._typeNameMap = new Map(); + this._clientIdMap = new Map(); + this._directiveMap = new Map( + typeMap.getDirectives().map((directive) => { + return [ + directive.name, + { + locations: directive.locations, + args: parseInputArgumentDefinitions(this, directive.args), + name: directive.name, + isClient: directive.isClient, + }, + ]; + }), + ); + } + + getTypes() { + return this._typeMap.getTypes(); + } + + getTypeFromAST(typeNode) { + if (typeNode.kind === "NonNullType") { + const innerType = this.getTypeFromAST(typeNode.type); + + if (!innerType) { + return; + } + + if (innerType instanceof NonNull) { + throw createCompilerError( + "Unable to wrap non-nullable type with non-null wrapper.", + ); + } + + const cacheKey = `${this.getTypeString(innerType)}!`; + + let type = this._typeWrappersMap.get(cacheKey); + + if (type) { + return type; + } + + type = new NonNull(innerType); + + this._typeWrappersMap.set(cacheKey, type); + + return type; + } else if (typeNode.kind === "ListType") { + const innerType = this.getTypeFromAST(typeNode.type); + + if (!innerType) { + return; + } + + const cacheKey = `[${this.getTypeString(innerType)}]`; + + let type = this._typeWrappersMap.get(cacheKey); + + if (type) { + return type; + } + + type = new List(innerType); + + this._typeWrappersMap.set(cacheKey, type); + + return type; + } + + return this._typeMap.getTypeByName(typeNode.name.value); + } + + _getRawType(typeName) { + const type = this._typeWrappersMap.get(typeName); + + if (type) { + return type; + } + + if (typeof typeName === "string") { + return this.getTypeFromAST(parseType(typeName)); + } else { + let operationType; + + if (typeName === QUERY_TYPE_KEY) { + operationType = this._typeMap.getQueryType(); + } else if (typeName === MUTATION_TYPE_KEY) { + operationType = this._typeMap.getMutationType(); + } else if (typeName === SUBSCRIPTION_TYPE_KEY) { + operationType = this._typeMap.getSubscriptionType(); + } + + if (operationType instanceof ObjectType) { + return operationType; + } + } + } + + getTypeFromString(typeName) { + return this._getRawType(typeName); + } + + expectTypeFromString(typeName) { + const type = this.getTypeFromString(typeName); + + if (type == null) { + throw createCompilerError(`Unknown type: '${typeName}'.`); + } + + return type; + } + + expectTypeFromAST(ast) { + const type = this.getTypeFromAST(ast); + + if (type == null) { + throw createCompilerError(`Unknown type: '${print(ast)}'.`, null, [ast]); + } + + return type; + } + + getNonNullType(type) { + if (type instanceof NonNull) { + return type; + } + + const cacheKey = `${String(type)}!`; + + let nonNullType = this._typeWrappersMap.get(cacheKey); + + if (nonNullType) { + return nonNullType; + } + + nonNullType = new NonNull(type); + + this._typeWrappersMap.set(cacheKey, nonNullType); + + return nonNullType; + } + + getRawType(type) { + return unwrap(type); + } + + getNullableType(type) { + if (type instanceof NonNull) { + return type.ofType; + } + + return type; + } + + getListItemType(type) { + if (type instanceof List) { + return type.ofType; + } + + return type; + } + + mapListItemType(type, mapper) { + if (!(type instanceof List)) { + throw createCompilerError("Expected List type"); + } + + const innerType = mapper(type.ofType); + const cacheKey = `[${this.getTypeString(innerType)}]`; + + let newType = this._typeWrappersMap.get(cacheKey); + + if (newType) { + return newType; + } + + newType = new List(innerType); + + this._typeWrappersMap.set(cacheKey, newType); + + return newType; + } + + areEqualTypes(typeA, typeB) { + if (typeA === typeB) { + return true; + } + + if (typeA instanceof NonNull && typeB instanceof NonNull) { + return this.areEqualTypes(typeA.ofType, typeB.ofType); + } + + if (typeA instanceof List && typeB instanceof List) { + return this.areEqualTypes(typeA.ofType, typeB.ofType); + } + + if (isBaseType(typeA) && isBaseType(typeB)) { + return typeA.name === typeB.name; + } + + return false; + } + /** + * Determine if the given type may implement the named type: + * - it is the named type + * - it implements the named interface + * - it is an abstract type and *some* of its concrete types may + * implement the named type + */ + + mayImplement(type, interfaceType) { + return ( + this.areEqualTypes(type, interfaceType) || + this.implementsInterface(type, interfaceType) || + (this.isAbstractType(type) && + hasConcreteTypeThatImplements(this, type, interfaceType)) + ); + } + + implementsInterface(type, interfaceType) { + return this.getInterfaces(type).some((typeInterface) => + this.areEqualTypes(typeInterface, interfaceType), + ); + } + + canHaveSelections(type) { + return this.isObject(type) || this.isInterface(type); + } + + getTypeString(type) { + return type.toString(); + } + + isTypeSubTypeOf(maybeSubType, superType) { + // Equivalent type is a valid subtype + if (maybeSubType === superType) { + return true; + } // If superType is non-null, maybeSubType must also be non-null. + + if (superType instanceof NonNull) { + if (maybeSubType instanceof NonNull) { + return this.isTypeSubTypeOf(maybeSubType.ofType, superType.ofType); + } + + return false; + } + + if (maybeSubType instanceof NonNull) { + // If superType is nullable, maybeSubType may be non-null or nullable. + return this.isTypeSubTypeOf(maybeSubType.ofType, superType); + } // If superType type is a list, maybeSubType type must also be a list. + + if (superType instanceof List) { + if (maybeSubType instanceof List) { + return this.isTypeSubTypeOf(maybeSubType.ofType, superType.ofType); + } + + return false; + } + + if (maybeSubType instanceof List) { + // If superType is not a list, maybeSubType must also be not a list. + return false; + } // If superType type is an abstract type, maybeSubType type may be a currently + // possible object type. + + if ( + this.isAbstractType(superType) && + this.isObject(maybeSubType) && + this.isPossibleType( + this.assertAbstractType(superType), + this.assertObjectType(maybeSubType), + ) + ) { + return true; + } // Otherwise, maybeSubType is not a valid subtype of the superType. + + return false; + } + /** + * Provided two composite types, determine if they "overlap". Two composite + * types overlap when the Sets of possible concrete types for each intersect. + * + * This is often used to determine if a fragment of a given type could possibly + * be visited in a context of another type. + * + * This function is commutative. + */ + + doTypesOverlap(typeA, typeB) { + // Equivalent types overlap + if (typeA === typeB) { + return true; + } + + if (isAbstractType(typeA)) { + if (isAbstractType(typeB)) { + // If both types are abstract, then determine if there is any intersection + // between possible concrete types of each. + return Array.from(this.getPossibleTypes(typeA)).some((type) => { + if (isObject(type)) { + return this.isPossibleType(typeB, type); + } + }); + } // Determine if the latter type is a possible concrete type of the former. + + return this.isPossibleType(typeA, typeB); + } + + if (isAbstractType(typeB)) { + // Determine if the former type is a possible concrete type of the latter. + return this.isPossibleType(typeB, typeA); + } // Otherwise the types do not overlap. + + return false; + } + + isPossibleType(superType, maybeSubType) { + return this._typeMap.getPossibleTypeSet(superType).has(maybeSubType); + } + + assertScalarFieldType(type) { + // Scalar type fields can be wrappers / or can be scalars/enums + if ( + (isWrapper(type) && !isScalar(unwrap(type)) && !isEnum(unwrap(type))) || + (!isWrapper(type) && !isScalar(type) && !isEnum(type)) + ) { + throw createCompilerError( + `Expected ${String(type)} to be a Scalar or Enum type.`, + ); + } + + return type; + } + + assertLinkedFieldType(type) { + // Linked Field types can be wrappers / or can be composite types + if ( + (isWrapper(type) && !isCompositeType(unwrap(type))) || + (!isWrapper(type) && !isCompositeType(type)) + ) { + throw createCompilerError( + `Expected ${String(type)} to be a Object, Interface or a Union Type.`, + ); + } + + return type; + } + + assertInputType(type) { + // Input type fields can be wrappers / or can be scalars/enums + if ( + (isWrapper(type) && !isInputType(unwrap(type))) || + (!isWrapper(type) && !isInputType(type)) + ) { + throw createCompilerError( + `Expected ${String(type)} to be a Input, Scalar or Enum type.`, + ); + } + + return type; + } + + asCompositeType(type) { + if (isCompositeType(type)) { + return type; + } + } + + asInputType(type) { + if ( + (isWrapper(type) && isInputType(unwrap(type))) || + (!isWrapper(type) && isInputType(type)) + ) { + return type; + } + } + + asScalarFieldType(type) { + if (isScalar(type) || isEnum(type)) { + return type; + } + } + + assertScalarType(type) { + if (!isScalar(type)) { + throw createCompilerError( + `Expected ${this.getTypeString( + type, + )} to be a scalar type, got ${this.getTypeString(type)}.`, + ); + } + + return type; + } + + assertObjectType(type) { + if (!isObject(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be an object type.`, + ); + } + + return type; + } + + assertInputObjectType(type) { + if (!isInputObject(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be an input type.`, + ); + } + + return type; + } + + asInputObjectType(type) { + if (!isInputObject(type)) { + return null; + } + + return type; + } + + assertInterfaceType(type) { + if (!isInterface(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be an interface type.`, + ); + } + + return type; + } + + assertCompositeType(type) { + if (!isCompositeType(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be a composite type.`, + ); + } + + return type; + } + + assertAbstractType(type) { + if (!isAbstractType(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be an abstract type.`, + ); + } + + return type; + } + + assertLeafType(type) { + if (!this.isLeafType(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be a leaf type.`, + ); + } + + return type; + } + + assertUnionType(type) { + if (!isUnion(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be a union type.`, + ); + } + + return type; + } + + assertEnumType(type) { + if (!isEnum(type)) { + throw createCompilerError(`Expected ${String(type)} to be an enum type.`); + } + + return type; + } + + assertIntType(type) { + if (!isScalar(type) || !this.isInt(type)) { + throw createCompilerError( + `Expected ${String(type)} to be an 'Int' type.`, + ); + } + + return type; + } + + assertFloatType(type) { + if (!isScalar(type) || !this.isFloat(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be a 'Float' type.`, + ); + } + + return type; + } + + assertBooleanType(type) { + if (!isScalar(type) || !this.isBoolean(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be a 'Boolean' type.`, + ); + } + + return type; + } + + assertStringType(type) { + if (!isScalar(type) || !this.isString(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be a 'String' type.`, + ); + } + + return type; + } + + assertIdType(type) { + if (!isScalar(type) || !this.isId(type)) { + throw createCompilerError( + `Expected ${this.getTypeString(type)} to be an ID type.`, + ); + } + + return type; + } + + expectBooleanType() { + return this.assertScalarType(this.expectTypeFromString("Boolean")); + } + + expectIntType() { + return this.assertScalarType(this.expectTypeFromString("Int")); + } + + expectFloatType() { + return this.assertScalarType(this.expectTypeFromString("Float")); + } + + expectStringType() { + return this.assertScalarType(this.expectTypeFromString("String")); + } + + expectIdType() { + return this.assertScalarType(this.expectTypeFromString("ID")); + } + + getQueryType() { + const queryType = this._getRawType(QUERY_TYPE_KEY); + + if (queryType && isObject(queryType)) { + return queryType; + } + } + + getMutationType() { + const mutationType = this._getRawType(MUTATION_TYPE_KEY); + + if (mutationType && isObject(mutationType)) { + return mutationType; + } + } + + getSubscriptionType() { + const subscriptionType = this._getRawType(SUBSCRIPTION_TYPE_KEY); + + if (subscriptionType && isObject(subscriptionType)) { + return subscriptionType; + } + } + + expectQueryType() { + const queryType = this.getQueryType(); + + if (queryType == null) { + throw createCompilerError("Query type is not defined on the Schema"); + } + + return queryType; + } + + expectMutationType() { + const mutationType = this.getMutationType(); + + if (mutationType == null) { + throw createCompilerError("Mutation type is not defined the Schema"); + } + + return mutationType; + } + + expectSubscriptionType() { + const subscriptionType = this.getSubscriptionType(); + + if (subscriptionType == null) { + throw createCompilerError("Subscription type is not defined the Schema"); + } + + return subscriptionType; + } + + isNonNull(type) { + return type instanceof NonNull; + } + + isList(type) { + return type instanceof List; + } + + isWrapper(type) { + return isWrapper(type); + } + + isScalar(type) { + return isScalar(type); + } + + isObject(type) { + return isObject(type); + } + + isEnum(type) { + return isEnum(type); + } + + isUnion(type) { + return isUnion(type); + } + + isInputObject(type) { + return isInputObject(type); + } + + isInterface(type) { + return isInterface(type); + } + + isInputType(type) { + // Wrappers can be input types (so it's save to check unwrapped type here) + return isInputType(type) || (isWrapper(type) && isInputType(unwrap(type))); + } + + isCompositeType(type) { + return isCompositeType(type); + } + + isAbstractType(type) { + return isAbstractType(type); + } + + isLeafType(type) { + return this.isScalar(type) || this.isEnum(type); + } + + isId(type) { + if (type instanceof ScalarType) { + return type.name === "ID"; + } + + return false; + } + + isInt(type) { + if (type instanceof ScalarType) { + return type.name === "Int"; + } + + return false; + } + + isFloat(type) { + if (type instanceof ScalarType) { + return type.name === "Float"; + } + + return false; + } + + isBoolean(type) { + if (type instanceof ScalarType) { + return type.name === "Boolean"; + } + + return false; + } + + isString(type) { + if (type instanceof ScalarType) { + return type.name === "String"; + } + + return false; + } + + hasField(type, fieldName) { + const canHaveTypename = this.isObject(type) || this.isAbstractType(type); // Special case for __typename field + + if ( + canHaveTypename && + (fieldName === TYPENAME_FIELD || fieldName === CLIENT_ID_FIELD) + ) { + return true; + } + + if (type instanceof ObjectType || type instanceof InterfaceType) { + return this._typeMap.getField(type, fieldName) != null; + } else if (type instanceof InputObjectType) { + return this._typeMap.getInputField(type, fieldName) != null; + } + + return false; + } + + hasId(type) { + if (!this.hasField(type, "id")) { + return false; + } + + const idField = this.expectField(type, "id"); + return this.areEqualTypes( + this.getNullableType(this.getFieldType(idField)), + this.expectIdType(), + ); + } + + getFields(type) { + const fieldsMap = this._getFieldsMap(type); + + return Array.from(fieldsMap.values()); + } + + _getFieldsMap(type) { + const cachedMap = this._fieldsMap.get(type); + + if (cachedMap != null) { + return cachedMap; + } + + const fieldsMap = new Map(); + + if (type instanceof ObjectType || type instanceof InterfaceType) { + const fields = this._typeMap.getFieldMap(type); + + if (fields) { + for (const [fieldName, fieldDefinition] of fields) { + const fieldType = this.expectTypeFromAST(fieldDefinition.type); + fieldsMap.set( + fieldName, + new Field( + this, + fieldName, + fieldType, + this.assertCompositeType(type), + fieldDefinition.arguments, + fieldDefinition.directives, + fieldDefinition.isClient, + ), + ); + } + } + } else if (type instanceof InputObjectType) { + const fields = this._typeMap.getInputFieldMap(type); + + if (fields) { + for (const [fieldName, typeNode] of fields) { + const fieldType = this.expectTypeFromAST(typeNode); + fieldsMap.set( + fieldName, + new Field(this, fieldName, fieldType, type, [], null, false), + ); + } + } + } + + if (fieldsMap.size === 0) { + throw createCompilerError( + `_getFieldsMap: Type '${type.name}' should have fields.`, + ); + } + + this._fieldsMap.set(type, fieldsMap); + + return fieldsMap; + } + + getFieldByName(type, fieldName) { + if (!this.hasField(type, fieldName)) { + return; + } // A "special" case for __typename and __id fields - which should + // not be in the list of type fields, but should be fine to select + + if (fieldName === TYPENAME_FIELD) { + let typename = this._typeNameMap.get(type); + + if (!typename) { + typename = new Field( + this, + TYPENAME_FIELD, + this.getNonNullType(this.expectStringType()), + type, + [], + null, + false, + ); + + this._typeNameMap.set(type, typename); + } + + return typename; + } + + if (fieldName === CLIENT_ID_FIELD) { + let clientId = this._clientIdMap.get(type); + + if (!clientId) { + clientId = new Field( + this, + CLIENT_ID_FIELD, + this.getNonNullType(this.expectIdType()), + type, + [], + null, + true, + ); + + this._clientIdMap.set(type, clientId); + } + + return clientId; + } + + if (isUnion(type)) { + throw createCompilerError( + `Unexpected union type '${this.getTypeString( + type, + )}' in the 'getFieldByName(...)'. Expected type with fields`, + ); + } + + const fieldsMap = this._getFieldsMap(type); + + return fieldsMap.get(fieldName); + } + + expectField(type, fieldName) { + const field = this.getFieldByName(type, fieldName); + + if (!field) { + throw createCompilerError( + `Unknown field '${fieldName}' on type '${this.getTypeString(type)}'.`, + ); + } + + return field; + } + + getFieldConfig(field) { + return { + type: field.type, + args: Array.from(field.args.values()), + }; + } + + getFieldName(field) { + return field.name; + } + + getFieldType(field) { + return field.type; + } + + getFieldParentType(field) { + return field.belongsTo; + } + + getFieldArgs(field) { + return Array.from(field.args.values()); + } + + getFieldArgByName(field, argName) { + return field.args.get(argName); + } + + getEnumValues(type) { + return type.values; + } + + getUnionTypes(type) { + return Array.from(this._typeMap.getPossibleTypeSet(type)); + } + + getInterfaces(type) { + if (type instanceof ObjectType) { + return this._typeMap.getInterfaces(type); + } + + return []; + } + + getPossibleTypes(type) { + return this._typeMap.getPossibleTypeSet(type); + } + + getFetchableFieldName(type) { + return this._typeMap.getFetchableFieldName(type); + } + + parseLiteral(type, valueNode) { + if (type instanceof EnumType && valueNode.kind === "EnumValue") { + return this.parseValue(type, valueNode.value); + } else if (type instanceof ScalarType) { + if (valueNode.kind === "BooleanValue" && type.name === "Boolean") { + return GraphQLBoolean.parseLiteral(valueNode); + } else if (valueNode.kind === "FloatValue" && type.name === "Float") { + return GraphQLFloat.parseLiteral(valueNode); + } else if ( + valueNode.kind === "IntValue" && + (type.name === "Int" || type.name === "ID" || type.name === "Float") + ) { + return GraphQLInt.parseLiteral(valueNode); + } else if ( + valueNode.kind === "StringValue" && + (type.name === "String" || type.name === "ID") + ) { + return GraphQLString.parseLiteral(valueNode); + } else if (!isDefaultScalar(type.name)) { + return valueFromASTUntyped(valueNode); + } + } + } + + parseValue(type, value) { + if (type instanceof EnumType) { + return type.values.includes(value) ? value : undefined; + } else if (type instanceof ScalarType) { + switch (type.name) { + case "Boolean": + return GraphQLBoolean.parseValue(value); + + case "Float": + return GraphQLFloat.parseValue(value); + + case "Int": + return GraphQLInt.parseValue(value); + + case "String": + return GraphQLString.parseValue(value); + + case "ID": + return GraphQLID.parseValue(value); + + default: + return value; + } + } + } + + serialize(type, value) { + if (type instanceof EnumType) { + return type.values.includes(value) ? value : undefined; + } else if (type instanceof ScalarType) { + switch (type.name) { + case "Boolean": + return GraphQLBoolean.serialize(value); + + case "Float": + return GraphQLFloat.serialize(value); + + case "Int": + return GraphQLInt.serialize(value); + + case "String": + return GraphQLString.serialize(value); + + case "ID": + return GraphQLID.serialize(value); + + default: + return value; + } + } + } + + getDirectives() { + return Array.from(this._directiveMap.values()); + } + + getDirective(directiveName) { + return this._directiveMap.get(directiveName); + } + + isServerType(type) { + const unwrapped = unwrap(type); + return unwrapped.isClient === false; + } + + isServerField(field) { + return field.isClient === false; + } + + isServerDirective(directiveName) { + const directive = this._directiveMap.get(directiveName); + + return directive?.isClient === false; + } + + isServerDefinedField(type, field) { + return ( + (this.isAbstractType(type) && + field.directives.some(({ name }) => name === "fixme_fat_interface")) || + (this.hasField(type, field.name) && + this.isServerField(this.expectField(type, field.name))) + ); + } + + isClientDefinedField(type, field) { + return !this.isServerDefinedField(type, field); + } + + extend(extensions) { + const doc = Array.isArray(extensions) + ? parse(extensions.join("\n")) + : extensions; + const schemaExtensions = []; + doc.definitions.forEach((definition) => { + if (isSchemaDefinitionAST(definition)) { + schemaExtensions.push(definition); + } + }); + + if (schemaExtensions.length > 0) { + return new Schema(this._typeMap.extend(schemaExtensions)); + } + + return this; + } +} + +class TypeMap { + constructor(source, extensions) { + this._types = new Map([ + ["ID", new ScalarType("ID", false)], + ["String", new ScalarType("String", false)], + ["Boolean", new ScalarType("Boolean", false)], + ["Float", new ScalarType("Float", false)], + ["Int", new ScalarType("Int", false)], + ]); + this._typeInterfaces = new Map(); + this._unionTypes = new Map(); + this._interfaceImplementations = new Map(); + this._fields = new Map(); + this._inputFields = new Map(); + this._directives = new Map([ + [ + "include", + { + name: "include", + isClient: false, + locations: ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"], + args: [ + { + name: "if", + typeNode: parseType("Boolean!"), + defaultValue: undefined, + }, + ], + }, + ], + [ + "skip", + { + name: "skip", + isClient: false, + locations: ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"], + args: [ + { + name: "if", + typeNode: parseType("Boolean!"), + defaultValue: undefined, + }, + ], + }, + ], + [ + "deprecated", + { + name: "deprecated", + isClient: false, + locations: ["FIELD_DEFINITION", "ENUM_VALUE"], + args: [ + { + name: "reason", + typeNode: parseType("String"), + defaultValue: { + kind: "StringValue", + value: "No longer supported", + }, + }, + ], + }, + ], + ]); + this._queryTypeName = "Query"; + this._mutationTypeName = "Mutation"; + this._subscriptionTypeName = "Subscription"; + this._source = source; + this._extensions = extensions; + this._fetchable = new Map(); + + this._parse(source); + + this._extend(extensions); + } + + _parse(source) { + const document = parse(source, { + noLocation: true, + }); + document.definitions.forEach((definition) => { + switch (definition.kind) { + case "SchemaDefinition": { + this._parseSchemaDefinition(definition); + + break; + } + + case "ScalarTypeDefinition": { + this._parseScalarNode(definition, false); + + break; + } + + case "EnumTypeDefinition": { + this._parseEnumNode(definition, false); + + break; + } + + case "ObjectTypeDefinition": { + this._parseObjectTypeNode(definition, false); + + break; + } + + case "InputObjectTypeDefinition": { + this._parseInputObjectTypeNode(definition, false); + + break; + } + + case "UnionTypeDefinition": { + this._parseUnionNode(definition, false); + + break; + } + + case "InterfaceTypeDefinition": { + this._parseInterfaceNode(definition, false); + + break; + } + + case "DirectiveDefinition": { + this._parseDirective(definition, false); + + break; + } + } + }); + } + + _parseSchemaDefinition(node) { + node.operationTypes.forEach((operationType) => { + switch (operationType.operation) { + case "query": + this._queryTypeName = operationType.type.name.value; + break; + + case "mutation": + this._mutationTypeName = operationType.type.name.value; + break; + + case "subscription": + this._subscriptionTypeName = operationType.type.name.value; + break; + } + }); + } + + _parseScalarNode(node, isClient) { + const name = node.name.value; + + if (!isDefaultScalar(name) && this._types.has(name)) { + throw createCompilerError( + `_parseScalarNode: Duplicate definition for type ${name}.`, + null, + [node], + ); + } + + this._types.set(name, new ScalarType(name, isClient)); + } + + _parseEnumNode(node, isClient) { + const name = node.name.value; + + if (this._types.has(name)) { + throw createCompilerError( + `_parseEnumNode: Duplicate definition for type ${name}.`, + null, + [node], + ); + } // SDL doesn't have information about the actual ENUM values + + const values = node.values + ? node.values.map((value) => value.name.value) + : []; + + this._types.set(name, new EnumType(name, values, isClient)); + } + + _parseObjectTypeNode(node, isClient) { + const name = node.name.value; // Objects may be created by _parseUnionNode + + const type = this._types.get(name) ?? new ObjectType(name, isClient); + + if (!(type instanceof ObjectType)) { + throw createCompilerError( + `_parseObjectTypeNode: Expected object type, got ${String(type)}`, + null, + [node], + ); + } + + if (type.isClient !== isClient) { + throw createCompilerError( + `_parseObjectTypeNode: Cannot create object type '${name}' defined as a client type.`, + null, + [node], + ); + } + + const typeInterfaces = []; + node.interfaces && + node.interfaces.forEach((interfaceTypeNode) => { + const interfaceName = interfaceTypeNode.name.value; + + let interfaceType = this._types.get(interfaceName); + + if (!interfaceType) { + interfaceType = new InterfaceType(interfaceName, isClient); + + this._types.set(interfaceName, interfaceType); + } + + if (!(interfaceType instanceof InterfaceType)) { + throw createCompilerError( + "_parseObjectTypeNode: Expected interface type", + null, + [interfaceTypeNode], + ); + } + + const implementations = + this._interfaceImplementations.get(interfaceType) ?? new Set(); + implementations.add(type); + + this._interfaceImplementations.set(interfaceType, implementations); + + typeInterfaces.push(interfaceType); + }); + let fetchable = null; + node.directives && + node.directives.forEach((directiveNode) => { + if (directiveNode.name.value === "fetchable") { + const field_name_arg = + directiveNode.arguments && + directiveNode.arguments.find( + (arg) => arg.name.value === "field_name", + ); + + if ( + field_name_arg != null && + field_name_arg.value.kind === "StringValue" + ) { + fetchable = { + field_name: field_name_arg.value.value, + }; + } + } + }); + + this._typeInterfaces.set(type, typeInterfaces); + + this._types.set(name, type); + + if (fetchable != null) { + this._fetchable.set(type, fetchable); + } + + node.fields && this._handleTypeFieldsStrict(type, node.fields, isClient); + } + + _parseInputObjectTypeNode(node, isClient) { + const name = node.name.value; + + if (this._types.has(name)) { + throw createCompilerError( + "_parseInputObjectTypeNode: Unable to parse schema file. Duplicate definition for object type", + null, + [node], + ); + } + + const type = new InputObjectType(name, isClient); + + this._types.set(name, type); + + this._parseInputObjectFields(type, node); + } + + _parseUnionNode(node, isClient) { + const name = node.name.value; + + if (this._types.has(name)) { + throw createCompilerError( + "_parseUnionNode: Unable to parse schema file. Duplicate definition for object type", + null, + [node], + ); + } + + const union = new UnionType(name, isClient); + + this._types.set(name, union); + + this._unionTypes.set( + union, + new Set( + node.types + ? node.types.map((typeInUnion) => { + const typeInUnionName = typeInUnion.name.value; + const object = + this._types.get(typeInUnionName) ?? + new ObjectType(typeInUnionName, false); + + if (!(object instanceof ObjectType)) { + throw createCompilerError( + "_parseUnionNode: Expected object type", + null, + [typeInUnion], + ); + } + + this._types.set(typeInUnionName, object); + + return object; + }) + : [], + ), + ); + } + + _parseInterfaceNode(node, isClient) { + const name = node.name.value; + + let type = this._types.get(name); + + if (!type) { + type = new InterfaceType(name, isClient); + + this._types.set(name, type); + } + + if (!(type instanceof InterfaceType)) { + throw createCompilerError( + `_parseInterfaceNode: Expected interface type. Got ${String(type)}`, + null, + [node], + ); + } + + if (type.isClient !== isClient) { + throw createCompilerError( + `_parseInterfaceNode: Cannot create interface '${name}' defined as a client interface`, + null, + [node], + ); + } + + node.fields && this._handleTypeFieldsStrict(type, node.fields, isClient); + } + + _handleTypeFieldsStrict(type, fields, isClient) { + if (this._fields.has(type)) { + throw createCompilerError( + "_handleTypeFieldsStrict: Unable to parse schema file. Duplicate definition for object type", + ); + } + + this._handleTypeFields(type, fields, isClient); + } + + _handleTypeFields(type, fields, isClient) { + const fieldsMap = this._fields.get(type) ?? new Map(); + fields.forEach((fieldNode) => { + const fieldName = fieldNode.name.value; + + if (fieldsMap.has(fieldName)) { + throw createCompilerError( + `_handleTypeFields: Duplicate definition for field '${fieldName}'.`, + ); + } + + fieldsMap.set(fieldName, { + arguments: fieldNode.arguments + ? fieldNode.arguments.map((arg) => { + return { + name: arg.name.value, + typeNode: arg.type, + defaultValue: arg.defaultValue, + }; + }) + : [], + directives: fieldNode.directives + ? fieldNode.directives.map((directive) => { + return { + name: directive.name.value, + args: directive.arguments + ? directive.arguments.map((arg) => { + return { + name: arg.name.value, + value: arg.value, + }; + }) + : [], + }; + }) + : null, + type: fieldNode.type, + isClient: isClient, + }); + }); + + this._fields.set(type, fieldsMap); + } + + _parseInputObjectFields(type, node) { + if (this._inputFields.has(type)) { + throw createCompilerError( + "_parseInputObjectFields: Unable to parse schema file. Duplicate definition for type", + null, + [node], + ); + } + + const fields = new Map(); + + if (node.fields) { + node.fields.forEach((fieldNode) => { + fields.set(fieldNode.name.value, fieldNode.type); + }); + } + + this._inputFields.set(type, fields); + } + + _parseDirective(node, isClient) { + const name = node.name.value; + + this._directives.set(name, { + name, + args: node.arguments + ? node.arguments.map((arg) => { + return { + name: arg.name.value, + typeNode: arg.type, + defaultValue: arg.defaultValue, + }; + }) + : [], + locations: node.locations.map((location) => { + switch (location.value) { + case "QUERY": + case "MUTATION": + case "SUBSCRIPTION": + case "FIELD": + case "FRAGMENT_DEFINITION": + case "FRAGMENT_SPREAD": + case "INLINE_FRAGMENT": + case "VARIABLE_DEFINITION": + case "SCHEMA": + case "SCALAR": + case "OBJECT": + case "FIELD_DEFINITION": + case "ARGUMENT_DEFINITION": + case "INTERFACE": + case "UNION": + case "ENUM": + case "ENUM_VALUE": + case "INPUT_OBJECT": + case "INPUT_FIELD_DEFINITION": + return location.value; + + default: + throw createCompilerError("Invalid directive location"); + } + }), + isClient, + }); + } + + _parseObjectTypeExtension(node) { + const type = this._types.get(node.name.value); + + if (!(type instanceof ObjectType)) { + throw createCompilerError( + `_parseObjectTypeExtension: Expected to find type with the name '${node.name.value}'`, + null, + [node], + ); + } + + node.fields && + this._handleTypeFields( + type, + node.fields, + true, + /** client fields */ + ); + } + + _parseInterfaceTypeExtension(node) { + const type = this._types.get(node.name.value); + + if (!(type instanceof InterfaceType)) { + throw createCompilerError( + "_parseInterfaceTypeExtension: Expected to have an interface type", + ); + } + + node.fields && this._handleTypeFields(type, node.fields, true); + } + + _extend(extensions) { + extensions.forEach((definition) => { + if (definition.kind === "ObjectTypeDefinition") { + this._parseObjectTypeNode(definition, true); + } else if (definition.kind === "InterfaceTypeDefinition") { + this._parseInterfaceNode(definition, true); + } else if (definition.kind === "ScalarTypeDefinition") { + this._parseScalarNode(definition, true); + } else if (definition.kind === "EnumTypeDefinition") { + this._parseEnumNode(definition, true); + } else if (definition.kind === "InterfaceTypeExtension") { + this._parseInterfaceTypeExtension(definition); + } else if (definition.kind === "ObjectTypeExtension") { + this._parseObjectTypeExtension(definition); + } else if (definition.kind === "DirectiveDefinition") { + this._parseDirective( + definition, + true, + /* client directive */ + ); + } else { + throw createCompilerError( + `Unexpected extension kind: '${definition.kind}'`, + null, + [definition], + ); + } + }); + } + + getTypes() { + return Array.from(this._types.values()); + } + + getTypeByName(typename) { + return this._types.get(typename); + } + + getInterfaces(type) { + return this._typeInterfaces.get(type) ?? []; + } + + getPossibleTypeSet(type) { + let set; + + if (type instanceof InterfaceType) { + set = this._interfaceImplementations.get(type) ?? new Set(); + } else if (type instanceof UnionType) { + set = this._unionTypes.get(type) ?? new Set(); + } else { + throw createCompilerError( + 'Invalid type supplied to "getPossibleTypeSet"', + ); + } + + if (!set) { + throw createCompilerError( + `Unable to find possible types for ${type.name}`, + ); + } + + return set; + } + + getFetchableFieldName(type) { + return this._fetchable.get(type)?.field_name ?? null; + } + + getQueryType() { + return this._types.get(this._queryTypeName); + } + + getMutationType() { + return this._types.get(this._mutationTypeName); + } + + getSubscriptionType() { + return this._types.get(this._subscriptionTypeName); + } + + getField(type, fieldName) { + const fields = this._fields.get(type); + + if (fields) { + return fields.get(fieldName); + } + } + + getFieldMap(type) { + return this._fields.get(type); + } + + getInputField(type, fieldName) { + const inputFields = this._inputFields.get(type); + + if (inputFields) { + return inputFields.get(fieldName); + } + } + + getInputFieldMap(type) { + return this._inputFields.get(type); + } + + getDirectives() { + return Array.from(this._directives.values()); + } + + extend(extensions) { + return new TypeMap(this._source, this._extensions.concat(extensions)); + } +} + +function create( + baseSchema, + schemaExtensionDocuments?, + schemaExtensions?, +): Schema { + const extensions = []; + schemaExtensions && + schemaExtensions.forEach((source) => { + const doc = parse(source, { + noLocation: true, + }); + doc.definitions.forEach((definition) => { + if (isSchemaDefinitionAST(definition)) { + extensions.push(definition); + } + }); + }); + schemaExtensionDocuments && + schemaExtensionDocuments.forEach((doc) => { + doc.definitions.forEach((definition) => { + if (isSchemaDefinitionAST(definition)) { + extensions.push(definition); + } + }); + }); + return new Schema(new TypeMap(baseSchema, extensions)); +} + +function parseInputArgumentDefinitions(schema, args) { + return args.map((arg) => { + const argType = schema.assertInputType( + schema.expectTypeFromAST(arg.typeNode), + ); + let defaultValue; + const defaultValueNode = arg.defaultValue; + + if (defaultValueNode != null) { + const nullableType = schema.getNullableType(argType); + const isNullable = schema.isNonNull(argType) === false; + + if (isNullable && defaultValueNode.kind === "NullValue") { + defaultValue = null; + } else { + if ( + nullableType instanceof ScalarType || + nullableType instanceof EnumType + ) { + defaultValue = schema.parseLiteral(nullableType, defaultValueNode); + } else if ( + (nullableType instanceof List && + defaultValueNode.kind === "ListValue") || + (nullableType instanceof InputObjectType && + defaultValueNode.kind === "ObjectValue") + ) { + defaultValue = valueFromASTUntyped(defaultValueNode); + } + } + + if (defaultValue === undefined) { + throw createCompilerError( + `parseInputArgumentDefinitions: Unexpected default value: ${String( + defaultValueNode, + )}. Expected to have a value of type ${String(nullableType)}.`, + ); + } + } + + return { + name: arg.name, + type: argType, + defaultValue, + }; + }); +} + +function parseInputArgumentDefinitionsMap(schema, args) { + return new Map( + parseInputArgumentDefinitions(schema, args).map((arg) => { + return [arg.name, arg]; + }), + ); +} + +function isDefaultScalar(name) { + return new Set(["ID", "String", "Boolean", "Int", "Float"]).has(name); +} + +export { create }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/SchemaUtils.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/SchemaUtils.ts new file mode 100644 index 000000000..f4cb49463 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/SchemaUtils.ts @@ -0,0 +1,120 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import { createCompilerError } from "./CompilerError"; + +const ID = "id"; +/** + * @public + * + * Determine if an AST node contains a fragment/operation definition. + */ + +function isExecutableDefinitionAST(ast) { + return ( + ast.kind === "FragmentDefinition" || ast.kind === "OperationDefinition" + ); +} +/** + * @public + * + * Determine if an AST node contains a schema definition. + */ + +function isSchemaDefinitionAST(ast) { + return ( + ast.kind === "SchemaDefinition" || + ast.kind === "ScalarTypeDefinition" || + ast.kind === "ObjectTypeDefinition" || + ast.kind === "InterfaceTypeDefinition" || + ast.kind === "UnionTypeDefinition" || + ast.kind === "EnumTypeDefinition" || + ast.kind === "InputObjectTypeDefinition" || + ast.kind === "DirectiveDefinition" || + ast.kind === "ScalarTypeExtension" || + ast.kind === "ObjectTypeExtension" || + ast.kind === "InterfaceTypeExtension" || + ast.kind === "UnionTypeExtension" || + ast.kind === "EnumTypeExtension" || + ast.kind === "InputObjectTypeExtension" + ); +} +/** + * Generates an id field on the given type. + */ + +function generateIDField(schema, type) { + const idField = schema.getFieldByName(type, "id"); + + if (idField == null) { + throw new createCompilerError( + `Expected an 'id' field on type '${schema.getTypeString(type)}'.`, + ); + } + + const idType = schema.assertScalarFieldType(schema.getFieldType(idField)); + return { + kind: "ScalarField", + alias: ID, + args: [], + directives: [], + handles: null, + loc: { + kind: "Generated", + }, + metadata: null, + name: ID, + type: idType, + }; +} + +function getNullableBooleanInput(schema) { + return schema.assertInputType(schema.expectBooleanType()); +} + +function getNonNullBooleanInput(schema) { + return schema.assertInputType( + schema.getNonNullType(schema.expectBooleanType()), + ); +} + +function getNullableStringInput(schema) { + return schema.assertInputType(schema.expectStringType()); +} + +function getNonNullStringInput(schema) { + return schema.assertInputType( + schema.getNonNullType(schema.expectStringType()), + ); +} + +function getNullableIdInput(schema) { + return schema.assertInputType(schema.expectIdType()); +} + +function getNonNullIdInput(schema) { + return schema.assertInputType(schema.getNonNullType(schema.expectIdType())); +} + +export { + generateIDField, + isExecutableDefinitionAST, + isSchemaDefinitionAST, + getNullableBooleanInput, + getNonNullBooleanInput, + getNullableStringInput, + getNonNullStringInput, + getNullableIdInput, + getNonNullIdInput, +}; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/getFieldDefinition.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/getFieldDefinition.ts new file mode 100644 index 000000000..7f77a23cf --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/getFieldDefinition.ts @@ -0,0 +1,141 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import { createCompilerError } from "./CompilerError"; + +import { SchemaMetaFieldDef, TypeMetaFieldDef } from "graphql"; + +/** + * Find the definition of a field of the specified type using strict + * resolution rules per the GraphQL spec. + */ +function getFieldDefinitionStrict(schema, parentType, fieldName) { + const type = schema.getRawType(parentType); + const queryType = schema.getQueryType(); + const isQueryType = + queryType != null && schema.areEqualTypes(type, queryType); + const hasTypeName = schema.isAbstractType(type) || schema.isObject(type); + let schemaFieldDef; + + if (isQueryType && fieldName === SchemaMetaFieldDef.name) { + schemaFieldDef = + queryType != null ? schema.getFieldByName(queryType, "__schema") : null; + } else if (isQueryType && fieldName === TypeMetaFieldDef.name) { + schemaFieldDef = + queryType != null ? schema.getFieldByName(queryType, "__type") : null; + } else if (hasTypeName && fieldName === "__typename") { + schemaFieldDef = schema.getFieldByName( + schema.assertCompositeType(type), + "__typename", + ); + } else if (hasTypeName && fieldName === "__id") { + schemaFieldDef = schema.getFieldByName( + schema.assertCompositeType(type), + "__id", + ); + } else if (schema.isInterface(type) || schema.isObject(type)) { + const compositeType = schema.assertCompositeType(type); + + if (schema.hasField(compositeType, fieldName)) { + schemaFieldDef = schema.getFieldByName(compositeType, fieldName); + } else { + return null; + } + } + + return schemaFieldDef; +} +/** + * Find the definition of a field of the specified type, first trying + * the standard spec-compliant resolution process and falling back + * to legacy mode that supports fat interfaces. + */ + +function getFieldDefinitionLegacy(schema, parentType, fieldName, fieldAST) { + let schemaFieldDef = getFieldDefinitionStrict(schema, parentType, fieldName); + + if (!schemaFieldDef) { + schemaFieldDef = getFieldDefinitionLegacyImpl( + schema, + parentType, + fieldName, + fieldAST, + ); + } + + return schemaFieldDef ?? null; +} +/** + * @private + */ + +function getFieldDefinitionLegacyImpl(schema, type, fieldName, fieldAST) { + const rawType = schema.getRawType(type); + + if ( + schema.isAbstractType(rawType) && + fieldAST && + fieldAST.directives && + fieldAST.directives.some( + (directive) => getName(directive) === "fixme_fat_interface", + ) + ) { + const possibleTypes = schema.getPossibleTypes( + schema.assertAbstractType(rawType), + ); + let schemaFieldDef; + + for (const possibleType of possibleTypes) { + const possibleField = schema.getFieldByName(possibleType, fieldName); + + if (possibleField) { + // Fat interface fields can have differing arguments. Try to return + // a field with matching arguments, but still return a field if the + // arguments do not match. + schemaFieldDef = possibleField; + + if (fieldAST && fieldAST.arguments) { + const argumentsAllExist = fieldAST.arguments.every( + (argument) => + schema.getFieldArgByName(possibleField, getName(argument)) != + null, + ); + + if (argumentsAllExist) { + break; + } + } + } + } + + return schemaFieldDef; + } +} +/** + * @private + */ + +function getName(ast) { + const name = ast.name ? ast.name.value : null; + + if (typeof name !== "string") { + throw createCompilerError("Expected ast node to have a 'name'.", null, [ + ast, + ]); + } + + return name; +} + +export { getFieldDefinitionLegacy, getFieldDefinitionStrict }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/getIdentifierForSelection.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/getIdentifierForSelection.ts new file mode 100644 index 000000000..127153320 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/core/getIdentifierForSelection.ts @@ -0,0 +1,66 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import invariant from "invariant"; + +import { printArguments, printDirectives } from "./IRPrinter"; + +/** + * Generates an identifier that is unique to a given selection: the alias for + * fields, the type for inline fragments, and a summary of the condition + * variable and passing value for conditions. + */ +function getIdentifierForSelection(schema, node) { + if (node.kind === "LinkedField" || node.kind === "ScalarField") { + return "Field: " + node.directives.length === 0 + ? node.alias + : node.alias + printDirectives(schema, node.directives); + } else if (node.kind === "FragmentSpread") { + return "FragmentSpread:" + node.args.length === 0 + ? node.name + : node.name + printArguments(schema, node.args); + } else if (node.kind === "ModuleImport") { + return "ModuleImport:"; + } else if (node.kind === "Defer") { + return "Defer:" + node.label; + } else if (node.kind === "Stream") { + return "Stream:" + node.label; + } else if (node.kind === "InlineFragment") { + return ( + "InlineFragment:" + + schema.getTypeString(node.typeCondition) + + printDirectives(schema, node.directives) + ); + } else if (node.kind === "ClientExtension") { + return "ClientExtension:"; + } else if (node.kind === "InlineDataFragmentSpread") { + return "InlineDataFragment:" + node.name; + } else if (node.kind === "Condition") { + return ( + "Condition:" + + (node.condition.kind === "Variable" + ? "$" + node.condition.variableName + : String(node.condition.value)) + + String(node.passingValue) + ); + } else { + invariant( + false, + "getIdentifierForSelection: Unexpected kind `%s`.", + node.kind, + ); + } +} + +export default getIdentifierForSelection; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/transforms/FlattenTransform.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/transforms/FlattenTransform.ts new file mode 100644 index 000000000..2ff3020e4 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/transforms/FlattenTransform.ts @@ -0,0 +1,423 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import * as IRTransformer from "../core/IRTransformer"; + +import areEqualArgValues from "../util/areEqualArgValues"; + +import getIdentifierForSelection from "../core/getIdentifierForSelection"; + +import { createCompilerError, createUserError } from "../core/CompilerError"; + +/** + * Transform that flattens inline fragments, fragment spreads, and conditionals. + * + * Inline fragments are inlined (replaced with their selections) when: + * - The fragment type matches the type of its parent, and its `isForCodegen`, + * or if it's for printing, there is no directive on the inline fragment. + */ +function flattenTransformImpl(context, options) { + const state = { + isForCodegen: !!(options && options.isForCodegen), + parentType: null, + }; + const visitorFn = memoizedFlattenSelection(new Map()); + return IRTransformer.transform( + context, + { + Condition: visitorFn, + Defer: visitorFn, + Fragment: visitorFn, + InlineDataFragmentSpread: visitorFn, + InlineFragment: visitorFn, + LinkedField: visitorFn, + ModuleImport: visitorFn, + Root: visitorFn, + SplitOperation: visitorFn, + }, + () => state, + ); +} + +function memoizedFlattenSelection(cache) { + return function flattenSelectionsFn(node, state) { + // $FlowFixMe[incompatible-use] + const context = this.getContext(); + let nodeCache = cache.get(node); + + if (nodeCache == null) { + nodeCache = new Map(); + cache.set(node, nodeCache); + } // Determine the current type. + + const parentType = state.parentType; + const result = nodeCache.get(parentType); + + if (result != null) { + return result; + } + + const type = + node.kind === "LinkedField" || + node.kind === "Fragment" || + node.kind === "Root" || + node.kind === "SplitOperation" + ? node.type + : node.kind === "InlineFragment" + ? node.typeCondition + : parentType; + + if (type == null) { + throw createCompilerError("FlattenTransform: Expected a parent type.", [ + node.loc, + ]); + } // Flatten the selections in this node, creating a new node with flattened + // selections if possible, then deeply traverse the flattened node, while + // keeping track of the parent type. + + const nextSelections = new Map(); + const hasFlattened = flattenSelectionsInto( + context.getSchema(), + nextSelections, + node, + state, + type, + ); + const flattenedNode = hasFlattened + ? { ...node, selections: Array.from(nextSelections.values()) } + : node; + state.parentType = type; // $FlowFixMe[incompatible-use] + + const deeplyFlattenedNode = this.traverse(flattenedNode, state); + state.parentType = parentType; + nodeCache.set(parentType, deeplyFlattenedNode); + return deeplyFlattenedNode; + }; +} +/** + * @private + */ + +function flattenSelectionsInto(schema, flattenedSelections, node, state, type) { + let hasFlattened = false; + node.selections.forEach((selection) => { + if ( + selection.kind === "InlineFragment" && + shouldFlattenInlineFragment(schema, selection, state, type) + ) { + hasFlattened = true; + flattenSelectionsInto( + schema, + flattenedSelections, + selection, + state, + type, + ); + return; + } + + const nodeIdentifier = getIdentifierForSelection(schema, selection); + const flattenedSelection = flattenedSelections.get(nodeIdentifier); // If this selection hasn't been seen before, keep track of it. + + if (!flattenedSelection) { + flattenedSelections.set(nodeIdentifier, selection); + return; + } // Otherwise a similar selection exists which should be merged. + + hasFlattened = true; + + if (flattenedSelection.kind === "InlineFragment") { + if (selection.kind !== "InlineFragment") { + throw createCompilerError( + `FlattenTransform: Expected an InlineFragment, got a '${selection.kind}'`, + [selection.loc], + ); + } + + flattenedSelections.set(nodeIdentifier, { + ...flattenedSelection, + selections: mergeSelections( + schema, + flattenedSelection, + selection, + state, + selection.typeCondition, + ), + }); + } else if (flattenedSelection.kind === "Condition") { + if (selection.kind !== "Condition") { + throw createCompilerError( + `FlattenTransform: Expected a Condition, got a '${selection.kind}'`, + [selection.loc], + ); + } + + flattenedSelections.set(nodeIdentifier, { + ...flattenedSelection, + selections: mergeSelections( + schema, + flattenedSelection, + selection, + state, + type, + ), + }); + } else if (flattenedSelection.kind === "ClientExtension") { + if (selection.kind !== "ClientExtension") { + throw createCompilerError( + `FlattenTransform: Expected a ClientExtension, got a '${selection.kind}'`, + [selection.loc], + ); + } + + flattenedSelections.set(nodeIdentifier, { + ...flattenedSelection, + selections: mergeSelections( + schema, + flattenedSelection, + selection, + state, + type, + ), + }); + } else if (flattenedSelection.kind === "FragmentSpread") { + // Ignore duplicate fragment spreads. + } else if (flattenedSelection.kind === "ModuleImport") { + if (selection.kind !== "ModuleImport") { + throw createCompilerError( + `FlattenTransform: Expected a ModuleImport, got a '${selection.kind}'`, + [selection.loc], + ); + } + + if ( + selection.name !== flattenedSelection.name || + selection.module !== flattenedSelection.module || + selection.key !== flattenedSelection.key + ) { + throw createUserError( + "Found conflicting @module selections: use a unique alias on the " + + "parent fields.", + [selection.loc, flattenedSelection.loc], + ); + } + + flattenedSelections.set(nodeIdentifier, { + ...flattenedSelection, + selections: mergeSelections( + schema, + flattenedSelection, + selection, + state, + type, + ), + }); + } else if (flattenedSelection.kind === "Defer") { + if (selection.kind !== "Defer") { + throw createCompilerError( + `FlattenTransform: Expected a Defer, got a '${selection.kind}'`, + [selection.loc], + ); + } + + flattenedSelections.set(nodeIdentifier, { + kind: "Defer", + ...flattenedSelection, + selections: mergeSelections( + schema, + flattenedSelection, + selection, + state, + type, + ), + }); + } else if (flattenedSelection.kind === "Stream") { + if (selection.kind !== "Stream") { + throw createCompilerError( + `FlattenTransform: Expected a Stream, got a '${selection.kind}'`, + [selection.loc], + ); + } + + flattenedSelections.set(nodeIdentifier, { + kind: "Stream", + ...flattenedSelection, + selections: mergeSelections( + schema, + flattenedSelection, + selection, + state, + type, + ), + }); + } else if (flattenedSelection.kind === "LinkedField") { + if (selection.kind !== "LinkedField") { + throw createCompilerError( + `FlattenTransform: Expected a LinkedField, got a '${selection.kind}'`, + [selection.loc], + ); + } + + assertUniqueArgsForAlias(selection, flattenedSelection); // NOTE: not using object spread here as this code is pretty hot + + flattenedSelections.set(nodeIdentifier, { + kind: "LinkedField", + alias: flattenedSelection.alias, + args: flattenedSelection.args, + connection: flattenedSelection.connection || selection.connection, + directives: flattenedSelection.directives, + handles: mergeHandles(flattenedSelection, selection), + loc: flattenedSelection.loc, + metadata: flattenedSelection.metadata, + name: flattenedSelection.name, + selections: mergeSelections( + schema, + flattenedSelection, + selection, + state, + selection.type, + ), + type: flattenedSelection.type, + }); + } else if (flattenedSelection.kind === "ScalarField") { + if (selection.kind !== "ScalarField") { + throw createCompilerError( + `FlattenTransform: Expected a ScalarField, got a '${selection.kind}'`, + [selection.loc], + ); + } + + assertUniqueArgsForAlias(selection, flattenedSelection); + + if (selection.handles && selection.handles.length > 0) { + flattenedSelections.set(nodeIdentifier, { + kind: "ScalarField", + ...flattenedSelection, + handles: mergeHandles(selection, flattenedSelection), + }); + } + } else if (flattenedSelection.kind === "InlineDataFragmentSpread") { + throw createCompilerError( + "FlattenTransform: did not expect an InlineDataFragmentSpread node. " + + "Only expecting InlineDataFragmentSpread in reader ASTs and this " + + "transform to run only on normalization ASTs.", + [selection.loc], + ); + } else { + flattenedSelection.kind; + throw createCompilerError( + `FlattenTransform: Unknown kind '${flattenedSelection.kind}'`, + ); + } + }); + return hasFlattened; +} +/** + * @private + */ + +function mergeSelections(schema, nodeA, nodeB, state, type) { + const flattenedSelections = new Map(); + flattenSelectionsInto(schema, flattenedSelections, nodeA, state, type); + flattenSelectionsInto(schema, flattenedSelections, nodeB, state, type); + return Array.from(flattenedSelections.values()); +} +/** + * @private + * TODO(T19327202) This is redundant with OverlappingFieldsCanBeMergedRule once + * it can be enabled. + */ + +function assertUniqueArgsForAlias(field, otherField) { + if (!areEqualFields(field, otherField)) { + throw createUserError( + "Expected all fields on the same parent with the name or alias " + + `'${field.alias}' to have the same name and arguments.`, + [field.loc, otherField.loc], + ); + } +} +/** + * @private + */ + +function shouldFlattenInlineFragment(schema, fragment, state, type) { + return ( + schema.areEqualTypes(fragment.typeCondition, schema.getRawType(type)) && + (state.isForCodegen || fragment.directives.length === 0) + ); +} +/** + * @private + * + * Verify that two fields are equal in all properties other than their + * selections. + */ + +function areEqualFields(thisField, thatField) { + return ( + thisField.kind === thatField.kind && + thisField.name === thatField.name && + thisField.alias === thatField.alias && + areEqualArgs(thisField.args, thatField.args) + ); +} +/** + * Verify that two sets of arguments are equivalent - same argument names + * and values. Notably this ignores the types of arguments and values, which + * may not always be inferred identically. + */ + +function areEqualArgs(thisArgs, thatArgs) { + return ( + thisArgs.length === thatArgs.length && + thisArgs.every((thisArg, index) => { + const thatArg = thatArgs[index]; + return ( + thisArg.name === thatArg.name && + thisArg.value.kind === thatArg.value.kind && + thisArg.value.variableName === thatArg.value.variableName && + areEqualArgValues(thisArg.value.value, thatArg.value.value) + ); + }) + ); +} +/** + * @private + */ + +function mergeHandles(nodeA, nodeB) { + if (!nodeA.handles) { + return nodeB.handles; + } + + if (!nodeB.handles) { + return nodeA.handles; + } + + const uniqueItems = new Map(); + nodeA.handles // $FlowFixMe[incompatible-use] + .concat(nodeB.handles) // $FlowFixMe[incompatible-use] + .forEach((item) => uniqueItems.set(item.name + item.key, item)); // $FlowFixMe[incompatible-return] + + return Array.from(uniqueItems.values()); +} + +function transformWithOptions(options) { + return function flattenTransform(context) { + return flattenTransformImpl(context, options); + }; +} + +export { transformWithOptions }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/transforms/InlineFragmentsTransform.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/transforms/InlineFragmentsTransform.ts new file mode 100644 index 000000000..dd4a40b5a --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/transforms/InlineFragmentsTransform.ts @@ -0,0 +1,71 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import * as IRTransformer from "../core/IRTransformer"; + +import invariant from "invariant"; + +/** + * A transform that inlines all fragments and removes them. + */ +function inlineFragmentsTransform(context) { + const visitFragmentSpread = fragmentSpreadVisitor(new Map()); + return IRTransformer.transform(context, { + Fragment: visitFragment, + FragmentSpread: visitFragmentSpread, + }); +} + +function visitFragment(fragment) { + return null; +} + +function fragmentSpreadVisitor(cache) { + return function visitFragmentSpread(fragmentSpread) { + let traverseResult = cache.get(fragmentSpread); + + if (traverseResult != null) { + return traverseResult; + } + + invariant( + fragmentSpread.args.length === 0, + "InlineFragmentsTransform: Cannot flatten fragment spread `%s` with " + + "arguments. Use the `ApplyFragmentArgumentTransform` before flattening", + fragmentSpread.name, + ); // $FlowFixMe[incompatible-use] + + const fragment = this.getContext().getFragment( + fragmentSpread.name, + fragmentSpread.loc, + ); + const result = { + kind: "InlineFragment", + directives: fragmentSpread.directives, + loc: { + kind: "Derived", + source: fragmentSpread.loc, + }, + metadata: fragmentSpread.metadata, + selections: fragment.selections, + typeCondition: fragment.type, + }; // $FlowFixMe[incompatible-use] + + traverseResult = this.traverse(result); + cache.set(fragmentSpread, traverseResult); + return traverseResult; + }; +} + +export { inlineFragmentsTransform as transform }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/CodeMarker.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/CodeMarker.ts new file mode 100644 index 000000000..a9d4e8aed --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/CodeMarker.ts @@ -0,0 +1,78 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; +/** + * Marks a string of code as code to be replaced later. + */ + +function moduleDependency(code) { + return `@@MODULE_START@@${code}@@MODULE_END@@`; +} +/** + * After JSON.stringify'ing some code that contained parts marked with `mark()`, + * this post-processes the JSON to convert the marked code strings to raw code. + * + * Example: + * CodeMarker.postProcess( + * JSON.stringify({code: CodeMarker.mark('alert(1)')}) + * ) + */ + +function postProcess(json, printModule) { + return json.replace( + /"@@MODULE_START@@(.*?)@@MODULE_END@@"/g, + (_, moduleName) => printModule(moduleName), + ); +} +/** + * Transforms a value such that any transitive CodeMarker strings are replaced + * with the value of the named module in the given module map. + */ + +function transform(node, moduleMap) { + if (node == null) { + return node; + } else if (Array.isArray(node)) { + return node.map((item) => transform(item, moduleMap)); + } else if (typeof node === "object") { + const next = {}; + Object.keys(node).forEach((key) => { + next[key] = transform(node[key], moduleMap); + }); + return next; + } else if (typeof node === "string") { + const match = /^@@MODULE_START@@(.*?)@@MODULE_END@@$/.exec(node); + + if (match != null) { + const moduleName = match[1]; + + if (moduleMap.hasOwnProperty(moduleName)) { + return moduleMap[moduleName]; + } else { + throw new Error( + `Could not find a value for CodeMarker value '${moduleName}', ` + + "make sure to supply one in the module mapping.", + ); + } + } else if (node.indexOf("@@MODULE_START") >= 0) { + throw new Error(`Found unprocessed CodeMarker value '${node}'.`); + } + + return node; + } else { + // mixed + return node; + } +} + +export { moduleDependency, postProcess, transform }; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/DefaultHandleKey.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/DefaultHandleKey.ts new file mode 100644 index 000000000..5e75759d3 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/DefaultHandleKey.ts @@ -0,0 +1,17 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict + * @format + */ + +// flowlint ambiguous-object-type:error + +"use strict"; + +export const DEFAULT_HANDLE_KEY = ""; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/areEqualArgValues.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/areEqualArgValues.ts new file mode 100644 index 000000000..e5733d1b3 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/areEqualArgValues.ts @@ -0,0 +1,142 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// TODO: This is only used with `ArgumentValue` types, so it could be simpler. +// flowlint ambiguous-object-type:error +"use strict"; + +const aStackPool = []; +const bStackPool = []; +/** + * Checks if two values are equal. Values may be primitives, arrays, or objects. + * Returns true if both arguments have the same keys and values. + * + * @see http://underscorejs.org + * @copyright 2009-2013 Jeremy Ashkenas, DocumentCloud Inc. + * @license MIT + */ + +function areEqualArgValues(a, b) { + const aStack = aStackPool.length ? aStackPool.pop() : []; + const bStack = bStackPool.length ? bStackPool.pop() : []; + const result = eq(a, b, aStack, bStack); + aStack.length = 0; + bStack.length = 0; + aStackPool.push(aStack); + bStackPool.push(bStack); + return result; +} + +function eq(a, b, aStack, bStack) { + if (a === b) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + return a !== 0 || 1 / a === 1 / b; + } + + if (a == null || b == null) { + // a or b can be `null` or `undefined` + return false; + } + + if (typeof a !== "object" || typeof b !== "object") { + return false; + } // $FlowFixMe[method-unbinding] added when improving typing for this parameters + + const objToStr = Object.prototype.toString; + const className = objToStr.call(a); + + if (className !== objToStr.call(b)) { + return false; + } + + switch (className) { + case "[object String]": + return a === String(b); + + case "[object Number]": + return isNaN(a) || isNaN(b) ? false : a === Number(b); + + case "[object Date]": + case "[object Boolean]": + return +a === +b; + + case "[object RegExp]": + return ( + a.source === b.source && + a.global === b.global && + a.multiline === b.multiline && + a.ignoreCase === b.ignoreCase + ); + } // Assume equality for cyclic structures. + + let length = aStack.length; + + while (length--) { + if (aStack[length] === a) { + return bStack[length] === b; + } + } + + aStack.push(a); + bStack.push(b); + let size = 0; // Recursively compare objects and arrays. + + if (className === "[object Array]") { + size = a.length; + + if (size !== b.length) { + return false; + } // Deep compare the contents, ignoring non-numeric properties. + + while (size--) { + if (!eq(a[size], b[size], aStack, bStack)) { + return false; + } + } + } else { + if (a.constructor !== b.constructor) { + return false; + } + + if (a.hasOwnProperty("valueOf") && b.hasOwnProperty("valueOf")) { + return a.valueOf() === b.valueOf(); + } + + const keys = Object.keys(a); + + if (keys.length !== Object.keys(b).length) { + return false; + } + + for (let i = 0; i < keys.length; i++) { + if (keys[i] === "_owner") { + // HACK: Comparing deeply nested React trees is slow since you end up + // comparing the entire tree (all ancestors and all children) and + // likely not what you want if you're comparing two elements with + // areEqualArgValues. We bail out here for now. + continue; + } + + if ( + !b.hasOwnProperty(keys[i]) || + !eq(a[keys[i]], b[keys[i]], aStack, bStack) + ) { + return false; + } + } + } + + aStack.pop(); + bStack.pop(); + return true; +} + +export default areEqualArgValues; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/argumentContainsVariables.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/argumentContainsVariables.ts new file mode 100644 index 000000000..7f37abf04 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/argumentContainsVariables.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +function argumentContainsVariables(arg) { + if (arg == null) { + return false; + } + + switch (arg.kind) { + case "Variable": + return true; + + case "Literal": + return false; + + case "ListValue": + return arg.items.some(argumentContainsVariables); + + case "ObjectValue": + return arg.fields.some(argumentContainsVariables); + + default: + arg.kind; + return false; + } +} + +export default argumentContainsVariables; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/generateAbstractTypeRefinementKey.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/generateAbstractTypeRefinementKey.ts new file mode 100644 index 000000000..7fe70d1f0 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/generateAbstractTypeRefinementKey.ts @@ -0,0 +1,25 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +import { createCompilerError } from "../core/CompilerError"; + +function generateAbstractTypeRefinementKey(schema, type) { + if (!schema.isAbstractType(type)) { + throw createCompilerError("Expected an abstract type"); + } + + return `__is${schema.getTypeString(type)}`; +} + +export default generateAbstractTypeRefinementKey; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/md5.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/md5.ts new file mode 100644 index 000000000..1fc6968a6 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/md5.ts @@ -0,0 +1,6 @@ +// @ts-nocheck + +// We supply a murmurhash2 implementation instead of md5 for digest +// work in a browser. +import murmurhash2 from "@emotion/hash"; +export default murmurhash2; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/orList.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/orList.ts new file mode 100644 index 000000000..6ae3bb997 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/orList.ts @@ -0,0 +1,37 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; + +const OR_LIST_MAX_LENGTH = 5; + +import { createCompilerError } from "../core/CompilerError"; + +function orList(items) { + if (items.length === 0) { + throw createCompilerError("Expected an array of strings. Got empty array"); + } + + if (items.length === 1) { + return items[0]; + } + + if (items.length > OR_LIST_MAX_LENGTH) { + return items.slice(0, OR_LIST_MAX_LENGTH).join(", ") + ", ..."; + } + + const selected = items.slice(); + const lastItem = selected.pop(); + return selected.join(", ") + " or " + lastItem; +} + +export default orList; diff --git a/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/partitionArray.ts b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/partitionArray.ts new file mode 100644 index 000000000..921f42a44 --- /dev/null +++ b/packages/relay-apollo-duct-tape/src/vendor/relay-compiler/lib/util/partitionArray.ts @@ -0,0 +1,37 @@ +// @ts-nocheck + +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + * @format + */ +// flowlint ambiguous-object-type:error +"use strict"; +/** + * Partitions an array given a predicate. All elements satisfying the predicate + * are part of the first returned array, and all elements that don't are in the + * second. + */ + +function partitionArray(array, predicate) { + const first = []; + const second = []; + + for (let i = 0; i < array.length; i++) { + const item = array[i]; + + if (predicate(item)) { + first.push(item); + } else { + second.push(item); + } + } + + return [first, second]; +} + +export default partitionArray; diff --git a/packages/relay-apollo-duct-tape/tsconfig.json b/packages/relay-apollo-duct-tape/tsconfig.json new file mode 100644 index 000000000..4b84ae45b --- /dev/null +++ b/packages/relay-apollo-duct-tape/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": ".tsbuildinfo", + "rootDir": "src", + "outDir": "lib", + "lib": ["esnext", "dom"], + "jsx": "react" + }, + "include": ["src"], + "references": [ + // { "path": "../graphql-codegen-relay-ir-plugin" }, + { "path": "../graphql-codegen-supermassive-typed-document-node-plugin" }, + { "path": "../graphql-codegen-typescript-operations" } + ] +} diff --git a/packages/relay-compiler-language-graphitation/src/formatModule.ts b/packages/relay-compiler-language-graphitation/src/formatModule.ts new file mode 100644 index 000000000..09a762518 --- /dev/null +++ b/packages/relay-compiler-language-graphitation/src/formatModule.ts @@ -0,0 +1,34 @@ +/** + * NOTE: This is currently in-flight and mostly re-uses code from the above mentioned package, where it's tested. + */ +/* istanbul ignore file */ + +import { FormatModule } from "relay-compiler/lib/language/RelayLanguagePluginInterface"; +import { parse } from "graphql"; + +export const formatModule: FormatModule = ({ + hash, + typeText, + concreteText, + node, + documentType, + docText, + definition, + kind, +}) => { + console.log(documentType, kind, docText, definition); + return `/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck +${hash ? `/* ${hash} */\n` : ""}; +${typeText || ""} + +export const node = ${concreteText}; + +export const document = ${JSON.stringify( + parse(definition.loc.source.body), + null, + 2, + )}; +`; +}; diff --git a/patches/@apollo+client+3.6.10.patch b/patches/@apollo+client+3.6.10.patch index 224af6fdd..e660d0261 100644 --- a/patches/@apollo+client+3.6.10.patch +++ b/patches/@apollo+client+3.6.10.patch @@ -19,6 +19,29 @@ index afbbcd0..d93d0af 100644 fieldName: fieldName, storeFieldName: storeFieldName, variables: variables, +diff --git a/node_modules/@apollo/client/cache/core/types/DataProxy.d.ts b/node_modules/@apollo/client/cache/core/types/DataProxy.d.ts +index ce97ef7..fab7252 100644 +--- a/node_modules/@apollo/client/cache/core/types/DataProxy.d.ts ++++ b/node_modules/@apollo/client/cache/core/types/DataProxy.d.ts +@@ -1,15 +1,16 @@ + import { DocumentNode } from 'graphql'; + import { TypedDocumentNode } from '@graphql-typed-document-node/core'; ++import { GraphQLTaggedNode } from "relay-runtime"; + import { MissingFieldError } from './common'; + export declare namespace DataProxy { + interface Query { +- query: DocumentNode | TypedDocumentNode; ++ query: (DocumentNode | TypedDocumentNode) & { __relay?: GraphQLTaggedNode }; + variables?: TVariables; + id?: string; + } + interface Fragment { + id?: string; +- fragment: DocumentNode | TypedDocumentNode; ++ fragment: (DocumentNode | TypedDocumentNode) & { __relay?: GraphQLTaggedNode }; + fragmentName?: string; + variables?: TVariables; + } diff --git a/node_modules/@apollo/client/cache/inmemory/policies.d.ts b/node_modules/@apollo/client/cache/inmemory/policies.d.ts index 6a93238..fdef0a4 100644 --- a/node_modules/@apollo/client/cache/inmemory/policies.d.ts diff --git a/patches/@types+react-relay+14.1.1.patch b/patches/@types+react-relay+14.1.1.patch new file mode 100644 index 000000000..d08752c55 --- /dev/null +++ b/patches/@types+react-relay+14.1.1.patch @@ -0,0 +1,16 @@ +diff --git a/node_modules/@types/react-relay/lib/relay-hooks/FragmentResource.d.ts b/node_modules/@types/react-relay/lib/relay-hooks/FragmentResource.d.ts +new file mode 100644 +index 0000000..3dd50a2 +--- /dev/null ++++ b/node_modules/@types/react-relay/lib/relay-hooks/FragmentResource.d.ts +@@ -0,0 +1,9 @@ ++// import { IEnvironment, ReaderFragment } from "relay-runtime"; ++ ++declare class FragmentResourceImpl { ++ public read(fragmentNode: any, fragmentRef: unknown, componentDisplayName: string): { data?: unknown; isMissingData: boolean; }; ++} ++ ++export declare function getFragmentResourceForEnvironment( ++ environment: any, ++ ): FragmentResourceImpl +\ No newline at end of file diff --git a/patches/@types+relay-compiler+8.0.0.patch b/patches/@types+relay-compiler+8.0.0.patch index 02f6fcf35..01e60c848 100644 --- a/patches/@types+relay-compiler+8.0.0.patch +++ b/patches/@types+relay-compiler+8.0.0.patch @@ -1,7 +1,92 @@ +diff --git a/node_modules/@types/relay-compiler/index.d.ts b/node_modules/@types/relay-compiler/index.d.ts +index 91ffc0a..2fa95be 100644 +--- a/node_modules/@types/relay-compiler/index.d.ts ++++ b/node_modules/@types/relay-compiler/index.d.ts +@@ -6,7 +6,7 @@ + // TypeScript Version: 3.4 + + import * as ASTConvert from './lib/core/ASTConvert'; +-import { CompilerContext } from './lib/core/CompilerContext'; ++import CompilerContext from './lib/core/CompilerContext'; + import * as Parser from './lib/core/RelayParser'; + import * as Printer from './lib/core/IRPrinter'; + import * as IRTransforms from './lib/core/RelayIRTransforms'; +diff --git a/node_modules/@types/relay-compiler/lib/codegen/RelayCodeGenerator.d.ts b/node_modules/@types/relay-compiler/lib/codegen/RelayCodeGenerator.d.ts +new file mode 100644 +index 0000000..1be6330 +--- /dev/null ++++ b/node_modules/@types/relay-compiler/lib/codegen/RelayCodeGenerator.d.ts +@@ -0,0 +1,12 @@ ++import { Schema } from "../core/Schema"; ++import { Fragment, Request, SplitOperation } from "../core/IR"; ++import { ReaderFragment, ConcreteRequest, NormalizationSplitOperation} from "relay-runtime"; ++ ++declare function generate(schema: Schema, node: Fragment): ReaderFragment; ++declare function generate(schema: Schema, node: Request): ConcreteRequest; ++declare function generate( ++ schema: Schema, ++ node: SplitOperation, ++): NormalizationSplitOperation; ++ ++export { generate } +\ No newline at end of file +diff --git a/node_modules/@types/relay-compiler/lib/codegen/compileRelayArtifacts.d.ts b/node_modules/@types/relay-compiler/lib/codegen/compileRelayArtifacts.d.ts +new file mode 100644 +index 0000000..e968595 +--- /dev/null ++++ b/node_modules/@types/relay-compiler/lib/codegen/compileRelayArtifacts.d.ts +@@ -0,0 +1,9 @@ ++import type CompilerContext from '../core/CompilerContext'; ++import type {GeneratedDefinition} from '../core/IR'; ++import type {GeneratedNode} from 'relay-runtime'; ++ ++export default function compileRelayArtifacts( ++ context: CompilerContext, ++ transforms: typeof import("../core/RelayIRTransforms"), ++ reporter?: unknown, ++): ReadonlyArray<[GeneratedDefinition, GeneratedNode]>; +\ No newline at end of file +diff --git a/node_modules/@types/relay-compiler/lib/core/CompilerContext.d.ts b/node_modules/@types/relay-compiler/lib/core/CompilerContext.d.ts +index f9753c2..474a6a9 100644 +--- a/node_modules/@types/relay-compiler/lib/core/CompilerContext.d.ts ++++ b/node_modules/@types/relay-compiler/lib/core/CompilerContext.d.ts +@@ -8,7 +8,7 @@ export type IRTransform = ( + + export type CompilerContextDocument = Fragment | Root | SplitOperation; + +-export class CompilerContext { ++export default class CompilerContext { + constructor(schema: Schema); + documents(): CompilerContextDocument[]; + forEachDocument(fn: (doc: CompilerContextDocument) => void): void; diff --git a/node_modules/@types/relay-compiler/lib/core/IR.d.ts b/node_modules/@types/relay-compiler/lib/core/IR.d.ts -index efb36e3..d82f352 100644 +index efb36e3..050f7eb 100644 --- a/node_modules/@types/relay-compiler/lib/core/IR.d.ts +++ b/node_modules/@types/relay-compiler/lib/core/IR.d.ts +@@ -68,7 +68,7 @@ export interface Fragment { + directives: ReadonlyArray; + kind: 'Fragment'; + loc: Location; +- metadata: Metadata; ++ metadata: Metadata | null; + name: string; + selections: ReadonlyArray; + type: CompositeTypeID; +@@ -252,12 +252,12 @@ export interface ObjectValue { + export interface Request { + kind: 'Request'; + fragment: Fragment; +- id?: string; ++ id?: string | null; + loc: Location; + metadata: Metadata; + name: string; + root: Root; +- text?: string; ++ text?: string | null; + } + + export interface Root { @@ -268,7 +268,7 @@ export interface Root { metadata: Metadata; name: string; @@ -11,25 +96,212 @@ index efb36e3..d82f352 100644 type: CompositeTypeID; } +diff --git a/node_modules/@types/relay-compiler/lib/core/IRTransformer.d.ts b/node_modules/@types/relay-compiler/lib/core/IRTransformer.d.ts +new file mode 100644 +index 0000000..a273d11 +--- /dev/null ++++ b/node_modules/@types/relay-compiler/lib/core/IRTransformer.d.ts +@@ -0,0 +1,59 @@ ++import CompilerContext, { CompilerContextDocument } from "./CompilerContext"; ++import { ++ Argument, ++ ClientExtension, ++ Condition, ++ Defer, ++ Directive, ++ Fragment, ++ FragmentSpread, ++ InlineDataFragmentSpread, ++ InlineFragment, ++ LinkedField, ++ ListValue, ++ Literal, ++ LocalArgumentDefinition, ++ ModuleImport, ++ ObjectFieldValue, ++ ObjectValue, ++ Request, ++ Root, ++ RootArgumentDefinition, ++ ScalarField, ++ SplitOperation, ++ Stream, ++ Variable, ++} from './IR'; ++ ++export type NodeVisitor = { ++ Argument?: NodeVisitorFunction, ++ ClientExtension?: NodeVisitorFunction, ++ Condition?: NodeVisitorFunction, ++ Defer?: NodeVisitorFunction, ++ Directive?: NodeVisitorFunction, ++ Fragment?: NodeVisitorFunction, ++ FragmentSpread?: NodeVisitorFunction, ++ InlineFragment?: NodeVisitorFunction, ++ LinkedField?: NodeVisitorFunction, ++ ListValue?: NodeVisitorFunction, ++ Literal?: NodeVisitorFunction, ++ LocalArgumentDefinition?: NodeVisitorFunction, ++ ModuleImport?: NodeVisitorFunction, ++ ObjectFieldValue?: NodeVisitorFunction, ++ ObjectValue?: NodeVisitorFunction, ++ Request?: NodeVisitorFunction, ++ Root?: NodeVisitorFunction, ++ InlineDataFragmentSpread?: NodeVisitorFunction, ++ RootArgumentDefinition?: NodeVisitorFunction, ++ ScalarField?: NodeVisitorFunction, ++ SplitOperation?: NodeVisitorFunction, ++ Stream?: NodeVisitorFunction, ++ Variable?: NodeVisitorFunction, ++} ++type NodeVisitorFunction = (node: N, state: S) => N | undefined | void | null; ++ ++export function transform( ++ context: CompilerContext, ++ visitor: NodeVisitor, ++ stateInitializer?: ((context: CompilerContextDocument) => S), ++): CompilerContext; +\ No newline at end of file diff --git a/node_modules/@types/relay-compiler/lib/core/Schema.d.ts b/node_modules/@types/relay-compiler/lib/core/Schema.d.ts -index c79aea0..3aeab5b 100644 +index c79aea0..c122c3e 100644 --- a/node_modules/@types/relay-compiler/lib/core/Schema.d.ts +++ b/node_modules/@types/relay-compiler/lib/core/Schema.d.ts -@@ -1,7 +1,7 @@ - import { - TypeNode, +@@ -3,6 +3,7 @@ import { DocumentNode, -- DirectiveLocationEnum, -+ DirectiveLocation, + DirectiveLocationEnum, ValueNode, ++ Source } from 'graphql'; import { Field as IRField } from './IR'; -@@ -29,7 +29,7 @@ export type Argument = Readonly<{ - export type Directive = Readonly<{ - args: ReadonlyArray, - isClient: boolean, -- locations: ReadonlyArray, -+ locations: ReadonlyArray, - name: string - }>; +@@ -127,3 +128,5 @@ export interface Schema { + parseValue: (type: ScalarTypeID | EnumTypeID, value: any) => any; + serialize: (type: ScalarTypeID | EnumTypeID, value: any) => any; + } ++ ++export function create(source: Source): Schema; +\ No newline at end of file +diff --git a/node_modules/@types/relay-compiler/lib/transforms/ApplyFragmentArgumentTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/ApplyFragmentArgumentTransform.d.ts +index 9edd75a..30f3fc0 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/ApplyFragmentArgumentTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/ApplyFragmentArgumentTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + declare function applyFragmentArgumentTransform( + context: CompilerContext, +diff --git a/node_modules/@types/relay-compiler/lib/transforms/ConnectionTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/ConnectionTransform.d.ts +index f6066db..b598493 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/ConnectionTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/ConnectionTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + /** + * This transform rewrites LinkedField nodes with @connection_resolver and rewrites them +diff --git a/node_modules/@types/relay-compiler/lib/transforms/FieldHandleTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/FieldHandleTransform.d.ts +new file mode 100644 +index 0000000..b598493 +--- /dev/null ++++ b/node_modules/@types/relay-compiler/lib/transforms/FieldHandleTransform.d.ts +@@ -0,0 +1,9 @@ ++import CompilerContext from '../core/CompilerContext'; ++ ++/** ++ * This transform rewrites LinkedField nodes with @connection_resolver and rewrites them ++ * into `ConnectionField` nodes. ++ */ ++declare function connectionTransform(context: CompilerContext): CompilerContext; ++ ++export { connectionTransform as transform }; +diff --git a/node_modules/@types/relay-compiler/lib/transforms/FlattenTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/FlattenTransform.d.ts +index a81eb0b..80c05fa 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/FlattenTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/FlattenTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + export interface FlattenOptions { + flattenAbstractTypes?: boolean; +diff --git a/node_modules/@types/relay-compiler/lib/transforms/GenerateTypeNameTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/GenerateTypeNameTransform.d.ts +new file mode 100644 +index 0000000..25be3b0 +--- /dev/null ++++ b/node_modules/@types/relay-compiler/lib/transforms/GenerateTypeNameTransform.d.ts +@@ -0,0 +1,5 @@ ++import CompilerContext from 'relay-compiler/lib/core/CompilerContext'; ++ ++export function transform( ++ context: CompilerContext, ++): CompilerContext; +diff --git a/node_modules/@types/relay-compiler/lib/transforms/InlineFragmentsTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/InlineFragmentsTransform.d.ts +index 11e6b33..7712bff 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/InlineFragmentsTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/InlineFragmentsTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + export function transform( + context: CompilerContext, +diff --git a/node_modules/@types/relay-compiler/lib/transforms/MaskTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/MaskTransform.d.ts +index 24638ee..566ac4c 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/MaskTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/MaskTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + /** + * A transform that inlines fragment spreads with the @relay(mask: false) +diff --git a/node_modules/@types/relay-compiler/lib/transforms/MatchTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/MatchTransform.d.ts +index bc5f414..2f35bb5 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/MatchTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/MatchTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + /** + * This transform rewrites LinkedField nodes with @match and rewrites them +diff --git a/node_modules/@types/relay-compiler/lib/transforms/RefetchableFragmentTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/RefetchableFragmentTransform.d.ts +index 24fddfc..581ca6a 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/RefetchableFragmentTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/RefetchableFragmentTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + /** + * This transform synthesizes "refetch" queries for fragments that +diff --git a/node_modules/@types/relay-compiler/lib/transforms/RelayDirectiveTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/RelayDirectiveTransform.d.ts +index 445dd3b..2006d8e 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/RelayDirectiveTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/RelayDirectiveTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + /** + * A transform that extracts `@relay(plural: Boolean)` directives and converts +diff --git a/node_modules/@types/relay-compiler/lib/transforms/SkipRedundantNodesTransform.d.ts b/node_modules/@types/relay-compiler/lib/transforms/SkipRedundantNodesTransform.d.ts +index 03ac747..9c33aad 100644 +--- a/node_modules/@types/relay-compiler/lib/transforms/SkipRedundantNodesTransform.d.ts ++++ b/node_modules/@types/relay-compiler/lib/transforms/SkipRedundantNodesTransform.d.ts +@@ -1,4 +1,4 @@ +-import { CompilerContext } from '../core/CompilerContext'; ++import CompilerContext from '../core/CompilerContext'; + + declare function skipRedundantNodesTransform( + context: CompilerContext, +diff --git a/node_modules/@types/relay-compiler/lib/util/dedupeJSONStringify.d.ts b/node_modules/@types/relay-compiler/lib/util/dedupeJSONStringify.d.ts +new file mode 100644 +index 0000000..41557c4 +--- /dev/null ++++ b/node_modules/@types/relay-compiler/lib/util/dedupeJSONStringify.d.ts +@@ -0,0 +1 @@ ++export default function dedupeJSONStringify(value: any): string; +\ No newline at end of file diff --git a/patches/@types+relay-runtime+14.1.14.patch b/patches/@types+relay-runtime+14.1.14.patch new file mode 100644 index 000000000..02aeef15d --- /dev/null +++ b/patches/@types+relay-runtime+14.1.14.patch @@ -0,0 +1,241 @@ +diff --git a/node_modules/@types/relay-runtime/index.d.ts b/node_modules/@types/relay-runtime/index.d.ts +index f165121..8dad92f 100644 +--- a/node_modules/@types/relay-runtime/index.d.ts ++++ b/node_modules/@types/relay-runtime/index.d.ts +@@ -154,9 +154,10 @@ export { RelayObservable as Observable } from "./lib/network/RelayObservable"; + export { default as Environment, EnvironmentConfig } from "./lib/store/RelayModernEnvironment"; + import QueryResponseCache from "./lib/network/RelayQueryResponseCache"; + export { QueryResponseCache }; +-export { RelayModernRecord as Record } from "./lib/store/RelayModernRecord"; + export { default as Store } from "./lib/store/RelayModernStore"; +-export { RelayRecordSource as RecordSource } from "./lib/store/RelayRecordSource"; ++import * as RecordSource from './lib/store/RelayRecordSource'; ++import * as Record from './lib/store/RelayModernRecord'; ++export { RecordSource, Record }; + + export { createFragmentSpecResolver } from "./lib/store/createFragmentSpecResolver"; + export { readInlineData } from "./lib/store/readInlineData"; +diff --git a/node_modules/@types/relay-runtime/lib/store/RelayModernRecord.d.ts b/node_modules/@types/relay-runtime/lib/store/RelayModernRecord.d.ts +index 8bf74aa..43a731e 100644 +--- a/node_modules/@types/relay-runtime/lib/store/RelayModernRecord.d.ts ++++ b/node_modules/@types/relay-runtime/lib/store/RelayModernRecord.d.ts +@@ -1,11 +1,11 @@ + import { DataID } from "../util/RelayRuntimeTypes"; + import { Record } from "./RelayStoreTypes"; + +-export class RelayModernRecord { ++// export class RelayModernRecord { + /** + * Clone a record. + */ +- clone(record: Record): Record; ++ export function clone(record: Record): Record; + + /** + * Copies all fields from `source` to `sink`, excluding `__id` and `__typename`. +@@ -15,71 +15,71 @@ export class RelayModernRecord { + * copied by reference and not value; callers should ensure that values are + * copied on write. + */ +- copyFields(source: Record, sink: Record): void; ++ export function copyFields(source: Record, sink: Record): void; + + /** + * Create a new record. + */ +- create(dataID: DataID, typeName: string): Record; ++ export function create(dataID: DataID, typeName: string): Record; + + /** + * Get the record's `id` if available or the client-generated identifier. + */ +- getDataID(record: Record): DataID; ++ export function getDataID(record: Record): DataID; + + /** + * Get the concrete type of the record. + */ +- getType(record: Record): string; ++ export function getType(record: Record): string; + + /** + * Get a scalar (non-link) field value. + */ +- getValue(record: Record, storageKey: string): unknown; ++ export function getValue(record: Record, storageKey: string): unknown; + + /** + * Get the value of a field as a reference to another record. Throws if the + * field has a different type. + */ +- getLinkedRecordID(record: Record, storageKey: string): DataID | null; ++ export function getLinkedRecordID(record: Record, storageKey: string): DataID | null; + + /** + * Get the value of a field as a list of references to other records. Throws if + * the field has a different type. + */ +- getLinkedRecordIDs(record: Record, storageKey: string): DataID[] | null; ++ export function getLinkedRecordIDs(record: Record, storageKey: string): DataID[] | null; + + /** + * Compares the fields of a previous and new record, returning either the + * previous record if all fields are equal or a new record (with merged fields) + * if any fields have changed. + */ +- update(prevRecord: Record, nextRecord: Record): Record; ++ export function update(prevRecord: Record, nextRecord: Record): Record; + + /** + * Returns a new record with the contents of the given records. Fields in the + * second record will overwrite identical fields in the first record. + */ +- merge(record1: Record, record2: Record): Record; ++ export function merge(record1: Record, record2: Record): Record; + + /** + * Prevent modifications to the record. Attempts to call `set*` functions on a + * frozen record will fatal at runtime. + */ +- freeze(record: Record): void; ++ export function freeze(record: Record): void; + + /** + * Set the value of a storageKey to a scalar. + */ +- setValue(record: Record, storageKey: string, value: any): void; ++ export function setValue(record: Record, storageKey: string, value: any): void; + + /** + * Set the value of a field to a reference to another record. + */ +- setLinkedRecordID(record: Record, storageKey: string, linkedID: DataID): void; ++ export function setLinkedRecordID(record: Record, storageKey: string, linkedID: DataID): void; + + /** + * Set the value of a field to a list of references other records. + */ +- setLinkedRecordIDs(record: Record, storageKey: string, linkedIDs: DataID[] | null): void; +-} ++ export function setLinkedRecordIDs(record: Record, storageKey: string, linkedIDs: DataID[] | null): void; ++// } +diff --git a/node_modules/@types/relay-runtime/lib/store/RelayPublishQueue.d.ts b/node_modules/@types/relay-runtime/lib/store/RelayPublishQueue.d.ts +new file mode 100644 +index 0000000..e4b515d +--- /dev/null ++++ b/node_modules/@types/relay-runtime/lib/store/RelayPublishQueue.d.ts +@@ -0,0 +1,48 @@ ++import { Store, PublishQueue, OptimisticUpdate, StoreUpdater, RecordSource, OperationDescriptor, RelayResponsePayload, SelectorStoreUpdater, RequestDescriptor } from "./RelayStoreTypes"; ++import { HandlerProvider } from "../handlers/RelayDefaultHandlerProvider"; ++ ++export default class RelayPublishQueue implements PublishQueue { ++ constructor(store: Store, handlerProvider: HandlerProvider | null | undefined, getDataId: (fieldValue: Record, typeName: string) => unknown); ++ ++ /** ++ * Schedule applying an optimistic updates on the next `run()`. ++ */ ++ applyUpdate(updater: OptimisticUpdate): void; ++ ++ /** ++ * Schedule reverting an optimistic updates on the next `run()`. ++ */ ++ revertUpdate(updater: OptimisticUpdate): void; ++ ++ /** ++ * Schedule a revert of all optimistic updates on the next `run()`. ++ */ ++ revertAll(): void; ++ ++ /** ++ * Schedule applying a payload to the store on the next `run()`. ++ */ ++ commitPayload( ++ operation: OperationDescriptor, ++ payload: RelayResponsePayload, ++ updater?: SelectorStoreUpdater | null, ++ ): void; ++ ++ /** ++ * Schedule an updater to mutate the store on the next `run()` typically to ++ * update client schema fields. ++ */ ++ commitUpdate(updater: StoreUpdater): void; ++ ++ /** ++ * Schedule a publish to the store from the provided source on the next ++ * `run()`. As an example, to update the store with substituted fields that ++ * are missing in the store. ++ */ ++ commitSource(source: RecordSource): void; ++ ++ /** ++ * Execute all queued up operations from the other public methods. ++ */ ++ run(): ReadonlyArray; ++} +\ No newline at end of file +diff --git a/node_modules/@types/relay-runtime/lib/store/RelayRecordSource.d.ts b/node_modules/@types/relay-runtime/lib/store/RelayRecordSource.d.ts +index d0ed98c..bcdfebe 100644 +--- a/node_modules/@types/relay-runtime/lib/store/RelayRecordSource.d.ts ++++ b/node_modules/@types/relay-runtime/lib/store/RelayRecordSource.d.ts +@@ -2,7 +2,7 @@ import { DataID } from "../util/RelayRuntimeTypes"; + import { RecordState } from "./RelayRecordState"; + import { MutableRecordSource, Record, RecordMap } from "./RelayStoreTypes"; + +-export class RelayRecordSource implements MutableRecordSource { ++export default class RelayRecordSource implements MutableRecordSource { + constructor(records?: RecordMap); + + static create(records?: RecordMap): MutableRecordSource; +diff --git a/node_modules/@types/relay-runtime/lib/store/RelayResponseNormalizer.d.ts b/node_modules/@types/relay-runtime/lib/store/RelayResponseNormalizer.d.ts +index 185401e..029d181 100644 +--- a/node_modules/@types/relay-runtime/lib/store/RelayResponseNormalizer.d.ts ++++ b/node_modules/@types/relay-runtime/lib/store/RelayResponseNormalizer.d.ts +@@ -7,6 +7,7 @@ export interface NormalizationOptions { + getDataID: GetDataID; + path?: ReadonlyArray | undefined; + request: RequestDescriptor; ++ treatMissingFieldsAsNull?: boolean; + } + + /** +diff --git a/node_modules/@types/relay-runtime/lib/store/RelayStoreTypes.d.ts b/node_modules/@types/relay-runtime/lib/store/RelayStoreTypes.d.ts +index 442266b..777c7ce 100644 +--- a/node_modules/@types/relay-runtime/lib/store/RelayStoreTypes.d.ts ++++ b/node_modules/@types/relay-runtime/lib/store/RelayStoreTypes.d.ts +@@ -100,7 +100,7 @@ export interface NormalizationSelector { + export interface TypedSnapshot { + readonly data: TData; + readonly isMissingData: boolean; +- readonly seenRecords: RecordMap; ++ readonly seenRecords: Set; + readonly selector: SingularReaderSelector; + } + export type Snapshot = TypedSnapshot; +@@ -208,7 +208,7 @@ export interface MutableRecordSource extends RecordSource { + } + + export interface CheckOptions { +- target: MutableRecordSource; ++ getTargetForActor: () => MutableRecordSource; + handlers: ReadonlyArray; + } + +@@ -230,7 +230,7 @@ export interface Store { + /** + * Get a read-only view of the store's internal RecordSource. + */ +- getSource(): RecordSource; ++ getSource(includeOptimisticSource?: boolean): RecordSource; + + /** + * Determine if the operation can be resolved with data in the store (i.e. no +@@ -243,7 +243,7 @@ export interface Store { + * Optionally takes an owner, corresponding to the operation that + * owns this selector (fragment). + */ +- lookup(selector: SingularReaderSelector): Snapshot; ++ lookup(selector: SingularReaderSelector, includeOptimisticSource?: boolean): Snapshot; + + /** + * Notify subscribers (see `subscribe`) of any data that was published diff --git a/patches/relay-runtime+15.0.0.patch b/patches/relay-runtime+15.0.0.patch new file mode 100644 index 000000000..95bd209c3 --- /dev/null +++ b/patches/relay-runtime+15.0.0.patch @@ -0,0 +1,27 @@ +diff --git a/node_modules/relay-runtime/lib/store/RelayModernStore.js b/node_modules/relay-runtime/lib/store/RelayModernStore.js +index aa56cf0..a40e7a3 100644 +--- a/node_modules/relay-runtime/lib/store/RelayModernStore.js ++++ b/node_modules/relay-runtime/lib/store/RelayModernStore.js +@@ -98,9 +98,9 @@ var RelayModernStore = /*#__PURE__*/function () { + initializeRecordSource(this._recordSource); + } + var _proto = RelayModernStore.prototype; +- _proto.getSource = function getSource() { ++ _proto.getSource = function getSource(includeOptimisticSource = true) { + var _this$_optimisticSour; +- return (_this$_optimisticSour = this._optimisticSource) !== null && _this$_optimisticSour !== void 0 ? _this$_optimisticSour : this._recordSource; ++ return (_this$_optimisticSour = this._optimisticSource) !== null && _this$_optimisticSour !== void 0 && includeOptimisticSource ? _this$_optimisticSour : this._recordSource; + }; + _proto._getMutableRecordSource = function _getMutableRecordSource() { + var _this$_optimisticSour2; +@@ -203,8 +203,8 @@ var RelayModernStore = /*#__PURE__*/function () { + dispose: dispose + }; + }; +- _proto.lookup = function lookup(selector) { +- var source = this.getSource(); ++ _proto.lookup = function lookup(selector, includeOptimisticSource = true) { ++ var source = this.getSource(includeOptimisticSource); + var snapshot = RelayReader.read(source, selector, this._resolverCache); + if (process.env.NODE_ENV !== "production") { + deepFreeze(snapshot); diff --git a/scripts/just.config.ts b/scripts/just.config.ts index 7c23092f4..6253cafc3 100644 --- a/scripts/just.config.ts +++ b/scripts/just.config.ts @@ -20,7 +20,10 @@ export const types = () => { export const build = () => { const baseEsbuildOptions: EsbuildBuildOptions = { - entryPoints: glob.sync(["src/**/*.{ts,tsx}", "!src/**/__tests__/**"]), + entryPoints: glob.sync([ + "src/**/*.{js,jsx,ts,tsx}", + "!src/**/__tests__/**", + ]), outdir: "lib", target: "es6", sourcemap: "external", diff --git a/tsconfig.json b/tsconfig.json index 9608fff6c..1c7e0d6a6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,7 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true, "paths": { + "@apollo/client": ["./node_modules/@apollo/client"], "@graphql-tools/utils": ["./node_modules/@graphql-tools/utils"], "graphql": ["./node_modules/graphql"] } diff --git a/yarn.lock b/yarn.lock index 9a6076e7b..dfed6d2bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,24 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@apollo/client@3.6.9": + version "3.6.9" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.6.9.tgz#ad0ee2e3a3c92dbed4acd6917b6158a492739d94" + integrity sha512-Y1yu8qa2YeaCUBVuw08x8NHenFi0sw2I3KCu7Kw9mDSu86HmmtHJkCAifKVrN2iPgDTW/BbP3EpSV8/EQCcxZA== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + "@apollo/client@>= ^3.3.0 < 3.7.0", "@apollo/client@~3.6.0": version "3.6.10" resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.6.10.tgz#f12d1f0cc4811d6bfe68b3f48a18e08a757ee301" @@ -28,6 +46,25 @@ tslib "^2.3.0" zen-observable-ts "^1.2.5" +"@apollo/client@^3.6.0": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.8.4.tgz#b6d67251422ee8bb05e240ffa65fe8fbd336cd66" + integrity sha512-QFXE4ylSHUa6LgYoOGsPysJCm4YJOOM1NwHyF6msZdZXIerqUVpLvxQOdQEXgS0RWvYiBMC1wGOWKzJKSWBdAg== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/context" "^0.7.3" + "@wry/equality" "^0.5.6" + "@wry/trie" "^0.4.3" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.17.5" + prop-types "^15.7.2" + response-iterator "^0.2.6" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + "@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0": version "3.4.17" resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.4.17.tgz#4972e19a49809e16d17c5adc67f45623a6dac135" @@ -137,6 +174,26 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/generator@7.0.0-beta.38": + version "7.0.0-beta.38" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.38.tgz#6115a66663e3adfd1d6844029ffb2354680182eb" + integrity sha512-aOHQPhsEyaB6p2n+AK981+onHoc+Ork9rcAQVSUJR33wUkGiWRpu6/C685knRyIZVsKeSdG5Q4xMiYeFUhuLzA== + dependencies: + "@babel/types" "7.0.0-beta.38" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/generator@^7.12.13": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/generator@^7.14.0", "@babel/generator@^7.15.4", "@babel/generator@^7.20.2", "@babel/generator@^7.7.2": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" @@ -293,11 +350,21 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-string-parser@^7.21.5": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" @@ -326,6 +393,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@7.12.16": + version "7.12.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" + integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== + "@babel/parser@7.15.5": version "7.15.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.5.tgz#d33a58ca69facc05b26adfe4abebfed56c1c2dac" @@ -336,6 +408,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.5.tgz#821bb520118fd25b982eaf8d37421cf5c64a312b" integrity sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ== +"@babel/parser@^7.12.13": + version "7.22.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" + integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== + "@babel/parser@^7.21.5": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" @@ -652,6 +729,21 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" +"@babel/traverse@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/traverse@7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" @@ -683,7 +775,25 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.15.4", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": +"@babel/types@7.0.0-beta.38": + version "7.0.0-beta.38" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.38.tgz#2ce2443f7dc6ad535a67db4940cbd34e64035a6f" + integrity sha512-SAtyEjmA7KiEoL2eAOAUM6M9arQJGWxJKK0S9x0WyPOosHS420RXoxPhn57u/8orRnK8Kxm0nHQQNTX203cP1Q== + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + +"@babel/types@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.15.4", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.21.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== @@ -692,6 +802,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.3": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" @@ -754,6 +873,11 @@ "@emotion/weak-memoize" "^0.3.1" stylis "4.2.0" +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + "@emotion/hash@^0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" @@ -1820,6 +1944,17 @@ "@n1ru4l/push-pull-async-iterable-iterator" "^3.1.0" meros "^1.1.4" +"@graphitation/apollo-react-relay-duct-tape@^0.7.0": + version "0.7.16" + resolved "https://registry.yarnpkg.com/@graphitation/apollo-react-relay-duct-tape/-/apollo-react-relay-duct-tape-0.7.16.tgz#7f4bcb8b94e4c4b81183f5159431c8a79a94a791" + integrity sha512-08hYb0OjiSPNS/MYLwEq30VI+OOCCv1DVStCmOBwBepaOfiLRgC0ngd98ErxeLs/uLFcSmNU/jpw5OQu37yhYw== + dependencies: + invariant "^2.2.4" + +"@graphitation/graphql-codegen-supermassive-relay-ir-plugin@link:examples/packages/graphql-codegen-supermassive-relay-ir-plugin": + version "0.0.0" + uid "" + "@graphitation/supermassive-ast@*": version "2.0.0" resolved "https://registry.yarnpkg.com/@graphitation/supermassive-ast/-/supermassive-ast-2.0.0.tgz#d49155c6b7213811d99b8609d496d6c460a4d1e2" @@ -1833,6 +1968,14 @@ "@graphql-codegen/plugin-helpers" "^2.1.0" tslib "~2.3.0" +"@graphql-codegen/add@^3.2.1": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-3.2.3.tgz#f1ecee085987e7c21841edc4b1fd48877c663e1a" + integrity sha512-sQOnWpMko4JLeykwyjFTxnhqjd/3NOG2OyMuvK76Wnnwh8DRrNf2VEs2kmSvLl7MndMlOj7Kh5U154dVcvhmKQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.1.1" + tslib "~2.4.0" + "@graphql-codegen/cli@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-2.2.0.tgz#84a909cb46f009cafc59aa719b816494b0ca222b" @@ -1879,6 +2022,51 @@ yaml "^1.10.0" yargs "^17.0.0" +"@graphql-codegen/cli@^1.19.4": + version "1.21.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-1.21.8.tgz#b30190b5e7f851952f04e0e2bdc9ec00349ccac6" + integrity sha512-sxKUIvT2dGerFyvs6SsQpkHDyOnk+MRwqsnmsF22eAWHUbNLd429PKC71E26egXzT2BhHabUIfMV7xk9mkgWNg== + dependencies: + "@graphql-codegen/core" "1.17.10" + "@graphql-codegen/plugin-helpers" "^1.18.8" + "@graphql-tools/apollo-engine-loader" "^6.2.5" + "@graphql-tools/code-file-loader" "^6.3.1" + "@graphql-tools/git-loader" "^6.2.6" + "@graphql-tools/github-loader" "^6.2.5" + "@graphql-tools/graphql-file-loader" "^6.2.7" + "@graphql-tools/json-file-loader" "^6.2.6" + "@graphql-tools/load" "^6.2.8" + "@graphql-tools/prisma-loader" "6.3.0" + "@graphql-tools/url-loader" "^6.10.1" + "@graphql-tools/utils" "^7.9.1" + ansi-escapes "^4.3.1" + chalk "^4.1.0" + change-case-all "1.0.14" + chokidar "^3.5.2" + common-tags "^1.8.0" + cosmiconfig "^7.0.0" + debounce "^1.2.0" + dependency-graph "^0.11.0" + detect-indent "^6.0.0" + glob "^7.1.6" + graphql-config "^3.3.0" + inquirer "^7.3.3" + is-glob "^4.0.1" + json-to-pretty-yaml "^1.2.2" + latest-version "5.1.0" + listr "^0.14.3" + listr-update-renderer "^0.5.0" + log-symbols "^4.0.0" + minimatch "^3.0.4" + mkdirp "^1.0.4" + string-env-interpolation "^1.0.1" + ts-log "^2.2.3" + tslib "~2.3.0" + valid-url "^1.0.9" + wrap-ansi "^7.0.0" + yaml "^1.10.0" + yargs "^17.0.0" + "@graphql-codegen/cli@^2.2.2", "@graphql-codegen/cli@^2.6.2": version "2.6.2" resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-2.6.2.tgz#a9aa4656141ee0998cae8c7ad7d0bf9ca8e0c9ae" @@ -1925,6 +2113,16 @@ yaml "^1.10.0" yargs "^17.0.0" +"@graphql-codegen/core@1.17.10": + version "1.17.10" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-1.17.10.tgz#3b85b5bc2e84fcacbd25fced5af47a4bb2d7a8bd" + integrity sha512-RA3umgVDs/RI/+ztHh+H4GfJxrJUfWJQqoAkMfX4qPTVO5qsy3R4vPudE0oP8w+kFbL8dFsRfAAPUZxI4jV/hQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^1.18.7" + "@graphql-tools/merge" "^6.2.14" + "@graphql-tools/utils" "^7.9.1" + tslib "~2.2.0" + "@graphql-codegen/core@2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-2.1.0.tgz#c0b2d63ad3e77b794b6a84485c4a8ac72c291c6b" @@ -1955,6 +2153,18 @@ "@graphql-codegen/visitor-plugin-common" "2.5.1" tslib "~2.3.0" +"@graphql-codegen/near-operation-file-preset@^2.4.1": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/near-operation-file-preset/-/near-operation-file-preset-2.5.0.tgz#987d9bb8d0101e944b9afc406b77d098a4c1e978" + integrity sha512-S9PNJP5tTkUWBQ6inbviOsTREzsMxYVqJGrtPcIdMWkKLZAAItAfAb60klB1T64vt6Oru+nUf8IYUNrchJ8MYg== + dependencies: + "@graphql-codegen/add" "^3.2.1" + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/visitor-plugin-common" "2.13.1" + "@graphql-tools/utils" "^8.8.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + "@graphql-codegen/plugin-helpers@1.17.7": version "1.17.7" resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-1.17.7.tgz#5903105fda9470aafefe9da29e3a6fb3a52b8376" @@ -1972,7 +2182,7 @@ tslib "~2.0.0" upper-case "2.0.1" -"@graphql-codegen/plugin-helpers@^1.18.2", "@graphql-codegen/plugin-helpers@^1.18.5", "@graphql-codegen/plugin-helpers@^1.18.8": +"@graphql-codegen/plugin-helpers@^1.18.2", "@graphql-codegen/plugin-helpers@^1.18.5", "@graphql-codegen/plugin-helpers@^1.18.7", "@graphql-codegen/plugin-helpers@^1.18.8": version "1.18.8" resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-1.18.8.tgz#39aac745b9e22e28c781cc07cf74836896a3a905" integrity sha512-mb4I9j9lMGqvGggYuZ0CV+Hme08nar68xkpPbAVotg/ZBmlhZIok/HqW2BcMQi7Rj+Il5HQMeQ1wQ1M7sv/TlQ== @@ -1995,6 +2205,30 @@ lodash "~4.17.0" tslib "~2.3.0" +"@graphql-codegen/plugin-helpers@^2.7.2": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz#6544f739d725441c826a8af6a49519f588ff9bed" + integrity sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg== + dependencies: + "@graphql-tools/utils" "^8.8.0" + change-case-all "1.0.14" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.4.0" + +"@graphql-codegen/plugin-helpers@^3.1.1", "@graphql-codegen/plugin-helpers@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz#69a2e91178f478ea6849846ade0a59a844d34389" + integrity sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg== + dependencies: + "@graphql-tools/utils" "^9.0.0" + change-case-all "1.0.15" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.4.0" + "@graphql-codegen/schema-ast@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-2.4.1.tgz#ad742b53e32f7a2fbff8ea8a91ba7e617e6ef236" @@ -2004,6 +2238,15 @@ "@graphql-tools/utils" "^8.1.1" tslib "~2.3.0" +"@graphql-codegen/schema-ast@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-2.6.1.tgz#8ba1b38827c034b51ecd3ce88622c2ae6cd3fe1a" + integrity sha512-5TNW3b1IHJjCh07D2yQNGDQzUpUl2AD+GVe1Dzjqyx/d2Fn0TPMxLsHsKPS4Plg4saO8FK/QO70wLsP7fdbQ1w== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.1.2" + "@graphql-tools/utils" "^9.0.0" + tslib "~2.4.0" + "@graphql-codegen/testing@1.17.7": version "1.17.7" resolved "https://registry.yarnpkg.com/@graphql-codegen/testing/-/testing-1.17.7.tgz#fc7bbaaee3af91fbe554ec547ec3f9ca40076c25" @@ -2015,6 +2258,39 @@ open "7.1.0" tslib "~2.0.0" +"@graphql-codegen/typed-document-node@^2.3.3": + version "2.3.13" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-2.3.13.tgz#bbfb8e376d6680e05509b5d13089add74b6ff3fd" + integrity sha512-vt1hvBAbYTYUCXblks9KYwR5Ho16hWQljid5xgx77jeVufj5PjnWrOjJfEFKFx17VOM4CKHP8ryoeT4NyjYNWw== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.1.2" + "@graphql-codegen/visitor-plugin-common" "2.13.8" + auto-bind "~4.0.0" + change-case-all "1.0.15" + tslib "~2.4.0" + +"@graphql-codegen/typescript-operations@^2.2.4": + version "2.5.13" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-2.5.13.tgz#f286c37f9c023356aacaa983ebd32e9e021a05ca" + integrity sha512-3vfR6Rx6iZU0JRt29GBkFlrSNTM6t+MSLF86ChvL4d/Jfo/JYAGuB3zNzPhirHYzJPCvLOAx2gy9ID1ltrpYiw== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.1.2" + "@graphql-codegen/typescript" "^2.8.8" + "@graphql-codegen/visitor-plugin-common" "2.13.8" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/typescript-react-apollo@^3.3.3": + version "3.3.7" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-react-apollo/-/typescript-react-apollo-3.3.7.tgz#e856caa22c5f7bc9a546c44f54e5f3bd5801ab67" + integrity sha512-9DUiGE8rcwwEkf/S1kpBT/Py/UUs9Qak14bOnTT1JHWs1MWhiDA7vml+A8opU7YFI1EVbSSaE5jjRv11WHoikQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/visitor-plugin-common" "2.13.1" + auto-bind "~4.0.0" + change-case-all "1.0.14" + tslib "~2.4.0" + "@graphql-codegen/typescript-resolvers@1.19.1": version "1.19.1" resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-1.19.1.tgz#56677ec56c1ca7174d22a2f236e3fb7f6503e708" @@ -2059,6 +2335,17 @@ auto-bind "~4.0.0" tslib "~2.3.0" +"@graphql-codegen/typescript@^2.2.0", "@graphql-codegen/typescript@^2.8.8": + version "2.8.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-2.8.8.tgz#8c3b9153e334db43c65f8f31ced69b4c60d14861" + integrity sha512-A0oUi3Oy6+DormOlrTC4orxT9OBZkIglhbJBcDmk34jAKKUgesukXRd4yOhmTrnbchpXz2T8IAOFB3FWIaK4Rw== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.1.2" + "@graphql-codegen/schema-ast" "^2.6.1" + "@graphql-codegen/visitor-plugin-common" "2.13.8" + auto-bind "~4.0.0" + tslib "~2.4.0" + "@graphql-codegen/typescript@^2.2.2", "@graphql-codegen/typescript@^2.3.0", "@graphql-codegen/typescript@^2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-2.5.1.tgz#5131485ff3ac83d5bc0aae11a2af0c9bdc08854c" @@ -2086,6 +2373,38 @@ parse-filepath "^1.0.2" tslib "~2.3.0" +"@graphql-codegen/visitor-plugin-common@2.13.1": + version "2.13.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.1.tgz#2228660f6692bcdb96b1f6d91a0661624266b76b" + integrity sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^8.8.0" + auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + +"@graphql-codegen/visitor-plugin-common@2.13.8": + version "2.13.8" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.8.tgz#09bc6317b227e5a278f394f4cef0d6c2d1910597" + integrity sha512-IQWu99YV4wt8hGxIbBQPtqRuaWZhkQRG2IZKbMoSvh0vGeWb3dB0n0hSgKaOOxDY+tljtOf9MTcUYvJslQucMQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^3.1.2" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^9.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + "@graphql-codegen/visitor-plugin-common@2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.2.1.tgz#721b646d3d19ec0fcf9509f516e788b7151be003" @@ -2148,6 +2467,15 @@ graphql-depth-limit "1.1.0" lodash.lowercase "4.3.0" +"@graphql-tools/apollo-engine-loader@^6.2.5": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-6.2.5.tgz#b9e65744f522bb9f6ca50651e5622820c4f059a8" + integrity sha512-CE4uef6PyxtSG+7OnLklIr2BZZDgjO89ZXK47EKdY7jQy/BQD/9o+8SxPsgiBc+2NsDJH2I6P/nqoaJMOEat6g== + dependencies: + "@graphql-tools/utils" "^7.0.0" + cross-fetch "3.0.6" + tslib "~2.0.1" + "@graphql-tools/apollo-engine-loader@^7.0.5": version "7.1.0" resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.1.0.tgz#12d58a459da976b496c7632bd41b76f3aceed48e" @@ -2158,6 +2486,16 @@ sync-fetch "0.3.0" tslib "~2.3.0" +"@graphql-tools/batch-execute@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-7.1.2.tgz#35ba09a1e0f80f34f1ce111d23c40f039d4403a0" + integrity sha512-IuR2SB2MnC2ztA/XeTMTfWcA0Wy7ZH5u+nDkDNLAdX+AaSyDnsQS35sCmHqG0VOGTl7rzoyBWLCKGwSJplgtwg== + dependencies: + "@graphql-tools/utils" "^7.7.0" + dataloader "2.0.0" + tslib "~2.2.0" + value-or-promise "1.0.6" + "@graphql-tools/batch-execute@^8.3.1": version "8.3.1" resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.3.1.tgz#0b74c54db5ac1c5b9a273baefc034c2343ebbb74" @@ -2179,6 +2517,28 @@ tslib "~2.3.0" unixify "^1.0.0" +"@graphql-tools/code-file-loader@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-6.3.1.tgz#42dfd4db5b968acdb453382f172ec684fa0c34ed" + integrity sha512-ZJimcm2ig+avgsEOWWVvAaxZrXXhiiSZyYYOJi0hk9wh5BxZcLUNKkTp6EFnZE/jmGUwuos3pIjUD3Hwi3Bwhg== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.5.1" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + +"@graphql-tools/delegate@^7.0.1", "@graphql-tools/delegate@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-7.1.5.tgz#0b027819b7047eff29bacbd5032e34a3d64bd093" + integrity sha512-bQu+hDd37e+FZ0CQGEEczmRSfQRnnXeUxI/0miDV+NV/zCbEdIJj5tYFNrKT03W6wgdqx8U06d8L23LxvGri/g== + dependencies: + "@ardatan/aggregate-error" "0.0.6" + "@graphql-tools/batch-execute" "^7.1.2" + "@graphql-tools/schema" "^7.1.5" + "@graphql-tools/utils" "^7.7.1" + dataloader "2.0.0" + tslib "~2.2.0" + value-or-promise "1.0.6" + "@graphql-tools/delegate@^8.4.1", "@graphql-tools/delegate@^8.4.2": version "8.4.2" resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-8.4.2.tgz#a61d45719855720304e3656800342cfa17d82558" @@ -2191,6 +2551,15 @@ tslib "~2.3.0" value-or-promise "1.0.11" +"@graphql-tools/git-loader@^6.2.6": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-6.2.6.tgz#c2226f4b8f51f1c05c9ab2649ba32d49c68cd077" + integrity sha512-ooQTt2CaG47vEYPP3CPD+nbA0F+FYQXfzrB1Y1ABN9K3d3O2RK3g8qwslzZaI8VJQthvKwt0A95ZeE4XxteYfw== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + "@graphql-tools/git-loader@^7.0.5": version "7.1.0" resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-7.1.0.tgz#6d4978752e058b69047bccca1d11c50b1e29b401" @@ -2203,6 +2572,16 @@ tslib "~2.3.0" unixify "^1.0.0" +"@graphql-tools/github-loader@^6.2.5": + version "6.2.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-6.2.5.tgz#460dff6f5bbaa26957a5ea3be4f452b89cc6a44b" + integrity sha512-DLuQmYeNNdPo8oWus8EePxWCfCAyUXPZ/p1PWqjrX/NGPyH2ZObdqtDAfRHztljt0F/qkBHbGHCEk2TKbRZTRw== + dependencies: + "@graphql-tools/graphql-tag-pluck" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + cross-fetch "3.0.6" + tslib "~2.0.1" + "@graphql-tools/github-loader@^7.0.5": version "7.1.0" resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-7.1.0.tgz#2309460f3b5c931b406ffc2506f3d7504b6c6c8c" @@ -2213,6 +2592,15 @@ cross-fetch "3.1.4" tslib "~2.3.0" +"@graphql-tools/graphql-file-loader@^6.0.0", "@graphql-tools/graphql-file-loader@^6.2.7": + version "6.2.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.2.7.tgz#d3720f2c4f4bb90eb2a03a7869a780c61945e143" + integrity sha512-5k2SNz0W87tDcymhEMZMkd6/vs6QawDyjQXWtqkuLTBF3vxjxPD1I4dwHoxgWPIjjANhXybvulD7E+St/7s9TQ== + dependencies: + "@graphql-tools/import" "^6.2.6" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + "@graphql-tools/graphql-file-loader@^7.0.5", "@graphql-tools/graphql-file-loader@^7.3.2": version "7.3.3" resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.3.3.tgz#7cee2f84f08dc13fa756820b510248b857583d36" @@ -2235,6 +2623,17 @@ "@graphql-tools/utils" "^8.5.1" tslib "~2.3.0" +"@graphql-tools/graphql-tag-pluck@^6.2.6", "@graphql-tools/graphql-tag-pluck@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.5.1.tgz#5fb227dbb1e19f4b037792b50f646f16a2d4c686" + integrity sha512-7qkm82iFmcpb8M6/yRgzjShtW6Qu2OlCSZp8uatA3J0eMl87TxyJoUmL3M3UMMOSundAK8GmoyNVFUrueueV5Q== + dependencies: + "@babel/parser" "7.12.16" + "@babel/traverse" "7.12.13" + "@babel/types" "7.12.13" + "@graphql-tools/utils" "^7.0.0" + tslib "~2.1.0" + "@graphql-tools/import@6.4.0": version "6.4.0" resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.4.0.tgz#eb2178d6df8d964e7b9d6b1ed75f80d12f9060a7" @@ -2243,6 +2642,15 @@ resolve-from "5.0.0" tslib "~2.3.0" +"@graphql-tools/import@^6.2.6": + version "6.7.15" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.7.15.tgz#7553e48140797255588b26d423a89aa042196928" + integrity sha512-WNhvauAt2I2iUg+JdQK5oQebKLXqUZWe8naP13K1jOkbTQT7hK3P/4I9AaVmzt0KXRJW5Uow3RgdHZ7eUBKVsA== + dependencies: + "@graphql-tools/utils" "9.1.4" + resolve-from "5.0.0" + tslib "^2.4.0" + "@graphql-tools/import@^6.5.7": version "6.6.1" resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.6.1.tgz#2a7e1ceda10103ffeb8652a48ddc47150b035485" @@ -2252,6 +2660,14 @@ resolve-from "5.0.0" tslib "~2.3.0" +"@graphql-tools/json-file-loader@^6.0.0", "@graphql-tools/json-file-loader@^6.2.6": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-6.2.6.tgz#830482cfd3721a0799cbf2fe5b09959d9332739a" + integrity sha512-CnfwBSY5926zyb6fkDBHnlTblHnHI4hoBALFYXnrg0Ev4yWU8B04DZl/pBRUc459VNgO2x8/mxGIZj2hPJG1EA== + dependencies: + "@graphql-tools/utils" "^7.0.0" + tslib "~2.0.1" + "@graphql-tools/json-file-loader@^7.1.2", "@graphql-tools/json-file-loader@^7.3.2": version "7.3.3" resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-7.3.3.tgz#45cfde77b9dc4ab6c21575305ae537d2814d237f" @@ -2262,6 +2678,21 @@ tslib "~2.3.0" unixify "^1.0.0" +"@graphql-tools/load@^6.0.0", "@graphql-tools/load@^6.2.8": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-6.2.8.tgz#16900fb6e75e1d075cad8f7ea439b334feb0b96a" + integrity sha512-JpbyXOXd8fJXdBh2ta0Q4w8ia6uK5FHzrTNmcvYBvflFuWly2LDTk2abbSl81zKkzswQMEd2UIYghXELRg8eTA== + dependencies: + "@graphql-tools/merge" "^6.2.12" + "@graphql-tools/utils" "^7.5.0" + globby "11.0.3" + import-from "3.0.0" + is-glob "4.0.1" + p-limit "3.1.0" + tslib "~2.2.0" + unixify "1.0.0" + valid-url "1.0.9" + "@graphql-tools/load@^7.3.0", "@graphql-tools/load@^7.4.1": version "7.4.1" resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.4.1.tgz#aa572fcef11d6028097b6ef39c13fa9d62e5a441" @@ -2272,6 +2703,32 @@ p-limit "3.1.0" tslib "~2.3.0" +"@graphql-tools/merge@6.0.0 - 6.2.14": + version "6.2.14" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.14.tgz#694e2a2785ba47558e5665687feddd2935e9d94e" + integrity sha512-RWT4Td0ROJai2eR66NHejgf8UwnXJqZxXgDWDI+7hua5vNA2OW8Mf9K1Wav1ZkjWnuRp4ztNtkZGie5ISw55ow== + dependencies: + "@graphql-tools/schema" "^7.0.0" + "@graphql-tools/utils" "^7.7.0" + tslib "~2.2.0" + +"@graphql-tools/merge@8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" + integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== + dependencies: + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + +"@graphql-tools/merge@^6.2.12", "@graphql-tools/merge@^6.2.14": + version "6.2.17" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.2.17.tgz#4dedf87d8435a5e1091d7cc8d4f371ed1e029f1f" + integrity sha512-G5YrOew39fZf16VIrc49q3c8dBqQDD0ax5LYPiNja00xsXDi0T9zsEWVt06ApjtSdSF6HDddlu5S12QjeN8Tow== + dependencies: + "@graphql-tools/schema" "^8.0.2" + "@graphql-tools/utils" "8.0.2" + tslib "~2.3.0" + "@graphql-tools/merge@^8.2.1", "@graphql-tools/merge@^8.4.1": version "8.4.1" resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.4.1.tgz#52879e5f73565f504ceea04fcd9ef90a6e733c62" @@ -2294,6 +2751,40 @@ dependencies: tslib "~2.3.0" +"@graphql-tools/optimize@^1.3.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.4.0.tgz#20d6a9efa185ef8fc4af4fd409963e0907c6e112" + integrity sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/prisma-loader@6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-6.3.0.tgz#c907e17751ff2b26e7c2bc75d0913ebf03f970da" + integrity sha512-9V3W/kzsFBmUQqOsd96V4a4k7Didz66yh/IK89B1/rrvy9rYj+ULjEqR73x9BYZ+ww9FV8yP8LasWAJwWaqqJQ== + dependencies: + "@graphql-tools/url-loader" "^6.8.2" + "@graphql-tools/utils" "^7.0.0" + "@types/http-proxy-agent" "^2.0.2" + "@types/js-yaml" "^4.0.0" + "@types/json-stable-stringify" "^1.0.32" + "@types/jsonwebtoken" "^8.5.0" + chalk "^4.1.0" + debug "^4.3.1" + dotenv "^8.2.0" + graphql-request "^3.3.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + isomorphic-fetch "^3.0.0" + js-yaml "^4.0.0" + json-stable-stringify "^1.0.1" + jsonwebtoken "^8.5.1" + lodash "^4.17.20" + replaceall "^0.1.6" + scuid "^1.1.0" + tslib "~2.1.0" + yaml-ast-parser "^0.0.43" + "@graphql-tools/prisma-loader@^7.0.6": version "7.1.0" resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-7.1.0.tgz#790dd29ad682f6c1fc7ceb3cf48b04cb1064b7f4" @@ -2329,6 +2820,15 @@ "@graphql-tools/utils" "8.6.13" tslib "^2.4.0" +"@graphql-tools/relay-operation-optimizer@^6.5.0": + version "6.5.18" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz#a1b74a8e0a5d0c795b8a4d19629b654cf66aa5ab" + integrity sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg== + dependencies: + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "^9.2.1" + tslib "^2.4.0" + "@graphql-tools/schema@8.3.1", "@graphql-tools/schema@^8.1.2", "@graphql-tools/schema@^8.2.0", "@graphql-tools/schema@^8.3.1": version "8.3.1" resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.3.1.tgz#1ee9da494d2da457643b3c93502b94c3c4b68c74" @@ -2339,7 +2839,7 @@ tslib "~2.3.0" value-or-promise "1.0.11" -"@graphql-tools/schema@^7.1.5": +"@graphql-tools/schema@^7.0.0", "@graphql-tools/schema@^7.1.5": version "7.1.5" resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-7.1.5.tgz#07b24e52b182e736a6b77c829fc48b84d89aa711" integrity sha512-uyn3HSNSckf4mvQSq0Q07CPaVZMNFCYEVxroApOaw802m9DcZPgf9XVPy/gda5GWj9AhbijfRYVTZQgHnJ4CXA== @@ -2348,6 +2848,16 @@ tslib "~2.2.0" value-or-promise "1.0.6" +"@graphql-tools/schema@^8.0.2": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" + integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== + dependencies: + "@graphql-tools/merge" "8.3.1" + "@graphql-tools/utils" "8.9.0" + tslib "^2.4.0" + value-or-promise "1.0.11" + "@graphql-tools/schema@^9.0.19": version "9.0.19" resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.19.tgz#c4ad373b5e1b8a0cf365163435b7d236ebdd06e7" @@ -2358,6 +2868,31 @@ tslib "^2.4.0" value-or-promise "^1.0.12" +"@graphql-tools/url-loader@^6.0.0", "@graphql-tools/url-loader@^6.10.1", "@graphql-tools/url-loader@^6.8.2": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.10.1.tgz#dc741e4299e0e7ddf435eba50a1f713b3e763b33" + integrity sha512-DSDrbhQIv7fheQ60pfDpGD256ixUQIR6Hhf9Z5bRjVkXOCvO5XrkwoWLiU7iHL81GB1r0Ba31bf+sl+D4nyyfw== + dependencies: + "@graphql-tools/delegate" "^7.0.1" + "@graphql-tools/utils" "^7.9.0" + "@graphql-tools/wrap" "^7.0.4" + "@microsoft/fetch-event-source" "2.0.1" + "@types/websocket" "1.0.2" + abort-controller "3.0.0" + cross-fetch "3.1.4" + extract-files "9.0.0" + form-data "4.0.0" + graphql-ws "^4.4.1" + is-promise "4.0.0" + isomorphic-ws "4.0.1" + lodash "4.17.21" + meros "1.1.4" + subscriptions-transport-ws "^0.9.18" + sync-fetch "0.3.0" + tslib "~2.2.0" + valid-url "1.0.9" + ws "7.4.5" + "@graphql-tools/url-loader@^7.0.11", "@graphql-tools/url-loader@^7.1.0", "@graphql-tools/url-loader@^7.4.2": version "7.5.2" resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.5.2.tgz#fb3737fd1269ab61b195b63052179b6049d90ce1" @@ -2383,6 +2918,13 @@ value-or-promise "1.0.11" ws "8.2.3" +"@graphql-tools/utils@8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.0.2.tgz#795a8383cdfdc89855707d62491c576f439f3c51" + integrity sha512-gzkavMOgbhnwkHJYg32Adv6f+LxjbQmmbdD5Hty0+CWxvaiuJq+nU6tzb/7VSU4cwhbNLx/lGu2jbCPEW1McZQ== + dependencies: + tslib "~2.3.0" + "@graphql-tools/utils@8.2.2": version "8.2.2" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.2.2.tgz#d29420bf1003d2876cb30f373145be432c7f7c4b" @@ -2411,6 +2953,20 @@ dependencies: tslib "^2.4.0" +"@graphql-tools/utils@8.9.0": + version "8.9.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" + integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/utils@9.1.4": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.1.4.tgz#2c9e0aefc9655dd73247667befe3c850ec014f3f" + integrity sha512-hgIeLt95h9nQgQuzbbdhuZmh+8WV7RZ/6GbTj6t3IU4Zd2zs9yYJ2jgW/krO587GMOY8zCwrjNOMzD40u3l7Vg== + dependencies: + tslib "^2.4.0" + "@graphql-tools/utils@^6.0.0": version "6.2.4" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-6.2.4.tgz#38a2314d2e5e229ad4f78cca44e1199e18d55856" @@ -2420,7 +2976,7 @@ camel-case "4.1.1" tslib "~2.0.1" -"@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.1.2", "@graphql-tools/utils@^7.9.1": +"@graphql-tools/utils@^7.0.0", "@graphql-tools/utils@^7.1.2", "@graphql-tools/utils@^7.5.0", "@graphql-tools/utils@^7.7.0", "@graphql-tools/utils@^7.7.1", "@graphql-tools/utils@^7.8.1", "@graphql-tools/utils@^7.9.0", "@graphql-tools/utils@^7.9.1": version "7.10.0" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-7.10.0.tgz#07a4cb5d1bec1ff1dc1d47a935919ee6abd38699" integrity sha512-d334r6bo9mxdSqZW6zWboEnnOOFRrAPVQJ7LkU8/6grglrbcu6WhwCLzHb90E94JI3TD3ricC3YGbUqIi9Xg0w== @@ -2429,14 +2985,14 @@ camel-case "4.1.2" tslib "~2.2.0" -"@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.2.0", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.5.1", "@graphql-tools/utils@^8.5.2", "@graphql-tools/utils@^8.5.3": +"@graphql-tools/utils@^8.1.1", "@graphql-tools/utils@^8.2.0", "@graphql-tools/utils@^8.3.0", "@graphql-tools/utils@^8.5.1", "@graphql-tools/utils@^8.5.2", "@graphql-tools/utils@^8.5.3", "@graphql-tools/utils@^8.8.0": version "8.13.1" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.13.1.tgz#b247607e400365c2cd87ff54654d4ad25a7ac491" integrity sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw== dependencies: tslib "^2.4.0" -"@graphql-tools/utils@^9.2.1": +"@graphql-tools/utils@^9.0.0", "@graphql-tools/utils@^9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" integrity sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A== @@ -2458,6 +3014,17 @@ "@graphql-tools/webpack-loader-runtime" "7.0.0" tslib "^2.4.0" +"@graphql-tools/wrap@^7.0.4": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-7.0.8.tgz#ad41e487135ca3ea1ae0ea04bb3f596177fb4f50" + integrity sha512-1NDUymworsOlb53Qfh7fonDi2STvqCtbeE68ntKY9K/Ju/be2ZNxrFSbrBHwnxWcN9PjISNnLcAyJ1L5tCUyhg== + dependencies: + "@graphql-tools/delegate" "^7.1.5" + "@graphql-tools/schema" "^7.1.5" + "@graphql-tools/utils" "^7.8.1" + tslib "~2.2.0" + value-or-promise "1.0.6" + "@graphql-tools/wrap@^8.3.1": version "8.3.2" resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-8.3.2.tgz#d3bcecb7529d071e4ecc4dfc75b9566e3da79d4f" @@ -2476,7 +3043,7 @@ "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" - resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== "@griffel/core@^1.10.0": @@ -2866,6 +3433,11 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@microsoft/fetch-event-source@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d" + integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA== + "@n1ru4l/graphql-live-query@0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@n1ru4l/graphql-live-query/-/graphql-live-query-0.9.0.tgz#defaebdd31f625bee49e6745934f36312532b2bc" @@ -3368,6 +3940,13 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== +"@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" + integrity sha512-2S6IuBRhqUnH1/AUx9k8KWtY3Esg4eqri946MnxTG5HwehF1S5mqLln8fcyMiuQkY72p2gH3W+rIPqp5li0LyQ== + dependencies: + "@types/node" "*" + "@types/http-proxy@^1.17.8": version "1.17.11" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" @@ -3543,6 +4122,14 @@ dependencies: "@types/react" "^17" +"@types/react-relay@14.1.1", "@types/react-relay@^14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@types/react-relay/-/react-relay-14.1.1.tgz#78f50309a19cf92bfaece563cc3a6ba43fcb5e23" + integrity sha512-uUXlJOjWmLF1awJGTSuolsCU3d9Qf7+YChBo/UvlX/neLaMYuAjHvzqB8EkafIOJtLi0AaKKvDL047rnoino2A== + dependencies: + "@types/react" "*" + "@types/relay-runtime" "*" + "@types/react-router-dom@^5.3.3": version "5.3.3" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" @@ -3585,10 +4172,10 @@ graphql "^14.5.3" typescript "^3.0.0" -"@types/relay-runtime@*": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-11.0.0.tgz#7ddbe41152d46b614d1f3f7f0672cfb721eb93f1" - integrity sha512-D5JNxDhkcPSIMZc2j3N/fh61399O309ph9RVmzbF+Fsyvepsqy7FirFKcJ2CMfYxE/kb8ZD/Xdzs3CYZEiQc4w== +"@types/relay-runtime@*", "@types/relay-runtime@^14.1.2": + version "14.1.14" + resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-14.1.14.tgz#72e8cf07d67eb2dace2dd84bd392ff43a1aee5ba" + integrity sha512-uG5GJhlyhqBp4j5b4xeH9LFMAr+xAFbWf1Q4ZLa0aLFJJNbjDVmHbzqzuXb+WqNpM3V7LaKwPB1m7w3NYSlCMg== "@types/retry@^0.12.0": version "0.12.1" @@ -3661,6 +4248,13 @@ tapable "^2.2.0" webpack "^5" +"@types/websocket@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.2.tgz#d2855c6a312b7da73ed16ba6781815bf30c6187a" + integrity sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ== + dependencies: + "@types/node" "*" + "@types/websocket@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8" @@ -4010,6 +4604,13 @@ dependencies: tslib "^2.3.0" +"@wry/context@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.3.tgz#240f6dfd4db5ef54f81f6597f6714e58d4f476a1" + integrity sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA== + dependencies: + tslib "^2.3.0" + "@wry/equality@^0.5.0": version "0.5.2" resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.2.tgz#72c8a7a7d884dff30b612f4f8464eba26c080e73" @@ -4017,6 +4618,13 @@ dependencies: tslib "^2.3.0" +"@wry/equality@^0.5.6": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.6.tgz#cd4a533c72c3752993ab8cbf682d3d20e3cb601e" + integrity sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA== + dependencies: + tslib "^2.3.0" + "@wry/trie@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.0.tgz#3245e74988c4e3033299e479a1bf004430752463" @@ -4024,6 +4632,13 @@ dependencies: tslib "^2.1.0" +"@wry/trie@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" + integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== + dependencies: + tslib "^2.3.0" + "@xstate/fsm@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@xstate/fsm/-/fsm-1.4.0.tgz#6fd082336fde4d026e9e448576189ee5265fa51a" @@ -4044,7 +4659,7 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -abort-controller@^3.0.0: +abort-controller@3.0.0, abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== @@ -4079,6 +4694,11 @@ acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +add@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" + integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q== + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -4227,6 +4847,25 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +apollo-codegen@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/apollo-codegen/-/apollo-codegen-0.19.1.tgz#30444de019f453c0d6ec167072b8e11b52d7f92e" + integrity sha512-jlxz/b5iinRWfh48hXdmMtrjTPn/rDok0Z3b7icvkiaD6I30w4sq9B+JDkFbLnkldzsFLV2BZtBDa/dkZhx8Ng== + dependencies: + "@babel/generator" "7.0.0-beta.38" + "@babel/types" "7.0.0-beta.38" + change-case "^3.0.1" + common-tags "^1.5.1" + core-js "^2.5.3" + glob "^7.1.2" + graphql "^0.13.1" + graphql-config "^1.1.1" + inflected "^2.0.3" + node-fetch "^1.7.3" + rimraf "^2.6.2" + source-map-support "^0.5.0" + yargs "^10.0.3" + apollo-inspector-ui@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/apollo-inspector-ui/-/apollo-inspector-ui-0.0.8.tgz#50164c22de15861538bb831fa85684223da5140c" @@ -4934,6 +5573,19 @@ camel-case@4.1.2, camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -4994,10 +5646,26 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -change-case-all@1.0.14: - version "1.0.14" - resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" - integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== +change-case-all@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" + integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case-all@1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.15.tgz#de29393167fc101d646cd76b0ef23e27d09756ad" + integrity sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ== dependencies: change-case "^4.1.2" is-lower-case "^2.0.2" @@ -5010,6 +5678,30 @@ change-case-all@1.0.14: upper-case "^2.0.2" upper-case-first "^2.0.2" +change-case@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" + integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== + dependencies: + camel-case "^3.0.0" + constant-case "^2.0.0" + dot-case "^2.1.0" + header-case "^1.0.0" + is-lower-case "^1.1.0" + is-upper-case "^1.1.0" + lower-case "^1.1.1" + lower-case-first "^1.0.0" + no-case "^2.3.2" + param-case "^2.1.0" + pascal-case "^2.0.0" + path-case "^2.1.0" + sentence-case "^2.1.0" + snake-case "^2.1.0" + swap-case "^1.1.0" + title-case "^2.1.0" + upper-case "^1.1.1" + upper-case-first "^1.1.0" + change-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" @@ -5153,6 +5845,15 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -5325,7 +6026,7 @@ common-tags@1.8.0: resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== -common-tags@1.8.2, common-tags@^1.8.0: +common-tags@1.8.2, common-tags@^1.5.1, common-tags@^1.8.0: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== @@ -5403,6 +6104,14 @@ constant-case@3.0.3: tslib "^1.10.0" upper-case "^2.0.1" +constant-case@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== + dependencies: + snake-case "^2.1.0" + upper-case "^1.1.1" + constant-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" @@ -5463,10 +6172,15 @@ copy-to-clipboard@^3.2.0: dependencies: toggle-selection "^1.0.6" +core-js@^2.5.3: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== cosmiconfig-toml-loader@1.0.0: version "1.0.0" @@ -5475,6 +6189,17 @@ cosmiconfig-toml-loader@1.0.0: dependencies: "@iarna/toml" "^2.2.5" +cosmiconfig@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cosmiconfig@7.0.1, cosmiconfig@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" @@ -5502,13 +6227,22 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-fetch@3.1.4, cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.4, cross-fetch@^3.1.5: +cross-fetch@2.2.2, cross-fetch@3.0.6, cross-fetch@3.1.4, cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.4, cross-fetch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5621,7 +6355,7 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -5906,6 +6640,13 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +dot-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== + dependencies: + no-case "^2.2.0" + dot-case@^3.0.3, dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -5919,6 +6660,11 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + dset@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" @@ -6346,6 +7092,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-iterator@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/event-iterator/-/event-iterator-2.0.0.tgz#10f06740cc1e9fd6bc575f334c2bc1ae9d2dbf62" + integrity sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ== + event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" @@ -6378,6 +7129,19 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -6537,7 +7301,7 @@ extract-files@11.0.0: resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== -extract-files@^9.0.0: +extract-files@9.0.0, extract-files@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== @@ -6650,6 +7414,19 @@ fbjs@^3.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fbjs@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -6724,6 +7501,13 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -6799,19 +7583,19 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== +form-data@4.0.0, form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -6933,6 +7717,11 @@ gensync@1.0.0-beta.2, gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -6957,6 +7746,11 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -7077,6 +7871,18 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -7089,6 +7895,18 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globby@11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@11.0.4, globby@^11.0.0, globby@^11.0.3, globby@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" @@ -7184,6 +8002,35 @@ graphql-config@4.1.0, graphql-config@^4.0.1, graphql-config@^4.1.0: minimatch "3.0.4" string-env-interpolation "1.0.1" +graphql-config@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-1.2.1.tgz#97b4403707db408feb335fbc159651f2a36cb558" + integrity sha512-BOtbEOn/fD13jT0peCy3Fzp1DSTsA/1AcZp266AQ5Sk3wFndKCEa/H7donbu5UriOw1V/N1WDirYPnr7rd8E7Q== + dependencies: + graphql "^0.12.3" + graphql-import "^0.4.0" + graphql-request "^1.4.0" + js-yaml "^3.10.0" + lodash "^4.17.4" + minimatch "^3.0.4" + +graphql-config@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-3.4.1.tgz#59f937a1b4d3a3c2dcdb27ddf5b4d4d4b2c6e9e1" + integrity sha512-g9WyK4JZl1Ko++FSyE5Ir2g66njfxGzrDDhBOwnkoWf/t3TnnZG6BBkWP+pkqVJ5pqMJGPKHNrbew8jRxStjhw== + dependencies: + "@endemolshinegroup/cosmiconfig-typescript-loader" "3.0.2" + "@graphql-tools/graphql-file-loader" "^6.0.0" + "@graphql-tools/json-file-loader" "^6.0.0" + "@graphql-tools/load" "^6.0.0" + "@graphql-tools/merge" "6.0.0 - 6.2.14" + "@graphql-tools/url-loader" "^6.0.0" + "@graphql-tools/utils" "^7.0.0" + cosmiconfig "7.0.0" + cosmiconfig-toml-loader "1.0.0" + minimatch "3.0.4" + string-env-interpolation "1.0.1" + graphql-depth-limit@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/graphql-depth-limit/-/graphql-depth-limit-1.1.0.tgz#59fe6b2acea0ab30ee7344f4c75df39cc18244e8" @@ -7191,6 +8038,13 @@ graphql-depth-limit@1.1.0: dependencies: arrify "^1.0.1" +graphql-import@^0.4.0: + version "0.4.5" + resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.4.5.tgz#e2f18c28d335733f46df8e0733d8deb1c6e2a645" + integrity sha512-G/+I08Qp6/QGTb9qapknCm3yPHV0ZL7wbaalWFpxsfR8ZhZoTBe//LsbsCKlbALQpcMegchpJhpTSKiJjhaVqQ== + dependencies: + lodash "^4.17.4" + graphql-jit@^0.8.4: version "0.8.4" resolved "https://registry.npmjs.org/graphql-jit/-/graphql-jit-0.8.4.tgz#53c2e43b90ec98ea0942f4062516de910fbff709" @@ -7241,6 +8095,13 @@ graphql-relay@^0.10.0: resolved "https://registry.yarnpkg.com/graphql-relay/-/graphql-relay-0.10.0.tgz#3b661432edf1cb414cd4a132cf595350e524db2b" integrity sha512-44yBuw2/DLNEiMypbNZBt1yMDbBmyVPVesPywnteGGALiBmdyy1JP8jSg8ClLePg8ZZxk0O4BLhd1a6U/1jDOQ== +graphql-request@^1.4.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.8.2.tgz#398d10ae15c585676741bde3fc01d5ca948f8fbe" + integrity sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg== + dependencies: + cross-fetch "2.2.2" + graphql-request@^3.3.0: version "3.5.0" resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-3.5.0.tgz#7e69574e15875fb3f660a4b4be3996ecd0bbc8b7" @@ -7272,28 +8133,21 @@ graphql-tools@^8.2.0: optionalDependencies: "@apollo/client" "~3.2.5 || ~3.3.0 || ~3.4.0" +graphql-ws@^4.4.1: + version "4.9.0" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-4.9.0.tgz#5cfd8bb490b35e86583d8322f5d5d099c26e365c" + integrity sha512-sHkK9+lUm20/BGawNEWNtVAeJzhZeBg21VmvmLoT5NdGVeZWv5PdIhkcayQIAgjSyyQ17WMKmbDijIPG2On+Ag== + graphql-ws@^5.4.1: version "5.5.0" resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.5.0.tgz#79f10248d23d104369eaef93acb9f887276a2c42" integrity sha512-WQepPMGQQoqS2VsrI2I3RMLCVz3CW4/6ZqGV6ABDOwH4R62DzjxwMlwZbj6vhSI/7IM3/C911yITwgs77iO/hw== -graphql@*, graphql@^15.0.0, graphql@^15.6.0, graphql@^15.6.1: +graphql@*, graphql@16.8.1, graphql@^0.12.3, graphql@^0.13.1, graphql@^14.5.3, graphql@^15.0.0, graphql@^15.5.0, graphql@^15.6.0, graphql@^15.6.1: version "15.8.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== -graphql@16.8.1: - version "16.8.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" - integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== - -graphql@^14.5.3: - version "14.7.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72" - integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA== - dependencies: - iterall "^1.2.2" - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -7407,6 +8261,14 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.3" + header-case@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" @@ -7679,6 +8541,11 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +inflected@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.1.0.tgz#2816ac17a570bbbc8303ca05bca8bf9b3f959687" + integrity sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -7776,6 +8643,11 @@ invariant@^2.0.0, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -7991,6 +8863,13 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-lower-case@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== + dependencies: + lower-case "^1.1.0" + is-lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" @@ -8080,6 +8959,11 @@ is-primitive@^3.0.1: resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-3.0.1.tgz#98c4db1abff185485a657fc2905052b940524d05" integrity sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w== +is-promise@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-promise@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" @@ -8160,6 +9044,13 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-upper-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== + dependencies: + upper-case "^1.1.0" + is-upper-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" @@ -8278,7 +9169,7 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0: +iterall@^1.2.1, iterall@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== @@ -8723,7 +9614,7 @@ jju@^1.4.0, jju@~1.4.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -8788,6 +9679,13 @@ json3@^3.3.3: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.1.2, json5@^2.2.1, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -8994,6 +9892,13 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.7.3" +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + dependencies: + invert-kv "^1.0.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -9082,6 +9987,23 @@ loader-utils@2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -9199,7 +10121,7 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= -lodash@^4, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.0, lodash@~4.17.15: +lodash@4.17.21, lodash@^4, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.0, lodash@~4.17.0, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9250,6 +10172,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" +lower-case-first@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== + dependencies: + lower-case "^1.1.2" + lower-case-first@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" @@ -9264,6 +10193,11 @@ lower-case@2.0.1: dependencies: tslib "^1.10.0" +lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -9281,6 +10215,14 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^4.0.1: + version "4.1.5" + 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" + yallist "^2.1.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -9288,6 +10230,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.14.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" + integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + lz-string@1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -9369,6 +10316,13 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ== + dependencies: + mimic-fn "^1.0.0" + memfs@^3.4.3: version "3.5.1" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec" @@ -9516,7 +10470,7 @@ minimatch@3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -9681,6 +10635,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +no-case@^2.2.0, no-case@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + no-case@^3.0.3, no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -9696,7 +10657,7 @@ node-emoji@^1.10.0: dependencies: lodash.toarray "^4.4.0" -node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.5, node-fetch@^2.6.7: +node-fetch@2.6.7, node-fetch@^1.7.3, node-fetch@^2.6.1, node-fetch@^2.6.5, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -9959,6 +10920,15 @@ optimism@^0.16.1: "@wry/context" "^0.7.0" "@wry/trie" "^0.3.0" +optimism@^0.17.5: + version "0.17.5" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.17.5.tgz#a4c78b3ad12c58623abedbebb4f2f2c19b8e8816" + integrity sha512-TEcp8ZwK1RczmvMnvktxHSF2tKgMWjJ71xEFGX5ApLh67VsMSTy1ZUlipJw8W+KaqgOmQ+4pqwkeivY89j+4Vw== + dependencies: + "@wry/context" "^0.7.0" + "@wry/trie" "^0.4.3" + tslib "^2.3.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -9986,6 +10956,15 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -10008,6 +10987,13 @@ p-limit@3.1.0, p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -10015,6 +11001,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -10056,6 +11049,11 @@ p-retry@^4.5.0: "@types/retry" "^0.12.0" retry "^0.13.1" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -10079,6 +11077,13 @@ param-case@3.0.3: dot-case "^3.0.3" tslib "^1.10.0" +param-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== + dependencies: + no-case "^2.2.0" + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -10156,6 +11161,14 @@ pascal-case@3.1.1: no-case "^3.0.3" tslib "^1.10.0" +pascal-case@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + pascal-case@^3.1.1, pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" @@ -10193,6 +11206,13 @@ path-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== + dependencies: + no-case "^2.2.0" + path-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" @@ -10285,6 +11305,11 @@ pify@^2.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -10357,6 +11382,11 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" +prettier@^2.4.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + prettier@^2.8.7: version "2.8.7" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" @@ -10444,6 +11474,11 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -10569,6 +11604,17 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-relay@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/react-relay/-/react-relay-14.1.0.tgz#2a2349d33ca6558543340a12b363ee2de3db06a6" + integrity sha512-U4oHb5wn1LEi17x3AcZOy66MXs83tnYbsK7/YE1/3cQKCPrXhyVUQbEOC9L7jMX659jtS1NACae+7b03bryMCQ== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.2" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "14.1.0" + react-remove-scroll-bar@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.3.tgz#e291f71b1bb30f5f67f023765b7435f4b2b2cd94" @@ -10788,7 +11834,15 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -relay-compiler-language-typescript@^15.0.1: +relay-compiler-language-graphitation@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/relay-compiler-language-graphitation/-/relay-compiler-language-graphitation-0.8.2.tgz#9f2f2c69795abed38072ca14b2471cf2ea4cc336" + integrity sha512-oEJoZzo5h/D7qqRr3SolspULFTvr3+S2iFdVJXheeASwmVd2aHWhohj6yJ5ZB7tYcK8W9sN8LD6hag95Bf5uLA== + dependencies: + relay-compiler-language-typescript ">=14.0.0" + typescript ">=4.2.3" + +relay-compiler-language-typescript@>=14.0.0, relay-compiler-language-typescript@^15.0.1: version "15.0.1" resolved "https://registry.yarnpkg.com/relay-compiler-language-typescript/-/relay-compiler-language-typescript-15.0.1.tgz#78e952cdf6d7c9f833f168c6f8765e985a791d3d" integrity sha512-hy760TxYhylNhSDkkxrQJvEqbhtknE8YtzmY+tRpgKGCq1Axi7eh3YjCLmfc3P2jumJXNEROQTkqqz8IbgU+tg== @@ -10818,13 +11872,13 @@ relay-compiler@12.0.0, relay-compiler@^12.0.0: signedsource "^1.0.0" yargs "^15.3.1" -relay-runtime@12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" - integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== +relay-runtime@12.0.0, relay-runtime@14.1.0, relay-runtime@^14.0.0, relay-runtime@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-15.0.0.tgz#e83315ea23925fae8f3317f0091f28924441576f" + integrity sha512-7AXkXLQo6gpJNBhk4Kii5b+Yat62HSDD1TgJBi021iSjT1muI8iYd4UZG4f/If209LmaVjkZt2HTNAlk6xtslw== dependencies: "@babel/runtime" "^7.0.0" - fbjs "^3.0.0" + fbjs "^3.0.2" invariant "^2.2.4" relay-test-utils-internal@^12.0.0: @@ -10906,6 +11960,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -10981,6 +12040,11 @@ resolve@~1.17.0: dependencies: path-parse "^1.0.6" +response-iterator@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" + integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -11029,7 +12093,7 @@ rfdc@^1.2.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.3: +rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11229,6 +12293,14 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +sentence-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== + dependencies: + no-case "^2.2.0" + upper-case-first "^1.1.2" + sentence-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" @@ -11390,6 +12462,13 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== + dependencies: + no-case "^2.2.0" + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" @@ -11499,7 +12578,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.17, source-map-support@~0.5.20: +source-map-support@^0.5.0, source-map-support@^0.5.17, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -11631,7 +12710,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -11768,6 +12847,17 @@ subscriptions-transport-ws@^0.11.0: symbol-observable "^1.0.4" ws "^5.2.0 || ^6.0.0 || ^7.0.0" +subscriptions-transport-ws@^0.9.18: + version "0.9.19" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf" + integrity sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0 || ^6.0.0 || ^7.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -11814,6 +12904,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swap-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== + dependencies: + lower-case "^1.1.1" + upper-case "^1.1.1" + swap-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" @@ -11942,6 +13040,14 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +title-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + title-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" @@ -12033,6 +13139,11 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== + trim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-1.0.1.tgz#68e78f6178ccab9687a610752f4f5e5a7022ee8c" @@ -12149,6 +13260,11 @@ tslib@~2.0.0, tslib@~2.0.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tslib@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" @@ -12213,6 +13329,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript@>=4.2.3: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + typescript@^3.0.0: version "3.9.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" @@ -12233,6 +13354,11 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.34.tgz#afb439e2e3e394bdc90080acb661a39c685b67d7" integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -12304,7 +13430,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unixify@^1.0.0: +unixify@1.0.0, unixify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA= @@ -12337,6 +13463,13 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^1.1.0, upper-case-first@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== + dependencies: + upper-case "^1.1.1" + upper-case-first@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" @@ -12351,6 +13484,11 @@ upper-case@2.0.1: dependencies: tslib "^1.10.0" +upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== + upper-case@^2.0.1, upper-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" @@ -12678,6 +13816,15 @@ webpack-dev-server@^3.1.14: ws "^6.2.1" yargs "^13.3.2" +webpack-graphql-loader@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/webpack-graphql-loader/-/webpack-graphql-loader-1.0.2.tgz#b7da119bea3063c1b13068c9c7bb01b203d3468b" + integrity sha512-tMcfC/IPMYO8RXsihjMcOplOnyTFqVUHXYZN5mRNIuDy8ADNvqYWVqs3Qi/YBP+U05uesdy9UUvf7N8QZtkc5Q== + dependencies: + apollo-codegen "^0.19.1" + loader-utils "^1.1.0" + pify "^3.0.0" + webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -12816,6 +13963,14 @@ workspace-tools@^0.16.2: multimatch "^4.0.0" read-yaml-file "^2.0.0" +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" @@ -12874,6 +14029,11 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@7.4.5: + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== + ws@8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" @@ -12906,6 +14066,11 @@ xmlhttprequest-ssl@~1.6.2: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + y18n@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" @@ -12916,6 +14081,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -12957,6 +14127,31 @@ yargs-parser@^21.0.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -13016,6 +14211,11 @@ yargs@^17.0.0, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yarn@^1.22.19: + version "1.22.19" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.19.tgz#4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" + integrity sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ== + yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"