diff --git a/.circleci/config.yml b/.circleci/config.yml index dc6ef567..37cedc1c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2 jobs: build: docker: - - image: cimg/node:14.15.1 + - image: cimg/node:16.12.0 steps: - checkout diff --git a/.gitignore b/.gitignore index e7673510..9ada2288 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,11 @@ logs npm-debug.log* yarn-debug.log* yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids @@ -16,11 +21,12 @@ lib-cov # Coverage directory used by tools like istanbul coverage +*.lcov # nyc test coverage .nyc_output -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) @@ -36,8 +42,11 @@ build/Release node_modules/ jspm_packages/ -# Typescript v1 declaration files -typings/ +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo # Optional npm cache directory .npm @@ -45,6 +54,12 @@ typings/ # Optional eslint cache .eslintcache +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + # Optional REPL history .node_repl_history @@ -56,83 +71,51 @@ typings/ # dotenv environment variables file .env +.env.test +.env.production -# next.js build output -.next -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history +# Next.js build output +.next +out -# Output of 'npm pack' -*.tgz +# Nuxt.js build / generate output +.nuxt +dist -# Yarn Integrity file -.yarn-integrity +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public -# dotenv environment variables file -.env +# vuepress build output +.vuepress/dist -# next.js build output -.next +# Serverless directories +.serverless/ -# vscode -.vscode +# FuseBox cache +.fusebox/ -# output directories -dist/ +# DynamoDB Local files +.dynamodb/ -# Typescript -.rpt2_cache +# TernJS port file +.tern-port -# temp folder -temp +# Stores VSCode versions used for testing VSCode extensions +.vscode-test -# mac +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +# macos .DS_store diff --git a/lerna.json b/lerna.json index 7eca74c6..a4c5c71f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,8 +1,10 @@ { - "packages": ["packages/*"], + "packages": [ + "packages/*" + ], "npmClient": "yarn", "useWorkspaces": true, - "version": "1.4.1", + "version": "1.4.5-next.0", "command": { "publish": { "message": "chore(release): publish %s", diff --git a/package.json b/package.json index b068b651..c8d2e877 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,6 @@ "trailingComma": "none" }, "eslintConfig": { - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], "parser": "@typescript-eslint/parser", "parserOptions": { "sourceType": "module", @@ -46,7 +41,6 @@ } }, "plugins": [ - "@typescript-eslint", "prefer-let" ], "env": { @@ -58,9 +52,7 @@ }, "rules": { "prefer-const": 0, - "prefer-let/prefer-let": 2, - "@typescript-eslint/ban-ts-comment": 1, - "@typescript-eslint/no-empty-function": 1 + "prefer-let/prefer-let": 2 }, "ignorePatterns": [ "packages/bundle", @@ -68,43 +60,44 @@ ] }, "devDependencies": { - "@babel/cli": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/preset-env": "^7.0.0", - "@babel/preset-react": "^7.0.0", - "@babel/preset-typescript": "^7.0.0", - "@babel/register": "^7.0.0", - "@graphql-tools/schema": "^8.2.0", + "@babel/cli": "^7.16.0", + "@babel/core": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/preset-env": "^7.16.0", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/register": "^7.16.0", + "@graphql-tools/schema": "^8.3.1", + "@testing-library/react-hooks": "^7.0.2", + "@types/crypto-js": "^4.0.2", "@types/jest": "^27.0.2", - "@types/node": "^16.10.1", - "@types/react": "^17.0.24", - "@types/react-test-renderer": "^17.0.1", + "@types/node": "^16.11.7", + "@types/react": "^17.0.34", "@types/uuid": "^8.3.1", "@types/ws": "^8.2.0", - "@typescript-eslint/eslint-plugin": "^4.9.1", - "@typescript-eslint/parser": "^4.9.1", + "@typescript-eslint/parser": "^5.3.1", + "babel-jest": "^27.3.1", "babel-plugin-jsx-pragmatic": "^1.0.2", "babel-plugin-tester": "^10.0.0", "casual": "^1.5.19", "codecov": "^3.2.0", - "eslint": "^7.15.0", - "eslint-plugin-prefer-let": "^1.1.0", + "eslint": "^8.1.0", + "eslint-plugin-prefer-let": "^3.0.1", "fetch-mock": "^9.11.0", - "graphql": "^15.4.0", - "husky": "^7.0.2", - "jest": "^27.2.2", + "graphql": "^15.6.1", + "husky": "^7.0.4", + "jest": "^27.3.1", "lerna": "^4.0.0", - "lint-staged": "^11.1.2", + "lint-staged": "^11.2.6", "lowdb": "^3.0.0", - "node-fetch": "^3.0.0", - "preact": "^8.3.0", - "preact-render-spy": "^1.3.0", + "microbundle": "^0.14.1", + "node-fetch": "^3.1.0", "prettier": "^2.2.1", - "react": "^16.8.2", - "react-test-renderer": "^16.8.2", - "resolve.exports": "^1.0.2", + "react": "^17.0.2", + "react-test-renderer": "^17.0.2", "rimraf": "^3.0.2", - "typescript": "^4.1.2", + "typescript": "^4.4.4", "uuid": "^8.3.2" } } diff --git a/packages/babel-plugin/.babelrc b/packages/babel-plugin/.babelrc deleted file mode 100644 index 31d8ce64..00000000 --- a/packages/babel-plugin/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": [["@babel/preset-env", { "targets": { "node": 4 } }]] -} diff --git a/packages/http-transport/.babelrc b/packages/babel-plugin/.babelrc.json similarity index 100% rename from packages/http-transport/.babelrc rename to packages/babel-plugin/.babelrc.json diff --git a/packages/babel-plugin/.grafoorc.json b/packages/babel-plugin/.grafoorc.json new file mode 100644 index 00000000..7f30f4ce --- /dev/null +++ b/packages/babel-plugin/.grafoorc.json @@ -0,0 +1,5 @@ +{ + "schema": "schema.graphql", + "idFields": ["id", "__typename"], + "compress": true +} diff --git a/packages/babel-plugin/__tests__/__snapshots__/index.js.snap b/packages/babel-plugin/__tests__/__snapshots__/index.js.snap deleted file mode 100644 index 38c22b35..00000000 --- a/packages/babel-plugin/__tests__/__snapshots__/index.js.snap +++ /dev/null @@ -1,244 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`@grafoo/babel-plugin should compress the query string if the option compress is specified: should compress the query string if the option compress is specified 1`] = ` - -import gql from "@grafoo/core/tag"; -let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } -\`; - - ↓ ↓ ↓ ↓ ↓ ↓ - -let query = { - query: - "query($id:ID!,$offset:Int!,$start:Int!){posts(offset:$offset,start:$start){authors{id name username}body createdAt id tags{id name}title}user(id:$id){id name username}}", - paths: { - "posts(offset:$offset,start:$start){authors{id name username}body createdAt id tags{id name}title}": - { - name: "posts", - args: ["offset", "start"] - }, - "user(id:$id){id name username}": { - name: "user", - args: ["id"] - } - } -}; - - -`; - -exports[`@grafoo/babel-plugin should generate md5 hash and add it to object if the option generateIds is specified: should generate md5 hash and add it to object if the option generateIds is specified 1`] = ` - -import gql from "@grafoo/core/tag"; -let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } -\`; - - ↓ ↓ ↓ ↓ ↓ ↓ - -let query = { - id: "6e0697df8f2453f2643bbd1e8a39c348", - query: - "query ($id: ID!, $offset: Int!, $start: Int!) {\\n posts(offset: $offset, start: $start) {\\n authors {\\n id\\n name\\n username\\n }\\n body\\n createdAt\\n id\\n tags {\\n id\\n name\\n }\\n title\\n }\\n user(id: $id) {\\n id\\n name\\n username\\n }\\n}", - paths: { - "posts(offset:$offset,start:$start){authors{id name username}body createdAt id tags{id name}title}": - { - name: "posts", - args: ["offset", "start"] - }, - "user(id:$id){id name username}": { - name: "user", - args: ["id"] - } - } -}; - - -`; - -exports[`@grafoo/babel-plugin should include \`idFields\` in the client instantiation even if options are provided: should include \`idFields\` in the client instantiation even if options are provided 1`] = ` - -import createClient from "@grafoo/core"; -let query = createClient(someTransport, { - headers: () => ({ authorization: "some-token" }) -}); - - ↓ ↓ ↓ ↓ ↓ ↓ - -import createClient from "@grafoo/core"; -let query = createClient(someTransport, { - headers: () => ({ - authorization: "some-token" - }), - idFields: ["id"] -}); - - -`; - -exports[`@grafoo/babel-plugin should include \`idFields\` in the client instantiation if not present in options: should include \`idFields\` in the client instantiation if not present in options 1`] = ` - -import createClient from "@grafoo/core"; -let query = createClient(someTransport, {}); - - ↓ ↓ ↓ ↓ ↓ ↓ - -import createClient from "@grafoo/core"; -let query = createClient(someTransport, { - idFields: ["id"] -}); - - -`; - -exports[`@grafoo/babel-plugin should include \`idFields\` in the client instantiation if options are not provided: should include \`idFields\` in the client instantiation if options are not provided 1`] = ` - -import createClient from "@grafoo/core"; -let query = createClient(someTransport); - - ↓ ↓ ↓ ↓ ↓ ↓ - -import createClient from "@grafoo/core"; -let query = createClient(someTransport, { - idFields: ["id"] -}); - - -`; - -exports[`@grafoo/babel-plugin should include \`idFields\` in the client instantiation if options is a variable: should include \`idFields\` in the client instantiation if options is a variable 1`] = ` - -import createClient from "@grafoo/core"; -let options = {}; -let query = createClient(someTransport, options); - - ↓ ↓ ↓ ↓ ↓ ↓ - -import createClient from "@grafoo/core"; -let options = { - idFields: ["id"] -}; -let query = createClient(someTransport, options); - - -`; - -exports[`@grafoo/babel-plugin should not generate md5 hash and add it to object if the option generateIds is falsey: should not generate md5 hash and add it to object if the option generateIds is falsey 1`] = ` - -import gql from "@grafoo/core/tag"; -let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } -\`; - - ↓ ↓ ↓ ↓ ↓ ↓ - -let query = { - query: - "query ($id: ID!, $offset: Int!, $start: Int!) {\\n posts(offset: $offset, start: $start) {\\n authors {\\n id\\n name\\n username\\n }\\n body\\n createdAt\\n id\\n tags {\\n id\\n name\\n }\\n title\\n }\\n user(id: $id) {\\n id\\n name\\n username\\n }\\n}", - paths: { - "posts(offset:$offset,start:$start){authors{id name username}body createdAt id tags{id name}title}": - { - name: "posts", - args: ["offset", "start"] - }, - "user(id:$id){id name username}": { - name: "user", - args: ["id"] - } - } -}; - - -`; - -exports[`@grafoo/babel-plugin should overide \`idFields\` in the client instantiation if options is a variable: should overide \`idFields\` in the client instantiation if options is a variable 1`] = ` - -import createClient from "@grafoo/core"; -let options = { idFields: ["err"] }; -let query = createClient(someTransport, options); - - ↓ ↓ ↓ ↓ ↓ ↓ - -import createClient from "@grafoo/core"; -let options = { - idFields: ["id"] -}; -let query = createClient(someTransport, options); - - -`; - -exports[`@grafoo/babel-plugin should remove the imported path: should remove the imported path 1`] = ` - -import gql from "@grafoo/core/tag"; - - ↓ ↓ ↓ ↓ ↓ ↓ - - - -`; - -exports[`@grafoo/babel-plugin should replace a tagged template literal with the compiled grafoo object: should replace a tagged template literal with the compiled grafoo object 1`] = ` - -import gql from "@grafoo/core/tag"; -let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } -\`; - - ↓ ↓ ↓ ↓ ↓ ↓ - -let query = { - query: - "query ($id: ID!, $offset: Int!, $start: Int!) {\\n posts(offset: $offset, start: $start) {\\n authors {\\n id\\n name\\n username\\n }\\n body\\n createdAt\\n id\\n tags {\\n id\\n name\\n }\\n title\\n }\\n user(id: $id) {\\n id\\n name\\n username\\n }\\n}", - paths: { - "posts(offset:$offset,start:$start){authors{id name username}body createdAt id tags{id name}title}": - { - name: "posts", - args: ["offset", "start"] - }, - "user(id:$id){id name username}": { - name: "user", - args: ["id"] - } - } -}; - - -`; diff --git a/packages/babel-plugin/__tests__/compile-document.js b/packages/babel-plugin/__tests__/compile-document.js deleted file mode 100644 index 8f623963..00000000 --- a/packages/babel-plugin/__tests__/compile-document.js +++ /dev/null @@ -1,75 +0,0 @@ -import * as babel from "@babel/core"; -import plugin from "../src"; - -let transform = (program, opts) => - babel.transform(program, { - plugins: [ - [plugin, Object.assign({ schema: "__tests__/schema.graphql", idFields: ["id"] }, opts)], - ], - }); - -describe("compile document", () => { - it("should throw if a schema path points to a inexistent file", () => { - let program = ` - import gql from "@grafoo/core/tag"; - let query = gql\`{ hello }\`; - `; - - expect(() => transform(program, { schema: "?" })).toThrow(); - }); - - it("should throw if more then one operation is specified", () => { - let program = ` - import gql from "@grafoo/core/tag"; - let query = gql\` - { hello } - { goodbye } - \`; - `; - - expect(() => transform(program)).toThrow(); - }); - - it("should accept fragments", () => { - let program = ` - import gql from "@grafoo/core/tag"; - let query = gql\` - fragment UserInfo on User { - name - bio - } - \`; - `; - - expect(() => transform(program)).not.toThrow(); - }); - - it("should accept named queries", () => { - let program = ` - import gql from "@grafoo/core/tag"; - let query = gql\` - query NamedQuery { - me { id } - } - \`; - `; - - expect(() => transform(program)).not.toThrow(); - }); - - it("should accept named queries with arguments", () => { - let program = ` - import gql from "@grafoo/core/tag"; - let query = gql\` - query NamedQuery($var: ID!) { - post(id: $var) { - id - title - } - } - \`; - `; - - expect(() => transform(program)).not.toThrow(); - }); -}); diff --git a/packages/babel-plugin/__tests__/index.js b/packages/babel-plugin/__tests__/index.js deleted file mode 100644 index d08bb184..00000000 --- a/packages/babel-plugin/__tests__/index.js +++ /dev/null @@ -1,199 +0,0 @@ -import pluginTester from "babel-plugin-tester"; -import plugin from "../src"; - -pluginTester({ - plugin, - pluginName: "@grafoo/babel-plugin", - pluginOptions: { - schema: "__tests__/schema.graphql", - idFields: ["id"], - }, - tests: { - "should throw if a import is not default": { - code: 'import { gql } from "@grafoo/core/tag";', - error: true, - }, - "should throw if a schema is not present on the root directory": { - pluginOptions: { - idFields: ["id"], - }, - code: ` - import gql from "@grafoo/core/tag"; - let query = gql\`{ hello }\`; - `, - error: true, - }, - "should throw if a tagged template string literal has expressions in it": { - code: ` - import gql from "@grafoo/core/tag"; - let query = gql\`{ user(id: "\${1}") { name } }\`; - `, - error: true, - }, - "should remove the imported path": { - code: 'import gql from "@grafoo/core/tag";', - snapshot: true, - }, - "should throw if idFields is not defined": { - pluginOptions: { - schema: "__tests__/schema.graphql", - }, - code: ` - import gql from "@grafoo/core/tag"; - let query = gql\`{ hello }\`; - `, - error: true, - }, - "should throw if during client instatiation options is passed with a type other then object": { - code: ` - import createClient from "@grafoo/core"; - let query = createClient(someTransport, "I AM ERROR"); - `, - error: true, - }, - "should throw if the type of some field in `idFields` is not of type string": { - pluginOptions: { - schema: "__tests__/schema.graphql", - idFields: ["id", true], - }, - code: ` - import createClient from "@grafoo/core"; - let query = createClient(someTransport); - `, - error: true, - }, - "should replace a tagged template literal with the compiled grafoo object": { - code: ` - import gql from "@grafoo/core/tag"; - let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } - \`; - `, - snapshot: true, - }, - "should compress the query string if the option compress is specified": { - pluginOptions: { - schema: "__tests__/schema.graphql", - idFields: ["id"], - compress: true, - }, - code: ` - import gql from "@grafoo/core/tag"; - let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } - \`; - `, - snapshot: true, - }, - "should generate md5 hash and add it to object if the option generateIds is specified": { - pluginOptions: { - schema: "__tests__/schema.graphql", - idFields: ["id"], - generateIds: true, - }, - code: ` - import gql from "@grafoo/core/tag"; - let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } - \`; - `, - snapshot: true, - }, - "should not generate md5 hash and add it to object if the option generateIds is falsey": { - pluginOptions: { - schema: "__tests__/schema.graphql", - idFields: ["id"], - }, - code: ` - import gql from "@grafoo/core/tag"; - let query = gql\` - query($start: Int!, $offset: Int!, $id: ID!) { - posts(start: $start, offset: $offset) { - title - body - createdAt - tags { name } - authors { name username } - } - user(id: $id) { name username } - } - \`; - `, - snapshot: true, - }, - "should include `idFields` in the client instantiation if options are not provided": { - code: ` - import createClient from "@grafoo/core"; - let query = createClient(someTransport); - `, - snapshot: true, - }, - "should include `idFields` in the client instantiation if not present in options": { - code: ` - import createClient from "@grafoo/core"; - let query = createClient(someTransport, {}); - `, - snapshot: true, - }, - "should include `idFields` in the client instantiation if options is a variable": { - code: ` - import createClient from "@grafoo/core"; - let options = {}; - let query = createClient(someTransport, options); - `, - snapshot: true, - }, - "should overide `idFields` in the client instantiation if options is a variable": { - code: ` - import createClient from "@grafoo/core"; - let options = { idFields: ["err"] }; - let query = createClient(someTransport, options); - `, - snapshot: true, - }, - "should throw if `idFields` in the client instantiation if options is not an object variable": { - code: ` - import createClient from "@grafoo/core"; - let options = []; - let query = createClient(someTransport, options); - `, - error: true, - }, - "should include `idFields` in the client instantiation even if options are provided": { - code: ` - import createClient from "@grafoo/core"; - let query = createClient(someTransport, { - headers: () => ({ authorization: "some-token" }) - }); - `, - snapshot: true, - }, - }, -}); diff --git a/packages/babel-plugin/__tests__/index.ts b/packages/babel-plugin/__tests__/index.ts new file mode 100644 index 00000000..165871f3 --- /dev/null +++ b/packages/babel-plugin/__tests__/index.ts @@ -0,0 +1,47 @@ +import pluginTester from "babel-plugin-tester"; +import plugin from "../src"; + +let output = ` +let query = { + document: "{authors{__typename id name}}", + operation: { + select: { + authors: { + scalars: ["__typename", "id", "name"] + } + } + } +}; +`.trim(); + +pluginTester({ + plugin, + pluginName: "@grafoo/babel-plugin", + tests: { + "should remove the imported path": { + code: 'import { graphql, gql } from "@grafoo/core";', + output: "" + }, + "should throw if a tagged template string literal has expressions in it": { + code: ` + import { graphql } from "@grafoo/core"; + let query = graphql\`{ user(id: "\${1}") { name } }\`; + `, + error: true + }, + "should replace a tagged template literal with the compiled grafoo object": { + code: ` + import { graphql } from "@grafoo/core"; + let query = graphql\`{ authors {name} }\`; + `, + output + }, + "should be able to use named import gql from @grafoo/core": { + code: ` + import { gql } from "@grafoo/core"; + let query = gql\`{ authors {name} }\`; + `, + output + } + } +}); diff --git a/packages/babel-plugin/package.json b/packages/babel-plugin/package.json index 180542e2..2c2bd6a7 100644 --- a/packages/babel-plugin/package.json +++ b/packages/babel-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@grafoo/babel-plugin", - "version": "1.4.1", + "version": "1.4.2-next.0", "description": "grafoo client babel plugin", "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/babel-plugin", "main": "dist/index.js", @@ -17,23 +17,20 @@ "access": "public" }, "scripts": { - "build": "babel src --out-dir dist", + "build": "tsc --declaration", "test": "jest", "test:coverage": "jest --coverage" }, "jest": { "transform": { - "^.+\\.(ts|tsx|js)$": "/../../scripts/jest-setup.js" - } + "^.+\\.(ts|tsx|js)$": "babel-jest" + }, + "transformIgnorePatterns": [ + "node_modules/(?!(lowdb|steno|node-fetch|fetch-blob)/)" + ] }, "dependencies": { - "babel-literal-to-ast": "^2.1.0", - "crypto-js": "^4.0.0", - "graphql": "^15.4.0", - "graphql-query-compress": "^1.0.0" + "@grafoo/compiler": "^1.4.2-next.0" }, - "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974", - "devDependencies": { - "graphql": "^15.4.0" - } + "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" } diff --git a/packages/babel-plugin/__tests__/schema.graphql b/packages/babel-plugin/schema.graphql similarity index 95% rename from packages/babel-plugin/__tests__/schema.graphql rename to packages/babel-plugin/schema.graphql index d8100b4d..55365803 100644 --- a/packages/babel-plugin/__tests__/schema.graphql +++ b/packages/babel-plugin/schema.graphql @@ -1,12 +1,3 @@ -type Mutation { - createPost(title: String!, body: String!, authors: [ID!]!, tags: [String!]): Post - deletePost(id: ID): Post - createTag(name: String!): Tag - register(username: String!, email: String!, password: String!): User - login(email: String!, password: String!): String - updateUser(username: String, name: String, bio: String, email: String, password: String): User -} - type Post { id: ID! title: String! @@ -15,22 +6,11 @@ type Post { published: Boolean! createdAt: String! updateAt: String! - authors: [User!]! + authors: [Author!]! + author: Author! tags: [Tag!]! } -type Query { - author(id: ID!): Author - authors(start: Int!, offset: Int!): [Author] - posts(start: Int!, offset: Int!): [Post] - post(id: ID!): Post - tag(id: ID!): Tag - users(start: Int!, offset: Int!): [User] - user(id: ID!): User - me: User - viewer: Viewer -} - union Viewer = Visitor | User type Tag { @@ -50,6 +30,7 @@ interface User { } type Author implements User { + id: ID! name: String bio: String posts: [Post!]! @@ -59,3 +40,24 @@ type Visitor { id: ID! ip: String! } + +type Mutation { + createPost(title: String!, body: String!, authors: [ID!]!, tags: [String!]): Post + deletePost(id: ID): Post + createTag(name: String!): Tag + register(username: String!, email: String!, password: String!): User + login(email: String!, password: String!): String + updateUser(username: String, name: String, bio: String, email: String, password: String): User +} + +type Query { + author(id: ID!): Author + authors(start: Int!, offset: Int!): [Author] + posts(start: Int!, offset: Int!): [Post] + post(id: ID!): Post + tag(id: ID!): Tag + users(start: Int!, offset: Int!): [User] + user(id: ID!): User + me: User + viewer: Viewer +} diff --git a/packages/babel-plugin/src/compile-document.js b/packages/babel-plugin/src/compile-document.js deleted file mode 100644 index fe4b2d20..00000000 --- a/packages/babel-plugin/src/compile-document.js +++ /dev/null @@ -1,92 +0,0 @@ -import fs from "fs"; -import { parse, print } from "graphql"; -import compress from "graphql-query-compress"; -import md5Hash from "crypto-js/md5"; -import path from "path"; -import insertFields from "./insert-fields"; -import sortDocument from "./sort-query"; - -let schema; -function getSchema(schemaPath) { - if (schema) return schema; - - let fullPath; - - if (!schemaPath) { - let schemaJson = path.join(process.cwd(), "schema.json"); - let schemaGraphql = path.join(process.cwd(), "schema.graphql"); - let schemaGql = path.join(process.cwd(), "schema.gql"); - - fullPath = fs.existsSync(schemaJson) - ? schemaJson - : fs.existsSync(schemaGraphql) - ? schemaGraphql - : fs.existsSync(schemaGql) - ? schemaGql - : undefined; - } else { - fullPath = path.join(process.cwd(), schemaPath); - } - - fs.accessSync(fullPath, fs.F_OK); - - schema = fs.readFileSync(fullPath, "utf-8"); - - return schema; -} - -export default function compileDocument(source, opts) { - let schema = getSchema(opts.schema); - let doc = sortDocument(insertFields(schema, parse(source), opts.idFields)); - let oprs = doc.definitions.filter((d) => d.kind === "OperationDefinition"); - let frags = doc.definitions.filter((d) => d.kind === "FragmentDefinition"); - - if (oprs.length > 1) { - throw new Error("@grafoo/core/tag: only one operation definition is accepted per tag."); - } - - let grafooObj = {}; - - if (oprs.length) { - let printed = print(oprs[0]); - let compressed = compress(printed); - - // Use compressed version to get same hash even if - // query has different whitespaces, newlines, etc - // Document is also sorted by "sortDocument" therefore - // selections, fields, etc order shouldn't matter either - if (opts.generateIds) { - grafooObj.id = md5Hash(compressed).toString(); - } - - grafooObj.query = opts.compress ? compressed : printed; - - grafooObj.paths = oprs[0].selectionSet.selections.reduce( - (acc, s) => - Object.assign(acc, { - // TODO: generate hashes as well - // based on compress(print(s))? - [compress(print(s))]: { - name: s.name.value, - args: s.arguments.map((a) => { - if (a.value && a.value.kind === "Variable") { - a = a.value; - } - return a.name.value; - }), - }, - }), - {} - ); - } - - if (frags.length) { - grafooObj.frags = {}; - - for (let frag of frags) { - grafooObj.frags[frag.name.value] = opts.compress ? compress(print(frag)) : print(frag); - } - } - - return grafooObj; -} diff --git a/packages/babel-plugin/src/index.js b/packages/babel-plugin/src/index.js deleted file mode 100644 index c66df5a3..00000000 --- a/packages/babel-plugin/src/index.js +++ /dev/null @@ -1,143 +0,0 @@ -import parseLiteral from "babel-literal-to-ast"; -import compileDocument from "./compile-document"; - -export default function transform({ types: t }) { - return { - visitor: { - Program(programPath, { opts }) { - let tagIdentifiers = []; - let clientFactoryIdentifiers = []; - - if (typeof opts.compress !== "boolean") { - opts.compress = process.env.NODE_ENV === "production"; - } - - if (typeof opts.generateIds !== "boolean") { - opts.generateIds = false; - } - - if (!opts.idFields) { - throw new Error("@grafoo/babel-plugin: the `idFields` option is required."); - } - - if ( - !Array.isArray(opts.idFields) || - opts.idFields.some((field) => typeof field !== "string") - ) { - throw new Error( - "@grafoo/babel-plugin: the `idFields` option must be declared as an array of strings." - ); - } - - programPath.traverse({ - ImportDeclaration(path) { - let { source, specifiers } = path.node; - - if (source.value === "@grafoo/core") { - let defaultSpecifier = specifiers.find((s) => t.isImportDefaultSpecifier(s)); - - clientFactoryIdentifiers.push(defaultSpecifier.local.name); - } - - if (source.value === "@grafoo/core/tag") { - let defaultSpecifier = specifiers.find((specifier) => - t.isImportDefaultSpecifier(specifier) - ); - - if (!defaultSpecifier) { - throw path.buildCodeFrameError("@grafoo/core/tag: no default import."); - } - - tagIdentifiers.push(defaultSpecifier.local.name); - - path.remove(); - } - }, - - CallExpression(path) { - let { arguments: args, callee } = path.node; - - let idFieldsArrayAst = t.arrayExpression( - opts.idFields.map((field) => t.stringLiteral(field)) - ); - - let clientObjectAst = t.objectProperty(t.identifier("idFields"), idFieldsArrayAst); - - if (clientFactoryIdentifiers.some((name) => t.isIdentifier(callee, { name }))) { - if (!args[1]) { - args[1] = t.objectExpression([clientObjectAst]); - } - - if (t.isIdentifier(args[1])) { - let name = args[1].name; - let { init } = path.scope.bindings[name].path.node; - - if (path.scope.hasBinding(name)) { - if (t.isObjectExpression(init)) { - let idFieldsProp = init.properties.find((arg) => arg.key.name === "idFields"); - - if (idFieldsProp) { - idFieldsProp.value = idFieldsArrayAst; - } else { - init.properties.push(clientObjectAst); - } - } else { - throw path.buildCodeFrameError( - callee.name + - " second argument must be of type object, instead got " + - args[1].type + - "." - ); - } - } - } else if (t.isObjectExpression(args[1])) { - let idFieldsProp = args[1].properties.find((arg) => arg.key.name === "idFields"); - - if (idFieldsProp) { - idFieldsProp.value = idFieldsArrayAst; - } else { - args[1].properties.push(clientObjectAst); - } - } else { - throw path.buildCodeFrameError( - callee.name + - " second argument must be of type object, instead got " + - args[1].type + - "." - ); - } - } - }, - - TaggedTemplateExpression(path) { - if (tagIdentifiers.some((name) => t.isIdentifier(path.node.tag, { name }))) { - try { - let quasi = path.get("quasi"); - - if (quasi.get("expressions").length) { - throw path.buildCodeFrameError( - "@grafoo/core/tag: interpolation is not supported in a graphql tagged template literal." - ); - } - - let source = quasi.node.quasis.reduce((src, q) => src + q.value.raw, ""); - - path.replaceWith(parseLiteral(compileDocument(source, opts))); - } catch (error) { - if (error.code === "ENOENT") { - throw new Error( - "Could not find a schema in the root directory! " + - "Please use the `schema` option to specify your schema path, " + - "or the `schemaUrl` to specify your graphql endpoint." - ); - } - - throw path.buildCodeFrameError(error.message); - } - } - }, - }); - }, - }, - }; -} diff --git a/packages/babel-plugin/src/index.ts b/packages/babel-plugin/src/index.ts new file mode 100644 index 00000000..46b41e07 --- /dev/null +++ b/packages/babel-plugin/src/index.ts @@ -0,0 +1,46 @@ +import type * as bc from "@babel/core"; +import { parseExpression } from "@babel/parser"; +import compileDocument from "@grafoo/compiler"; + +export default function transform({ types: t }: typeof bc): bc.PluginObj { + return { + visitor: { + Program(program) { + let tags = []; + + program.traverse({ + ImportSpecifier(path) { + let parentPath = path.parentPath as bc.NodePath; + + if (parentPath.node.source.value !== "@grafoo/core") return; + + let { name } = path.node.local; + + if (!["graphql", "gql"].some((n) => n === name)) return; + + tags.push(name); + path.remove(); + + if (!parentPath.node.specifiers.length) parentPath.remove(); + }, + TaggedTemplateExpression(path) { + if (!tags.some((n) => t.isIdentifier(path.node.tag, { name: n }))) return; + + let quasi = path.get("quasi"); + let expressions = quasi.get("expressions"); + + if (expressions.length) { + throw expressions[0].buildCodeFrameError( + "@grafoo/core: interpolation is not supported in a graphql tagged template literal." + ); + } + + let source = quasi.node.quasis.reduce((q, s) => q + s.value.raw, ""); + let query = compileDocument(source); + path.replaceWith(parseExpression(query)); + } + }); + } + } + }; +} diff --git a/packages/babel-plugin/src/insert-fields.js b/packages/babel-plugin/src/insert-fields.js deleted file mode 100644 index e2afa5d8..00000000 --- a/packages/babel-plugin/src/insert-fields.js +++ /dev/null @@ -1,71 +0,0 @@ -import { TypeInfo, buildASTSchema, parse, visit, visitWithTypeInfo } from "graphql"; - -function getType(typeInfo) { - let currentType = typeInfo.getType(); - while (currentType.ofType) currentType = currentType.ofType; - return currentType; -} - -function insertField(selections, value) { - selections.push({ kind: "Field", name: { kind: "Name", value } }); -} - -export default function insertFields(schemaStr, documentAst, idFields) { - let typeInfo = new TypeInfo(buildASTSchema(parse(schemaStr))); - - let isOperationDefinition = false; - let isFragment = false; - - let visitor = { - OperationDefinition() { - isOperationDefinition = true; - }, - InlineFragment() { - isFragment = true; - }, - FragmentDefinition() { - isFragment = true; - }, - SelectionSet({ selections }) { - if (isOperationDefinition) { - isOperationDefinition = false; - - return; - } - - let type = getType(typeInfo); - - if (type.astNode.kind === "UnionTypeDefinition") { - return; - } - - let typeFields = Object.keys(type.getFields()); - let typeInterfaces = type.getInterfaces ? type.getInterfaces() : []; - let typeInterfacesFields = typeInterfaces.reduce( - (acc, next) => acc.concat(Object.keys(next.getFields())), - [] - ); - - for (let field of idFields) { - if (selections.some((_) => _.name && _.name.value === field)) { - continue; // Skip already declared fields - } - - let typeHasField = typeFields.some((_) => _ === field); - let typeInterfacesHasField = typeInterfacesFields.some((_) => _ === field); - - if ( - typeHasField || - (field === "__typename" && !isFragment) || - (typeInterfacesHasField && !isFragment) - ) { - insertField(selections, field); - } - } - - isFragment = false; - }, - }; - - return visit(documentAst, visitWithTypeInfo(typeInfo, visitor)); -} diff --git a/packages/babel-plugin/src/sort-query.js b/packages/babel-plugin/src/sort-query.js deleted file mode 100644 index 1f07fb2c..00000000 --- a/packages/babel-plugin/src/sort-query.js +++ /dev/null @@ -1,48 +0,0 @@ -import { visit } from "graphql"; - -function sort(array, fn) { - fn = fn || ((obj) => obj.name.value); - - return ( - array && - array.sort((prev, next) => { - if (fn(prev) < fn(next)) return -1; - if (fn(prev) > fn(next)) return 1; - return 0; - }) - ); -} - -export default function sortQuery(document) { - return visit(document, { - Document(node) { - node.definitions = [ - ...sort(node.definitions.filter((def) => def.kind === "FragmentDefinition")), - ...node.definitions.filter((def) => def.kind !== "FragmentDefinition"), - ]; - }, - OperationDefinition(node) { - sort(node.directives); - sort(node.variableDefinitions, (_) => _.variable.name.value); - }, - SelectionSet(node) { - sort(node.selections, (_) => (_.alias || _.name || _.typeCondition.name).value); - }, - Field(node) { - sort(node.directives); - sort(node.arguments); - }, - InlineFragment(node) { - sort(node.directives); - }, - FragmentSpread(node) { - sort(node.directives); - }, - FragmentDefinition(node) { - sort(node.directives); - }, - Directive(node) { - sort(node.arguments); - }, - }); -} diff --git a/packages/preact/tsconfig.json b/packages/babel-plugin/tsconfig.json similarity index 67% rename from packages/preact/tsconfig.json rename to packages/babel-plugin/tsconfig.json index c79891e5..aa4e1c88 100644 --- a/packages/preact/tsconfig.json +++ b/packages/babel-plugin/tsconfig.json @@ -2,14 +2,14 @@ "compilerOptions": { "moduleResolution": "node", "strict": false, + "lib": ["esnext", "dom"], "noUnusedLocals": true, "noUnusedParameters": true, "checkJs": false, "downlevelIteration": true, - "jsx": "react", - "jsxFactory": "h", - "lib": ["dom", "esnext"], - "types": ["preact", "jest"] + "esModuleInterop": true, + "outDir": "./dist", + "module": "commonjs" }, "include": ["src"] } diff --git a/packages/bindings/.grafoorc.json b/packages/bindings/.grafoorc.json new file mode 100644 index 00000000..0c00d834 --- /dev/null +++ b/packages/bindings/.grafoorc.json @@ -0,0 +1,4 @@ +{ + "schema": "schema.graphql", + "idFields": ["id", "__typename"] +} diff --git a/packages/bindings/__tests__/index.ts b/packages/bindings/__tests__/index.ts index fc53356c..2d6b9336 100644 --- a/packages/bindings/__tests__/index.ts +++ b/packages/bindings/__tests__/index.ts @@ -1,147 +1,37 @@ -import createBindings from "../src"; -import graphql from "@grafoo/core/tag"; -import createClient from "@grafoo/core"; -import { GrafooClient, GrafooMutations, Variables } from "@grafoo/types"; -import { mockQueryRequest } from "@grafoo/test-utils"; -import createTransport from "@grafoo/http-transport"; - -interface Post { - title: string; - content: string; - id: string; - __typename: string; - author: Author; -} - -interface Author { - name: string; - id: string; - __typename: string; - posts?: Array; -} - -interface Authors { - authors: Author[]; -} - -interface CreateAuthor { - createAuthor: { - name: string; - id: string; - __typename: string; - posts?: Array; - }; -} - -interface DeleteAuthor { - deleteAuthor: { - name: string; - id: string; - __typename: string; - posts?: Array; - }; -} - -interface UpdateAuthor { - updateAuthor: { - name: string; - id: string; - __typename: string; - posts?: Array; - }; -} - -let AUTHORS = graphql` - query { - authors { - name - posts { - title - body - } - } - } -`; - -let AUTHOR = graphql` - query($id: ID!) { - author(id: $id) { - name - posts { - title - body - } - } - } -`; - -let POSTS_AND_AUTHORS = graphql` - query { - posts { - title - body - author { - name - } - } - - authors { - name - posts { - title - body - } - } - } -`; - -let CREATE_AUTHOR = graphql` - mutation($name: String!) { - createAuthor(name: $name) { - name - posts { - title - body - } - } - } -`; - -let DELETE_AUTHOR = graphql` - mutation($id: ID!) { - deleteAuthor(id: $id) { - name - posts { - title - body - } - } - } -`; - -let UPDATE_AUTHOR = graphql` - mutation($id: ID!, $name: String) { - updateAuthor(id: $id, name: $name) { - name - posts { - title - body - } - } - } -`; +import { createBindings, makeGrafooConfig } from "../src"; +import { createClient, GrafooClient } from "@grafoo/core"; +import { + mockQueryRequest, + createTransport, + AuthorEdge, + AuthorConnection +} from "@grafoo/test-utils"; +import { + AUTHOR, + AUTHORS, + AuthorsQuery, + CREATE_AUTHOR, + CreateAuthorMutation, + DELETE_AUTHOR, + DeleteAuthorMutation, + POSTS_AND_AUTHORS, + UPDATE_AUTHOR +} from "./queries"; + +let sleep = (time = 0) => new Promise((resolve) => setTimeout(resolve, time)); describe("@grafoo/bindings", () => { let client: GrafooClient; + let load = expect.any(Function); beforeEach(() => { jest.resetAllMocks(); let transport = createTransport("https://some.graphql.api/"); - client = createClient(transport, { idFields: ["id"] }); + client = createClient({ transport, idFields: ["id"] }); }); it("should be evocable given the minimal props", () => { - let bindings; - expect(() => (bindings = createBindings(client, {}, () => void 0))).not.toThrow(); + let bindings: ReturnType; + expect(() => (bindings = createBindings(client, () => {}, {}))).not.toThrow(); Object.keys(bindings).forEach((fn) => { expect(typeof bindings[fn]).toBe("function"); @@ -151,178 +41,143 @@ describe("@grafoo/bindings", () => { }); it("should not provide any data if no query or mutation is given", () => { - let bindings = createBindings(client, {}, () => void 0); - - let props = bindings.getState(); + let bindings = createBindings(client, () => {}, {}); + let state = bindings.getState(); - expect(props).toEqual({ client }); + expect(state).toEqual({ loaded: false, loading: false }); }); it("should execute a query", async () => { - let { data } = await mockQueryRequest(AUTHORS); - + let { data } = await mockQueryRequest(AUTHORS); let renderFn = jest.fn(); + let bindings = createBindings(client, renderFn, { query: AUTHORS }); - let bindings = createBindings(client, { query: AUTHORS }, renderFn); + expect(bindings.getState()).toEqual({ load, loaded: false, loading: true }); - expect(bindings.getState()).toMatchObject({ loaded: false, loading: true }); + await sleep(); - await bindings.load(); + let results = renderFn.mock.calls.map((c) => c[0]); - expect(bindings.getState()).toMatchObject({ ...data, loaded: true, loading: false }); + expect(results).toEqual([{ ...data, load, loaded: true, loading: false }]); }); it("should notify a loading state", async () => { - let { data } = await mockQueryRequest(AUTHORS); - + let { data } = await mockQueryRequest(AUTHORS); let renderFn = jest.fn(); + let bindings = createBindings(client, renderFn, { query: AUTHORS }); - let bindings = createBindings(client, { query: AUTHORS }, renderFn); - + await sleep(); await bindings.load(); - expect(renderFn).toHaveBeenCalledTimes(1); - expect(bindings.getState()).toMatchObject({ ...data, loaded: true, loading: false }); - - let reloadPromise = bindings.load(); - - expect(bindings.getState().loading).toBe(true); - - await reloadPromise; + let results = renderFn.mock.calls.map((c) => c[0]); - expect(bindings.getState().loading).toBe(false); + expect(results).toEqual([ + { load, loaded: true, loading: false, ...data }, + { load, loaded: true, loading: true, ...data }, + { load, loaded: true, loading: false, ...data } + ]); }); it("should provide the data if the query is already cached", async () => { - let { data } = await mockQueryRequest(AUTHORS); + let { data } = await mockQueryRequest(AUTHORS); client.write(AUTHORS, data); - let bindings = createBindings(client, { query: AUTHORS }, () => void 0); + let bindings = createBindings(client, () => {}, { query: AUTHORS }); - expect(bindings.getState()).toMatchObject({ ...data, loaded: true, loading: false }); + expect(bindings.getState()).toEqual({ ...data, load, loaded: true, loading: false }); }); it("should provide the data if a query is partialy cached", async () => { - let { data } = await mockQueryRequest(AUTHORS); + let { data } = await mockQueryRequest(AUTHORS); client.write(AUTHORS, data); - let bindings = createBindings(client, { query: POSTS_AND_AUTHORS }, () => void 0); - - expect(bindings.getState()).toMatchObject({ ...data, loaded: false, loading: true }); - }); - - it("should trigger updater function if the cache has been updated", async () => { - let { data } = await mockQueryRequest(AUTHORS); - - let renderFn = jest.fn(); - - let bindings = createBindings(client, { query: AUTHORS }, renderFn); - - client.write(AUTHORS, data); + let bindings = createBindings(client, () => {}, { query: POSTS_AND_AUTHORS }); - expect(renderFn).toHaveBeenCalled(); - expect(bindings.getState()).toMatchObject(data); + expect(bindings.getState()).toEqual({ ...data, load, loaded: false, loading: true }); }); it("should provide the state for a cached query", async () => { - let { data } = await mockQueryRequest(AUTHORS); + let { data } = await mockQueryRequest(AUTHORS); client.write(AUTHORS, data); let renderFn = jest.fn(); + let bindings = createBindings(client, renderFn, { query: AUTHORS }); - let bindings = createBindings(client, { query: AUTHORS }, renderFn); - - expect(bindings.getState()).toMatchObject(data); + expect(bindings.getState()).toEqual({ ...data, load, loaded: true, loading: false }); }); it("should stop updating if unbind has been called", async () => { - let { data } = await mockQueryRequest(AUTHORS); - - let renderFn = jest.fn(); - - let bindings = createBindings(client, { query: AUTHORS }, renderFn); - - await bindings.load(); + let { data } = await mockQueryRequest(AUTHORS); + let bindings = createBindings(client, () => {}, { query: AUTHORS }); + await sleep(); bindings.unbind(); - client.write(AUTHORS, { - authors: data.authors.map((a, i) => (!i ? { ...a, name: "Homer" } : a)), - }); + let clonedData: AuthorsQuery = JSON.parse(JSON.stringify(data)); + clonedData.authors.edges[0].node.name = "Homer"; - expect(client.read(AUTHORS).data.authors[0].name).toBe("Homer"); - expect(renderFn).toHaveBeenCalledTimes(1); - expect(bindings.getState()).toMatchObject(data); + client.write(AUTHORS, clonedData); + expect(client.read(AUTHORS).data.authors.edges[0].node.name).toBe("Homer"); + expect(bindings.getState().authors).toEqual(data.authors); }); it("should provide errors on bad request", async () => { - let FailAuthors = { ...AUTHORS, query: AUTHORS.query.substr(1) }; - - let { errors } = await mockQueryRequest(FailAuthors); - + let failedQuery = { ...AUTHORS, document: AUTHORS.document.substring(1) }; + let { errors } = await mockQueryRequest(failedQuery); let renderFn = jest.fn(); + let bindings = createBindings(client, renderFn, { query: failedQuery }); - let bindings = createBindings(client, { query: FailAuthors }, renderFn); - - await bindings.load(); + await sleep(); expect(renderFn).toHaveBeenCalledTimes(1); - expect(bindings.getState()).toMatchObject({ errors }); + expect(bindings.getState()).toEqual({ load, loading: false, loaded: false, errors }); }); it("should perform a simple mutation", async () => { - interface Mutations { - createAuthor: CreateAuthor; - } - - let mutations: GrafooMutations = { createAuthor: { query: CREATE_AUTHOR } }; - - let bindings = createBindings(client, { mutations }, () => void 0); + let bindings = createBindings(client, () => {}, { + mutations: { + createAuthor: { query: CREATE_AUTHOR } + } + }); let props = bindings.getState(); - - let variables = { name: "Bart" }; - - let { data } = await mockQueryRequest({ query: CREATE_AUTHOR.query, variables }); - + let variables = { input: { name: "Bart" } }; + let { data } = await mockQueryRequest(CREATE_AUTHOR, variables); let { data: mutationData } = await props.createAuthor(variables); expect(mutationData).toEqual(data); }); it("should perform mutation with a cache update", async () => { - await mockQueryRequest(AUTHORS); - - interface Mutations { - createAuthor: CreateAuthor; - } - - let mutations: GrafooMutations = { - createAuthor: { - query: CREATE_AUTHOR, - update: ({ authors }, data) => ({ - authors: [data.createAuthor, ...authors], - }), - }, - }; - - let update = jest.spyOn(mutations.createAuthor, "update"); + await mockQueryRequest(AUTHORS); - let bindings = createBindings(client, { query: AUTHORS, mutations }, () => void 0); + let init = makeGrafooConfig({ + query: AUTHORS, + mutations: { + createAuthor: { + query: CREATE_AUTHOR, + update: ({ authors }, data) => ({ + authors: { + edges: [{ node: data.createAuthor.author } as AuthorEdge, ...authors.edges] + } as AuthorConnection + }) + } + } + }); + let update = jest.spyOn(init.mutations.createAuthor, "update"); + let bindings = createBindings(client, () => {}, init); let props = bindings.getState(); expect(typeof props.createAuthor).toBe("function"); - await bindings.load(); - - let variables = { name: "Homer" }; - - let { data } = await mockQueryRequest({ query: CREATE_AUTHOR.query, variables }); + await sleep(); + let variables = { input: { name: "homer" } }; + let { data } = await mockQueryRequest(CREATE_AUTHOR, variables); let { authors } = bindings.getState(); await props.createAuthor(variables); @@ -333,39 +188,43 @@ describe("@grafoo/bindings", () => { it("should perform optimistic update", async () => { await mockQueryRequest(AUTHORS); - interface Mutations { - createAuthor: CreateAuthor; - } - - let mutations: GrafooMutations = { - createAuthor: { - query: CREATE_AUTHOR, - optimisticUpdate: ({ authors }, variables: Author) => ({ - authors: [{ ...variables, id: "tempID" }, ...authors], - }), - update: ({ authors }, data) => ({ - authors: authors.map((p) => (p.id === "tempID" ? data.createAuthor : p)), - }), - }, - }; - - let optimisticUpdate = jest.spyOn(mutations.createAuthor, "optimisticUpdate"); - let update = jest.spyOn(mutations.createAuthor, "update"); - - let bindings = createBindings(client, { query: AUTHORS, mutations }, () => void 0); + let init = makeGrafooConfig({ + query: AUTHORS, + mutations: { + createAuthor: { + query: CREATE_AUTHOR, + optimisticUpdate: ({ authors }, variables) => ({ + authors: { + ...authors, + edges: [ + { node: { ...variables.input, id: "tempID" } } as AuthorEdge, + ...authors.edges + ] + } as AuthorConnection + }), + update: ({ authors }, data) => ({ + authors: { + edges: authors.edges.map((p) => + p.node.id === "tempID" ? { node: data.createAuthor.author, ...p } : p + ) + } as AuthorConnection + }) + } + } + }); + let optimisticUpdate = jest.spyOn(init.mutations.createAuthor, "optimisticUpdate"); + let update = jest.spyOn(init.mutations.createAuthor, "update"); + let bindings = createBindings(client, () => {}, init); let props = bindings.getState(); expect(typeof props.createAuthor).toBe("function"); - await bindings.load(); - - let variables = { name: "Peter" }; - - let { data } = await mockQueryRequest({ query: CREATE_AUTHOR.query, variables }); + await sleep(); + let variables = { input: { name: "marge" } }; + let { data } = await mockQueryRequest(CREATE_AUTHOR, variables); let { authors } = bindings.getState(); - let createAuthorPromise = props.createAuthor(variables); expect(optimisticUpdate).toHaveBeenCalledWith({ authors }, variables); @@ -377,88 +236,88 @@ describe("@grafoo/bindings", () => { expect(update).toHaveBeenCalledWith({ authors: modifiedAuthors }, data); }); - it("should update if query objects has less keys then nextObjects", async () => { - let { query } = CREATE_AUTHOR; - let author = (await mockQueryRequest({ query, variables: { name: "gustav" } })) - .data.createAuthor; - let { data } = await mockQueryRequest(AUTHORS); + it("should update if query records has less keys then nextRecords", async () => { + let { + data: { createAuthor } + } = await mockQueryRequest(CREATE_AUTHOR, { + input: { name: "flanders" } + }); + let { data } = await mockQueryRequest(AUTHORS); client.write(AUTHORS, data); - interface Mutations { - removeAuthor: DeleteAuthor; - } - - let mutations: GrafooMutations = { - removeAuthor: { - query: DELETE_AUTHOR, - optimisticUpdate: ({ authors }, { id }: Author) => ({ - authors: authors.filter((author) => author.id !== id), - }), - }, - }; - let renderFn = jest.fn(); - let bindings = createBindings(client, { query: AUTHORS, mutations }, renderFn); + let bindings = createBindings(client, renderFn, { + query: AUTHORS, + mutations: { + removeAuthor: { + query: DELETE_AUTHOR, + optimisticUpdate: ({ authors }, { input: { id } }) => ({ + authors: { + edges: authors.edges.filter((author) => author.node.id !== id) + } as AuthorConnection + }) + } + } + }); let { removeAuthor } = bindings.getState(); + let variables = { input: { id: createAuthor.author.id } }; - let variables = { id: author.id }; - + await mockQueryRequest(DELETE_AUTHOR, variables); await removeAuthor(variables); expect(renderFn).toHaveBeenCalled(); }); it("should update if query objects is modified", async () => { - let { query } = CREATE_AUTHOR; - let author = ( - await mockQueryRequest({ - query, - variables: { name: "sven" }, - }) - ).data.createAuthor; - let { data } = await mockQueryRequest(AUTHORS); + let { + data: { createAuthor } + } = await mockQueryRequest(CREATE_AUTHOR, { + input: { name: "milhouse" } + }); + let { data } = await mockQueryRequest(AUTHORS); client.write(AUTHORS, data); - interface Mutations { - updateAuthor: UpdateAuthor; - } - - let mutations: GrafooMutations = { - updateAuthor: { - query: UPDATE_AUTHOR, - optimisticUpdate: ({ authors }, variables: Author) => ({ - authors: authors.map((author) => (author.id === variables.id ? variables : author)), - }), - }, - }; + let init = makeGrafooConfig({ + query: AUTHORS, + mutations: { + updateAuthor: { + query: UPDATE_AUTHOR, + optimisticUpdate: ({ authors }, variables) => ({ + authors: { + edges: authors.edges.map((a) => + a.node.id === variables.input.id + ? { ...a, node: { ...a.node, ...variables.input } } + : a + ) + } as AuthorConnection + }) + } + } + }); let renderFn = jest.fn(); - - let bindings = createBindings(client, { query: AUTHORS, mutations }, renderFn); - + let bindings = createBindings(client, renderFn, init); let { updateAuthor } = bindings.getState(); + let variables = { input: { ...createAuthor.author, name: "moe" } }; - let variables = { ...author, name: "johan" }; - - await mockQueryRequest({ query: UPDATE_AUTHOR.query, variables }); - + await mockQueryRequest(UPDATE_AUTHOR, variables); await updateAuthor(variables); expect(renderFn).toHaveBeenCalled(); }); it("should not update if query objects is not modified", async () => { - let { data } = await mockQueryRequest(AUTHORS); + let { data } = await mockQueryRequest(AUTHORS); client.write(AUTHORS, data); let renderFn = jest.fn(); - createBindings(client, { query: AUTHORS }, renderFn); + createBindings(client, renderFn, { query: AUTHORS }); client.write(AUTHORS, data); @@ -466,91 +325,93 @@ describe("@grafoo/bindings", () => { }); it("should accept multiple mutations", async () => { - let { data } = await mockQueryRequest(AUTHORS); - client.write(AUTHORS, data); - - interface Mutations { - createAuthor: CreateAuthor; - updateAuthor: UpdateAuthor; - deleteAuthor: DeleteAuthor; - } - - let mutations: GrafooMutations = { - createAuthor: { - query: CREATE_AUTHOR, - optimisticUpdate: ({ authors }, variables: Author) => ({ - authors: [{ ...variables, id: "tempID" }, ...authors], - }), - update: ({ authors }, data: CreateAuthor) => ({ - authors: authors.map((author) => (author.id === "tempID" ? data.createAuthor : author)), - }), - }, - updateAuthor: { - query: UPDATE_AUTHOR, - optimisticUpdate: ({ authors }, variables: Author) => ({ - authors: authors.map((author) => (author.id === variables.id ? variables : author)), - }), - }, - deleteAuthor: { - query: DELETE_AUTHOR, - optimisticUpdate: ({ authors }, variables: Author) => ({ - authors: authors.map((author) => (author.id === variables.id ? variables : author)), - }), - }, - }; + let authors = await mockQueryRequest(AUTHORS); + client.write(AUTHORS, authors.data); + + let init = makeGrafooConfig({ + query: AUTHORS, + mutations: { + createAuthor: { + query: CREATE_AUTHOR, + optimisticUpdate: ({ authors }, variables) => ({ + authors: { + edges: [ + { node: { ...variables.input, id: "tempID" } } as AuthorEdge, + ...authors.edges + ] + } as AuthorConnection + }), + update: ({ authors }, data) => ({ + authors: { + edges: authors.edges.map((a) => + a.node.id === "tempID" + ? { ...a, node: { ...a.node, ...data.createAuthor.author } } + : a + ) + } as AuthorConnection + }) + }, + updateAuthor: { + query: UPDATE_AUTHOR, + optimisticUpdate: ({ authors }, variables) => ({ + authors: { + edges: authors.edges.map((a) => + a.node.id === variables.input.id ? { node: { ...a.node, ...variables.input } } : a + ) + } as AuthorConnection + }) + }, + deleteAuthor: { + query: DELETE_AUTHOR, + optimisticUpdate: ({ authors }, variables) => ({ + authors: { + edges: authors.edges.filter((author) => author.node.id !== variables.input.id) + } as AuthorConnection + }) + } + } + }); let renderFn = jest.fn(); - - let bindings = createBindings(client, { query: AUTHORS, mutations }, renderFn); + let bindings = createBindings(client, renderFn, init); let props = bindings.getState(); - try { - let variables: Variables = { name: "mikel" }; - let { data } = await mockQueryRequest({ - query: CREATE_AUTHOR.query, - variables, - }); - expect(await mockQueryRequest({ query: CREATE_AUTHOR.query, variables })).toEqual( - await props.createAuthor(variables) - ); - - variables = { ...data.createAuthor, name: "miguel" }; - expect(await mockQueryRequest({ query: UPDATE_AUTHOR.query, variables })).toEqual( - await props.updateAuthor(variables) - ); - - variables = data.createAuthor; - expect(await mockQueryRequest({ query: DELETE_AUTHOR.query, variables })).toEqual( - await props.deleteAuthor(data.createAuthor) - ); - } catch (err) { - console.error(err); - } + let createVariables = { input: { name: "crusty" } }; + let { data } = await mockQueryRequest(CREATE_AUTHOR, createVariables); + expect(await mockQueryRequest(CREATE_AUTHOR, createVariables)).toEqual( + await props.createAuthor(createVariables) + ); + + let updateVariables = { input: { ...data.createAuthor.author, name: "lisa" } }; + expect(await mockQueryRequest(UPDATE_AUTHOR, updateVariables)).toEqual( + await props.updateAuthor(updateVariables) + ); + + let deleteVariables = { input: { id: data.createAuthor.author.id } }; + expect(await mockQueryRequest(DELETE_AUTHOR, deleteVariables)).toEqual( + await props.deleteAuthor(deleteVariables) + ); }); it("should update variables when new variables are passed", async () => { let { - data: { authors }, - } = await mockQueryRequest(AUTHORS); + data: { authors } + } = await mockQueryRequest(AUTHORS); - let [author1, author2] = authors; - let author1Variables = { id: author1.id }; - let author2Variables = { id: author2.id }; + let [author1, author2] = authors.edges; + let author1Variables = { id: author1.node.id }; + let author2Variables = { id: author2.node.id }; - let bindings = createBindings<{ author: Author }>( - client, - { query: AUTHOR, variables: author1Variables }, - () => {} - ); + await mockQueryRequest(AUTHOR, author1Variables); + let bindings = createBindings(client, () => {}, { query: AUTHOR, variables: author1Variables }); + await sleep(); - await mockQueryRequest({ query: AUTHOR.query, variables: author1Variables }); - await bindings.load(); - expect(bindings.getState().author).toMatchObject(author1); - expect(client.read<{ author: Author }>(AUTHOR, author1Variables).data.author).toEqual(author1); + expect(bindings.getState().author).toEqual(author1.node); + expect(client.read(AUTHOR, author1Variables).data.author).toEqual(author1.node); - await mockQueryRequest({ query: AUTHOR.query, variables: author2Variables }); + await mockQueryRequest(AUTHOR, author2Variables); await bindings.load(author2Variables); - expect(bindings.getState().author).toMatchObject(author2); - expect(client.read<{ author: Author }>(AUTHOR, author2Variables).data.author).toEqual(author2); + expect(bindings.getState().author).toEqual(author2.node); + expect(client.read(AUTHOR, author2Variables).data.author).toEqual(author2.node); }); }); diff --git a/packages/bindings/__tests__/queries.ts b/packages/bindings/__tests__/queries.ts new file mode 100644 index 00000000..4a9bbb3e --- /dev/null +++ b/packages/bindings/__tests__/queries.ts @@ -0,0 +1,116 @@ +import { graphql } from "@grafoo/core"; +import { + CreateAuthorInput, + DeleteAuthorInput, + Mutation, + Query, + UpdateAuthorInput +} from "@grafoo/test-utils"; + +export type AuthorQuery = Pick; +export type AuthorQueryVariables = { id: string }; +export let AUTHOR = graphql` + query ($id: ID!) { + author(id: $id) { + name + posts { + edges { + node { + body + title + } + } + } + } + } +`; + +export type AuthorsQuery = Pick; +export let AUTHORS = graphql` + query { + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +export type PostsAndAuthorsQuery = Pick; +export let POSTS_AND_AUTHORS = graphql` + query { + posts { + edges { + node { + title + body + author { + name + } + } + } + } + + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +export type CreateAuthorMutation = Pick; +export type CreateAuthorMutationVariables = { input: CreateAuthorInput }; +export let CREATE_AUTHOR = graphql` + mutation ($input: CreateAuthorInput!) { + createAuthor(input: $input) { + author { + name + } + } + } +`; + +export type DeleteAuthorMutation = Pick; +export type DeleteAuthorMutationVariables = { input: DeleteAuthorInput }; +export let DELETE_AUTHOR = graphql` + mutation ($input: DeleteAuthorInput!) { + deleteAuthor(input: $input) { + author { + name + } + } + } +`; + +export type UpdateAuthorMutation = Pick; +export type UpdateAuthorMutationVariables = { input: UpdateAuthorInput }; +export let UPDATE_AUTHOR = graphql` + mutation ($input: UpdateAuthorInput!) { + updateAuthor(input: $input) { + author { + name + } + } + } +`; diff --git a/packages/bindings/babel.config.js b/packages/bindings/babel.config.js new file mode 100644 index 00000000..2524bf5d --- /dev/null +++ b/packages/bindings/babel.config.js @@ -0,0 +1,8 @@ +module.exports = { + presets: [["@babel/preset-env", { targets: { node: "current" } }], "@babel/preset-typescript"], + env: { + test: { + plugins: ["module:@grafoo/babel-plugin"] + } + } +}; diff --git a/packages/bindings/package.json b/packages/bindings/package.json index f8509363..3e46a434 100644 --- a/packages/bindings/package.json +++ b/packages/bindings/package.json @@ -1,10 +1,15 @@ { "name": "@grafoo/bindings", - "version": "1.4.1", + "version": "1.4.5-next.0", "description": "grafoo client internal helper for building framework bindings", "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/bindings", + "source": "./src/index.ts", "main": "dist/index.js", - "types": "dist/index.d.ts", + "module": "dist/index.js", + "exports": { + "require": "./dist/index.cjs", + "default": "./dist/index.modern.js" + }, "author": "malbernaz", "license": "MIT", "keywords": [ @@ -18,21 +23,24 @@ "access": "public" }, "scripts": { - "build": "grafoo-bundle --input src/index.ts", + "build": "microbundle", + "watch": "microbundle watch", "test": "jest", "test:coverage": "jest --coverage" }, "jest": { "transform": { - "^.+\\.(ts|tsx|js)$": "/../../scripts/jest-setup.js" + "^.+\\.(ts|tsx|js)$": "babel-jest" }, - "resolver": "/../../scripts/resolver.js", "transformIgnorePatterns": [ - "node_modules/(?!(lowdb|steno|node-fetch|fetch-blob)/)" + "node_modules/(?!(lowdb|steno|fetch-mock|node-fetch|fetch-blob|data-uri-to-buffer|formdata-polyfill)/)" + ], + "modulePathIgnorePatterns": [ + "/__tests__/queries.ts" ] }, "dependencies": { - "@grafoo/types": "^1.4.1" + "@grafoo/core": "^1.4.5-next.0" }, "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" } diff --git a/packages/bindings/schema.graphql b/packages/bindings/schema.graphql index 8011416b..26c7e6bf 100644 --- a/packages/bindings/schema.graphql +++ b/packages/bindings/schema.graphql @@ -1,28 +1,267 @@ type Query { - author(id: ID!): Author! - authors: [Author!]! - post(id: ID!): Post! - posts: [Post!]! -} + author(id: ID!): Author + authors( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String -type Mutation { - createAuthor(name: String!): Author! - updateAuthor(id: ID!, name: String): Author! - deleteAuthor(id: ID!): Author! - createPost(title: String!, body: String!, author: ID!): Post! - updatePost(id: ID!, title: String, body: String): Post! - deletePost(id: ID!): Post! + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): AuthorConnection + post(id: ID!): Post + posts( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String + + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): PostConnection + + """ + Fetches an object given its ID + """ + node( + """ + The ID of an object + """ + id: ID! + ): Node } -type Author { +type Author implements Node { + """ + The ID of an object + """ id: ID! name: String! - posts: [Post!] + bio: String + posts( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String + + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): PostConnection +} + +""" +An object with an ID +""" +interface Node { + """ + The id of the object. + """ + id: ID! +} + +""" +A connection to a list of items. +""" +type PostConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [PostEdge] +} + +""" +Information about pagination in a connection. +""" +type PageInfo { + """ + When paginating forwards, are there more items? + """ + hasNextPage: Boolean! + + """ + When paginating backwards, are there more items? + """ + hasPreviousPage: Boolean! + + """ + When paginating backwards, the cursor to continue. + """ + startCursor: String + + """ + When paginating forwards, the cursor to continue. + """ + endCursor: String +} + +""" +An edge in a connection. +""" +type PostEdge { + """ + The item at the end of the edge + """ + node: Post + + """ + A cursor for use in pagination + """ + cursor: String! } -type Post { +type Post implements Node { + """ + The ID of an object + """ id: ID! title: String! body: String! author: Author! } + +""" +A connection to a list of items. +""" +type AuthorConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [AuthorEdge] +} + +""" +An edge in a connection. +""" +type AuthorEdge { + """ + The item at the end of the edge + """ + node: Author + + """ + A cursor for use in pagination + """ + cursor: String! +} + +type Mutation { + createAuthor(input: CreateAuthorInput!): CreateAuthorPayload + updateAuthor(input: UpdateAuthorInput!): UpdateAuthorPayload + deleteAuthor(input: DeleteAuthorInput!): DeleteAuthorPayload + createPost(input: CreatePostInput!): CreatePostPayload + updatePost(input: UpdatePostInput!): UpdatePostPayload + deletePost(input: DeletePostInput!): DeletePostPayload +} + +type CreateAuthorPayload { + author: Author + clientMutationId: String +} + +input CreateAuthorInput { + name: String! + bio: String + clientMutationId: String +} + +type UpdateAuthorPayload { + author: Author + clientMutationId: String +} + +input UpdateAuthorInput { + id: ID + name: String + bio: String + clientMutationId: String +} + +type DeleteAuthorPayload { + author: Author + clientMutationId: String +} + +input DeleteAuthorInput { + id: ID! + clientMutationId: String +} + +type CreatePostPayload { + post: Post + clientMutationId: String +} + +input CreatePostInput { + title: String! + body: String + authorId: ID! + clientMutationId: String +} + +type UpdatePostPayload { + post: Post + clientMutationId: String +} + +input UpdatePostInput { + id: ID! + title: String + body: String + clientMutationId: String +} + +type DeletePostPayload { + post: Post + clientMutationId: String +} + +input DeletePostInput { + id: ID! + clientMutationId: String +} diff --git a/packages/bindings/src/bindings.ts b/packages/bindings/src/bindings.ts new file mode 100644 index 00000000..4af139d9 --- /dev/null +++ b/packages/bindings/src/bindings.ts @@ -0,0 +1,97 @@ +import { GrafooClient, GraphQlError, GrafooQuery } from "@grafoo/core"; +import { + GrafooBindings, + GrafooBoundMutations, + GrafooBoundState, + GrafooConsumerProps +} from "./types"; + +export let makeGrafooConfig = >( + init: GrafooConsumerProps +) => init; + +let clone = (data: T) => JSON.parse(JSON.stringify(data)); + +export function createBindings>( + client: GrafooClient, + updater: (state: GrafooBoundState) => void, + props: GrafooConsumerProps +): GrafooBindings { + type CP = GrafooConsumerProps; + let { query, variables, mutations, lazy = false } = props; + let data: CP["query"]["_queryType"]; + let errors: GraphQlError[]; + let partial = true; + let unbind = () => {}; + + if (query) { + ({ data, partial } = client.read(query, variables)); + + unbind = client.listen((shouldUpdate) => { + if (!state.loading && shouldUpdate) { + ({ data, partial } = client.read(query, variables)); + + state.loaded = !partial; + updater(getState()); + } + }); + } + + let boundMutations = {} as GrafooBoundMutations; + + if (mutations) { + for (let key in mutations) { + let { update, optimisticUpdate, query: mutationQuery } = mutations[key]; + + boundMutations[key] = (mutationVariables) => { + if (query && optimisticUpdate) { + client.write(query, variables, optimisticUpdate(clone(data), mutationVariables)); + } + + return client.execute(mutationQuery, mutationVariables).then((res) => { + if (query && update && res.data) { + client.write(query, variables, update(clone(data), res.data)); + } + + return res; + }); + }; + } + } + + let getState = () => ({ + ...state, + ...boundMutations, + ...data, + ...(query && { load }) + }); + + let state = { + loaded: !partial, + loading: !!query && !lazy && partial + }; + + if (state.loading) load(); + + function load(nextVariables?: CP["query"]["_variablesType"]) { + variables = nextVariables ?? variables; + + if (!state.loading) { + state.loading = true; + updater(getState()); + } + + return client.execute(query, variables).then((res) => { + ({ data, errors } = res); + + if (data) client.write(query, variables, data); + + state = { loaded: !!data, loading: false, ...(errors && { errors }) }; + updater(getState()); + + return res; + }); + } + + return { unbind, getState, load }; +} diff --git a/packages/bindings/src/index.ts b/packages/bindings/src/index.ts index 75c75fbe..4a53e5be 100644 --- a/packages/bindings/src/index.ts +++ b/packages/bindings/src/index.ts @@ -1,114 +1,2 @@ -import { - GrafooClient, - GrafooBindings, - GrafooBoundMutations, - GrafooConsumerProps, - ObjectsMap, - Variables, -} from "@grafoo/types"; - -export default function createBindings( - client: GrafooClient, - props: GrafooConsumerProps, - updater: () => void -): GrafooBindings { - let { variables } = props; - let data: T; - let objects: ObjectsMap; - let boundMutations = {} as GrafooBoundMutations; - let unbind = () => {}; - let lockListenUpdate = 0; - let loaded = false; - let partial = false; - - if (props.query) { - ({ data, objects, partial } = client.read(props.query, variables)); - - loaded = !!data && !partial; - - unbind = client.listen((nextObjects) => { - if (lockListenUpdate) return (lockListenUpdate = 0); - - objects = objects || {}; - - for (let i in nextObjects) { - // object has been inserted - if (!(i in objects)) return performUpdate(); - - for (let j in nextObjects[i]) { - // object has been updated - if (nextObjects[i][j] !== objects[i][j]) return performUpdate(); - } - } - - for (let i in objects) { - // object has been removed - if (!(i in nextObjects)) return performUpdate(); - } - }); - } - - let boundState = props.query ? { load, loaded, loading: !props.skip && !loaded } : {}; - - if (props.mutations) { - for (let key in props.mutations) { - let { update, optimisticUpdate, query: mutationQuery } = props.mutations[key]; - - boundMutations[key] = (mutationVariables) => { - if (props.query && optimisticUpdate) { - writeToCache(optimisticUpdate(data, mutationVariables)); - } - - return client - .execute(mutationQuery, mutationVariables) - .then((mutationResponse) => { - if (props.query && update && mutationResponse.data) { - writeToCache(update(data, mutationResponse.data)); - } - - return mutationResponse; - }); - }; - } - } - - function writeToCache(dataUpdate: T) { - client.write(props.query, variables, dataUpdate); - } - - function performUpdate(boundStateUpdate?) { - ({ data, objects } = client.read(props.query, variables)); - - Object.assign(boundState, boundStateUpdate); - - updater(); - } - - function getState() { - return Object.assign({ client }, boundState, boundMutations, data); - } - - function load(nextVariables?: Variables) { - if (nextVariables) { - variables = nextVariables; - } - - if (!boundState.loading) { - Object.assign(boundState, { loading: true }); - - updater(); - } - - return client.execute(props.query, variables).then(({ data, errors }) => { - if (data) { - lockListenUpdate = 1; - - writeToCache(data); - } - - performUpdate({ errors, loaded: !!data, loading: false }); - }); - } - - return { getState, unbind, load }; -} +export * from "./bindings"; +export * from "./types"; diff --git a/packages/bindings/src/types.ts b/packages/bindings/src/types.ts new file mode 100644 index 00000000..c6968750 --- /dev/null +++ b/packages/bindings/src/types.ts @@ -0,0 +1,41 @@ +import { GraphQlError, GraphQlPayload, GrafooQuery } from "@grafoo/core"; + +export type GrafooBoundMutations> = { + [U in keyof T]: ( + variables: T[U]["_variablesType"] + ) => Promise>; +}; + +export type GrafooBoundState< + T extends GrafooQuery, + U extends Record +> = T["_queryType"] & + GrafooBoundMutations & { + loaded: boolean; + loading: boolean; + load?: (variables?: T["_variablesType"]) => Promise>; + errors?: GraphQlError[]; + }; + +export type GrafooBindings> = { + unbind: () => void; + getState: () => GrafooBoundState; + load: (variables?: T["_variablesType"]) => Promise>; +}; + +export type GrafooMutation = { + query: U; + update?: (props: T["_queryType"], data: U["_queryType"]) => T["_queryType"]; + optimisticUpdate?: (props: T["_queryType"], variables: U["_variablesType"]) => T["_queryType"]; +}; + +export type GrafooMutations> = { + [V in keyof U]: GrafooMutation; +}; + +export type GrafooConsumerProps> = { + query?: T; + lazy?: boolean; + variables?: T["_variablesType"]; + mutations?: GrafooMutations; +}; diff --git a/packages/bundle/cli.js b/packages/bundle/cli.js deleted file mode 100755 index c298b437..00000000 --- a/packages/bundle/cli.js +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env node - -/* eslint-disable no-console */ - -var mri = require("mri"); -var build = require("."); - -var opts = mri(process.argv.slice(2)); - -opts.skipCompression = !!opts["skip-compression"]; -opts.rootPath = process.cwd(); - -build(opts).catch(console.error); diff --git a/packages/bundle/index.js b/packages/bundle/index.js deleted file mode 100755 index 73c3a4b8..00000000 --- a/packages/bundle/index.js +++ /dev/null @@ -1,57 +0,0 @@ -var fs = require("fs"); -var path = require("path"); -var rollup = require("rollup").rollup; -var buble = require("rollup-plugin-buble"); -var fileSize = require("rollup-plugin-filesize"); -var nodeResolve = require("rollup-plugin-node-resolve"); -var terser = require("rollup-plugin-terser").terser; -var typescript = require("rollup-plugin-typescript2"); -var ts = require("typescript"); - -module.exports = function build(opts) { - var pkg = JSON.parse(fs.readFileSync(path.join(opts.rootPath, "package.json"), "utf-8")); - var tsconfig = JSON.parse(fs.readFileSync(path.join(opts.rootPath, "tsconfig.json"), "utf-8")); - var peerDependencies = pkg.peerDependencies || {}; - - tsconfig.compilerOptions.target = "esnext"; - tsconfig.compilerOptions.module = "esnext"; - tsconfig.compilerOptions.declaration = true; - tsconfig.compilerOptions.outDir = path.join(opts.rootPath, "dist"); - - return rollup({ - input: path.join(opts.rootPath, opts.input), - external: Object.keys(peerDependencies), - sourcemap: true, - plugins: [ - nodeResolve(), - typescript({ - typescript: ts, - tsconfigOverride: tsconfig, - }), - buble({ - transforms: { - dangerousForOf: true, - dangerousTaggedTemplateString: true, - }, - }), - !opts.skipCompression && - terser({ - output: { comments: false }, - compress: { keep_infinity: true, pure_getters: true }, - warnings: true, - toplevel: true, - mangle: {}, - }), - fileSize(), - ].filter(Boolean), - }).then(function (bundle) { - return bundle.write({ - file: path.join(opts.rootPath, "dist/index.js"), - sourcemap: true, - format: opts.format || "esm", - treeshake: { - propertyReadSideEffects: false, - }, - }); - }); -}; diff --git a/packages/bundle/package.json b/packages/bundle/package.json deleted file mode 100644 index 19961692..00000000 --- a/packages/bundle/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "grafoo-bundle", - "version": "1.4.1", - "bin": "cli.js", - "main": "index.js", - "dependencies": { - "mri": "^1.1.1", - "rollup": "^2.34.2", - "rollup-plugin-buble": "^0.19.2", - "rollup-plugin-filesize": "^9.1.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.30.0", - "typescript": "^4.1.2" - }, - "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" -} diff --git a/packages/bundle/readme.md b/packages/bundle/readme.md deleted file mode 100644 index 2fc5178c..00000000 --- a/packages/bundle/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# `grafoo-bundle` - -**This is and internal cli tool for [Grafoo](https://github.com/grafoojs/grafoo) and it's not meant to be used for anything else**. Basicaly a wrapper around rollup with some configuration already set. - -## Usage - -``` -$ grafoo-bundle --input src/index.ts -``` - -## Options - -```sh ---input # the entrypoint ---skip-compression # avoids minification -``` - -## LICENSE - -[MIT](https://github.com/grafoojs/grafoo/blob/master/LICENSE) diff --git a/packages/bindings/.babelrc b/packages/compiler/.babelrc.json similarity index 52% rename from packages/bindings/.babelrc rename to packages/compiler/.babelrc.json index ba0dd976..6e63b6e0 100644 --- a/packages/bindings/.babelrc +++ b/packages/compiler/.babelrc.json @@ -2,6 +2,5 @@ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }], "@babel/preset-typescript" - ], - "plugins": [["module:@grafoo/babel-plugin", { "schema": "schema.graphql", "idFields": ["id"] }]] + ] } diff --git a/packages/compiler/__tests__/generate-client-resolvers.ts b/packages/compiler/__tests__/generate-client-resolvers.ts new file mode 100644 index 00000000..6d74b5e5 --- /dev/null +++ b/packages/compiler/__tests__/generate-client-resolvers.ts @@ -0,0 +1,100 @@ +import * as fs from "fs"; +import * as path from "path"; +import { parse, buildASTSchema } from "graphql"; + +import generateClientResolver from "../src/generate-client-resolvers"; + +let graphql = (s: TemplateStringsArray) => parse(s[0]); +let schemaString = fs.readFileSync(path.join(__dirname, "schema.graphql"), "utf-8"); +let schema = buildASTSchema(parse(schemaString)); + +describe("generateClientResolver", () => { + it("should create the client resolver object in the correct shape", () => { + let query = graphql` + query { + posts { + id + ...PostStuff + author { + ...AuthorStuff + } + } + + author { + id + name + posts { + ... on Post { + id + title + } + } + } + } + `; + + expect(generateClientResolver(schema, query)).toEqual({ + select: { + posts: { + scalars: ["id"], + fragments: ["PostStuff"], + select: { author: { fragments: ["AuthorStuff"] } } + }, + author: { + scalars: ["id", "name"], + select: { posts: { scalars: ["id", "title"] } } + } + } + }); + + let fragments = graphql` + fragment AuthorStuff on Author { + id + name + posts(from: 1, to: 10) { + ...PostStuff + id + } + } + + fragment PostStuff on Post { + title + } + `; + + expect(generateClientResolver(schema, fragments)).toEqual({ + select: { + AuthorStuff: { + scalars: ["id", "name"], + select: { + posts: { + args: { from: "1", to: "10" }, + fragments: ["PostStuff"], + scalars: ["id"] + } + } + }, + PostStuff: { + scalars: ["title"] + } + } + }); + + let operationWithVariables = graphql` + query ($id: ID) { + author(id: $id) { + name + } + } + `; + + expect(generateClientResolver(schema, operationWithVariables)).toEqual({ + select: { + author: { + args: { id: "$id" }, + scalars: ["name"] + } + } + }); + }); +}); diff --git a/packages/babel-plugin/__tests__/insert-fields.js b/packages/compiler/__tests__/insert-fields.ts similarity index 74% rename from packages/babel-plugin/__tests__/insert-fields.js rename to packages/compiler/__tests__/insert-fields.ts index ca0a39d8..29007003 100644 --- a/packages/babel-plugin/__tests__/insert-fields.js +++ b/packages/compiler/__tests__/insert-fields.ts @@ -1,28 +1,29 @@ import fs from "fs"; -import { parse, print } from "graphql"; +import { buildASTSchema, parse, print } from "graphql"; import path from "path"; import insertFields from "../src/insert-fields"; -let schema = fs.readFileSync(path.join(__dirname, "schema.graphql"), "utf-8"); +let schemaString = fs.readFileSync(path.join(__dirname, "schema.graphql"), "utf-8"); +let schema = buildASTSchema(parse(schemaString)); let cases = [ { should: "should insert a field", input: "{ author { name } }", expectedOutput: "{ author { name id } }", - idFields: ["id"], + idFields: ["id"] }, { should: "should insert more then a field if specified", input: "{ author { name } }", expectedOutput: "{ author { name username email id } }", - idFields: ["username", "email", "id"], + idFields: ["username", "email", "id"] }, { should: "should insert `__typename` if specified", input: "{ author { name } }", expectedOutput: "{ author { name __typename } }", - idFields: ["__typename"], + idFields: ["__typename"] }, { should: "should insert props in queries with fragments", @@ -56,7 +57,7 @@ let cases = [ } } `, - idFields: ["id"], + idFields: ["id"] }, { should: "should insert props in queries with inline fragments", @@ -88,7 +89,7 @@ let cases = [ } } `, - idFields: ["id", "__typename"], + idFields: ["id", "__typename"] }, { should: "should not insert `__typename` inside fragments", @@ -122,7 +123,7 @@ let cases = [ } } `, - idFields: ["__typename"], + idFields: ["__typename"] }, { should: "should not insert `__typename` inside inline fragments", @@ -152,69 +153,7 @@ let cases = [ } } `, - idFields: ["__typename"], - }, - { - should: "should insert field present on a fragment", - input: ` - { - user { - ...UserFrag - } - } - - fragment UserFrag on Author { - name - posts { - title - } - } - `, - expectedOutput: ` - { - user { - ...UserFrag - } - } - - fragment UserFrag on Author { - name - posts { - title - } - bio - } - `, - idFields: ["bio"], - }, - { - should: "should insert field present in an inline fragment", - input: ` - { - user { - name - ...on Author { - posts { - title - } - } - } - } - `, - expectedOutput: ` - { - user { - name - ...on Author { - posts { - title - } - bio - } - } - } - `, - idFields: ["bio"], + idFields: ["__typename"] }, { should: "should insert fields in inline fragments while leaving unions", @@ -244,7 +183,7 @@ let cases = [ } } `, - idFields: ["id"], + idFields: ["id"] }, { should: "should not insert `__typename` in an operation definition", @@ -272,8 +211,8 @@ let cases = [ } } `, - idFields: ["id", "__typename"], - }, + idFields: ["id", "__typename"] + } ]; describe("insert-fields", () => { diff --git a/packages/compiler/__tests__/schema.graphql b/packages/compiler/__tests__/schema.graphql new file mode 100644 index 00000000..55365803 --- /dev/null +++ b/packages/compiler/__tests__/schema.graphql @@ -0,0 +1,63 @@ +type Post { + id: ID! + title: String! + slug: String! + body: String! + published: Boolean! + createdAt: String! + updateAt: String! + authors: [Author!]! + author: Author! + tags: [Tag!]! +} + +union Viewer = Visitor | User + +type Tag { + id: ID! + name: String! + posts: [Post!]! + createdAt: String! + updateAt: String! +} + +interface User { + id: ID! + username: String! + email: String! + createdAt: String! + updatedAt: String! +} + +type Author implements User { + id: ID! + name: String + bio: String + posts: [Post!]! +} + +type Visitor { + id: ID! + ip: String! +} + +type Mutation { + createPost(title: String!, body: String!, authors: [ID!]!, tags: [String!]): Post + deletePost(id: ID): Post + createTag(name: String!): Tag + register(username: String!, email: String!, password: String!): User + login(email: String!, password: String!): String + updateUser(username: String, name: String, bio: String, email: String, password: String): User +} + +type Query { + author(id: ID!): Author + authors(start: Int!, offset: Int!): [Author] + posts(start: Int!, offset: Int!): [Post] + post(id: ID!): Post + tag(id: ID!): Tag + users(start: Int!, offset: Int!): [User] + user(id: ID!): User + me: User + viewer: Viewer +} diff --git a/packages/babel-plugin/__tests__/sort-query.js b/packages/compiler/__tests__/sort-query.ts similarity index 91% rename from packages/babel-plugin/__tests__/sort-query.js rename to packages/compiler/__tests__/sort-query.ts index da9ee68b..d586b3fa 100644 --- a/packages/babel-plugin/__tests__/sort-query.js +++ b/packages/compiler/__tests__/sort-query.ts @@ -3,14 +3,14 @@ import sortQuery from "../src/sort-query"; let gql = String.raw; -function print(query, sort = false) { +function print(query: string, sort = false) { return sort ? graphqlPrint(sortQuery(parse(query))) : graphqlPrint(parse(query)); } describe("sort-query", () => { it("should sort fields, variable declarations and arguments", () => { let query = gql` - query($f: ID, $e: ID, $d: ID, $c: ID, $b: ID, $a: ID) { + query ($f: ID, $e: ID, $d: ID, $c: ID, $b: ID, $a: ID) { f e d @@ -34,7 +34,7 @@ describe("sort-query", () => { `; let expected = gql` - query($a: ID, $b: ID, $c: ID, $d: ID, $e: ID, $f: ID) { + query ($a: ID, $b: ID, $c: ID, $d: ID, $e: ID, $f: ID) { a(a: $a, b: $b, c: $c, d: $d, e: $e, f: $f) { a(a: $a, b: $b, c: $c, d: $d, e: $e, f: $f) { b @@ -148,13 +148,13 @@ describe("sort-query", () => { it("should sort directives", () => { let query = gql` - query($c: ID, $b: ID, $a: ID) { + query ($c: ID, $b: ID, $a: ID) { someField @c(c: $c) @a(a: $a) @b(c: $b) } `; let expected = gql` - query($a: ID, $b: ID, $c: ID) { + query ($a: ID, $b: ID, $c: ID) { someField @a(a: $a) @b(c: $b) @c(c: $c) } `; diff --git a/packages/preact/package.json b/packages/compiler/package.json similarity index 54% rename from packages/preact/package.json rename to packages/compiler/package.json index 02524392..8939035a 100644 --- a/packages/preact/package.json +++ b/packages/compiler/package.json @@ -1,44 +1,38 @@ { - "name": "@grafoo/preact", - "version": "1.4.1", - "description": "grafoo client preact bindings", - "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/preact", + "name": "@grafoo/compiler", + "version": "1.4.2-next.0", + "description": "grafoo client babel plugin", + "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/babel-plugin", "main": "dist/index.js", - "types": "dist/index.d.ts", "author": "malbernaz", "license": "MIT", "keywords": [ - "babel", - "babel-plugin", "graphql", "graphql-client", "grafoo", - "preact", - "preactjs" + "compiler" ], "publishConfig": { "access": "public" }, "scripts": { - "build": "grafoo-bundle --input src/index.ts", + "build": "tsc --declaration", "test": "jest", "test:coverage": "jest --coverage" }, "jest": { "transform": { - "^.+\\.(ts|tsx|js)$": "/../../scripts/jest-setup.js" + "^.+\\.(ts|tsx|js)$": "babel-jest" }, - "resolver": "/../../scripts/resolver.js", "transformIgnorePatterns": [ "node_modules/(?!(lowdb|steno|node-fetch|fetch-blob)/)" ] }, - "peerDependencies": { - "preact": ">=8.3" - }, "dependencies": { - "@grafoo/bindings": "^1.4.1", - "@grafoo/types": "^1.4.1" + "@types/babel-plugin-macros": "^2.8.5", + "crypto-js": "^4.0.0", + "graphql": "^15.6.1", + "graphql-query-compress": "^1.0.0" }, "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" } diff --git a/packages/compiler/src/generate-client-resolvers.ts b/packages/compiler/src/generate-client-resolvers.ts new file mode 100644 index 00000000..1bfaf9af --- /dev/null +++ b/packages/compiler/src/generate-client-resolvers.ts @@ -0,0 +1,82 @@ +import { GrafooSelection } from "@grafoo/core"; +import { + ASTNode, + FieldNode, + FragmentDefinitionNode, + GraphQLNonNull, + GraphQLScalarType, + GraphQLSchema, + TypeInfo, + visit, + visitWithTypeInfo, + print +} from "graphql"; + +let getNonNullType = (typeInfo: TypeInfo) => { + let currentType = typeInfo.getType(); + if (currentType && currentType instanceof GraphQLNonNull) currentType = currentType.ofType; + return currentType; +}; + +let findPath = (clientResolver: GrafooSelection, currentFields: string[]) => { + let selection = clientResolver; + for (let field of currentFields) selection = selection.select[field]; + return selection; +}; + +export default function generateClientResolver(schema: GraphQLSchema, document: ASTNode) { + let t = new TypeInfo(schema); + let clientResolver = { select: {} } as GrafooSelection; + let currentFields = []; + + let incrementClientResolver = (node: FieldNode | FragmentDefinitionNode) => { + let selection = findPath(clientResolver, currentFields); + if (!(getNonNullType(t) instanceof GraphQLScalarType)) { + let newSelection: GrafooSelection = {}; + + if (node.kind === "Field" && node.arguments?.length) { + newSelection.args = node.arguments.reduce( + (args, arg) => ({ ...args, [arg.name.value]: print(arg.value) }), + {} + ); + } + + selection.select = selection.select ?? {}; + selection.select[node.name.value] = newSelection; + + currentFields.push(node.name.value); + } else { + selection.scalars = selection.scalars ?? []; + selection.scalars.push(node.name.value); + } + }; + + visit( + document, + visitWithTypeInfo(t, { + enter: { + Field(node) { + incrementClientResolver(node); + }, + FragmentDefinition(node) { + incrementClientResolver(node); + }, + FragmentSpread(node) { + let selection = findPath(clientResolver, currentFields); + selection.fragments = selection.fragments ?? []; + selection.fragments.push(node.name.value); + } + }, + leave: { + Field() { + if (!(getNonNullType(t) instanceof GraphQLScalarType)) currentFields.pop(); + }, + FragmentDefinition() { + if (!(getNonNullType(t) instanceof GraphQLScalarType)) currentFields.pop(); + } + } + }) + ); + + return clientResolver; +} diff --git a/packages/compiler/src/index.ts b/packages/compiler/src/index.ts new file mode 100644 index 00000000..8e426552 --- /dev/null +++ b/packages/compiler/src/index.ts @@ -0,0 +1,114 @@ +import * as fs from "fs"; +import * as path from "path"; +import { + DocumentNode, + GraphQLSchema, + buildASTSchema, + getOperationAST, + parse, + print +} from "graphql"; +import compress from "graphql-query-compress"; +import md5Hash from "crypto-js/md5"; +import { GrafooQuery } from "@grafoo/core"; + +import insertFields from "./insert-fields"; +import sortDocument from "./sort-query"; +import generateClientResolver from "./generate-client-resolvers"; + +export type Options = { + schema: string; + idFields: string[]; + compress?: boolean; + generateIds?: boolean; +}; + +let cache = new Map(); + +export default function compileDocument(source: string) { + if (!cache.has("opts")) { + let opts = getOptions(); + + if (!["schema", "idFields"].some((f) => Object.keys(opts).includes(f))) { + throw new Error( + "The `schema` and `idFields` options are required. Please include then in your .grafoorc." + ); + } + + opts.compress = opts.compress ?? process.env.NODE_ENV === "production"; + opts.generateIds = opts.generateIds ?? false; + + cache.set("opts", opts); + } + + let opts: Options = cache.get("opts"); + let schemaString = getSchema(opts.schema); + let schema: GraphQLSchema; + try { + schema = buildASTSchema(parse(schemaString)); + } catch (error) { + error.message = `Failed to parse ${path.join(process.cwd(), opts.schema)}.`; + throw error; + } + + let document = sortDocument(insertFields(schema, parse(source), opts.idFields)) as DocumentNode; + let operation = getOperationAST(document); + let fragments = { + ...document, + definitions: document.definitions.filter((d) => d.kind === "FragmentDefinition") + }; + let documentStr = print(document); + let compressedDocumentStr = compress(documentStr); + + let grafooQuery: GrafooQuery = { + document: opts.compress ? compressedDocumentStr : documentStr, + operation: generateClientResolver(schema, operation), + fragments: fragments.definitions.length ? generateClientResolver(schema, fragments) : undefined + }; + + if (opts.generateIds) { + grafooQuery.id = md5Hash(compressedDocumentStr).toString(); + } + + return JSON.stringify(grafooQuery); +} + +export function getOptions(): Options { + try { + let paths = [".grafoorc.json", ".grafoorc"].map((p) => path.join(process.cwd(), p)); + let configPath = paths.find((p) => fs.existsSync(p)); + + fs.accessSync(configPath); + + let config = fs.readFileSync(configPath, "utf-8"); + + return JSON.parse(config); + } catch (error) { + if (error.code === "ENOENT") { + throw new Error("Could not find a .grafoorc or .grafoorc.json in the root directory."); + } + + throw error; + } +} + +export function getSchema(schemaPath: string) { + try { + let fullPath = path.join(process.cwd(), schemaPath); + + fs.accessSync(fullPath); + + let schema = fs.readFileSync(fullPath, "utf-8"); + + return schema; + } catch (error) { + if (error.code === "ENOENT") { + throw new Error( + "Could not find a schema in the root directory. " + + "Please specify the `schema` option in your .grafoorc file." + ); + } + + throw error; + } +} diff --git a/packages/compiler/src/insert-fields.ts b/packages/compiler/src/insert-fields.ts new file mode 100644 index 00000000..f735366e --- /dev/null +++ b/packages/compiler/src/insert-fields.ts @@ -0,0 +1,99 @@ +import { + ASTKindToNode, + DocumentNode, + FieldNode, + GraphQLSchema, + GraphQLUnionType, + TypeInfo, + Visitor, + visit, + visitWithTypeInfo +} from "graphql"; + +function getType(typeInfo) { + let currentType = typeInfo.getType(); + while (currentType?.ofType) currentType = currentType.ofType; + return currentType; +} + +export default function insertFields( + schema: GraphQLSchema, + documentAst: DocumentNode, + idFields: string[] +): DocumentNode { + let typeInfo = new TypeInfo(schema); + let unionChildrenTypes = []; + let isOperationDefinition = false; + let isFragment = false; + + let visitor: Visitor = { + OperationDefinition() { + isOperationDefinition = true; + }, + InlineFragment() { + isFragment = true; + }, + FragmentDefinition() { + isFragment = true; + }, + SelectionSet(node) { + let { selections } = node; + let newSelections = []; + + if (isOperationDefinition) { + isOperationDefinition = false; + return; + } + + let t = getType(typeInfo); + + if (!t) return; + + if (t.astNode.kind === "UnionTypeDefinition") { + unionChildrenTypes.push( + ...(typeInfo.getType() as GraphQLUnionType).astNode.types.map((t) => t.name.value) + ); + + return; + } + + let typeFields = Object.keys(t.getFields()); + let typeInterfaces = t.getInterfaces(); + let typeInterfacesFields = typeInterfaces.reduce( + (acc, next) => acc.concat(Object.keys(next.getFields())), + [] + ); + + for (let id of idFields) { + if ((selections as FieldNode[]).some((s) => s.name?.value === id)) { + continue; // Skip already declared fields + } + + let typeHasId = typeFields.some((s) => s === id); + let typeInterfacesHasId = typeInterfacesFields.some((s) => s === id); + + if ( + typeHasId || + (id === "__typename" && !isFragment) || + (typeInterfacesHasId && !isFragment) + ) { + newSelections.push({ kind: "Field", name: { kind: "Name", value: id } }); + } + } + + let result = { ...node, selections: [...selections, ...newSelections] }; + + if (isFragment) { + isFragment = false; + + if (unionChildrenTypes.includes(t.inspect())) return result; + + return; + } + + return result; + } + }; + + return visit(documentAst, visitWithTypeInfo(typeInfo, visitor)); +} diff --git a/packages/compiler/src/sort-query.ts b/packages/compiler/src/sort-query.ts new file mode 100644 index 00000000..b152184f --- /dev/null +++ b/packages/compiler/src/sort-query.ts @@ -0,0 +1,74 @@ +import { ASTNode, visit } from "graphql"; + +function sort(array: readonly ASTNode[], fn?: (f: any) => string) { + fn = fn || ((obj) => obj.name.value); + + return ( + array && + array.slice().sort((prev, next) => { + let a = fn(prev); + let b = fn(next); + if (a < b) return -1; + if (a > b) return 1; + return 0; + }) + ); +} + +export default function sortQuery(document: ASTNode): ASTNode { + return visit(document, { + Document(node) { + return { + ...node, + definitions: [ + ...sort(node.definitions.filter((def) => def.kind === "FragmentDefinition")), + ...node.definitions.filter((def) => def.kind !== "FragmentDefinition") + ] + }; + }, + OperationDefinition(node) { + return { + ...node, + directives: sort(node.directives), + variableDefinitions: sort(node.variableDefinitions, (_) => _.variable.name.value) + }; + }, + SelectionSet(node) { + return { + ...node, + selections: sort(node.selections, (_) => (_.alias || _.name || _.typeCondition.name).value) + }; + }, + Field(node) { + return { + ...node, + directives: sort(node.directives), + arguments: sort(node.arguments) + }; + }, + InlineFragment(node) { + return { + ...node, + directives: sort(node.directives) + }; + }, + FragmentSpread(node) { + return { + ...node, + directives: sort(node.directives) + }; + }, + FragmentDefinition(node) { + return { + ...node, + directives: sort(node.directives) + }; + }, + Directive(node) { + return { + ...node, + arguments: sort(node.arguments) + }; + } + }); +} diff --git a/packages/http-transport/tsconfig.json b/packages/compiler/tsconfig.json similarity index 66% rename from packages/http-transport/tsconfig.json rename to packages/compiler/tsconfig.json index e291682a..aa4e1c88 100644 --- a/packages/http-transport/tsconfig.json +++ b/packages/compiler/tsconfig.json @@ -6,7 +6,10 @@ "noUnusedLocals": true, "noUnusedParameters": true, "checkJs": false, - "downlevelIteration": true + "downlevelIteration": true, + "esModuleInterop": true, + "outDir": "./dist", + "module": "commonjs" }, "include": ["src"] } diff --git a/packages/core/.babelrc b/packages/core/.babelrc deleted file mode 100644 index e27da2cc..00000000 --- a/packages/core/.babelrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presets": [ - ["@babel/preset-env", { "targets": { "node": "current" } }], - "@babel/preset-typescript" - ], - "plugins": [ - [ - "module:@grafoo/babel-plugin", - { "schema": "schema.graphql", "idFields": ["id", "__typename"] } - ] - ] -} diff --git a/packages/core/.grafoorc.json b/packages/core/.grafoorc.json new file mode 100644 index 00000000..0c00d834 --- /dev/null +++ b/packages/core/.grafoorc.json @@ -0,0 +1,4 @@ +{ + "schema": "schema.graphql", + "idFields": ["id", "__typename"] +} diff --git a/packages/core/__tests__/build-query-tree.ts b/packages/core/__tests__/build-query-tree.ts deleted file mode 100644 index 8d3f0b5c..00000000 --- a/packages/core/__tests__/build-query-tree.ts +++ /dev/null @@ -1,72 +0,0 @@ -import buildQueryTree from "../src/build-query-tree"; - -let tree = { - posts: [ - { - title: "foo", - id: "1", - author: { - name: "miguel", - id: "2", - posts: [ - { - id: "1", - content: "a post content", - author: { - name: "miguel", - lastName: "albernaz", - id: "2", - }, - }, - ], - }, - }, - { title: "bar", id: "3", author: { name: "vicente", id: "4" } }, - { title: "baz", id: "5", author: { name: "laura", id: "6" } }, - ], -}; - -let idFields = ["id"]; - -describe("build-query-tree", () => { - it("should update values of a resulting query tree", () => { - let objects = { - "1": { title: "foobar", id: "1", content: "a new post content" }, - "2": { name: "miguel", id: "2", lastName: "coelho" }, - }; - - let { posts } = buildQueryTree(tree, objects, idFields); - - expect(posts[0].title).toBe("foobar"); - expect(posts[0].content).toBe("a new post content"); - expect(posts[0].author.lastName).toBe("coelho"); - }); - - it("should add all properties of an object to its corresponding branch", () => { - let objects = { - "1": { title: "foo", id: "1", content: "a post content" }, - "2": { name: "miguel", id: "2", lastName: "coelho" }, - }; - - let [post] = buildQueryTree(tree, objects, idFields).posts; - - expect(post.content).toBeTruthy(); - expect(post.author.lastName).toBeTruthy(); - expect(post.author.posts[0].title).toBeTruthy(); - }); - - it("should not remove a property from a branch", () => { - let objects = { - "1": { id: "1" }, - "2": { id: "2" }, - "3": { id: "3" }, - "4": { id: "4" }, - "5": { id: "5" }, - "6": { id: "6" }, - }; - - let newTree = buildQueryTree(tree, objects, idFields); - - expect(newTree).toEqual(tree); - }); -}); diff --git a/packages/core/__tests__/data/author-with-arguments.ts b/packages/core/__tests__/data/author-with-arguments.ts new file mode 100644 index 00000000..05d9acb2 --- /dev/null +++ b/packages/core/__tests__/data/author-with-arguments.ts @@ -0,0 +1,50 @@ +export let data = { + author: { + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + name: "Murphy Abshire", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui" + } + } + ] + } + } +}; + +export let records = { + "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==": { + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + name: "Murphy Abshire" + }, + "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=": { + __typename: "Post", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui" + } +}; + +export let path = { + "author:id:QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==": { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + "posts:first:1": { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=" + } + } + ] + } + } +}; diff --git a/packages/core/__tests__/data/posts-and-authors.ts b/packages/core/__tests__/data/posts-and-authors.ts new file mode 100644 index 00000000..d8bd4cce --- /dev/null +++ b/packages/core/__tests__/data/posts-and-authors.ts @@ -0,0 +1,262 @@ +export let data = { + authors: { + __typename: "AuthorConnection", + edges: [ + { + __typename: "AuthorEdge", + node: { + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + name: "Murphy Abshire", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + body: "Sit dignissimos ullam tenetur ex minus saepe quo repellendus.", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + body: "Ducimus harum delectus consectetur.", + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + title: "Quam odit" + } + } + ] + } + } + }, + { + __typename: "AuthorEdge", + node: { + __typename: "Author", + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + name: "Rebekah Gleason", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + body: "Qui natus repellat porro.", + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + title: "Numquam ducimus rerum" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + body: "Amet eos dolores.", + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + title: "Possimus et ullam" + } + } + ] + } + } + } + ] + }, + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + author: { + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + name: "Murphy Abshire" + }, + body: "Sit dignissimos ullam tenetur ex minus saepe quo repellendus.", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + author: { + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + name: "Murphy Abshire" + }, + body: "Ducimus harum delectus consectetur.", + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + title: "Quam odit" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + author: { + __typename: "Author", + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + name: "Rebekah Gleason" + }, + body: "Qui natus repellat porro.", + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + title: "Numquam ducimus rerum" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + author: { + __typename: "Author", + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + name: "Rebekah Gleason" + }, + body: "Amet eos dolores.", + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + title: "Possimus et ullam" + } + } + ] + } +}; + +export let records = { + "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=": { + __typename: "Post", + body: "Amet eos dolores.", + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + title: "Possimus et ullam" + }, + "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==": { + __typename: "Author", + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + name: "Rebekah Gleason" + }, + "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=": { + __typename: "Post", + body: "Qui natus repellat porro.", + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + title: "Numquam ducimus rerum" + }, + "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=": { + __typename: "Post", + body: "Ducimus harum delectus consectetur.", + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + title: "Quam odit" + }, + "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==": { + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + name: "Murphy Abshire" + }, + "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=": { + __typename: "Post", + body: "Sit dignissimos ullam tenetur ex minus saepe quo repellendus.", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui" + } +}; + +export let path = { + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + author: { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==" + } + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + author: { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==" + } + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + author: { + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==" + } + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + author: { + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==" + } + } + } + ] + }, + authors: { + __typename: "AuthorConnection", + edges: [ + { + __typename: "AuthorEdge", + node: { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=" + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" + } + } + ] + } + } + }, + { + __typename: "AuthorEdge", + node: { + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=" + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=" + } + } + ] + } + } + } + ] + } +}; diff --git a/packages/core/__tests__/data/posts-with-fragments.ts b/packages/core/__tests__/data/posts-with-fragments.ts new file mode 100644 index 00000000..c9248a81 --- /dev/null +++ b/packages/core/__tests__/data/posts-with-fragments.ts @@ -0,0 +1,296 @@ +export let data = { + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + author: { + name: "Murphy Abshire", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + title: "Quam odit" + } + } + ] + }, + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==" + }, + body: "Sit dignissimos ullam tenetur ex minus saepe quo repellendus.", + title: "Quam et qui", + __typename: "Post", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=" + } + }, + { + __typename: "PostEdge", + node: { + author: { + name: "Murphy Abshire", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + title: "Quam odit" + } + } + ] + }, + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==" + }, + body: "Ducimus harum delectus consectetur.", + title: "Quam odit", + __typename: "Post", + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" + } + }, + { + __typename: "PostEdge", + node: { + author: { + name: "Rebekah Gleason", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + title: "Numquam ducimus rerum" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + title: "Possimus et ullam" + } + } + ] + }, + __typename: "Author", + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==" + }, + body: "Qui natus repellat porro.", + title: "Numquam ducimus rerum", + __typename: "Post", + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=" + } + }, + { + __typename: "PostEdge", + node: { + author: { + name: "Rebekah Gleason", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + title: "Numquam ducimus rerum" + } + }, + { + __typename: "PostEdge", + node: { + __typename: "Post", + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + title: "Possimus et ullam" + } + } + ] + }, + __typename: "Author", + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==" + }, + body: "Amet eos dolores.", + title: "Possimus et ullam", + __typename: "Post", + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=" + } + } + ] + } +}; + +export let records = { + "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=": { + __typename: "Post", + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + body: "Amet eos dolores.", + title: "Possimus et ullam" + }, + "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==": { + __typename: "Author", + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + name: "Rebekah Gleason" + }, + "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=": { + __typename: "Post", + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + title: "Numquam ducimus rerum", + body: "Qui natus repellat porro." + }, + "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=": { + __typename: "Post", + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + body: "Ducimus harum delectus consectetur.", + title: "Quam odit" + }, + "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==": { + __typename: "Author", + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + name: "Murphy Abshire" + }, + "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=": { + __typename: "Post", + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + title: "Quam et qui", + body: "Sit dignissimos ullam tenetur ex minus saepe quo repellendus." + } +}; + +export let path = { + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=", + author: { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=" + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" + } + } + ] + } + } + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=", + author: { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=" + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" + } + } + ] + } + } + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=", + author: { + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=" + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=" + } + } + ] + } + } + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=", + author: { + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + posts: { + __typename: "PostConnection", + edges: [ + { + __typename: "PostEdge", + node: { + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=" + } + }, + { + __typename: "PostEdge", + node: { + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=" + } + } + ] + } + } + } + } + ] + } +}; diff --git a/packages/core/__tests__/index.ts b/packages/core/__tests__/index.ts index e115f49c..8431b921 100644 --- a/packages/core/__tests__/index.ts +++ b/packages/core/__tests__/index.ts @@ -1,321 +1,175 @@ -import graphql from "@grafoo/core/tag"; import { executeQuery } from "@grafoo/test-utils"; -import { GrafooClient, Variables } from "@grafoo/types"; -import createClient from "../src"; - -interface Post { - title: string; - content: string; - id: string; - __typename: string; - author: Author; -} - -interface Author { - name: string; - id: string; - __typename: string; - posts?: Array; -} - -interface AuthorsQuery { - authors: Author[]; -} - -interface PostQuery { - post: Post; -} - -interface PostsAndAuthorsQuery { - authors: Author[]; - posts: Post[]; -} - -interface PostsQuery { - posts: Post[]; -} - -let AUTHORS = graphql` - query { - authors { - name - posts { - title - body - } - } - } -`; - -let SIMPLE_AUTHORS = graphql` - query { - authors { - name - } - } -`; - -let POSTS_AND_AUTHORS = graphql` - query { - posts { - title - body - author { - name - } - } - - authors { - name - posts { - title - body - } - } - } -`; - -let POST = graphql` - query ($postId: ID!) { - post(id: $postId) { - title - body - author { - name - } - } - } -`; - -let POST_WITH_FRAGMENT = graphql` - query ($postId: ID!) { - post(id: $postId) { - title - body - author { - ...AuthorInfo - } - } - } - - fragment AuthorInfo on Author { - name - } -`; - -let POSTS = graphql` - query { - posts { - title - body - author { - name - } - } - } -`; - -function mockTrasport(query: string, variables: Variables) { +import { createClient } from "../src"; +import { GrafooClient } from "../src/types"; +import { + AUTHORS, + POST, + POSTS, + POSTS_AND_AUTHORS, + POST_WITH_FRAGMENT, + SIMPLE_AUTHORS +} from "./queries"; + +function transport(query: any, variables: any) { return executeQuery({ query, variables }); } describe("@grafoo/core", () => { let client: GrafooClient; beforeEach(() => { - client = createClient(mockTrasport, { idFields: ["id"] }); + client = createClient({ transport, idFields: ["id"] }); }); it("should be instantiable", () => { - expect(() => createClient(mockTrasport, { idFields: ["id"] })).not.toThrow(); + expect(() => createClient({ transport, idFields: ["id"] })).not.toThrow(); expect(typeof client.execute).toBe("function"); expect(typeof client.listen).toBe("function"); expect(typeof client.write).toBe("function"); expect(typeof client.read).toBe("function"); - expect(typeof client.flush).toBe("function"); + expect(typeof client.extract).toBe("function"); expect(typeof client.reset).toBe("function"); }); it("should perform query requests", async () => { - let variables = { postId: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - - let { query, frags } = POST_WITH_FRAGMENT; - if (frags) for (let frag in frags) query += " " + frags[frag]; - - let data = await executeQuery({ query, variables }); - - expect(data).toEqual(await client.execute(POST_WITH_FRAGMENT, variables)); + let data = await client.execute(SIMPLE_AUTHORS); + expect(data).toEqual(await client.execute(SIMPLE_AUTHORS)); }); it("should perform query requests with fragments", async () => { - let data = await executeQuery({ query: SIMPLE_AUTHORS.query }); + let variables = { id: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - expect(data).toEqual(await client.execute(SIMPLE_AUTHORS)); + let data = await executeQuery({ query: POST_WITH_FRAGMENT.document, variables }); + + expect(data).toEqual(await client.execute(POST_WITH_FRAGMENT, variables)); }); it("should write queries to the client", async () => { - let data = await executeQuery(POSTS_AND_AUTHORS); + let { data } = await client.execute(POSTS_AND_AUTHORS); client.write(POSTS_AND_AUTHORS, data); - let { authors, posts } = data.data; - let { objectsMap, pathsMap } = client.flush(); + let { authors, posts } = data; + let { records } = client.extract(); - expect(authors).toEqual( - pathsMap["authors{__typename id name posts{__typename body id title}}"].data.authors - ); - expect(posts).toEqual( - pathsMap["posts{__typename author{__typename id name}body id title}"].data.posts - ); - expect(authors.every((author) => Boolean(objectsMap[author.id]))).toBe(true); - expect(posts.every((post) => Boolean(objectsMap[post.id]))).toBe(true); + expect(authors.edges.every((a) => Boolean(records[a.node.id]))).toBe(true); + expect(posts.edges.every((p) => Boolean(records[p.node.id]))).toBe(true); }); it("should write queries partially to the client", async () => { - let { data } = await executeQuery(POSTS); + let { data } = await client.execute(POSTS); + + client.write(POSTS_AND_AUTHORS, data as any); - expect(() => client.write(POSTS_AND_AUTHORS, data)).not.toThrow(); - expect(() => client.read(POSTS)).not.toThrow(); - expect(() => client.read(AUTHORS)).not.toThrow(); + expect(client.read(POSTS)).toMatchObject({ data, partial: false }); + expect(client.read(AUTHORS)).toEqual({ data: {}, partial: true }); }); it("should read queries from the client", async () => { - let { data } = await executeQuery(AUTHORS); + let { data } = await client.execute(AUTHORS); client.write(AUTHORS, data); - let result = client.read(AUTHORS); + let result = client.read(AUTHORS); let { authors } = data; expect(authors).toEqual(result.data.authors); - expect(authors.every((author) => Boolean(result.objects[author.id]))).toBe(true); - expect( - authors.every((author) => author.posts.every((post) => Boolean(result.objects[post.id]))) - ).toBe(true); }); it("should handle queries with variables", async () => { - let variables = { postId: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - let { data } = await executeQuery({ query: POST.query, variables }); + let variables = { id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=" }; + let { data } = await client.execute(POST, variables); client.write(POST, variables, data); - expect(client.read(POST, { postId: "123" })).toEqual({}); - expect(client.read(POST, variables).data.post.id).toBe(variables.postId); + expect(client.read(POST, { id: "123" }).data).toEqual({}); + expect(client.read(POST, variables).data.post.id).toBe(variables.id); }); it("should distinguish between calls to the same query with different variables", async () => { - let v1 = { postId: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - let v2 = { postId: "77c483dd-6529-4c72-9bb6-bbfd69f65682" }; + let v1 = { id: "UG9zdDo5YzZhYmQ1OC0wY2M1LTQzNDEtODdhMi1lZGUzNjQ2ODVlYmQ=" }; + let v2 = { id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" }; - let { data: d1 } = await executeQuery({ query: POST.query, variables: v1 }); - client.write(POST, v1, d1); + let d1 = await client.execute(POST, v1); + client.write(POST, v1, d1.data); - expect(client.read(POST, { postId: "not found" })).toEqual({}); - expect(client.read(POST, v1).data.post.id).toBe(v1.postId); + expect(client.read(POST, v1).data.post.id).toBe(v1.id); - let d2 = await executeQuery({ query: POST.query, variables: v2 }); - client.write(POST, v2, d2); + let d2 = await client.execute(POST, v2); + client.write(POST, v2, d2.data); - expect(client.read(POST, v1).data.post.id).toBe(v1.postId); - expect(client.read(POST, v2).data.post.id).toBe(v2.postId); + expect(client.read(POST, v1).data.post.id).toBe(v1.id); + expect(client.read(POST, v2).data.post.id).toBe(v2.id); }); it("should flag if a query result is partial", async () => { - let { data } = await executeQuery({ query: POSTS.query }); + let { data } = await client.execute(POSTS); client.write(POSTS, data); - expect(client.read(POSTS_AND_AUTHORS).partial).toBe(true); - }); - - it("should remove unused objects from objectsMap", async () => { - let { data } = await executeQuery(SIMPLE_AUTHORS); - - client.write(SIMPLE_AUTHORS, data); - - let authorToBeRemoved: Author = data.authors[0]; - - let ids = Object.keys(client.flush().objectsMap); - - expect(ids.some((id) => id === authorToBeRemoved.id)).toBe(true); - - client.write(SIMPLE_AUTHORS, { - authors: data.authors.filter((author) => author.id !== authorToBeRemoved.id) - }); - - let nextIds = Object.keys(client.flush().objectsMap); - - expect(nextIds.length).toBe(ids.length - 1); - expect(nextIds.some((id) => id === authorToBeRemoved.id)).toBe(false); + expect(client.read(POSTS_AND_AUTHORS).partial).toBe(true); }); it("should perform update to client", async () => { - let variables = { postId: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - let { data } = await executeQuery({ query: POST.query, variables }); + let variables = { id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" }; + let { data } = await client.execute(POST, variables); client.write(POST, variables, data); let { data: { post } - } = client.read(POST, variables); + } = client.read(POST, variables); expect(post.title).toBe("Quam odit"); client.write(POST, variables, { post: { ...post, title: "updated title" } }); - expect(client.read(POST, variables).data.post.title).toBe("updated title"); + expect(client.read(POST, variables).data.post.title).toBe("updated title"); }); - it("should reflect updates on queries with shared objects", async () => { - let variables = { postId: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - let postData = (await executeQuery({ query: POST.query, variables })).data; - let postsData = (await executeQuery({ query: POSTS.query, variables })).data; + it("should reflect updates on queries when shared records change", async () => { + let variables = { id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" }; + let postData = await client.execute(POST, variables); + let postsData = await client.execute(POSTS, variables); - client.write(POSTS, postsData); + client.write(POSTS, postsData.data); - let { posts } = client.read(POSTS).data; + let { posts } = client.read(POSTS).data; - expect(posts.find((p) => p.id === variables.postId).title).toBe("Quam odit"); + expect(posts.edges.find((p) => p.node.id === variables.id).node.title).toBe("Quam odit"); - client.write(POST, variables, { post: { ...postData.post, title: "updated title" } }); + client.write(POST, variables, { + post: { ...postData.data.post, title: "updated title" } + }); - let { posts: updatedPosts } = client.read(POSTS, variables).data; + let { posts: updatedPosts } = client.read(POSTS, variables).data; - expect(updatedPosts.find((p) => p.id === variables.postId).title).toBe("updated title"); + expect(updatedPosts.edges.find((p) => p.node.id === variables.id).node.title).toBe( + "updated title" + ); }); - it("should merge objects in the client when removing or adding properties", async () => { - let variables = { postId: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - let data = (await executeQuery({ query: POST.query, variables })).data; + it("should merge records in the client when removing or adding properties", async () => { + let variables = { id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" }; + let { data } = await client.execute(POST, variables); client.write(POST, variables, data); - let post = JSON.parse(JSON.stringify(client.read(POST, variables).data.post)); + let post = JSON.parse(JSON.stringify(client.read(POST, variables).data.post)); - delete post.__typename; - - post.foo = "bar"; + post.title = "updated title"; client.write(POST, variables, { post }); - expect(client.read(POST, variables).data.post).toEqual({ - __typename: "Post", - author: { - __typename: "Author", - id: "a1d3a2bc-e503-4640-9178-23cbd36b542c", - name: "Murphy Abshire" - }, - body: "Ducimus harum delectus consectetur.", - id: "2c969ce7-02ae-42b1-a94d-7d0a38804c85", - title: "Quam odit", - foo: "bar" + expect(client.read(POST, variables).data.post).toEqual({ + ...data.post, + title: "updated title" }); }); - it("should call client listeners on write with paths objects as arguments", async () => { - let variables = { postId: "2c969ce7-02ae-42b1-a94d-7d0a38804c85" }; - let data = (await executeQuery({ query: POST.query, variables })).data; + it("should call client listeners on write with a boolean shouldUpdate as arguments", async () => { + let variables = { id: "UG9zdDoyYzk2OWNlNy0wMmFlLTQyYjEtYTk0ZC03ZDBhMzg4MDRjODU=" }; + let { data } = await client.execute(POST, variables); let listener = jest.fn(); let listener2 = jest.fn(); @@ -325,7 +179,7 @@ describe("@grafoo/core", () => { client.write(POST, variables, data); - expect(listener).toHaveBeenCalledWith(client.read(POST, variables).objects); + expect(listener).toHaveBeenCalledWith(true); unlisten(); client.write(POST, variables, data); @@ -340,35 +194,30 @@ describe("@grafoo/core", () => { }); it("should be able read from the client with a declared initialState", async () => { - let { data } = await executeQuery(POSTS_AND_AUTHORS); + let { data } = await client.execute(POSTS_AND_AUTHORS); client.write(POSTS_AND_AUTHORS, data); - client = createClient(mockTrasport, { idFields: ["id"], initialState: client.flush() }); + client = createClient({ transport, idFields: ["id"], initialState: client.extract() }); expect(client.read(POSTS_AND_AUTHORS).data).toEqual(data); }); - it("should allow cache to be cleared using reset()", () => { - let data = { authors: [{ name: "deleteme" }] }; - client.write(SIMPLE_AUTHORS, data); - expect(client.read(SIMPLE_AUTHORS).data).toEqual(data); + it("should clear cache if reset is called", async () => { + let { data } = await client.execute(AUTHORS); + client.write(AUTHORS, data); + expect(client.read(AUTHORS).data).toEqual(data); client.reset(); - expect(client.read(SIMPLE_AUTHORS).data).toEqual(undefined); - expect(client.flush()).toEqual({ - objectsMap: {}, - pathsMap: {} - }); + expect(client.extract()).toEqual({ records: {}, paths: {} }); }); it("should accept `idFields` array in options", async () => { - let { data } = await executeQuery(AUTHORS); - - let client = createClient(mockTrasport, { idFields: ["__typename", "id"] }); + let client = createClient({ transport, idFields: ["__typename", "id"] }); + let { data } = await client.execute(AUTHORS); client.write(AUTHORS, data); - let cachedIds = Object.keys(client.flush().objectsMap); + let cachedIds = Object.keys(client.extract().records); expect(cachedIds.every((key) => /(Post|Author)/.test(key))).toBe(true); }); diff --git a/packages/core/__tests__/map-objects.ts b/packages/core/__tests__/map-objects.ts deleted file mode 100644 index 9b496c4e..00000000 --- a/packages/core/__tests__/map-objects.ts +++ /dev/null @@ -1,87 +0,0 @@ -import mapObjects from "../src/map-objects"; - -let tree = { - posts: [ - { - title: "foo", - id: "1", - __typename: "Post", - author: { - name: "miguel", - id: "2", - __typename: "Author", - posts: [ - { - title: "foo", - id: "1", - __typename: "Post", - content: "a post content", - author: { - name: "miguel", - lastName: "albernaz", - id: "2", - __typename: "Author", - }, - }, - ], - }, - }, - { - title: "bar", - id: "3", - __typename: "Post", - author: { name: "vicente", id: "4", __typename: "Author" }, - }, - { - title: "baz", - id: "5", - __typename: "Post", - author: { name: "laura", id: "6", __typename: "Author" }, - }, - ], -}; - -let idFields = ["id"]; - -describe("map-objects", () => { - it("should return the correct map of objects", () => { - let objects = mapObjects(tree, idFields); - - let expected = { - "1": { title: "foo", id: "1", __typename: "Post", content: "a post content" }, - "2": { name: "miguel", id: "2", __typename: "Author", lastName: "albernaz" }, - "3": { title: "bar", __typename: "Post", id: "3" }, - "4": { name: "vicente", id: "4", __typename: "Author" }, - "5": { title: "baz", __typename: "Post", id: "5" }, - "6": { name: "laura", id: "6", __typename: "Author" }, - }; - - expect(objects).toEqual(expected); - }); - - it("should accept null values", () => { - let result = { - data: { - me: { - id: "5a3ab7e93f662a108d978a6e", - username: "malbernaz", - email: "albernazmiguel@gmail.com", - name: null, - bio: null, - }, - }, - }; - - expect(() => mapObjects(result, idFields)).not.toThrow(); - }); - - it("should build an object identifier based on the `idFields` cache option", () => { - let idFields = ["__typename", "id"]; - - let objects = mapObjects(tree, idFields); - - let expected = ["Post1", "Author2", "Post3", "Author4", "Post5", "Author6"]; - - expect(Object.keys(objects).every((obj) => expected.some((exp) => exp === obj))).toBe(true); - }); -}); diff --git a/packages/core/__tests__/queries.ts b/packages/core/__tests__/queries.ts new file mode 100644 index 00000000..d870d137 --- /dev/null +++ b/packages/core/__tests__/queries.ts @@ -0,0 +1,118 @@ +import { graphql } from "@grafoo/core"; +import { Query, QueryPostArgs } from "@grafoo/test-utils"; + +export type AuthorsQuery = Pick; + +export let AUTHORS = graphql` + query { + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +export let SIMPLE_AUTHORS = graphql` + query { + authors { + edges { + node { + name + } + } + } + } +`; + +export type PostsAndAuthorsQuery = Pick; + +export let POSTS_AND_AUTHORS = graphql` + query { + posts { + edges { + node { + title + body + author { + name + } + } + } + } + + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +export type PostQuery = Pick; + +export let POST = graphql` + query ($id: ID!) { + post(id: $id) { + title + body + author { + name + } + } + } +`; + +export let POST_WITH_FRAGMENT = graphql` + query ($id: ID!) { + post(id: $id) { + title + body + author { + ...AuthorInfo + } + } + } + + fragment AuthorInfo on Author { + name + } +`; + +export type PostsQuery = Pick; + +export let POSTS = graphql` + query { + posts { + edges { + node { + title + body + author { + name + } + } + } + } + } +`; diff --git a/packages/core/__tests__/resolve-data.ts b/packages/core/__tests__/resolve-data.ts new file mode 100644 index 00000000..0a9e0c05 --- /dev/null +++ b/packages/core/__tests__/resolve-data.ts @@ -0,0 +1,179 @@ +import { graphql } from "@grafoo/core"; +import resolveData from "../src/resolve-data"; +import * as postsAndAuthors from "./data/posts-and-authors"; +import * as postsWithFragments from "./data/posts-with-fragments"; +import * as authorWithArguments from "./data/author-with-arguments"; + +let POSTS_AND_AUTHORS = graphql` + query { + posts { + edges { + node { + title + body + author { + name + } + } + } + } + + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +describe("resolveValues", () => { + it("should resolve the data given a simple query, a path and the records", () => { + let query = POSTS_AND_AUTHORS; + + let { data } = resolveData(query, {}, postsAndAuthors.path, postsAndAuthors.records); + + expect(data).toEqual(postsAndAuthors.data); + }); + + it("should resolve the data given a query with fragments, a path and the records", () => { + let query = graphql` + query { + posts { + edges { + node { + ...P + } + } + } + } + + fragment P on Post { + title + body + author { + ...A + } + } + + fragment A on Author { + name + posts { + edges { + node { + title + } + } + } + } + `; + + let { data } = resolveData(query, {}, postsWithFragments.path, postsWithFragments.records); + + expect(data).toEqual(postsWithFragments.data); + }); + + it("should resolve the data given a query with arguments, a path and the records", async () => { + let query = graphql` + query ($id: ID!, $first: Int!) { + author(id: $id) { + name + posts(first: $first) { + edges { + node { + title + } + } + } + } + } + `; + + let variables = { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + first: 1 + }; + + let { data } = resolveData( + query, + variables, + authorWithArguments.path, + authorWithArguments.records + ); + + expect(data).toEqual(authorWithArguments.data); + }); + + it("should resolve the data given a query with fragments and arguments, a path and the records", () => { + let query = graphql` + query ($id: ID!, $first: Int) { + author(id: $id) { + name + ...AuthorStuff + } + } + + fragment AuthorStuff on Author { + posts(first: $first) { + edges { + node { + title + } + } + } + } + `; + + let variables = { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + first: 1 + }; + + let { data } = resolveData( + query, + variables, + authorWithArguments.path, + authorWithArguments.records + ); + + expect(data).toEqual(authorWithArguments.data); + }); + + it("should yield empty objects for data and records if no paths are given", () => { + let query = graphql` + query { + authors { + name + } + } + `; + + let { data, partial } = resolveData(query, {}, {}, {}); + + expect(data).toEqual({}); + expect(partial).toEqual(true); + }); + + it("should be able to resolve values partially", () => { + let query = POSTS_AND_AUTHORS; + + let { data, partial } = resolveData( + query, + {}, + { authors: postsAndAuthors.path.authors }, + postsAndAuthors.records + ); + + expect(data).toEqual({ authors: postsAndAuthors.data.authors }); + expect(partial).toEqual(true); + }); +}); diff --git a/packages/core/__tests__/store-data.ts b/packages/core/__tests__/store-data.ts new file mode 100644 index 00000000..fce79c1e --- /dev/null +++ b/packages/core/__tests__/store-data.ts @@ -0,0 +1,201 @@ +import { graphql } from "@grafoo/core"; +import storeData from "../src/store-data"; +import * as postsAndAuthors from "./data/posts-and-authors"; +import * as postsWithFragments from "./data/posts-with-fragments"; +import * as authorWithArguments from "./data/author-with-arguments"; + +let POSTS_AND_AUTHORS = graphql` + query { + posts { + edges { + node { + title + body + author { + name + } + } + } + } + + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +let idFields = ["id"]; + +describe("storeValues", () => { + it("should yield correct path and records to a normal query", () => { + let query = POSTS_AND_AUTHORS; + + let { paths, records } = storeData(query, {}, postsAndAuthors.data, idFields); + + expect(paths).toEqual(postsAndAuthors.path); + expect(records).toEqual(postsAndAuthors.records); + }); + + it("should yield correct path and records to queries with fragments", () => { + let query = graphql` + query { + posts { + edges { + node { + ...P + } + } + } + } + + fragment P on Post { + title + body + author { + ...A + } + } + + fragment A on Author { + name + posts { + edges { + node { + title + } + } + } + } + `; + + let { paths, records } = storeData(query, {}, postsWithFragments.data, idFields); + + expect(paths).toEqual(postsWithFragments.path); + expect(records).toEqual(postsWithFragments.records); + }); + + it("should yield correct path and records to queries with arguments", () => { + let query = graphql` + query ($id: ID!, $first: Int!) { + author(id: $id) { + name + posts(first: $first) { + edges { + node { + title + } + } + } + } + } + `; + + let variables = { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + first: 1 + }; + + let { paths, records } = storeData(query, variables, authorWithArguments.data, idFields); + + expect(paths).toEqual(authorWithArguments.path); + expect(records).toEqual(authorWithArguments.records); + }); + + it("should yield correct path and records to queries with arguments and fragments", () => { + let query = graphql` + query ($id: ID!, $first: Int) { + author(id: $id) { + name + ...AuthorStuff + } + } + + fragment AuthorStuff on Author { + posts(first: $first) { + edges { + node { + title + } + } + } + } + `; + + let variables = { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + first: 1 + }; + + let { paths, records } = storeData(query, variables, authorWithArguments.data, idFields); + + expect(paths).toEqual(authorWithArguments.path); + expect(records).toEqual(authorWithArguments.records); + }); + + it("should deal correctly with null values", () => { + let query = graphql` + query { + authors { + edges { + node { + name + } + } + } + } + `; + + let data = { authors: postsAndAuthors.data.authors }; + + data.authors.edges[0].node.posts = null; + + let { paths } = storeData(query, {}, data, idFields); + + expect(paths).toEqual({ + authors: { + __typename: "AuthorConnection", + edges: [ + { + __typename: "AuthorEdge", + node: { + id: "QXV0aG9yOmExZDNhMmJjLWU1MDMtNDY0MC05MTc4LTIzY2JkMzZiNTQyYw==", + posts: null + } + }, + { + __typename: "AuthorEdge", + node: { + id: "QXV0aG9yOmExZDFjM2YwLTViZDUtNDUzZS1iNGY4LTlmNDE5NDU3ZTVhNg==", + posts: { + edges: [ + { + node: { + id: "UG9zdDphMmJjZTVmOC0yZWI3LTQyM2QtOTk0Zi1kODAwMmJkMDUwOWY=" + } + }, + { + node: { + id: "UG9zdDpiYmI5NjgyMS0wNmZhLTRlMTYtOWUxYi0zYzJhNmZiNzcxMGQ=" + } + } + ] + } + } + } + ] + } + }); + }); +}); diff --git a/packages/core/babel.config.js b/packages/core/babel.config.js new file mode 100644 index 00000000..2524bf5d --- /dev/null +++ b/packages/core/babel.config.js @@ -0,0 +1,8 @@ +module.exports = { + presets: [["@babel/preset-env", { targets: { node: "current" } }], "@babel/preset-typescript"], + env: { + test: { + plugins: ["module:@grafoo/babel-plugin"] + } + } +}; diff --git a/packages/core/package.json b/packages/core/package.json index ba6aa1fd..8ad452cf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,10 +1,15 @@ { "name": "@grafoo/core", - "version": "1.4.1", + "version": "1.4.5-next.0", "description": "grafoo client core", "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/core", + "source": "./src/index.ts", "main": "dist/index.js", - "types": "dist/index.d.ts", + "module": "dist/index.js", + "exports": { + "require": "./dist/index.cjs", + "default": "./dist/index.modern.js" + }, "author": "malbernaz", "license": "MIT", "keywords": [ @@ -18,21 +23,22 @@ "access": "public" }, "scripts": { - "build": "grafoo-bundle --input src/index.ts", + "build": "microbundle", + "watch": "microbundle watch", "test": "jest", "test:coverage": "jest --coverage" }, "jest": { "transform": { - "^.+\\.(ts|tsx|js)$": "/../../scripts/jest-setup.js" + "^.+\\.(ts|tsx|js)$": "babel-jest" }, - "resolver": "/../../scripts/resolver.js", "transformIgnorePatterns": [ - "node_modules/(?!(lowdb|steno|node-fetch|fetch-blob)/)" + "node_modules/(?!(lowdb|steno|fetch-mock|node-fetch|fetch-blob|data-uri-to-buffer|formdata-polyfill)/)" + ], + "modulePathIgnorePatterns": [ + "/__tests__/data", + "/__tests__/queries.ts" ] }, - "dependencies": { - "@grafoo/types": "^1.4.1" - }, "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" } diff --git a/packages/core/schema.graphql b/packages/core/schema.graphql index 8011416b..26c7e6bf 100644 --- a/packages/core/schema.graphql +++ b/packages/core/schema.graphql @@ -1,28 +1,267 @@ type Query { - author(id: ID!): Author! - authors: [Author!]! - post(id: ID!): Post! - posts: [Post!]! -} + author(id: ID!): Author + authors( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String -type Mutation { - createAuthor(name: String!): Author! - updateAuthor(id: ID!, name: String): Author! - deleteAuthor(id: ID!): Author! - createPost(title: String!, body: String!, author: ID!): Post! - updatePost(id: ID!, title: String, body: String): Post! - deletePost(id: ID!): Post! + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): AuthorConnection + post(id: ID!): Post + posts( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String + + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): PostConnection + + """ + Fetches an object given its ID + """ + node( + """ + The ID of an object + """ + id: ID! + ): Node } -type Author { +type Author implements Node { + """ + The ID of an object + """ id: ID! name: String! - posts: [Post!] + bio: String + posts( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String + + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): PostConnection +} + +""" +An object with an ID +""" +interface Node { + """ + The id of the object. + """ + id: ID! +} + +""" +A connection to a list of items. +""" +type PostConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [PostEdge] +} + +""" +Information about pagination in a connection. +""" +type PageInfo { + """ + When paginating forwards, are there more items? + """ + hasNextPage: Boolean! + + """ + When paginating backwards, are there more items? + """ + hasPreviousPage: Boolean! + + """ + When paginating backwards, the cursor to continue. + """ + startCursor: String + + """ + When paginating forwards, the cursor to continue. + """ + endCursor: String +} + +""" +An edge in a connection. +""" +type PostEdge { + """ + The item at the end of the edge + """ + node: Post + + """ + A cursor for use in pagination + """ + cursor: String! } -type Post { +type Post implements Node { + """ + The ID of an object + """ id: ID! title: String! body: String! author: Author! } + +""" +A connection to a list of items. +""" +type AuthorConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [AuthorEdge] +} + +""" +An edge in a connection. +""" +type AuthorEdge { + """ + The item at the end of the edge + """ + node: Author + + """ + A cursor for use in pagination + """ + cursor: String! +} + +type Mutation { + createAuthor(input: CreateAuthorInput!): CreateAuthorPayload + updateAuthor(input: UpdateAuthorInput!): UpdateAuthorPayload + deleteAuthor(input: DeleteAuthorInput!): DeleteAuthorPayload + createPost(input: CreatePostInput!): CreatePostPayload + updatePost(input: UpdatePostInput!): UpdatePostPayload + deletePost(input: DeletePostInput!): DeletePostPayload +} + +type CreateAuthorPayload { + author: Author + clientMutationId: String +} + +input CreateAuthorInput { + name: String! + bio: String + clientMutationId: String +} + +type UpdateAuthorPayload { + author: Author + clientMutationId: String +} + +input UpdateAuthorInput { + id: ID + name: String + bio: String + clientMutationId: String +} + +type DeleteAuthorPayload { + author: Author + clientMutationId: String +} + +input DeleteAuthorInput { + id: ID! + clientMutationId: String +} + +type CreatePostPayload { + post: Post + clientMutationId: String +} + +input CreatePostInput { + title: String! + body: String + authorId: ID! + clientMutationId: String +} + +type UpdatePostPayload { + post: Post + clientMutationId: String +} + +input UpdatePostInput { + id: ID! + title: String + body: String + clientMutationId: String +} + +type DeletePostPayload { + post: Post + clientMutationId: String +} + +input DeletePostInput { + id: ID! + clientMutationId: String +} diff --git a/packages/core/src/build-query-tree.ts b/packages/core/src/build-query-tree.ts deleted file mode 100644 index 787d12b4..00000000 --- a/packages/core/src/build-query-tree.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { idFromProps, isNotNullObject } from "./util"; - -export default function buildQueryTree(tree, objects, idFields) { - // clone resulting query tree - let queryTree = tree; - let stack = []; - - // populates stack with the properties of the query tree and the query tree it self - for (let i in queryTree) stack.push([i, queryTree]); - - // will loop until the stack is empty - while (stack.length) { - // pops a stack entry extracting the current key of the tree's branch - // (eg: a node or an edge) and the branch it self - let [key, currentTree] = stack.pop(); - // assigns nested branch - let branch = currentTree[key]; - // get node identifier - let identifier = idFromProps(branch, idFields); - // possible node matching object - let branchObject = objects[identifier]; - - // iterates over the child branch properties - for (let i in Object.assign({}, branch, branchObject)) { - // assigns to the child branch all properties retrieved - // from the corresponding object retrieved from the objects cache - if (identifier && branchObject) branch[i] = branchObject[i] || branch[i]; - - // pushes properties of the child branch and the branch it self to the stack - if (isNotNullObject(branch[i])) stack.push([i, branch]); - } - } - - return queryTree; -} diff --git a/packages/core/src/client.ts b/packages/core/src/client.ts new file mode 100644 index 00000000..69170365 --- /dev/null +++ b/packages/core/src/client.ts @@ -0,0 +1,85 @@ +import storeData from "./store-data"; +import resolveData from "./resolve-data"; +import { + GrafooClient, + GrafooClientOptions, + GrafooListener, + GrafooPath, + GrafooQuery, + GrafooRecords +} from "./types"; +import { deepMerge } from "./util"; + +export function createClient(options: GrafooClientOptions): GrafooClient { + let { transport, initialState, idFields } = options; + let paths: GrafooPath = initialState?.paths ?? {}; + let records: GrafooRecords = initialState?.records ?? {}; + let listeners: GrafooListener[] = []; + + function execute(query: T, variables?: T["_variablesType"]) { + return transport(query.document, variables); + } + + function listen(listener: GrafooListener) { + listeners.push(listener); + + return () => { + let index = listeners.indexOf(listener); + if (index < 0) return; + listeners.splice(index, 1); + }; + } + + function write( + query: T, + variables: T["_variablesType"], + data?: T["_queryType"] + ) { + if (!data) (data = variables), (variables = {}); + + let result = storeData(query, variables, data, idFields); + + let updateListener = shouldUpdate(result.records); + + // update paths and records + deepMerge(paths, result.paths); + deepMerge(records, result.records); + + // run listeners + for (let i in listeners) listeners[i](updateListener); + } + + function shouldUpdate(nextRecords: GrafooRecords) { + for (let i in nextRecords) { + // record has been inserted + if (!(i in records)) return true; + + for (let j in nextRecords[i]) { + // record has been updated + if (nextRecords[i][j] !== records[i]?.[j]) return true; + } + } + + for (let i in records) { + // record has been removed + if (!(i in nextRecords)) return true; + } + + return false; + } + + function read(query: T, variables?: T["_variablesType"]) { + return resolveData(query, variables, paths, records); + } + + function extract() { + return { records, paths }; + } + + function reset() { + paths = {}; + records = {}; + } + + return { execute, listen, write, read, extract, reset }; +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f919f4fe..0bfbe1bf 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,111 +1,3 @@ -import { - GrafooClient, - GrafooClientOptions, - GrafooObject, - Listener, - ObjectsMap, - Variables, - GrafooTransport, -} from "@grafoo/types"; -import buildQueryTree from "./build-query-tree"; -import mapObjects from "./map-objects"; -import { getPathId } from "./util"; - -export default function createClient( - transport: GrafooTransport, - options?: GrafooClientOptions -): GrafooClient { - let { initialState, idFields } = options; - let { pathsMap, objectsMap } = initialState || { pathsMap: {}, objectsMap: {} }; - let listeners: Listener[] = []; - - function execute({ query, frags, id }: GrafooObject, variables?: Variables) { - if (frags) for (let frag in frags) query += frags[frag]; - - return transport(query, variables, id); - } - - function listen(listener: Listener) { - listeners.push(listener); - - return () => { - let index = listeners.indexOf(listener); - - if (index < 0) return; - - listeners.splice(index, 1); - }; - } - - function write({ paths }: GrafooObject, variables: Variables, data?: T | { data: T }) { - if (!data) { - data = variables as typeof data; - variables = undefined; - } - - let objects: ObjectsMap = {}; - - for (let i in paths) { - let { name, args } = paths[i]; - let pathData = { - [name]: (data as { data: T }).data ? (data as { data: T }).data[name] : data[name], - }; - let pathObjects = mapObjects(pathData, idFields); - - Object.assign(objects, pathObjects); - - pathsMap[getPathId(i, args, variables)] = { - data: pathData, - objects: Object.keys(pathObjects), - }; - } - - // assign new values to objects in objectsMap - for (let i in objects) { - objectsMap[i] = objects[i] = Object.assign({}, objectsMap[i], objects[i]); - } - - // clean cache - let pathsObjects = []; - for (let i in pathsMap) pathsObjects = pathsObjects.concat(pathsMap[i].objects); - let allObjects = new Set(pathsObjects); - for (let i in objectsMap) if (!allObjects.has(i)) delete objectsMap[i]; - - // run listeners - for (let i in listeners) listeners[i](objects); - } - - function read({ paths }: GrafooObject, variables?: Variables) { - let data = {}; - let objects: ObjectsMap = {}; - let partial = false; - - for (let i in paths) { - let { name, args } = paths[i]; - let currentPath = pathsMap[getPathId(i, args, variables)]; - - if (currentPath) { - data[name] = currentPath.data[name]; - - for (let i of currentPath.objects) objects[i] = objectsMap[i]; - } else { - partial = true; - } - } - - return Object.keys(data).length - ? { data: buildQueryTree(data, objectsMap, idFields), objects, partial } - : {}; - } - - function flush() { - return { objectsMap, pathsMap }; - } - - function reset() { - pathsMap = {}; - objectsMap = {}; - } - - return { execute, listen, write, read, flush, reset }; -} +export * from "./types"; +export * from "./tag"; +export * from "./client"; diff --git a/packages/core/src/map-objects.ts b/packages/core/src/map-objects.ts deleted file mode 100644 index 18a8bf54..00000000 --- a/packages/core/src/map-objects.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { isNotNullObject, idFromProps } from "./util"; - -export default function mapObjects(tree, idFields) { - // map in which objects will be stored - // having their extracted ids from props as key - let map = {}; - let stack = []; - - // populates the stack with the tree branches - for (let i in tree) stack.push(tree[i]); - - // will run until the stack is empty - while (stack.length) { - // pops the current branch from the stack - let branch = stack.pop(); - // next node to be traversed. nested branches will be removed - let filteredBranch = {}; - - // iterate over branch properties - // if the property is a branch it will be added to the stack - // else if it is not a branch it will be added to filtered branch - for (let i in branch) { - let branchVal = branch[i]; - (isNotNullObject(branchVal) && stack.push(branchVal)) || (filteredBranch[i] = branchVal); - } - - // node identifier - let identifier = idFromProps(branch, idFields); - - // if branch is a node, assign the value of filtered branch to it - if (identifier) map[identifier] = Object.assign({}, map[identifier], filteredBranch); - } - - return map; -} diff --git a/packages/core/src/resolve-data.ts b/packages/core/src/resolve-data.ts new file mode 100644 index 00000000..7582cec3 --- /dev/null +++ b/packages/core/src/resolve-data.ts @@ -0,0 +1,49 @@ +import { GrafooPath, GrafooQuery, GrafooRecords, GrafooSelection } from "./types"; +import { getPathId, getPathType, resolveSelection } from "./util"; + +export default function resolveData( + { operation, fragments }: T, + variables: T["_variablesType"], + allPaths: GrafooPath, + allRecords: GrafooRecords +) { + let data = {} as T["_queryType"]; + let partial = false; + let stack: [GrafooSelection, GrafooPath<{ id?: string }>, any][] = [[operation, allPaths, data]]; + + // traverse operation selection + while (stack.length) { + let [select, path, data] = stack.shift(); + + if (Array.isArray(path)) { + // if path is an array increment the stack with + // the current selection and path children + for (let [index, item] of Object.entries(path)) { + // assign path type to data key + data[index] = getPathType(item); + stack.unshift([select, item, data[index]]); + } + } else { + let currentSelect = resolveSelection(select, fragments); + let record = allRecords[path.id]; + + for (let s of currentSelect.scalars) data[s] = record?.[s] ?? path?.[s]; + + for (let [name, value] of Object.entries(currentSelect.select)) { + let pathId = getPathId(name, value.args, variables); + let newPath = path[pathId]; + + // skip selection if path is undefined + if (newPath === undefined) { + partial = true; + } else { + // assign path type to data key + data[name] = getPathType(newPath); + if (newPath) stack.unshift([value, newPath, data[name]]); + } + } + } + } + + return { data, partial }; +} diff --git a/packages/core/src/store-data.ts b/packages/core/src/store-data.ts new file mode 100644 index 00000000..63bd8c2a --- /dev/null +++ b/packages/core/src/store-data.ts @@ -0,0 +1,58 @@ +import { GrafooPath, GrafooQuery, GrafooRecords, GrafooSelection } from "./types"; +import { idFromBranch, getPathId, resolveSelection } from "./util"; + +export default function storeData( + { operation, fragments }: T, + variables: T["_variablesType"], + data: T["_queryType"], + idFields: string[] +) { + let records: GrafooRecords = {}; + let paths: GrafooPath = {}; + let stack: [string, any, GrafooSelection, GrafooPath][] = Object.entries(data).map((e) => [ + ...e, + operation, + paths + ]); + + // traverse data tree + while (stack.length) { + let [name, branch, select, path] = stack.shift(); + let isArrayChild = isNaN(parseInt(name)); + let currentSelect = resolveSelection(isArrayChild ? select.select[name] : select, fragments); + let pathId = isArrayChild ? getPathId(name, currentSelect.args, variables) : name; + + // skip if a branch is null or undefined + if (!branch) { + path[pathId] = branch; + continue; + } + + if (Array.isArray(branch)) { + path[pathId] = []; + } else { + let id = idFromBranch(branch, idFields); + + path[pathId] = { ...(id && { id }) }; + + for (let field of currentSelect.scalars) { + if (id) { + // create a record + records[id] = records[id] ?? {}; + // populate record with branch scalar values + records[id][field] = branch[field]; + } else { + // add scalars to the path object if the node doesn't have id fields + path[pathId][field] = branch[field]; + } + } + } + + // look for new branches and increment stack + for (let [k, v] of Object.entries(branch)) { + if (typeof v === "object") stack.unshift([k, v, currentSelect, path[pathId]]); + } + } + + return { paths, records }; +} diff --git a/packages/core/src/tag.ts b/packages/core/src/tag.ts new file mode 100644 index 00000000..51d6a9f1 --- /dev/null +++ b/packages/core/src/tag.ts @@ -0,0 +1,6 @@ +import { GrafooQuery } from "./types"; + +// @ts-ignore +export function graphql(strs: TemplateStringsArray): GrafooQuery {} + +export let gql = graphql; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts new file mode 100644 index 00000000..3d9e41c5 --- /dev/null +++ b/packages/core/src/types.ts @@ -0,0 +1,70 @@ +export type GraphQlError = { + message: string; + locations: { line: number; column: number }[]; + path: string[]; +}; + +export type GraphQlPayload = { + data: T; + errors?: GraphQlError[]; +}; + +export type GrafooTransport = ( + query: string, + variables?: unknown, + id?: string +) => Promise>; + +export type GrafooRecords = Record>; + +export type GrafooListener = (shouldUpdate: boolean) => void; + +export type GrafooInitialState = { + records: GrafooRecords; + paths: GrafooPath; +}; + +export type GrafooPath = + | { [U in keyof T]: U extends "id" ? string : GrafooPath } + | GrafooPath[] + | null; + +export type GrafooSelection = { + args?: Record; + scalars?: string[]; + fragments?: string[]; + select?: Record; +}; + +export type GrafooQuery = { + document: string; + id?: string; + operation?: GrafooSelection; + fragments?: GrafooSelection; + _queryType?: T; + _variablesType?: U; +}; + +export type GrafooClient = { + execute: ( + query: T, + variables?: T["_variablesType"] + ) => Promise>; + write: { + (query: T, variables: T["_variablesType"], data: T["_queryType"]): void; + (query: T, data: T["_queryType"]): void; + }; + read: ( + query: T, + variables?: T["_variablesType"] + ) => { data: T["_queryType"]; partial: boolean }; + listen: (listener: GrafooListener) => () => void; + extract: () => GrafooInitialState; + reset: () => void; +}; + +export type GrafooClientOptions = { + transport: GrafooTransport; + idFields: Array; + initialState?: GrafooInitialState; +}; diff --git a/packages/core/src/util.ts b/packages/core/src/util.ts index 93b39847..a02dc7f5 100644 --- a/packages/core/src/util.ts +++ b/packages/core/src/util.ts @@ -1,24 +1,80 @@ -import { Variables } from "@grafoo/types"; +import { GrafooPath, GrafooQuery, GrafooSelection } from "./types"; -export let idFromProps = (branch, idFields) => { - branch = branch || {}; - let identifier = ""; +export let idFromBranch = (branch: T, idFields: string[]) => + branch + ? idFields + .map((i) => branch[i]) + .filter(Boolean) + .join(":") + : ""; - for (let i = 0; i < idFields.length; i++) { - branch[idFields[i]] && (identifier += branch[idFields[i]]); +export function getPathId( + path: string, + args: Record = {}, + variables: T["_variablesType"] +) { + variables = variables ?? {}; + args = args ?? {}; + + let ids = Object.entries(args).map(([name, value]) => { + let rgx = /^\$(?\w+)/i; + let { variable } = rgx.exec(value)?.groups ?? {}; + let finalValue = variable ? variables[variable] : value; + + return `${name}:${finalValue}`; + }); + + return [path].concat(ids).join(":"); +} + +export function resolveSelection( + selection: GrafooSelection = {}, + fragments: GrafooSelection +): GrafooSelection { + let newArgs = selection.args ?? {}; + let newScalars = selection.scalars ?? []; + let newSelection = selection.select ?? {}; + let newFragments = []; + + if (selection.fragments) { + for (let f of selection.fragments) { + let fragment = fragments.select[f]; + newScalars = [...newScalars, ...(fragment.scalars ?? [])]; + newFragments = [...newFragments, ...(fragment.fragments ?? [])]; + newSelection = { ...newSelection, ...fragment.select }; + } } - return identifier; -}; + return { + args: newArgs, + select: newSelection, + scalars: [...new Set(newScalars)], + fragments: [...new Set(newFragments)] + }; +} + +export function getPathType(path: GrafooPath) { + return path ? (Array.isArray(path) ? [] : {}) : null; +} -export let isNotNullObject = (obj) => obj && typeof obj == "object"; +function isObject(item: any) { + return typeof item === "object" && !Array.isArray(item); +} -export let getPathId = (path: string, args: string[], variables?: Variables) => { - variables = variables || {}; - let finalPath = path; - let i = args.length; +export function deepMerge(target: any, ...sources: any[]) { + if (!sources.length) return target; + let source = sources.shift(); - while (i--) finalPath += ":" + variables[args[i]]; + if (isObject(target) && isObject(source)) { + for (let key in source) { + if (isObject(source[key])) { + if (!target[key]) target[key] = {}; + deepMerge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + } - return finalPath; -}; + return deepMerge(target, ...sources); +} diff --git a/packages/core/tag.d.ts b/packages/core/tag.d.ts deleted file mode 100644 index 11234c48..00000000 --- a/packages/core/tag.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module "@grafoo/core/tag" { - import { GrafooObject } from "@grafoo/types"; - - export default function graphql(strs: TemplateStringsArray): GrafooObject; -} diff --git a/packages/core/tag.js b/packages/core/tag.js deleted file mode 100644 index b9f4afe5..00000000 --- a/packages/core/tag.js +++ /dev/null @@ -1,8 +0,0 @@ -function graphql() { - throw new Error( - "@grafoo/core/tag: if you are getting this error it means your queries are not being transpiled" - ); -} - -module.exports = graphql; -module.exports.default = graphql; diff --git a/packages/http-transport/.npmignore b/packages/http-transport/.npmignore deleted file mode 100644 index bd8c7c39..00000000 --- a/packages/http-transport/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -__tests__ -.rpt2_cache -.babelrc -schema.graphql diff --git a/packages/http-transport/__tests__/index.ts b/packages/http-transport/__tests__/index.ts deleted file mode 100644 index 3aba89e9..00000000 --- a/packages/http-transport/__tests__/index.ts +++ /dev/null @@ -1,88 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ - -import { GrafooTransport } from "@grafoo/types"; -import createTransport from "../src"; - -jest.mock("node-fetch", () => require("fetch-mock").sandbox()); -let fetchMock = require("node-fetch"); -global.fetch = fetchMock; - -let fakeAPI = "http://fake-api.com/graphql"; -let query = "{ hello }"; - -describe("@grafoo/http-transport", () => { - let request: GrafooTransport; - beforeEach(() => { - request = createTransport(fakeAPI); - fetchMock.restore(); - }); - - it("should perform a simple request", async () => { - await mock(async () => { - await request(query); - - let [, { body, headers, method }] = fetchMock.lastCall(); - - expect(method).toBe("POST"); - expect(body).toBe(JSON.stringify({ query })); - expect(headers).toEqual({ "Content-Type": "application/json" }); - }); - }); - - it("should perform a request with variables", async () => { - await mock(async () => { - let variables = { some: "variable" }; - - await request(query, variables); - - let [, { body }] = fetchMock.lastCall(); - - expect(JSON.parse(body as string).variables).toEqual(variables); - }); - }); - - it("should accept fetchObjects as an object", async () => { - request = createTransport(fakeAPI, { headers: { authorization: "Bearer some-token" } }); - - await mock(async () => { - await request(query); - - let [, { headers }] = fetchMock.lastCall(); - - expect(headers).toEqual({ - authorization: "Bearer some-token", - "Content-Type": "application/json" - }); - }); - }); - - it("should accept fetchObjects as a function", async () => { - request = createTransport(fakeAPI, () => ({ headers: { authorization: "Bearer some-token" } })); - - await mock(async () => { - await request(query); - - let [, { headers }] = fetchMock.lastCall(); - - expect(headers).toEqual({ - authorization: "Bearer some-token", - "Content-Type": "application/json" - }); - }); - }); - - it("should handle graphql errors", async () => { - let response = { data: null, errors: [{ message: "I AM ERROR!" }] }; - - await mock( - async () => expect(request(query)).resolves.toMatchObject({ errors: response.errors }), - response - ); - }); -}); - -async function mock(testFn, response?: any) { - fetchMock.mock(fakeAPI, response || { data: { hello: "world" } }); - - await testFn(); -} diff --git a/packages/http-transport/__tests__/tsconfig.json b/packages/http-transport/__tests__/tsconfig.json deleted file mode 100644 index 97adb0a4..00000000 --- a/packages/http-transport/__tests__/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../tsconfig", - "include": ["."] -} diff --git a/packages/http-transport/readme.md b/packages/http-transport/readme.md deleted file mode 100644 index bc5c11c7..00000000 --- a/packages/http-transport/readme.md +++ /dev/null @@ -1,96 +0,0 @@ -# `@grafoo/http-transport` - -

A Simple HTTP Client for GraphQL Servers

- -

- - build - - - coverage - - - npm - - - downloads - - - size - - - code style: prettier - - - mantained with: lerna - - - slack - -

- -## Install - -``` -$ npm i @grafoo/http-transport -``` - -## Usage - -`@grafoo/http-transport` default export is a factory that accepts as arguments `uri` and `fetchOptions` (that can be an object or a function): - -```js -import createTransport from "@grafoo/http-transport"; - -const request = createTransport("http://some.graphql.api", () => ({ - headers: { - authorization: storage.getItem("authorization") - } -})); - -const USER_QUERY = ` - query($id: ID!) { - user(id: $id) { - name - } - } -`; - -const variables = { id: 123 }; - -request(USER_QUERY, variables).then(({ data }) => { - console.log(data.user); -}); -``` - -## Warning - -As this package uses `fetch` and `Object.assign` under the hood, make sure to install the proper polyfills if you want to use it in your project. - -## LICENSE - -[MIT](https://github.com/grafoojs/grafoo/blob/master/LICENSE) diff --git a/packages/http-transport/src/index.ts b/packages/http-transport/src/index.ts deleted file mode 100644 index 28d5d4ff..00000000 --- a/packages/http-transport/src/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { GraphQlPayload, GrafooTransport, Variables } from "@grafoo/types"; - -export default function createTransport( - url: string, - options?: RequestInit | (() => RequestInit) -): GrafooTransport { - return (query: string, variables?: Variables): Promise> => { - options = typeof options == "function" ? options() : options || {}; - - return fetch( - url, - Object.assign(options, { - body: JSON.stringify({ query, variables }), - method: "POST", - headers: Object.assign({ "Content-Type": "application/json" }, options.headers), - }) - ).then((response) => response.json()); - }; -} diff --git a/packages/macro/.babelrc.json b/packages/macro/.babelrc.json new file mode 100644 index 00000000..6e63b6e0 --- /dev/null +++ b/packages/macro/.babelrc.json @@ -0,0 +1,6 @@ +{ + "presets": [ + ["@babel/preset-env", { "targets": { "node": "current" } }], + "@babel/preset-typescript" + ] +} diff --git a/packages/macro/.grafoorc.json b/packages/macro/.grafoorc.json new file mode 100644 index 00000000..7f30f4ce --- /dev/null +++ b/packages/macro/.grafoorc.json @@ -0,0 +1,5 @@ +{ + "schema": "schema.graphql", + "idFields": ["id", "__typename"], + "compress": true +} diff --git a/packages/macro/__tests__/index.ts b/packages/macro/__tests__/index.ts new file mode 100644 index 00000000..b44d5919 --- /dev/null +++ b/packages/macro/__tests__/index.ts @@ -0,0 +1,37 @@ +import pluginTester from "babel-plugin-tester"; +import plugin from "babel-plugin-macros"; + +let output = ` +let query = { + document: "{authors{__typename id name}}", + operation: { + select: { + authors: { + scalars: ["__typename", "id", "name"] + } + } + } +}; +`.trim(); + +pluginTester({ + plugin, + pluginName: "@grafoo/macro", + babelOptions: { filename: __filename }, + tests: { + "should throw if a tagged template string literal has expressions in it": { + code: ` + import graphql from "../src/macro"; + let query = graphql\`{ user(id: "\${1}") { name } }\`; + `, + error: true + }, + "should replace a tagged template literal with the compiled grafoo object": { + code: ` + import graphql from "../src/macro"; + let query = graphql\`{ authors {name} }\`; + `, + output + } + } +}); diff --git a/packages/http-transport/package.json b/packages/macro/package.json similarity index 59% rename from packages/http-transport/package.json rename to packages/macro/package.json index 7dfccb28..95f34ddf 100644 --- a/packages/http-transport/package.json +++ b/packages/macro/package.json @@ -1,13 +1,14 @@ { - "name": "@grafoo/http-transport", - "description": "grafoo client standard transport", - "version": "1.4.1", - "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/transport", + "name": "@grafoo/macro", + "version": "1.4.2-next.0", + "description": "grafoo client babel macro", + "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/macro", "main": "dist/index.js", - "types": "dist/index.d.ts", "author": "malbernaz", "license": "MIT", "keywords": [ + "babel", + "babel-macro", "graphql", "graphql-client", "grafoo" @@ -16,22 +17,22 @@ "access": "public" }, "scripts": { - "build": "grafoo-bundle --input src/index.ts", + "build": "tsc --declaration", "test": "jest", "test:coverage": "jest --coverage" }, "jest": { "transform": { - "^.+\\.(ts|tsx|js)$": "/../../scripts/jest-setup.js" + "^.+\\.(ts|tsx|js)$": "babel-jest" }, - "resolver": "/../../scripts/resolver.js", "transformIgnorePatterns": [ "node_modules/(?!(lowdb|steno|node-fetch|fetch-blob)/)" ] }, "dependencies": { - "@grafoo/types": "^1.4.1", - "grafoo-bundle": "^1.4.1" + "@babel/parser": "^7.16.4", + "@grafoo/compiler": "^1.4.2-next.0", + "babel-plugin-macros": "^3.1.0" }, "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" } diff --git a/packages/macro/schema.graphql b/packages/macro/schema.graphql new file mode 100644 index 00000000..55365803 --- /dev/null +++ b/packages/macro/schema.graphql @@ -0,0 +1,63 @@ +type Post { + id: ID! + title: String! + slug: String! + body: String! + published: Boolean! + createdAt: String! + updateAt: String! + authors: [Author!]! + author: Author! + tags: [Tag!]! +} + +union Viewer = Visitor | User + +type Tag { + id: ID! + name: String! + posts: [Post!]! + createdAt: String! + updateAt: String! +} + +interface User { + id: ID! + username: String! + email: String! + createdAt: String! + updatedAt: String! +} + +type Author implements User { + id: ID! + name: String + bio: String + posts: [Post!]! +} + +type Visitor { + id: ID! + ip: String! +} + +type Mutation { + createPost(title: String!, body: String!, authors: [ID!]!, tags: [String!]): Post + deletePost(id: ID): Post + createTag(name: String!): Tag + register(username: String!, email: String!, password: String!): User + login(email: String!, password: String!): String + updateUser(username: String, name: String, bio: String, email: String, password: String): User +} + +type Query { + author(id: ID!): Author + authors(start: Int!, offset: Int!): [Author] + posts(start: Int!, offset: Int!): [Post] + post(id: ID!): Post + tag(id: ID!): Tag + users(start: Int!, offset: Int!): [User] + user(id: ID!): User + me: User + viewer: Viewer +} diff --git a/packages/macro/src/index.ts b/packages/macro/src/index.ts new file mode 100644 index 00000000..941179c2 --- /dev/null +++ b/packages/macro/src/index.ts @@ -0,0 +1 @@ +export { default } from "./macro"; diff --git a/packages/macro/src/macro.ts b/packages/macro/src/macro.ts new file mode 100644 index 00000000..338a3e83 --- /dev/null +++ b/packages/macro/src/macro.ts @@ -0,0 +1,28 @@ +import type bc from "@babel/core"; +import { parseExpression } from "@babel/parser"; +import { createMacro } from "babel-plugin-macros"; +import compileDocument from "@grafoo/compiler"; +import { graphql } from "@grafoo/core"; + +export default createMacro(({ references }) => { + for (let ref of references.default) { + let path = ref as bc.NodePath; + let targetPath = path.parentPath; + + if (targetPath.type === "TaggedTemplateExpression") { + let quasi = ref.parentPath.get("quasi") as bc.NodePath; + + let expressions = quasi.get("expressions"); + + if (expressions.length) { + throw expressions[0].buildCodeFrameError( + "@grafoo/macro: interpolation is not supported in a graphql tagged template literal." + ); + } + + let source = quasi.node.quasis.reduce((src, q) => src + q.value.raw, ""); + let query = compileDocument(source); + targetPath.replaceWith(parseExpression(query)); + } + } +}) as typeof graphql; diff --git a/packages/macro/tsconfig.json b/packages/macro/tsconfig.json new file mode 100644 index 00000000..aa4e1c88 --- /dev/null +++ b/packages/macro/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "strict": false, + "lib": ["esnext", "dom"], + "noUnusedLocals": true, + "noUnusedParameters": true, + "checkJs": false, + "downlevelIteration": true, + "esModuleInterop": true, + "outDir": "./dist", + "module": "commonjs" + }, + "include": ["src"] +} diff --git a/packages/preact/.babelrc b/packages/preact/.babelrc deleted file mode 100644 index 3801fd21..00000000 --- a/packages/preact/.babelrc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "presets": [ - ["@babel/preset-env", { "targets": { "node": 10 } }], - ["@babel/preset-react", { "pragma": "h" }], - ["@babel/preset-typescript", { "jsxPragma": "h" }] - ], - "plugins": [ - ["babel-plugin-jsx-pragmatic", { "module": "preact", "export": "h", "import": "h" }], - [ - "module:@grafoo/babel-plugin", - { "schema": "schema.graphql", "idFields": ["id", "__typename"] } - ] - ] -} diff --git a/packages/preact/.npmignore b/packages/preact/.npmignore deleted file mode 100644 index bd8c7c39..00000000 --- a/packages/preact/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -__tests__ -.rpt2_cache -.babelrc -schema.graphql diff --git a/packages/preact/__tests__/index.tsx b/packages/preact/__tests__/index.tsx deleted file mode 100644 index 8249c21d..00000000 --- a/packages/preact/__tests__/index.tsx +++ /dev/null @@ -1,424 +0,0 @@ -/** - * @jest-environment jsdom - */ - -import createClient from "@grafoo/core"; -import graphql from "@grafoo/core/tag"; -import createTransport from "@grafoo/http-transport"; -import { mockQueryRequest } from "@grafoo/test-utils"; -import { GrafooClient } from "@grafoo/types"; -import { h, FunctionalComponent, Component } from "preact"; -import { render } from "preact-render-spy"; -import { Consumer, Provider } from "../src"; - -interface Post { - title: string; - content: string; - id: string; - __typename: string; - author: Author; -} - -interface Author { - name: string; - id: string; - __typename: string; - posts?: Array; -} - -interface Authors { - authors: Author[]; -} - -let AUTHOR = graphql` - query ($id: ID!) { - author(id: $id) { - name - } - } -`; - -let AUTHORS = graphql` - { - authors { - name - posts { - title - body - } - } - } -`; - -let CREATE_AUTHOR = graphql` - mutation ($name: String!) { - createAuthor(name: $name) { - name - } - } -`; - -let POSTS_AND_AUTHORS = graphql` - { - posts { - title - body - author { - name - } - } - - authors { - name - posts { - title - body - } - } - } -`; - -describe("@grafoo/preact", () => { - let client: GrafooClient; - - beforeEach(() => { - jest.resetAllMocks(); - - let transport = createTransport("https://some.graphql.api/"); - client = createClient(transport, { idFields: ["id"] }); - }); - - describe("", () => { - it("should provide the client in it's context", (done) => { - let Comp = (_, context) => { - expect(context.client).toBe(client); - - return null; - }; - - render( - - - - ); - - done(); - }); - }); - - describe("", () => { - it("should not crash if a query is not given as prop", () => { - expect(() => - render( - - {() => null} - - ) - ).not.toThrow(); - }); - - it("should not fetch a query if skip prop is set to true", async () => { - await mockQueryRequest(AUTHORS); - - let spy = jest.spyOn(window, "fetch"); - - render( - - - {() => null} - - - ); - - expect(spy).not.toHaveBeenCalled(); - }); - - it("should trigger listen on client instance", async () => { - await mockQueryRequest(AUTHORS); - - let spy = jest.spyOn(client, "listen"); - - render( - - - {() => null} - - - ); - - expect(spy).toHaveBeenCalled(); - }); - - it("should not crash on unmount", () => { - let ctx = render( - - - {() => null} - - - ); - - expect(() => ctx.render(null)).not.toThrow(); - }); - - it("should execute render with default render argument", () => { - let mockRender = jest.fn(); - - render( - - - {mockRender} - - - ); - - let [[call]] = mockRender.mock.calls; - - expect(call).toMatchObject({ loading: false, loaded: false }); - expect(typeof call.load).toBe("function"); - }); - - it("should execute render with the right data if a query is specified", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: true, loaded: false }), - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }) - ]); - - render( - - {mockRender} - - ); - }); - }); - - it("should render if skip changed value to true", (done) => { - mockQueryRequest(AUTHORS).then(async ({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: false, loaded: false }), - (props) => expect(props).toMatchObject({ loading: true, loaded: false }), - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }), - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }) - ]); - - let App: FunctionalComponent<{ skip?: boolean }> = ({ skip = false }) => ( - - - {mockRender} - - - ); - - let ctx = render(); - - ctx.render(); - - await new Promise((resolve) => setTimeout(resolve, 10)); - - ctx.render(); - }); - }); - - it("should rerender if variables prop has changed", (done) => { - mockQueryRequest(AUTHORS).then(async ({ data }) => { - let mock = async (variables) => { - return ( - await mockQueryRequest<{ author: Author }>({ - query: AUTHOR.query, - variables - }) - ).data.author; - }; - - let firstVariables = { id: data.authors[0].id }; - let secondVariables = { id: data.authors[1].id }; - let firstAuthor = await mock(firstVariables); - let secondAuthor; - - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: true, loaded: false }), - (props) => expect(props.author).toMatchObject(firstAuthor), - (props) => - expect(props).toMatchObject({ loading: true, loaded: true, author: firstAuthor }), - (props) => expect(props.author).toMatchObject(secondAuthor) - ]); - - class AuthorComponent extends Component { - constructor(props, context) { - super(props, context); - - this.state = firstVariables; - - setTimeout(async () => { - secondAuthor = await mock(secondVariables); - - this.setState(secondVariables); - }, 100); - } - - render(_, variables) { - return ( - - {mockRender} - - ); - } - } - - render( - - - - ); - }); - }); - - it("should not trigger a network request if the query is already cached", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - client.write(AUTHORS, data); - - jest.resetAllMocks(); - - let spy = jest.spyOn(client, "execute"); - - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }) - ]); - - render( - - {mockRender} - - ); - - expect(spy).not.toHaveBeenCalled(); - }); - }); - - it("should handle simple mutations", (done) => { - let { query } = CREATE_AUTHOR; - let variables = { name: "Bart" }; - - mockQueryRequest({ query, variables }).then(({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => { - props.createAuthor(variables).then((res) => { - expect(res.data).toEqual(data); - }); - } - ]); - - render( - - {mockRender} - - ); - }); - }); - - it("should handle mutations with cache update", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => { - expect(props).toMatchObject({ loading: true, loaded: false }); - expect(typeof props.createAuthor).toBe("function"); - }, - (props) => { - expect(props).toMatchObject({ loading: false, loaded: true, ...data }); - let variables = { name: "Homer" }; - mockQueryRequest({ query: CREATE_AUTHOR.query, variables }).then(() => { - props.createAuthor(variables); - }); - }, - (props) => { - expect(props.authors.length).toBe(data.authors.length + 1); - let newAuthor = props.authors.find((a) => a.id === "tempID"); - expect(newAuthor).toMatchObject({ name: "Homer", id: "tempID" }); - }, - (props) => { - expect(props.authors.find((a) => a.id === "tempID")).toBeUndefined(); - expect(props.authors.find((a) => a.name === "Homer")).toBeTruthy(); - } - ]); - - render( - - ({ - authors: [...authors, { ...variables, id: "tempID" }] - }), - update: ({ authors }, { createAuthor: author }) => ({ - authors: authors.map((a) => (a.id === "tempID" ? author : a)) - }) - } - }} - > - {mockRender} - - - ); - }); - }); - - it("should reflect updates that happen outside of the component", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - client.write(AUTHORS, data); - - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }), - (props) => expect(props.authors[0].name).toBe("Homer") - ]); - - render( - - {mockRender} - - ); - - client.write(AUTHORS, { - authors: data.authors.map((a, i) => (!i ? { ...a, name: "Homer" } : a)) - }); - }); - }); - - it("should not trigger a network request if a query field is cached", (done) => { - mockQueryRequest(POSTS_AND_AUTHORS).then(({ data }) => { - client.write(POSTS_AND_AUTHORS, data); - - let spy = jest.spyOn(client, "execute"); - - let mockRender = createMockRenderFn(done, [ - (props) => { - expect(props).toMatchObject({ authors: data.authors, loading: false, loaded: true }); - expect(spy).not.toHaveBeenCalled(); - } - ]); - - render( - - {mockRender} - - ); - }); - }); - }); -}); - -function createMockRenderFn(done, assertionsFns) { - let currentRender = 0; - - return (props) => { - let assert = assertionsFns[currentRender]; - - if (assert) assertionsFns[currentRender](props); - - if (currentRender++ === assertionsFns.length - 1) done(); - - return null; - }; -} diff --git a/packages/preact/__tests__/tsconfig.json b/packages/preact/__tests__/tsconfig.json deleted file mode 100644 index 97adb0a4..00000000 --- a/packages/preact/__tests__/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../tsconfig", - "include": ["."] -} diff --git a/packages/preact/readme.md b/packages/preact/readme.md deleted file mode 100644 index d8c4fc65..00000000 --- a/packages/preact/readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# `@grafoo/preact` - -

Grafoo Preact Bindings

- -

- - build - - - coverage - - - npm - - - downloads - - - size - - - code style: prettier - - - mantained with: lerna - - - slack - -

- -## Install - -``` -$ npm i @grafoo/{core,react} && npm i -D @grafoo/babel-plugin -``` - -## API - -For documentation please refer to [`@grafoo/react`](https://github.com/grafoojs/grafoo/tree/master/packages/react)'s page since both modules share the same API. - -## Example - -**`index.js`** - -```jsx -import { h, render } from "preact"; -import createClient from "@grafoo/core"; -import { Provider } from "@grafoo/preact"; - -import Posts from "./Posts"; - -function fetchQuery(query, variables) { - const init = { - method: "POST", - body: JSON.stringify({ query, variables }), - headers: { - "content-type": "application/json" - } - }; - - return fetch("http://some.graphql.api", init).then(res => res.json()); -} - -const client = createClient(fetchQuery); - -render( - - - , - document.getElementById("mnt") -); -``` - -**`Posts.js`** - -```jsx -import { h } from "preact"; -import gql from "@grafoo/core/tag"; -import { Consumer } from "@grafoo/preact"; - -const ALL_POSTS = gql` - query getPosts($orderBy: PostOrderBy) { - allPosts(orderBy: $orderBy) { - title - content - createdAt - updatedAt - } - } -`; - -export default function Posts() { - return ( - - {({ client, load, loaded, loading, errors, allPosts }) => ( -

- 👆 do whatever you want with the variables above 👆 -

- )} -
- ); -} -``` - -## LICENSE - -[MIT](https://github.com/grafoojs/grafoo/blob/master/LICENSE) diff --git a/packages/preact/schema.graphql b/packages/preact/schema.graphql deleted file mode 100644 index 8011416b..00000000 --- a/packages/preact/schema.graphql +++ /dev/null @@ -1,28 +0,0 @@ -type Query { - author(id: ID!): Author! - authors: [Author!]! - post(id: ID!): Post! - posts: [Post!]! -} - -type Mutation { - createAuthor(name: String!): Author! - updateAuthor(id: ID!, name: String): Author! - deleteAuthor(id: ID!): Author! - createPost(title: String!, body: String!, author: ID!): Post! - updatePost(id: ID!, title: String, body: String): Post! - deletePost(id: ID!): Post! -} - -type Author { - id: ID! - name: String! - posts: [Post!] -} - -type Post { - id: ID! - title: String! - body: String! - author: Author! -} diff --git a/packages/preact/src/consumer.ts b/packages/preact/src/consumer.ts deleted file mode 100644 index aa0d046f..00000000 --- a/packages/preact/src/consumer.ts +++ /dev/null @@ -1,59 +0,0 @@ -import createBindings from "@grafoo/bindings"; -import { - Context, - GrafooBoundState, - GrafooBoundMutations, - GrafooConsumerProps, -} from "@grafoo/types"; -import { Component, VNode } from "preact"; - -/** - * T = Query - * U = Mutations - */ -type GrafooRenderFn = (renderProps: GrafooBoundState & T & GrafooBoundMutations) => VNode; - -/** - * T = Query - * U = Mutations - */ -type GrafooPreactConsumerProps = GrafooConsumerProps & { - children?: GrafooRenderFn; -}; - -/** - * T = Query - * U = Mutations - */ -export class Consumer extends Component> { - state: GrafooBoundState & T & GrafooBoundMutations; - - constructor(props: GrafooPreactConsumerProps, context: Context) { - super(props, context); - - let bindings = createBindings(context.client, props, () => { - this.setState(bindings.getState()); - }); - - this.state = bindings.getState(); - - this.componentDidMount = () => { - if (props.skip || !props.query || this.state.loaded) return; - - this.state.load(); - }; - - this.componentWillReceiveProps = (next) => { - if ((!this.state.loaded && !next.skip) || props.variables !== next.variables) - this.state.load(next.variables); - }; - - this.componentWillUnmount = () => { - bindings.unbind(); - }; - } - - render(props, state): VNode { - return props.children[0](state); - } -} diff --git a/packages/preact/src/index.ts b/packages/preact/src/index.ts deleted file mode 100644 index d386ed57..00000000 --- a/packages/preact/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./provider"; -export * from "./consumer"; diff --git a/packages/preact/src/provider.ts b/packages/preact/src/provider.ts deleted file mode 100644 index ae5ae6ca..00000000 --- a/packages/preact/src/provider.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Context } from "@grafoo/types"; -import { Component } from "preact"; - -type GrafooPreactProviderProps = Context & { children?: JSX.Element }; - -export class Provider extends Component { - getChildContext(): Context { - return { client: this.props.client }; - } - - render(props: GrafooPreactProviderProps): JSX.Element { - return props.children[0]; - } -} diff --git a/packages/react/.babelrc b/packages/react/.babelrc deleted file mode 100644 index 3ebce728..00000000 --- a/packages/react/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presets": [ - ["@babel/preset-env", { "targets": { "node": 10 } }], - "@babel/preset-react", - "@babel/preset-typescript" - ], - "plugins": [ - [ - "module:@grafoo/babel-plugin", - { "schema": "schema.graphql", "idFields": ["id"] } - ] - ] -} diff --git a/packages/react/.grafoorc.json b/packages/react/.grafoorc.json new file mode 100644 index 00000000..0c00d834 --- /dev/null +++ b/packages/react/.grafoorc.json @@ -0,0 +1,4 @@ +{ + "schema": "schema.graphql", + "idFields": ["id", "__typename"] +} diff --git a/packages/react/__tests__/index.tsx b/packages/react/__tests__/index.tsx index e34e87c9..c2b4fe1f 100644 --- a/packages/react/__tests__/index.tsx +++ b/packages/react/__tests__/index.tsx @@ -2,113 +2,50 @@ * @jest-environment jsdom */ -import createClient from "@grafoo/core"; -import graphql from "@grafoo/core/tag"; -import createTrasport from "@grafoo/http-transport"; -import { mockQueryRequest } from "@grafoo/test-utils"; -import { GrafooClient, Variables } from "@grafoo/types"; +import fetch from "node-fetch"; import * as React from "react"; -import * as TestRenderer from "react-test-renderer"; -import { Consumer, Provider } from "../src"; - -interface Post { - title: string; - content: string; - id: string; - __typename: string; - author: Author; -} - -interface Author { - name: string; - id: string; - __typename: string; - posts?: Array; -} - -interface Authors { - authors: Author[]; -} - -let AUTHORS = graphql` - { - authors { - name - posts { - title - body - } - } - } -`; - -let AUTHOR = graphql` - query ($id: ID!) { - author(id: $id) { - name - } - } -`; - -let CREATE_AUTHOR = graphql` - mutation ($name: String!) { - createAuthor(name: $name) { - name - } - } -`; - -let POSTS_AND_AUTHORS = graphql` - { - posts { - title - body - author { - name - } - } - - authors { - name - posts { - title - body - } - } - } -`; +import { createClient } from "@grafoo/core"; +import { + mockQueryRequest, + createTransport, + AuthorEdge, + AuthorConnection +} from "@grafoo/test-utils"; +import { renderHook, act } from "@testing-library/react-hooks"; + +import { GrafooProvider, useGrafoo } from "../src"; +import { + AuthorsQuery, + PostsAndAuthorsQuery, + AUTHOR, + AUTHORS, + CREATE_AUTHOR, + POSTS_AND_AUTHORS +} from "./queries"; + +// @ts-ignore +globalThis.fetch = fetch; describe("@grafoo/react", () => { - let client: GrafooClient; + let client: ReturnType; + let wrapper: React.FC; + let load = expect.any(Function); beforeEach(() => { jest.resetAllMocks(); - let transport = createTrasport("https://some.graphql.api/"); - client = createClient(transport, { idFields: ["id"] }); + let transport = createTransport("https://some.graphql.api/"); + client = createClient({ transport, idFields: ["id"] }); + wrapper = (props) => {props.children}; }); it("should not crash if a query is not given as prop", () => { - expect(() => - TestRenderer.create( - - {() => null} - - ) - ).not.toThrow(); + expect(() => renderHook(() => useGrafoo({}), { wrapper })).not.toThrow(); }); - it("should not fetch a query if skip prop is set to true", async () => { - await mockQueryRequest(AUTHORS); - + it("should not fetch a query if lazy prop is set to true", async () => { let spy = jest.spyOn(window, "fetch"); - TestRenderer.create( - - - {() => null} - - - ); + renderHook(() => useGrafoo({ query: AUTHORS, lazy: true }), { wrapper }); expect(spy).not.toHaveBeenCalled(); }); @@ -118,284 +55,184 @@ describe("@grafoo/react", () => { let spy = jest.spyOn(client, "listen"); - TestRenderer.create( - - - {() => null} - - - ); + renderHook(() => useGrafoo({ query: AUTHORS, lazy: true }), { wrapper }); expect(spy).toHaveBeenCalled(); }); - it("should not crash on unmount", () => { - let testRenderer = TestRenderer.create( - - - {() => null} - - - ); - - expect(() => testRenderer.unmount()).not.toThrow(); - }); - it("should execute render with default render argument", () => { - let mockRender = jest.fn().mockReturnValue(null); - - TestRenderer.create( - - - {mockRender} - - - ); - - let [[call]] = mockRender.mock.calls; + let { result } = renderHook(() => useGrafoo({ query: AUTHORS, lazy: true }), { wrapper }); - expect(call).toMatchObject({ loading: false, loaded: false }); - expect(typeof call.load).toBe("function"); + expect(result.current).toEqual({ load, loading: false, loaded: false }); }); - it("should execute render with the right data if a query is specified", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: true, loaded: false }), - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }) - ]); - - TestRenderer.create( - - {mockRender} - - ); + it("should execute render with the right data if a query is specified", async () => { + let { data } = await mockQueryRequest(AUTHORS); + let { result, waitForNextUpdate } = renderHook(() => useGrafoo({ query: AUTHORS }), { + wrapper }); - }); - it("should render if skip changed value to true", (done) => { - mockQueryRequest(AUTHORS).then(async ({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: false, loaded: false }), - (props) => expect(props).toMatchObject({ loading: true, loaded: false }), - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }) - ]); - - let App: React.FC<{ skip?: boolean }> = ({ skip = false }) => ( - - - {mockRender} - - - ); - - let ctx = TestRenderer.create(); - - ctx.update(); - await new Promise((resolve) => setTimeout(resolve, 10)); - ctx.update(); - }); + expect(result.current).toEqual({ load, loading: true, loaded: false }); + await waitForNextUpdate(); + expect(result.current).toEqual({ load, loading: false, loaded: true, ...data }); }); - it("should rerender if variables prop has changed", (done) => { - mockQueryRequest(AUTHORS).then(async ({ data }) => { - let mock = async (variables: Variables) => { - return ( - await mockQueryRequest<{ author: Author }>({ - query: AUTHOR.query, - variables - }) - ).data.author; - }; - - let firstVariables = { id: data.authors[0].id }; - let secondVariables = { id: data.authors[1].id }; - let firstAuthor = await mock(firstVariables); - let secondAuthor; - - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: true, loaded: false }), - (props) => expect(props.author).toMatchObject(firstAuthor), - (props) => - expect(props).toMatchObject({ loading: true, loaded: true, author: firstAuthor }), - (props) => expect(props.author).toMatchObject(secondAuthor) - ]); - - class AuthorComponent extends React.Component { - constructor(props, context) { - super(props, context); - - this.state = firstVariables; - - setTimeout(async () => { - secondAuthor = await mock(secondVariables); - - this.setState(secondVariables); - }, 100); + it("should render if lazy changed value to false", async () => { + let { data } = await mockQueryRequest(AUTHORS); + let { result, rerender, waitForNextUpdate } = renderHook<{ lazy: boolean }, any>( + ({ lazy }) => useGrafoo({ query: AUTHORS, lazy }), + { + wrapper, + initialProps: { + lazy: true } + } + ); + + expect(result.current).toEqual({ load, loading: false, loaded: false }); + rerender({ lazy: false }); + expect(result.current).toEqual({ load, loading: true, loaded: false }); + await waitForNextUpdate(); + expect(result.current).toEqual({ load, loading: false, loaded: true, ...data }); + }); - render() { - return ( - - {mockRender} - - ); + it("should rerender if variables prop has changed", async () => { + let { + data: { authors } + } = await mockQueryRequest(AUTHORS); + let author1 = authors.edges[0]; + let author2 = authors.edges[1]; + + await mockQueryRequest(AUTHOR, { id: author1.node.id }); + let { result, rerender, waitForNextUpdate } = renderHook<{ id: string }, any>( + ({ id }) => useGrafoo({ query: AUTHOR, variables: { id } }), + { + wrapper, + initialProps: { + id: author1.node.id } } + ); - TestRenderer.create( - - - - ); - }); + expect(result.current).toEqual({ load, loading: true, loaded: false }); + await waitForNextUpdate(); + expect(result.current).toEqual({ load, loading: false, loaded: true, author: author1.node }); + await mockQueryRequest(AUTHOR, { id: author2.node.id }); + rerender({ id: author2.node.id }); + expect(result.current).toEqual({ load, loading: true, loaded: true, author: author1.node }); + await waitForNextUpdate(); + expect(result.current).toEqual({ load, loading: false, loaded: true, author: author2.node }); }); - it("should not trigger a network request if the query is already cached", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - client.write(AUTHORS, data); + it("should not try to load a query if it's already cached", async () => { + let { data } = await mockQueryRequest(AUTHORS); + client.write(AUTHORS, data); + jest.resetAllMocks(); - jest.resetAllMocks(); + let spy = jest.spyOn(client, "execute"); + let { result } = renderHook(() => useGrafoo({ query: AUTHORS }), { wrapper }); - let spy = jest.spyOn(client, "execute"); + expect(result.current).toEqual({ load, loading: false, loaded: true, ...data }); + expect(spy).not.toHaveBeenCalled(); + }); - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }) - ]); + it("should handle mutations", async () => { + let variables = { input: { name: "Bart" } }; - TestRenderer.create( - - {mockRender} - - ); + let data = await mockQueryRequest(CREATE_AUTHOR, variables); + let { result } = renderHook( + () => useGrafoo({ mutations: { createAuthor: { query: CREATE_AUTHOR } } }), + { wrapper } + ); - expect(spy).not.toHaveBeenCalled(); - }); + let res = await result.current.createAuthor(variables); + expect(res).toEqual(data); }); - it("should handle simple mutations", (done) => { - let variables = { name: "Bart" }; + it("should handle mutations with cache update", async () => { + let { data } = await mockQueryRequest(AUTHORS); + let { result, waitForNextUpdate } = renderHook( + () => + useGrafoo({ + query: AUTHORS, + mutations: { + createAuthor: { + query: CREATE_AUTHOR, + optimisticUpdate: ({ authors }, variables) => ({ + authors: { + edges: [ + ...authors.edges, + { node: { ...variables.input, id: "tempID" } } as AuthorEdge + ] + } as AuthorConnection + }), + update: ({ authors }, data) => ({ + authors: { + edges: authors.edges.map((p) => + p.node.id === "tempID" ? { ...p, node: data.createAuthor.author } : p + ) + } as AuthorConnection + }) + } + } + }), + { wrapper } + ); - mockQueryRequest({ query: CREATE_AUTHOR.query, variables }).then(({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => { - props.createAuthor(variables).then((res) => { - expect(res.data).toEqual(data); - }); - } - ]); + expect(result.current).toMatchObject({ load, loading: true, loaded: false }); + expect(typeof result.current.createAuthor).toBe("function"); - let mutations = { createAuthor: { query: CREATE_AUTHOR } }; + await waitForNextUpdate(); - TestRenderer.create( - - {mockRender} - - ); - }); - }); + expect(result.current).toMatchObject({ load, loading: false, loaded: true, ...data }); - it("should handle mutations with cache update", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - let mockRender = createMockRenderFn(done, [ - (props) => { - expect(props).toMatchObject({ loading: true, loaded: false }); - expect(typeof props.createAuthor).toBe("function"); - }, - (props) => { - expect(props).toMatchObject({ loading: false, loaded: true, ...data }); - let variables = { name: "Homer" }; - mockQueryRequest({ query: CREATE_AUTHOR.query, variables }).then(() => { - props.createAuthor(variables); - }); - }, - (props) => { - expect(props.authors.length).toBe(data.authors.length + 1); - let newAuthor = props.authors.find((a) => a.id === "tempID"); - expect(newAuthor).toMatchObject({ name: "Homer", id: "tempID" }); - }, - (props) => { - expect(props.authors.find((a) => a.id === "tempID")).toBeUndefined(); - expect(props.authors.find((a) => a.name === "Homer")).toBeTruthy(); - } - ]); - - TestRenderer.create( - - ({ - authors: [...authors, { ...variables, id: "tempID" }] - }), - update: ({ authors }, data) => ({ - authors: authors.map((a) => (a.id === "tempID" ? (data as any).createAuthor : a)) - }) - } - }} - > - {mockRender} - - - ); + let variables = { input: { name: "Homer" } }; + await mockQueryRequest(CREATE_AUTHOR, variables); + act(() => { + result.current.createAuthor(variables); }); - }); - it("should reflect updates that happen outside of the component", (done) => { - mockQueryRequest(AUTHORS).then(({ data }) => { - client.write(AUTHORS, data); + expect(result.current.authors.edges.length).toBe(data.authors.edges.length + 1); + let newAuthor = result.current.authors.edges.find((a) => a.node.id === "tempID"); + expect(newAuthor).toEqual({ node: { name: "Homer", id: "tempID" } }); - let mockRender = createMockRenderFn(done, [ - (props) => expect(props).toMatchObject({ loading: false, loaded: true, ...data }), - (props) => expect(props.authors[0].name).toBe("Homer") - ]); + await waitForNextUpdate(); - TestRenderer.create( - - {mockRender} - - ); - - client.write(AUTHORS, { - authors: data.authors.map((a, i) => (!i ? { ...a, name: "Homer" } : a)) - }); - }); + expect(result.current.authors.edges.find((a) => a.node.id === "tempID")).toBeUndefined(); + expect(result.current.authors.edges.find((a) => a.node.name === "Homer")).toBeTruthy(); }); - it("should not trigger a network request if a query field is cached", (done) => { - mockQueryRequest(POSTS_AND_AUTHORS).then(({ data }) => { - client.write(POSTS_AND_AUTHORS, data); + it("should reflect updates that happen outside of the component", async () => { + let { data } = await mockQueryRequest(AUTHORS); - let spy = jest.spyOn(client, "execute"); + client.write(AUTHORS, data); - let mockRender = createMockRenderFn(done, [ - (props) => { - expect(props).toMatchObject({ authors: data.authors, loading: false, loaded: true }); - expect(spy).not.toHaveBeenCalled(); - } - ]); + let { result } = renderHook(() => useGrafoo({ query: AUTHORS }), { wrapper }); + + expect(result.current).toMatchObject({ load, loading: false, loaded: true, ...data }); - TestRenderer.create( - - {mockRender} - - ); + act(() => { + let newAuthors: AuthorsQuery = JSON.parse(JSON.stringify(data)); + newAuthors.authors.edges.unshift({ + node: { name: "Lisa", id: "tempID" }, + cursor: "tempCursor" + }); + client.write(AUTHORS, newAuthors); }); + + expect(result.current.authors.edges[0].node.name).toBe("Lisa"); }); -}); -function createMockRenderFn(done, assertionsFns) { - let currentRender = 0; + it("should not try to fetch a query data if it's already cached", async () => { + let { data } = await mockQueryRequest(POSTS_AND_AUTHORS); - return (props) => { - let assert = assertionsFns[currentRender]; + client.write(POSTS_AND_AUTHORS, data); - if (assert) assertionsFns[currentRender](props); + let { result } = renderHook(() => useGrafoo({ query: AUTHORS }), { wrapper }); - if (currentRender++ === assertionsFns.length - 1) done(); + let spy = jest.spyOn(client, "execute"); - return null; - }; -} + expect(result.current).toEqual({ authors: data.authors, load, loading: false, loaded: true }); + expect(spy).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/react/__tests__/queries.ts b/packages/react/__tests__/queries.ts new file mode 100644 index 00000000..4a9bbb3e --- /dev/null +++ b/packages/react/__tests__/queries.ts @@ -0,0 +1,116 @@ +import { graphql } from "@grafoo/core"; +import { + CreateAuthorInput, + DeleteAuthorInput, + Mutation, + Query, + UpdateAuthorInput +} from "@grafoo/test-utils"; + +export type AuthorQuery = Pick; +export type AuthorQueryVariables = { id: string }; +export let AUTHOR = graphql` + query ($id: ID!) { + author(id: $id) { + name + posts { + edges { + node { + body + title + } + } + } + } + } +`; + +export type AuthorsQuery = Pick; +export let AUTHORS = graphql` + query { + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +export type PostsAndAuthorsQuery = Pick; +export let POSTS_AND_AUTHORS = graphql` + query { + posts { + edges { + node { + title + body + author { + name + } + } + } + } + + authors { + edges { + node { + name + posts { + edges { + node { + body + title + } + } + } + } + } + } + } +`; + +export type CreateAuthorMutation = Pick; +export type CreateAuthorMutationVariables = { input: CreateAuthorInput }; +export let CREATE_AUTHOR = graphql` + mutation ($input: CreateAuthorInput!) { + createAuthor(input: $input) { + author { + name + } + } + } +`; + +export type DeleteAuthorMutation = Pick; +export type DeleteAuthorMutationVariables = { input: DeleteAuthorInput }; +export let DELETE_AUTHOR = graphql` + mutation ($input: DeleteAuthorInput!) { + deleteAuthor(input: $input) { + author { + name + } + } + } +`; + +export type UpdateAuthorMutation = Pick; +export type UpdateAuthorMutationVariables = { input: UpdateAuthorInput }; +export let UPDATE_AUTHOR = graphql` + mutation ($input: UpdateAuthorInput!) { + updateAuthor(input: $input) { + author { + name + } + } + } +`; diff --git a/packages/react/babel.config.js b/packages/react/babel.config.js new file mode 100644 index 00000000..495f3417 --- /dev/null +++ b/packages/react/babel.config.js @@ -0,0 +1,12 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + "@babel/preset-react", + "@babel/preset-typescript" + ], + env: { + test: { + plugins: ["module:@grafoo/babel-plugin"] + } + } +}; diff --git a/packages/react/package.json b/packages/react/package.json index 37705e30..1d441e22 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,10 +1,15 @@ { "name": "@grafoo/react", - "version": "1.4.1", + "version": "1.4.5-next.0", "description": "grafoo client react bindings", "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/react", + "source": "./src/index.ts", "main": "dist/index.js", - "types": "dist/index.d.ts", + "module": "dist/index.js", + "exports": { + "require": "./dist/index.cjs", + "default": "./dist/index.modern.js" + }, "author": "malbernaz", "license": "MIT", "keywords": [ @@ -20,26 +25,33 @@ "access": "public" }, "scripts": { - "build": "grafoo-bundle --input src/index.ts", + "build": "microbundle", + "watch": "microbundle watch", "test": "jest", "test:coverage": "jest --coverage", "tsc": "tsc --noEmit" }, "jest": { "transform": { - "^.+\\.(ts|tsx|js)$": "/../../scripts/jest-setup.js" + "^.+\\.(ts|tsx|js)$": "babel-jest" }, - "resolver": "/../../scripts/resolver.js", "transformIgnorePatterns": [ - "node_modules/(?!(lowdb|steno|node-fetch|fetch-blob)/)" + "node_modules/(?!(lowdb|steno|fetch-mock|node-fetch|fetch-blob|data-uri-to-buffer|formdata-polyfill)/)" + ], + "modulePathIgnorePatterns": [ + "/__tests__/queries.ts" ] }, "peerDependencies": { - "react": ">=16.4" + "react": ">=17" }, "dependencies": { - "@grafoo/bindings": "^1.4.1", - "@grafoo/types": "^1.4.1" + "@grafoo/bindings": "^1.4.5-next.0", + "@grafoo/core": "^1.4.5-next.0" }, - "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" + "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974", + "devDependencies": { + "@types/node": "^16.11.11", + "@types/react": "^17.0.37" + } } diff --git a/packages/react/schema.graphql b/packages/react/schema.graphql index 8011416b..26c7e6bf 100644 --- a/packages/react/schema.graphql +++ b/packages/react/schema.graphql @@ -1,28 +1,267 @@ type Query { - author(id: ID!): Author! - authors: [Author!]! - post(id: ID!): Post! - posts: [Post!]! -} + author(id: ID!): Author + authors( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String -type Mutation { - createAuthor(name: String!): Author! - updateAuthor(id: ID!, name: String): Author! - deleteAuthor(id: ID!): Author! - createPost(title: String!, body: String!, author: ID!): Post! - updatePost(id: ID!, title: String, body: String): Post! - deletePost(id: ID!): Post! + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): AuthorConnection + post(id: ID!): Post + posts( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String + + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): PostConnection + + """ + Fetches an object given its ID + """ + node( + """ + The ID of an object + """ + id: ID! + ): Node } -type Author { +type Author implements Node { + """ + The ID of an object + """ id: ID! name: String! - posts: [Post!] + bio: String + posts( + """ + Returns the items in the list that come after the specified cursor. + """ + after: String + + """ + Returns the first n items from the list. + """ + first: Int + + """ + Returns the items in the list that come before the specified cursor. + """ + before: String + + """ + Returns the last n items from the list. + """ + last: Int + ): PostConnection +} + +""" +An object with an ID +""" +interface Node { + """ + The id of the object. + """ + id: ID! +} + +""" +A connection to a list of items. +""" +type PostConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [PostEdge] +} + +""" +Information about pagination in a connection. +""" +type PageInfo { + """ + When paginating forwards, are there more items? + """ + hasNextPage: Boolean! + + """ + When paginating backwards, are there more items? + """ + hasPreviousPage: Boolean! + + """ + When paginating backwards, the cursor to continue. + """ + startCursor: String + + """ + When paginating forwards, the cursor to continue. + """ + endCursor: String +} + +""" +An edge in a connection. +""" +type PostEdge { + """ + The item at the end of the edge + """ + node: Post + + """ + A cursor for use in pagination + """ + cursor: String! } -type Post { +type Post implements Node { + """ + The ID of an object + """ id: ID! title: String! body: String! author: Author! } + +""" +A connection to a list of items. +""" +type AuthorConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [AuthorEdge] +} + +""" +An edge in a connection. +""" +type AuthorEdge { + """ + The item at the end of the edge + """ + node: Author + + """ + A cursor for use in pagination + """ + cursor: String! +} + +type Mutation { + createAuthor(input: CreateAuthorInput!): CreateAuthorPayload + updateAuthor(input: UpdateAuthorInput!): UpdateAuthorPayload + deleteAuthor(input: DeleteAuthorInput!): DeleteAuthorPayload + createPost(input: CreatePostInput!): CreatePostPayload + updatePost(input: UpdatePostInput!): UpdatePostPayload + deletePost(input: DeletePostInput!): DeletePostPayload +} + +type CreateAuthorPayload { + author: Author + clientMutationId: String +} + +input CreateAuthorInput { + name: String! + bio: String + clientMutationId: String +} + +type UpdateAuthorPayload { + author: Author + clientMutationId: String +} + +input UpdateAuthorInput { + id: ID + name: String + bio: String + clientMutationId: String +} + +type DeleteAuthorPayload { + author: Author + clientMutationId: String +} + +input DeleteAuthorInput { + id: ID! + clientMutationId: String +} + +type CreatePostPayload { + post: Post + clientMutationId: String +} + +input CreatePostInput { + title: String! + body: String + authorId: ID! + clientMutationId: String +} + +type UpdatePostPayload { + post: Post + clientMutationId: String +} + +input UpdatePostInput { + id: ID! + title: String + body: String + clientMutationId: String +} + +type DeletePostPayload { + post: Post + clientMutationId: String +} + +input DeletePostInput { + id: ID! + clientMutationId: String +} diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 417cf392..06ef0801 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,80 +1,62 @@ -import createBindings from "@grafoo/bindings"; +import * as React from "react"; +import { GrafooClient, GrafooQuery } from "@grafoo/core"; import { - Context, + createBindings, + makeGrafooConfig, GrafooConsumerProps, - GrafooBoundState, - GrafooBoundMutations, -} from "@grafoo/types"; -import { Component, createContext, createElement, ReactElement, ReactNode, FC } from "react"; + GrafooBoundState +} from "@grafoo/bindings"; -/** - * T = Query - * U = Mutations - */ -type GrafooRenderFn = ( - renderProps: GrafooBoundState & T & GrafooBoundMutations -) => ReactNode; +// @ts-ignore +export let GrafooContext = React.createContext(); -/** - * T = Query - * U = Mutations - */ -type GrafooReactConsumerProps = GrafooConsumerProps & { - children: GrafooRenderFn; +export type GrafooProviderProps = { + client: GrafooClient; }; -/** - * T = Query - * U = Mutations - */ -interface ConsumerType extends FC { - (props: GrafooReactConsumerProps): ReactElement | null; +export let GrafooProvider: React.FC = (props) => + React.createElement(GrafooContext.Provider, { value: props.client }, props.children); + +export { makeGrafooConfig }; + +export function useGrafoo>( + props: GrafooConsumerProps +): GrafooBoundState { + let client = React.useContext(GrafooContext); + let update: (s: GrafooBoundState) => void = React.useCallback((s) => setState(s), []); + let bindings = React.useMemo(() => createBindings(client, update, props), []); + let [state, setState] = React.useState(() => bindings.getState()); + let variables = React.useRef(props.variables); + + React.useEffect(() => { + return () => bindings.unbind(); + }, []); + + React.useEffect(() => { + if ( + (props.query && !props.lazy && !state.loaded && !state.loading) || + !deepEqual(variables.current, props.variables) + ) { + variables.current = props.variables; + bindings.load(props.variables); + } + }, [props.lazy, props.variables]); + + return state; } -let ctx = createContext({}); +let deepEqual = (x: any, y: any) => { + if (x === y) return true; -export let Provider: FC = (props) => - createElement(ctx.Provider, { value: props.client }, props.children); + if (isPrimitive(x) && isPrimitive(y)) return x === y; -class GrafooConsumer extends Component> { - state: GrafooBoundState & T & GrafooBoundMutations; + if (Object.keys(x).length !== Object.keys(y).length) return false; - constructor(props) { - super(props); - - let bindings = createBindings(props.client, props, () => { - this.setState(bindings.getState()); - }); - - this.state = bindings.getState(); - - this.componentDidMount = () => { - if (props.skip || !props.query || this.state.loaded) return; - - bindings.load(); - }; - - this.componentWillReceiveProps = (next) => { - if ((!this.state.loaded && !next.skip) || props.variables !== next.variables) { - bindings.load(next.variables); - } - }; - - this.componentWillUnmount = () => { - bindings.unbind(); - }; + for (let i in x) { + if (!(i in y) || !deepEqual(x[i], y[i])) return false; } - render() { - return this.props.children(this.state); - } -} + return true; +}; -/** - * T = Query - * U = Mutations - */ -export let Consumer: ConsumerType = (props: GrafooReactConsumerProps) => - createElement(ctx.Consumer, null, (client) => - createElement(GrafooConsumer, Object.assign({ client }, props)) - ); +let isPrimitive = (obj: any) => obj !== Object(obj); diff --git a/packages/rollup-plugin/.babelrc.json b/packages/rollup-plugin/.babelrc.json new file mode 100644 index 00000000..6e63b6e0 --- /dev/null +++ b/packages/rollup-plugin/.babelrc.json @@ -0,0 +1,6 @@ +{ + "presets": [ + ["@babel/preset-env", { "targets": { "node": "current" } }], + "@babel/preset-typescript" + ] +} diff --git a/packages/rollup-plugin/.grafoorc.json b/packages/rollup-plugin/.grafoorc.json new file mode 100644 index 00000000..7f30f4ce --- /dev/null +++ b/packages/rollup-plugin/.grafoorc.json @@ -0,0 +1,5 @@ +{ + "schema": "schema.graphql", + "idFields": ["id", "__typename"], + "compress": true +} diff --git a/packages/rollup-plugin/__tests__/index.ts b/packages/rollup-plugin/__tests__/index.ts new file mode 100644 index 00000000..f3d279fd --- /dev/null +++ b/packages/rollup-plugin/__tests__/index.ts @@ -0,0 +1,54 @@ +import plugin from "../src"; +import { parse } from "acorn"; + +let transform = (input: string) => + plugin().transform.call( + { + parse: (code: string) => + parse(code, { + sourceType: "module", + ecmaVersion: 9 + }) + }, + input, + "file.js" + ); + +let output = + 'let query = {"document":"{authors{__typename id name}}","operation":{"select":{"authors":{"scalars":["__typename","id","name"]}}}};'; + +describe("@grafoo/rollup-plugin", () => { + it("should remove the imported path", () => { + let { code } = transform('import { graphql, gql } from "@grafoo/core";'); + let output = ""; + + expect(code).toBe(output); + }); + + it("should throw if a tagged template string literal has expressions in it", () => { + let code = ` + import { graphql } from "@grafoo/core"; + let query = graphql\`{ user(id: "\${1}") { name } }\`; + `; + + expect(() => transform(code)).toThrow(); + }); + + it("should replace a tagged template literal with the compiled grafoo object", () => { + let { code } = transform(` + import { graphql } from "@grafoo/core"; + let query = graphql\`{ authors {name} }\`; + `); + + expect(code.trim()).toBe(output); + }); + + it("should be able to use named import gql from @grafoo/core", () => { + let { code } = transform(` + import { gql } from "@grafoo/core"; + let query = gql\`{ authors {name} }\`; + `); + + expect(code.trim()).toBe(output); + }); +}); diff --git a/packages/rollup-plugin/package.json b/packages/rollup-plugin/package.json new file mode 100644 index 00000000..edb0c321 --- /dev/null +++ b/packages/rollup-plugin/package.json @@ -0,0 +1,37 @@ +{ + "name": "@grafoo/rollup-plugin", + "version": "1.0.0", + "license": "MIT", + "main": "dist/index.js", + "module": "dist/index.es.js", + "scripts": { + "build": "tsc --declaration", + "test": "jest", + "test:coverage": "jest --coverage" + }, + "jest": { + "transform": { + "^.+\\.(ts|tsx|js)$": "babel-jest" + }, + "transformIgnorePatterns": [ + "node_modules/(?!(lowdb|steno|node-fetch|fetch-blob)/)" + ] + }, + "dependencies": { + "@rollup/pluginutils": "^4.1.1", + "@types/estree": "^0.0.50", + "acorn": "^8.6.0", + "estree-walker": "^2.0.1", + "magic-string": "^0.25.7", + "rollup": "^2.60.2" + }, + "devDependencies": { + "@babel/parser": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@types/jest": "^27.0.3", + "@types/node": "^16.11.11", + "@types/react": "^17.0.37", + "@types/uuid": "^8.3.3", + "@types/ws": "^8.2.1" + } +} diff --git a/packages/rollup-plugin/rollup.config.js b/packages/rollup-plugin/rollup.config.js new file mode 100644 index 00000000..8c3dbce7 --- /dev/null +++ b/packages/rollup-plugin/rollup.config.js @@ -0,0 +1,12 @@ +import pkg from "./package.json"; +import typescript from "@rollup/plugin-typescript"; + +export default { + input: "src/index.ts", + external: Object.keys(pkg.dependencies), + output: [ + { format: "cjs", file: pkg.main, exports: "auto" }, + { format: "esm", file: pkg.module } + ], + plugins: [typescript()] +}; diff --git a/packages/rollup-plugin/schema.graphql b/packages/rollup-plugin/schema.graphql new file mode 100644 index 00000000..55365803 --- /dev/null +++ b/packages/rollup-plugin/schema.graphql @@ -0,0 +1,63 @@ +type Post { + id: ID! + title: String! + slug: String! + body: String! + published: Boolean! + createdAt: String! + updateAt: String! + authors: [Author!]! + author: Author! + tags: [Tag!]! +} + +union Viewer = Visitor | User + +type Tag { + id: ID! + name: String! + posts: [Post!]! + createdAt: String! + updateAt: String! +} + +interface User { + id: ID! + username: String! + email: String! + createdAt: String! + updatedAt: String! +} + +type Author implements User { + id: ID! + name: String + bio: String + posts: [Post!]! +} + +type Visitor { + id: ID! + ip: String! +} + +type Mutation { + createPost(title: String!, body: String!, authors: [ID!]!, tags: [String!]): Post + deletePost(id: ID): Post + createTag(name: String!): Tag + register(username: String!, email: String!, password: String!): User + login(email: String!, password: String!): String + updateUser(username: String, name: String, bio: String, email: String, password: String): User +} + +type Query { + author(id: ID!): Author + authors(start: Int!, offset: Int!): [Author] + posts(start: Int!, offset: Int!): [Post] + post(id: ID!): Post + tag(id: ID!): Tag + users(start: Int!, offset: Int!): [User] + user(id: ID!): User + me: User + viewer: Viewer +} diff --git a/packages/rollup-plugin/src/index.ts b/packages/rollup-plugin/src/index.ts new file mode 100644 index 00000000..7f206f88 --- /dev/null +++ b/packages/rollup-plugin/src/index.ts @@ -0,0 +1,98 @@ +import { walk } from "estree-walker"; +import { AcornNode, Plugin } from "rollup"; +import MagicString from "magic-string"; +import type { ImportDeclaration, Node } from "estree"; +import { FilterPattern, createFilter } from "@rollup/pluginutils"; +import compileDocument from "@grafoo/compiler"; + +type Options = { + include?: FilterPattern; + exclude?: FilterPattern; + sourceMap?: boolean; +}; + +export default function grafoo(options?: Options): Plugin { + let { include = "**/*.{js,jsx,ts,tsx}", exclude, sourceMap = true } = options ?? {}; + let filter = createFilter(include, exclude); + + return { + name: "@grafoo/rollup-plugin", + transform(code, id) { + if (!filter(id)) return null; + + let ast: AcornNode; + try { + ast = this.parse(code); + } catch (err) { + err.message += ` in ${id}`; + throw err; + } + + let ms = new MagicString(code); + let edited = false; + let tags = []; + + function removeImportSpecifier({ start, end }) { + while (/\s/.test(code[start - 1])) start -= 1; + while (/\s|,/.test(code[end + 1])) end += 1; + ms.remove(start, end); + edited = true; + } + + function removeImportDeclaration({ start, end }) { + ms.remove(start, end); + edited = true; + } + + function replaceTemplateExpression({ start, end }, source: string) { + ms.overwrite(start, end, source); + edited = true; + } + + walk(ast, { + enter(node: Node, parent) { + let parentNode = parent as ImportDeclaration; + + if (node.type === "ImportSpecifier") { + if (parentNode.source.value !== "@grafoo/core") return; + + let { name } = node.local; + + if (["graphql", "gql"].includes(name)) { + tags.push(name); + removeImportSpecifier(node as any); + this.remove(); + + if (!parentNode.specifiers.filter((s) => s.local.name !== name).length) { + removeImportDeclaration(parent as any); + } + } + } + + if (node.type === "TaggedTemplateExpression") { + if (!tags.includes((node.tag as any).name)) return; + + let { quasis, expressions } = node.quasi; + + if (expressions.length) { + throw new Error( + `interpolation is not supported in a grafoo graphql tagged template literal.` + ); + } + + let source = quasis.reduce((q, s) => q + s.value.raw, ""); + let query = compileDocument(source); + replaceTemplateExpression(node as any, query); + } + } + }); + + if (!edited) return null; + + return { + code: ms.toString(), + map: sourceMap ? ms.generateMap() : null + }; + } + }; +} diff --git a/packages/rollup-plugin/tsconfig.json b/packages/rollup-plugin/tsconfig.json new file mode 100644 index 00000000..aa4e1c88 --- /dev/null +++ b/packages/rollup-plugin/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "strict": false, + "lib": ["esnext", "dom"], + "noUnusedLocals": true, + "noUnusedParameters": true, + "checkJs": false, + "downlevelIteration": true, + "esModuleInterop": true, + "outDir": "./dist", + "module": "commonjs" + }, + "include": ["src"] +} diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index ff6c25e4..c7574175 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,12 +1,16 @@ { "private": true, "name": "@grafoo/test-utils", - "version": "1.4.1", + "version": "1.4.4-next.0", "main": "dist/index.js", "publishConfig": { "access": "public" }, "scripts": { - "build": "tsc" + "build": "tsc --declaration" + }, + "dependencies": { + "fetch-mock": "^9.11.0", + "graphql-relay": "^0.9.0" } } diff --git a/packages/test-utils/schema.graphql b/packages/test-utils/schema.graphql index 8011416b..8c99e2cc 100644 --- a/packages/test-utils/schema.graphql +++ b/packages/test-utils/schema.graphql @@ -1,8 +1,8 @@ type Query { author(id: ID!): Author! - authors: [Author!]! + authors(from: Int, to: Int): [Author!]! post(id: ID!): Post! - posts: [Post!]! + posts(from: Int, to: Int): [Post!]! } type Mutation { @@ -17,7 +17,7 @@ type Mutation { type Author { id: ID! name: String! - posts: [Post!] + posts(from: Int, to: Int): [Post!] } type Post { diff --git a/packages/test-utils/src/db.ts b/packages/test-utils/src/db.ts index 085fa5d5..5add1a13 100644 --- a/packages/test-utils/src/db.ts +++ b/packages/test-utils/src/db.ts @@ -5,26 +5,44 @@ casual.seed(666); let times = (t: number, fn: (i: number) => void) => Array.from(Array(t), fn); +type Author = { + id: string; + name: string; + posts: string[]; +}; + +type Post = { + title: string; + body?: string; + id: string; + author: string; +}; + +type Db = { + posts: Post[]; + authors: Author[]; +}; + export default function setupDB() { - let db = new Low<{ posts: any[]; authors: any[] }>(new Memory()); + let db = new Low(new Memory()); db.data = { posts: [], authors: [] }; - db.read; times(2, () => db.data.authors.push({ id: casual.uuid, name: casual.first_name + " " + casual.last_name, + posts: [] }) ); db.data.authors.forEach(({ id }) => { - times(4, () => + times(2, () => db.data.posts.push({ author: id, id: casual.uuid, title: casual.title, - body: casual.short_description, + body: casual.short_description }) ); diff --git a/packages/test-utils/src/http-transport.ts b/packages/test-utils/src/http-transport.ts new file mode 100644 index 00000000..71d11b76 --- /dev/null +++ b/packages/test-utils/src/http-transport.ts @@ -0,0 +1,18 @@ +import { GraphQlPayload } from "@grafoo/core"; + +export function createTransport(url: string, options?: RequestInit | (() => RequestInit)) { + return async (query: string, variables?: unknown): Promise> => { + options = typeof options == "function" ? options() : options || {}; + + let response = await fetch( + url, + Object.assign(options, { + body: JSON.stringify({ query, variables }), + method: "POST", + headers: Object.assign({ "Content-Type": "application/json" }, options.headers) + }) + ); + + return await response.json(); + }; +} diff --git a/packages/test-utils/src/index.ts b/packages/test-utils/src/index.ts index d4af12cf..9a521a65 100644 --- a/packages/test-utils/src/index.ts +++ b/packages/test-utils/src/index.ts @@ -1,2 +1,4 @@ export * from "./db"; export * from "./mock-server"; +export * from "./types"; +export * from "./http-transport"; diff --git a/packages/test-utils/src/mock-server.ts b/packages/test-utils/src/mock-server.ts index e5159ffd..9e4ebca3 100644 --- a/packages/test-utils/src/mock-server.ts +++ b/packages/test-utils/src/mock-server.ts @@ -1,133 +1,279 @@ -import { GraphQlPayload } from "@grafoo/types"; -import fetchMock from "fetch-mock"; -import fs from "fs"; -import { graphql } from "graphql"; -import { makeExecutableSchema } from "@graphql-tools/schema"; -import path from "path"; +import { GraphQlPayload } from "@grafoo/core"; +import { + GraphQLID, + GraphQLNonNull, + GraphQLObjectType, + GraphQLSchema, + GraphQLString, + graphql +} from "graphql"; +import { + connectionArgs, + connectionDefinitions, + connectionFromArray, + fromGlobalId, + globalIdField, + mutationWithClientMutationId, + nodeDefinitions +} from "graphql-relay"; import { v4 as uuid } from "uuid"; +import fetchMock from "fetch-mock"; import setupDB from "./db"; let db = setupDB(); -let typeDefs = fs.readFileSync(path.join(__dirname, "..", "schema.graphql"), "utf-8"); +let { nodeInterface, nodeField } = nodeDefinitions( + (globalId) => { + let { type, id } = fromGlobalId(globalId); -let Query = { - author(_, args) { - return db.data.authors.find((author) => author.id === args.id); - }, - authors() { - return db.data.authors; + switch (type) { + case "Author": + return db.data.authors.find((author) => author.id === id); + case "Post": + return db.data.posts.find((post) => post.id === id); + } }, - post(_, args) { - return db.data.posts.find((author) => author.id === args.id); - }, - posts() { - return db.data.posts; - } -}; + (obj) => (obj.name ? authorType : postType) +); -let Mutation = { - createAuthor(_, args) { - let newAuthor = Object.assign({}, args, { id: uuid() }); +let authorType = new GraphQLObjectType({ + name: "Author", + interfaces: [nodeInterface], + fields: () => ({ + id: globalIdField(), + name: { type: new GraphQLNonNull(GraphQLString) }, + posts: { + type: postConnection, + args: connectionArgs, + resolve: (author, args) => + connectionFromArray( + author.posts.map((id) => db.data.posts.find((p) => p.id === id)), + args + ) + } + }) +}); - db.data.authors.push(newAuthor); +let { connectionType: authorConnection } = connectionDefinitions({ nodeType: authorType }); + +let postType = new GraphQLObjectType({ + name: "Post", + interfaces: [nodeInterface], + fields: () => ({ + id: globalIdField(), + title: { type: new GraphQLNonNull(GraphQLString) }, + body: { type: new GraphQLNonNull(GraphQLString) }, + author: { + type: new GraphQLNonNull(authorType), + resolve: (post) => db.data.authors.find((a) => a.id === post.author) + } + }) +}); + +let { connectionType: postConnection } = connectionDefinitions({ nodeType: postType }); +let queryType = new GraphQLObjectType({ + name: "Query", + fields: () => ({ + author: { + type: authorType, + args: { + id: { type: new GraphQLNonNull(GraphQLID) } + }, + resolve: (_, args) => { + let { id } = fromGlobalId(args.id); + return db.data.authors.find((a) => a.id === id); + } + }, + authors: { + type: authorConnection, + args: connectionArgs, + resolve: (_, args) => connectionFromArray(db.data.authors, args) + }, + post: { + type: postType, + args: { + id: { type: new GraphQLNonNull(GraphQLID) } + }, + resolve: (_, args) => { + let { id } = fromGlobalId(args.id); + return db.data.posts.find((a) => a.id === id); + } + }, + posts: { + type: postConnection, + args: connectionArgs, + resolve: (_, args) => connectionFromArray(db.data.posts, args) + }, + node: nodeField + }) +}); + +let createAuthor = mutationWithClientMutationId({ + name: "CreateAuthor", + inputFields: { + name: { type: new GraphQLNonNull(GraphQLString) } + }, + outputFields: { + author: { + type: authorType, + resolve: (id) => db.data.authors.find((a) => a.id === id) + } + }, + mutateAndGetPayload: (args) => { + let id = uuid(); + let newAuthor = Object.assign({}, args, { id }); + db.data.authors.push(newAuthor); db.write(); + return id; + } +}); - return newAuthor; +let updateAuthor = mutationWithClientMutationId({ + name: "UpdateAuthor", + inputFields: { + id: { type: GraphQLID }, + name: { type: GraphQLString } + }, + outputFields: { + author: { + type: authorType, + resolve: (id) => db.data.authors.find((a) => a.id === id) + } }, - updateAuthor(_, args) { - let author = Object.assign( - db.data.authors.find((author) => author.id === args.id), + mutateAndGetPayload: (args) => { + let { id } = fromGlobalId(args.id); + Object.assign( + db.data.authors.find((a) => a.id === id), args ); - db.write(); + return args.id; + } +}); - return author; +let deleteAuthor = mutationWithClientMutationId({ + name: "DeleteAuthor", + inputFields: { + id: { + type: new GraphQLNonNull(GraphQLID) + } }, - deleteAuthor(_, args) { - let author = db.data.authors.find(args); - + outputFields: { + author: { + type: authorType, + resolve: (author) => author + } + }, + mutateAndGetPayload: (args) => { + let { id } = fromGlobalId(args.id); + let author = db.data.authors.find((a) => a.id === id); db.data.authors = db.data.authors.filter((a) => a.id !== author.id); db.data.posts = db.data.posts.filter((p) => p.author !== author.id); - db.write(); - return author; - }, - createPost(_, args) { - let newPost = Object.assign({}, args, { id: uuid() }); + } +}); +let createPost = mutationWithClientMutationId({ + name: "CreatePost", + inputFields: { + title: { type: new GraphQLNonNull(GraphQLString) }, + body: { type: GraphQLString }, + authorId: { type: new GraphQLNonNull(GraphQLID) } + }, + outputFields: { + post: { + type: postType, + resolve: (id) => db.data.posts.find((p) => p.id === id) + } + }, + mutateAndGetPayload: (args) => { + let id = uuid(); + db.data.authors.find((a) => a.id === args.authorId).posts.push(id); + let newPost = { title: args.title, body: args.body, author: args.authorId, id }; db.data.posts.push(newPost); - db.write(); + return id; + } +}); - return newPost; +let updatePost = mutationWithClientMutationId({ + name: "UpdatePost", + inputFields: { + id: { type: new GraphQLNonNull(GraphQLID) }, + title: { type: GraphQLString }, + body: { type: GraphQLString } + }, + outputFields: { + post: { + type: postType, + resolve: (id) => db.data.posts.find((p) => p.id === id) + } }, - updatePost(_, args) { - let post = Object.assign( - db.data.posts.find((author) => author.id === args.id), + mutateAndGetPayload: (args) => { + Object.assign( + db.data.posts.find((p) => p.id === args.id), args ); - db.write(); + return args.id; + } +}); - return post; +let deletePost = mutationWithClientMutationId({ + name: "DeletePost", + inputFields: { + id: { type: new GraphQLNonNull(GraphQLID) } }, - deletePost(_, args) { - let post = db.data.posts.find(args); - + outputFields: { + post: { + type: postType, + resolve: (post) => post + } + }, + mutateAndGetPayload: (args) => { + let post = db.data.posts.find((p) => p.id === args.id); + let author = db.data.authors.find((a) => a.id === post.author); + author.posts = author.posts.filter((p) => p !== post.id); db.data.posts = db.data.posts.filter((p) => p.id !== args.id); - db.write(); - return post; } -}; - -let Author = { - posts(author) { - let s = author.posts - ? author.posts.map((id) => db.data.posts.find((post) => post.id === id)) - : null; +}); - return s; - } -}; +let mutationType = new GraphQLObjectType({ + name: "Mutation", + fields: () => ({ + createAuthor, + updateAuthor, + deleteAuthor, + createPost, + updatePost, + deletePost + }) +}); -let Post = { - author(post) { - return db.data.authors.find((author) => author.id === post.author); - } -}; +let schema = new GraphQLSchema({ query: queryType, mutation: mutationType }); -let resolvers = { - Query: Query, - Mutation: Mutation, - Author: Author, - Post: Post -}; - -let schema = makeExecutableSchema({ typeDefs: typeDefs, resolvers: resolvers }); - -interface ExecuteQueryArg { +type ExecuteQueryArg = { query: string; - variables?: { - [key: string]: unknown; - }; -} + variables?: Record; +}; export function executeQuery({ query, variables }: ExecuteQueryArg): Promise> { // @ts-ignore return graphql({ schema: schema, source: query, variableValues: variables }); } -export async function mockQueryRequest(request: ExecuteQueryArg): Promise> { +export async function mockQueryRequest( + query: { document: string }, + variables?: Record +): Promise> { fetchMock.reset(); fetchMock.restore(); - let response = await executeQuery(request); + let response = await executeQuery({ query: query.document, variables }); fetchMock.post("*", response); return response; diff --git a/packages/test-utils/src/types.ts b/packages/test-utils/src/types.ts new file mode 100644 index 00000000..ecfff49d --- /dev/null +++ b/packages/test-utils/src/types.ts @@ -0,0 +1,210 @@ +export type Maybe = T | null; +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 }; + +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; +}; + +export type Query = { + __typename?: "Query"; + author?: Maybe; + authors?: Maybe; + post?: Maybe; + posts?: Maybe; + node?: Maybe; +}; + +export type QueryAuthorArgs = { + id: Scalars["ID"]; +}; + +export type QueryAuthorsArgs = { + after?: Maybe; + first?: Maybe; + before?: Maybe; + last?: Maybe; +}; + +export type QueryPostArgs = { + id: Scalars["ID"]; +}; + +export type QueryPostsArgs = { + after?: Maybe; + first?: Maybe; + before?: Maybe; + last?: Maybe; +}; + +export type QueryNodeArgs = { + id: Scalars["ID"]; +}; + +export type Author = Node & { + __typename?: "Author"; + id: Scalars["ID"]; + name: Scalars["String"]; + posts?: Maybe; +}; + +export type AuthorPostsArgs = { + after?: Maybe; + first?: Maybe; + before?: Maybe; + last?: Maybe; +}; + +export type Node = { + id: Scalars["ID"]; +}; + +export type PostConnection = { + __typename?: "PostConnection"; + pageInfo: PageInfo; + edges?: Maybe>>; +}; + +export type PageInfo = { + __typename?: "PageInfo"; + hasNextPage: Scalars["Boolean"]; + hasPreviousPage: Scalars["Boolean"]; + startCursor?: Maybe; + endCursor?: Maybe; +}; + +export type PostEdge = { + __typename?: "PostEdge"; + node?: Maybe; + cursor: Scalars["String"]; +}; + +export type Post = Node & { + __typename?: "Post"; + id: Scalars["ID"]; + title: Scalars["String"]; + body: Scalars["String"]; + author: Author; +}; + +export type AuthorConnection = { + __typename?: "AuthorConnection"; + pageInfo: PageInfo; + edges?: Maybe>>; +}; + +export type AuthorEdge = { + __typename?: "AuthorEdge"; + node?: Maybe; + cursor: Scalars["String"]; +}; + +export type Mutation = { + __typename?: "Mutation"; + createAuthor?: Maybe; + updateAuthor?: Maybe; + deleteAuthor?: Maybe; + createPost?: Maybe; + updatePost?: Maybe; + deletePost?: Maybe; +}; + +export type MutationCreateAuthorArgs = { + input: CreateAuthorInput; +}; + +export type MutationUpdateAuthorArgs = { + input: UpdateAuthorInput; +}; + +export type MutationDeleteAuthorArgs = { + input: DeleteAuthorInput; +}; + +export type MutationCreatePostArgs = { + input: CreatePostInput; +}; + +export type MutationUpdatePostArgs = { + input: UpdatePostInput; +}; + +export type MutationDeletePostArgs = { + input: DeletePostInput; +}; + +export type CreateAuthorPayload = { + __typename?: "CreateAuthorPayload"; + author?: Maybe; + clientMutationId?: Maybe; +}; + +export type CreateAuthorInput = { + name: Scalars["String"]; + clientMutationId?: Maybe; +}; + +export type UpdateAuthorPayload = { + __typename?: "UpdateAuthorPayload"; + author?: Maybe; + clientMutationId?: Maybe; +}; + +export type UpdateAuthorInput = { + id?: Maybe; + name?: Maybe; + clientMutationId?: Maybe; +}; + +export type DeleteAuthorPayload = { + __typename?: "DeleteAuthorPayload"; + author?: Maybe; + clientMutationId?: Maybe; +}; + +export type DeleteAuthorInput = { + id: Scalars["ID"]; + clientMutationId?: Maybe; +}; + +export type CreatePostPayload = { + __typename?: "CreatePostPayload"; + post?: Maybe; + clientMutationId?: Maybe; +}; + +export type CreatePostInput = { + title: Scalars["String"]; + body?: Maybe; + authorId: Scalars["ID"]; + clientMutationId?: Maybe; +}; + +export type UpdatePostPayload = { + __typename?: "UpdatePostPayload"; + post?: Maybe; + clientMutationId?: Maybe; +}; + +export type UpdatePostInput = { + id: Scalars["ID"]; + title?: Maybe; + body?: Maybe; + clientMutationId?: Maybe; +}; + +export type DeletePostPayload = { + __typename?: "DeletePostPayload"; + post?: Maybe; + clientMutationId?: Maybe; +}; + +export type DeletePostInput = { + id: Scalars["ID"]; + clientMutationId?: Maybe; +}; diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts deleted file mode 100644 index b4ea7280..00000000 --- a/packages/types/index.d.ts +++ /dev/null @@ -1,155 +0,0 @@ -/** - * GrafooTransport - */ - -export interface GraphQlError { - message: string; - locations: { line: number; column: number }[]; - path: string[]; -} - -/** - * T = QueryData - */ -export interface GraphQlPayload { - data: T; - errors?: GraphQlError[]; -} - -export interface Variables { - [key: string]: any; -} - -/** - * T = QueryData - */ -export type GrafooTransport = ( - query: string, - variables?: Variables, - id?: string -) => Promise>; - -/** - * Core - */ - -export interface ObjectsMap { - [key: string]: Record; -} - -export interface PathsMap { - [key: string]: { - data: { [key: string]: any }; - objects: string[]; - }; -} - -export type Listener = (objects: ObjectsMap) => void; - -export interface InitialState { - objectsMap: ObjectsMap; - pathsMap: PathsMap; -} - -export interface GrafooClient { - execute: (grafooObject: GrafooObject, variables?: Variables) => Promise>; - listen: (listener: Listener) => () => void; - write: { - (grafooObject: GrafooObject, variables: Variables, data: T | { data: T }): void; - (grafooObject: GrafooObject, data: T | { data: T }): void; - }; - read: ( - grafooObject: GrafooObject, - variables?: Variables - ) => { data?: T; objects?: ObjectsMap; partial?: boolean }; - flush: () => InitialState; - reset: () => void; -} - -export interface GrafooClientOptions { - initialState?: InitialState; - idFields?: Array; -} - -export interface GrafooObject { - frags?: { - [key: string]: string; - }; - paths: { - [key: string]: { - name: string; - args: string[]; - }; - }; - query: string; - id?: string; -} - -/** - * Bindings - */ - -/** - * T = Query - * U = Mutations - */ -export interface GrafooBindings { - getState(): GrafooBoundState & T & GrafooBoundMutations; - unbind(): void; - load(variables?: Variables): void; -} - -export interface GrafooBoundState { - client: GrafooClient; - errors?: GraphQlError[]; - load?: (variables?: Variables) => void; - loaded?: boolean; - loading?: boolean; -} - -/** - * T = Query - * U = Mutations - */ -export type UpdateFn = (props: T, data?: U) => T; - -/** - * T = Query - */ -export type OptimisticUpdateFn = (props: T, variables?: Variables) => T; - -/** - * T = Query - * U = Mutations - * V = keyof Mutation - */ -export type GrafooMutations = { - [V in keyof U]: { - query: GrafooObject; - optimisticUpdate?: OptimisticUpdateFn; - update?: UpdateFn; - }; -}; - -export interface Context { - client: GrafooClient; -} - -/** - * T = Mutations - * U = keyof Mutations - */ -export type GrafooBoundMutations = { - [U in keyof T]: (variables?: Variables) => Promise>; -}; - -/** - * T = Query - * U = Mutations - */ -export interface GrafooConsumerProps { - query?: GrafooObject; - variables?: Variables; - mutations?: GrafooMutations; - skip?: boolean; -} diff --git a/packages/types/package.json b/packages/types/package.json deleted file mode 100644 index c6105b69..00000000 --- a/packages/types/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@grafoo/types", - "version": "1.4.1", - "description": "grafoo client typescript definitions", - "repository": "https://github.com/grafoojs/grafoo/tree/master/packages/types", - "types": "index.d.ts", - "author": "malbernaz", - "license": "MIT", - "publishConfig": { - "access": "public" - }, - "gitHead": "0bc67d8b398884a1f387a1813e485d2c5318b974" -} diff --git a/packages/types/readme.md b/packages/types/readme.md deleted file mode 100644 index b6466d4f..00000000 --- a/packages/types/readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# `@grafoo/types` - -

Grafoo Typescript Definitions

- -

- - build - - - coverage - - - npm - - - downloads - - - code style: prettier - - - mantained with: lerna - - - slack - -

- -## Install - -``` -$ npm i @grafoo/types -``` - -## LICENSE - -[MIT](https://github.com/grafoojs/grafoo/blob/master/LICENSE) diff --git a/scripts/build.js b/scripts/build.js index 1aad51ac..4706cf87 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -1,18 +1,10 @@ -let { readdirSync } = require("fs"); -let { join } = require("path"); let { exec } = require("child_process"); -let pkgsRoot = join(__dirname, "..", "packages"); - -let withDeps = ["react", "preact"]; -let noDeps = readdirSync(pkgsRoot).filter((x) => !withDeps.some((y) => y === x)); - -let command = exec( - [ - `lerna run --scope "@grafoo/*(${noDeps.join("|")})" build`, - `lerna run --scope "@grafoo/*(${withDeps.join("|")})" build`, - ].join(" && ") +let commands = ["core", "bindings", "react", "test-utils", "compiler", "babel-plugin"].map( + (p) => `lerna run --scope @grafoo/${p} build` ); +let command = exec(commands.join(" && ")); + command.stdout.pipe(process.stdout); command.stderr.pipe(process.stderr); diff --git a/scripts/jest-setup.js b/scripts/jest-setup.js deleted file mode 100644 index 2ef2e202..00000000 --- a/scripts/jest-setup.js +++ /dev/null @@ -1,11 +0,0 @@ -let fs = require("fs"); -let path = require("path"); -let { transform } = require("@babel/core"); - -let config = Object.assign( - { sourceMap: "inline", ast: false }, - JSON.parse(fs.readFileSync(path.join(process.cwd(), ".babelrc"), "utf-8")) -); - -module.exports.process = (src, path) => - transform(src, Object.assign({}, config, { filename: path })); diff --git a/scripts/resolver.js b/scripts/resolver.js deleted file mode 100644 index 6cad796d..00000000 --- a/scripts/resolver.js +++ /dev/null @@ -1,10 +0,0 @@ -let { resolve } = require("resolve.exports"); - -module.exports = (request, options) => - options.defaultResolver(request, { - ...options, - packageFilter: (package) => ({ - ...package, - main: package.main || resolve(package, ".") - }) - }); diff --git a/yarn.lock b/yarn.lock index 5863a47b..05dd576f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@babel/cli@^7.0.0": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.15.7.tgz#62658abedb786d09c1f70229224b11a65440d7a1" - integrity sha512-YW5wOprO2LzMjoWZ5ZG6jfbY9JnkDxuHDwvnrThnuYtByorova/I0HNXJedrUfwuXFQfYOjcqDA4PU3qlZGZjg== +"@babel/cli@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.16.0.tgz#a729b7a48eb80b49f48a339529fc4129fd7bcef3" + integrity sha512-WLrM42vKX/4atIoQB+eb0ovUof53UUvecb4qGjU2PDDWRiZr50ZpiV8NpcLo7iSxeGYrRG0Mqembsa+UrTAV6Q== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -18,39 +18,32 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.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" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@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/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": + 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" @@ -58,64 +51,64 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.15.4", "@babel/generator@^7.7.2": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" - integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== +"@babel/generator@^7.16.0", "@babel/generator@^7.7.2": + 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.15.4" + "@babel/types" "^7.16.0" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" - integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== +"@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" - integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== dependencies: - "@babel/helper-explode-assignable-expression" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== dependencies: - "@babel/compat-data" "^7.15.0" + "@babel/compat-data" "^7.16.0" "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" + browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" - integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== +"@babel/helper-create-class-features-plugin@^7.12.1", "@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.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@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-create-regexp-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" - integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.16.0" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -126,117 +119,117 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" - integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" - integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== +"@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.15.4" - "@babel/template" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-get-function-arity@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" - integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== +"@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-hoist-variables@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" - integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== +"@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== +"@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226" - integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw== +"@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.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@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.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== +"@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.15.4" + "@babel/types" "^7.16.0" "@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": 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-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" - integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== +"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" + integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-wrap-function" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== +"@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.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@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.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== +"@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" - integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== +"@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== +"@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.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": +"@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== @@ -246,174 +239,189 @@ 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/helper-wrap-function@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" - integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== dependencies: - "@babel/helper-function-name" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== +"@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== +"@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.14.5" + "@babel/helper-validator-identifier" "^7.15.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.7.2": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae" - integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.16.4", "@babel/parser@^7.3.3", "@babel/parser@^7.7.2": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" - integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" - integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.15.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + +"@babel/plugin-proposal-async-generator-functions@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" + integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.4" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== +"@babel/plugin-proposal-class-properties@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-class-properties@^7.16.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-class-static-block@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" - integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.15.6": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" - integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== +"@babel/plugin-proposal-object-rest-spread@^7.16.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.15.0" - "@babel/helper-compilation-targets" "^7.15.4" + "@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.15.4" + "@babel/plugin-transform-parameters" "^7.16.0" -"@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-private-property-in-object@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" - integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" - integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== +"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-async-generators@^7.8.4": @@ -458,7 +466,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@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.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -472,10 +487,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" - integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== +"@babel/plugin-syntax-jsx@^7.12.1", "@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" @@ -535,328 +550,337 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.14.5", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== +"@babel/plugin-syntax-typescript@^7.16.0", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== +"@babel/plugin-transform-arrow-functions@^7.16.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-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== dependencies: - "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-module-imports" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" -"@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== +"@babel/plugin-transform-block-scoped-functions@^7.16.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.15.3": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" - integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== +"@babel/plugin-transform-block-scoping@^7.16.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.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" - integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== +"@babel/plugin-transform-classes@^7.16.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.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" + "@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.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@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.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== +"@babel/plugin-transform-computed-properties@^7.16.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.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" - integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== +"@babel/plugin-transform-destructuring@^7.16.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-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" - integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== +"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" - integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== +"@babel/plugin-transform-flow-strip-types@^7.12.10", "@babel/plugin-transform-flow-strip-types@^7.16.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-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== +"@babel/plugin-transform-for-of@^7.16.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-function-name" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== +"@babel/plugin-transform-function-name@^7.16.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-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== +"@babel/plugin-transform-literals@^7.16.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-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== +"@babel/plugin-transform-member-expression-literals@^7.16.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-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== dependencies: - "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" - integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== +"@babel/plugin-transform-modules-commonjs@^7.16.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.15.4" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-simple-access" "^7.16.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" - integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== dependencies: - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-validator-identifier" "^7.15.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== dependencies: - "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" - integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" -"@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== +"@babel/plugin-transform-object-super@^7.16.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.14.5" + "@babel/helper-replace-supers" "^7.16.0" -"@babel/plugin-transform-parameters@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" - integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== +"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" + integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== +"@babel/plugin-transform-property-literals@^7.16.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.14.5": - version "7.15.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" - integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== +"@babel/plugin-transform-react-display-name@^7.16.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-development@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" - integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== +"@babel/plugin-transform-react-jsx-development@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" + integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== dependencies: - "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.16.0" -"@babel/plugin-transform-react-jsx@^7.14.5": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" - integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== +"@babel/plugin-transform-react-jsx@^7.12.11", "@babel/plugin-transform-react-jsx@^7.16.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.14.5" - "@babel/helper-module-imports" "^7.14.5" + "@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.14.5" - "@babel/types" "^7.14.9" + "@babel/plugin-syntax-jsx" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/plugin-transform-react-pure-annotations@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" - integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== +"@babel/plugin-transform-react-pure-annotations@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" + integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== +"@babel/plugin-transform-regenerator@^7.12.1", "@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== +"@babel/plugin-transform-shorthand-properties@^7.16.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.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" - integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== +"@babel/plugin-transform-spread@^7.16.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.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" -"@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== +"@babel/plugin-transform-template-literals@^7.16.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/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typescript@^7.15.0": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz#db7a062dcf8be5fc096bc0eeb40a13fbfa1fa251" - integrity sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA== +"@babel/plugin-transform-typescript@^7.16.0": + version "7.16.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" + integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.16.0" -"@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.0.0": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" - integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw== +"@babel/preset-env@^7.12.11", "@babel/preset-env@^7.16.0", "@babel/preset-env@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" + integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" - "@babel/plugin-proposal-async-generator-functions" "^7.15.4" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.15.4" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.15.6" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.15.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.4" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -871,50 +895,59 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.15.3" - "@babel/plugin-transform-classes" "^7.15.4" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.15.4" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.4" - "@babel/plugin-transform-modules-systemjs" "^7.15.4" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.15.4" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.6" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.6" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.16.0" + "@babel/plugin-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.3" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" semver "^6.3.0" -"@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== +"@babel/preset-flow@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.16.0.tgz#9f1f6e72714d79460d48058cb5658fc87da7150b" + integrity sha512-e5NE1EoPMpoHFkyFkMSj2h9tu7OolARcUHki8mnBv4NiFK9so+UrhbvT9mV99tMJOUEx8BOj67T6dXvGcTeYeQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-flow-strip-types" "^7.16.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -922,31 +955,31 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" - integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== +"@babel/preset-react@^7.12.10", "@babel/preset-react@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" + integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-react-display-name" "^7.14.5" - "@babel/plugin-transform-react-jsx" "^7.14.5" - "@babel/plugin-transform-react-jsx-development" "^7.14.5" - "@babel/plugin-transform-react-pure-annotations" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-react-jsx" "^7.16.0" + "@babel/plugin-transform-react-jsx-development" "^7.16.0" + "@babel/plugin-transform-react-pure-annotations" "^7.16.0" -"@babel/preset-typescript@^7.0.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" - integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== +"@babel/preset-typescript@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" + integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.15.0" + "@babel/plugin-transform-typescript" "^7.16.0" -"@babel/register@^7.0.0": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.15.3.tgz#6b40a549e06ec06c885b2ec42c3dd711f55fe752" - integrity sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw== +"@babel/register@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.16.0.tgz#f5d2aa14df37cf7146b9759f7c53818360f24ec6" + integrity sha512-lzl4yfs0zVXnooeLE0AAfYaT7F3SPA8yB2Bj4W1BiZwLbMS3MZH35ZvCWSRHvneUugwuM+Wsnrj7h0F7UmU3NQ== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -954,43 +987,43 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.13.8", "@babel/runtime@^7.8.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": + 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.3.3": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": - 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" +"@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/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.7.2": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + 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.3" + "@babel/types" "^7.16.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== +"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + 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.14.9" + "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -998,18 +1031,18 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint/eslintrc@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.4.tgz#dfe0ff7ba270848d10c5add0715e04964c034b31" + integrity sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" + debug "^4.3.2" + espree "^9.0.0" globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" - js-yaml "^3.13.1" + js-yaml "^4.1.0" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -1018,44 +1051,44 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== -"@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== +"@graphql-tools/merge@^8.2.1": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.2.1.tgz#bf83aa06a0cfc6a839e52a58057a84498d0d51ff" + integrity sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA== dependencies: - "@graphql-tools/utils" "^8.2.2" + "@graphql-tools/utils" "^8.5.1" tslib "~2.3.0" -"@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== +"@graphql-tools/schema@^8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.3.1.tgz#1ee9da494d2da457643b3c93502b94c3c4b68c74" + integrity sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ== dependencies: - "@graphql-tools/merge" "^8.1.0" - "@graphql-tools/utils" "^8.2.0" + "@graphql-tools/merge" "^8.2.1" + "@graphql-tools/utils" "^8.5.1" tslib "~2.3.0" - value-or-promise "1.0.10" + value-or-promise "1.0.11" -"@graphql-tools/utils@^8.2.0", "@graphql-tools/utils@^8.2.2": - version "8.2.3" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.2.3.tgz#9d7b9e7e116d11d26c2687f4d9cfb2b54568838b" - integrity sha512-RR+aiusf2gIfnPmrDIH1uA45QuPiHB54RD+BmWyMcl88tWAjeJtqZeWPqUTq/1EXrNeocJAJQqogHV4Fbbzx3A== +"@graphql-tools/utils@^8.5.1": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.5.3.tgz#404062e62cae9453501197039687749c4885356e" + integrity sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg== dependencies: tslib "~2.3.0" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@humanwhocodes/config-array@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.6.0.tgz#b5621fdb3b32309d2d16575456cbc277fa8f021a" + integrity sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A== dependencies: "@humanwhocodes/object-schema" "^1.2.0" debug "^4.1.1" minimatch "^3.0.4" "@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -1078,94 +1111,94 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.2.2.tgz#a977245155c519ac2ef713ec0e722d13eda893c9" - integrity sha512-m7tbzPWyvSFfoanTknJoDnaeruDARsUe555tkVjG/qeaRDKwyPqqbgs4yFx583gmoETiAts1deeYozR5sVRhNA== +"@jest/console@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.4.2.tgz#7a95612d38c007ddb528ee446fe5e5e785e685ce" + integrity sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.2.2" - jest-util "^27.2.0" + jest-message-util "^27.4.2" + jest-util "^27.4.2" slash "^3.0.0" -"@jest/core@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.2.2.tgz#9eea16101b2f04bf799dcdbdf1792d4ef7553ecf" - integrity sha512-4b9km/h9pAGdCkwWYtbfoeiOtajOlGmr5rL1Eq6JCAVbOevOqxWHxJ6daWxRJW9eF6keXJoJ1H+uVAVcdZu8Bg== +"@jest/core@^27.4.3": + version "27.4.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.3.tgz#9b9b34f4e6429a633085f476402aa2e3ce707877" + integrity sha512-V9ms3zSxUHxh1E/ZLAiXF7SLejsdFnjWTFizWotMOWvjho0lW5kSjZymhQSodNW0T0ZMQRiha7f8+NcFVm3hJQ== dependencies: - "@jest/console" "^27.2.2" - "@jest/reporters" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^27.4.2" + "@jest/reporters" "^27.4.2" + "@jest/test-result" "^27.4.2" + "@jest/transform" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^27.1.1" - jest-config "^27.2.2" - jest-haste-map "^27.2.2" - jest-message-util "^27.2.2" - jest-regex-util "^27.0.6" - jest-resolve "^27.2.2" - jest-resolve-dependencies "^27.2.2" - jest-runner "^27.2.2" - jest-runtime "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" - jest-watcher "^27.2.2" + jest-changed-files "^27.4.2" + jest-config "^27.4.3" + jest-haste-map "^27.4.2" + jest-message-util "^27.4.2" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.2" + jest-resolve-dependencies "^27.4.2" + jest-runner "^27.4.3" + jest-runtime "^27.4.2" + jest-snapshot "^27.4.2" + jest-util "^27.4.2" + jest-validate "^27.4.2" + jest-watcher "^27.4.2" micromatch "^4.0.4" - p-each-series "^2.1.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.2.2.tgz#2e57b9d2cc01028b0e35fae5833c1c63df4c5e41" - integrity sha512-gO9gVnZfn5ldeOJ5q+35Kru9QWGHEqZCB7W/M+8mD6uCwOGC9HR6mzpLSNRuDsxY/KhaGBYHpgFqtpe4Rl1gDQ== +"@jest/environment@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.4.2.tgz#03efabce528dbb09bffd3ec7e39bb0f3f7475cc2" + integrity sha512-uSljKxh/rGlHlmhyeG4ZoVK9hOec+EPBkwTHkHKQ2EqDu5K+MaG9uJZ8o1CbRsSdZqSuhXvJCYhBWsORPPg6qw== dependencies: - "@jest/fake-timers" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/fake-timers" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^27.1.1" + jest-mock "^27.4.2" -"@jest/fake-timers@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.2.2.tgz#43e6f191c95ae74e95d0ddba2ecb8470b4a288b7" - integrity sha512-gDIIqs0yxyjyxEI9HlJ8SEJ4uCc8qr8BupG1Hcx7tvyk/SLocyXE63rFxL+HQ0ZLMvSyEcJUmYnvvHH1osWiGA== +"@jest/fake-timers@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.4.2.tgz#d217f86c3ba2027bf29e0b731fd0cb761a72d093" + integrity sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg== dependencies: - "@jest/types" "^27.1.1" - "@sinonjs/fake-timers" "^7.0.2" + "@jest/types" "^27.4.2" + "@sinonjs/fake-timers" "^8.0.1" "@types/node" "*" - jest-message-util "^27.2.2" - jest-mock "^27.1.1" - jest-util "^27.2.0" + jest-message-util "^27.4.2" + jest-mock "^27.4.2" + jest-util "^27.4.2" -"@jest/globals@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.2.2.tgz#df66aaafda5c69b2bb0dae548e3cfb345f549c31" - integrity sha512-fWa/Luwod1hyehnuep+zCnOTqTVvyc4HLUU/1VpFNOEu0tCWNSODyvKSSOjtb1bGOpCNjgaDcyjzo5f7rl6a7g== +"@jest/globals@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.4.2.tgz#56a402c5ebf22eba1d34e900772147f5126ea2d8" + integrity sha512-KkfaHEttlGpXYAQTZHgrESiEPx2q/DKAFLGLFda1uGVrqc17snd3YVPhOxlXOHIzVPs+lQ/SDB2EIvxyGzb3Ew== dependencies: - "@jest/environment" "^27.2.2" - "@jest/types" "^27.1.1" - expect "^27.2.2" + "@jest/environment" "^27.4.2" + "@jest/types" "^27.4.2" + expect "^27.4.2" -"@jest/reporters@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.2.2.tgz#e2d41cd9f8088676b81b9a9908cb1ba67bdbee78" - integrity sha512-ufwZ8XoLChEfPffDeVGroYbhbcYPom3zKDiv4Flhe97rr/o2IfUXoWkDUDoyJ3/V36RFIMjokSu0IJ/pbFtbHg== +"@jest/reporters@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.2.tgz#d3860c5d3f668fa1326ab2bf5989f774e5c03f04" + integrity sha512-sp4aqmdBJtjKetEakzDPcZggPcVIF6w9QLkYBbaWDV6e/SIsHnF1S4KtIH91eEc2fp7ep6V/e1xvdfEoho1d2w== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^27.4.2" + "@jest/test-result" "^27.4.2" + "@jest/transform" "^27.4.2" + "@jest/types" "^27.4.2" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" @@ -1176,70 +1209,70 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^27.2.2" - jest-resolve "^27.2.2" - jest-util "^27.2.0" - jest-worker "^27.2.2" + jest-haste-map "^27.4.2" + jest-resolve "^27.4.2" + jest-util "^27.4.2" + jest-worker "^27.4.2" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^8.0.0" + v8-to-istanbul "^8.1.0" -"@jest/source-map@^27.0.6": - version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" - integrity sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g== +"@jest/source-map@^27.4.0": + version "27.4.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.4.0.tgz#2f0385d0d884fb3e2554e8f71f8fa957af9a74b6" + integrity sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.2.2.tgz#cd4ba1ca9b0521e463bd4b32349ba1842277563b" - integrity sha512-yENoDEoWlEFI7l5z7UYyJb/y5Q8RqbPd4neAVhKr6l+vVaQOPKf8V/IseSMJI9+urDUIxgssA7RGNyCRhGjZvw== +"@jest/test-result@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.4.2.tgz#05fd4a5466ec502f3eae0b39dff2b93ea4d5d9ec" + integrity sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA== dependencies: - "@jest/console" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^27.4.2" + "@jest/types" "^27.4.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.2.2.tgz#9a6d735317f525741a5913ee3cdefeffc9b0aba6" - integrity sha512-YnJqwNQP2Zeu0S4TMqkxg6NN7Y1EFq715n/nThNKrvIS9wmRZjDt2XYqsHbuvhAFjshi0iKDQ813NewFITBH+Q== +"@jest/test-sequencer@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.2.tgz#94bb7e5412d59ae2a8a4b8f9925bb16b6dc82b4c" + integrity sha512-HmHp5mlh9f9GyNej5yCS1JZIFfUGnP9+jEOH5zoq5EmsuZeYD+dGULqyvGDPtuzzbyAFJ6R4+z4SS0VvnFwwGQ== dependencies: - "@jest/test-result" "^27.2.2" + "@jest/test-result" "^27.4.2" graceful-fs "^4.2.4" - jest-haste-map "^27.2.2" - jest-runtime "^27.2.2" + jest-haste-map "^27.4.2" + jest-runtime "^27.4.2" -"@jest/transform@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.2.2.tgz#89b16b4de84354fb48d15712b3ea34cadc1cb600" - integrity sha512-l4Z/7PpajrOjCiXLWLfMY7fgljY0H8EwW7qdzPXXuv2aQF8kY2+Uyj3O+9Popnaw1V7JCw32L8EeI/thqFDkPA== +"@jest/transform@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.2.tgz#459885e96de2e21fc68b8b371e90aa653966dd0d" + integrity sha512-RTKcPZllfcmLfnlxBya7aypofhdz05+E6QITe55Ex0rxyerkgjmmpMlvVn11V0cP719Ps6WcDYCnDzxnnJUwKg== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" 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.2.2" - jest-regex-util "^27.0.6" - jest-util "^27.2.0" + jest-haste-map "^27.4.2" + jest-regex-util "^27.4.0" + jest-util "^27.4.2" 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.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.1.1.tgz#77a3fc014f906c65752d12123a0134359707c0ad" - integrity sha512-yqJPDDseb0mXgKqmNqypCsb85C22K1aY5+LUxh7syIM9n/b0AsaltxNy+o6tt29VcfGDpYEve175bm3uOhcehA== +"@jest/types@^27.4.2": + version "27.4.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.4.2.tgz#96536ebd34da6392c2b7c7737d693885b5dd44a5" + integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" @@ -1945,9 +1978,9 @@ fastq "^1.6.0" "@npmcli/ci-detect@^1.0.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz#6c1d2c625fb6ef1b9dea85ad0a5afcbef85ef22a" - integrity sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q== + version "1.4.0" + resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1" + integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== "@npmcli/fs@^1.0.0": version "1.0.0" @@ -1988,9 +2021,9 @@ rimraf "^3.0.2" "@npmcli/node-gyp@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz#3cdc1f30e9736dbc417373ed803b42b1a0a29ede" - integrity sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" + integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== "@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": version "1.3.2" @@ -2047,34 +2080,34 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^10.5.0": - version "10.6.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-10.6.0.tgz#13278af3cbe7bb141dc4ae02c24eaff209efadfb" - integrity sha512-/iQtZq+zuQJrwawFyjixh333xPu4/KJKk0bFM/Omm4kFlTGw0dWXfq6xCOe5DqONW0faW29Cc9r6p2mvl72aTQ== +"@octokit/openapi-types@^11.2.0": + version "11.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" + integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^2.16.0": - version "2.16.5" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.5.tgz#4d8098410f4c4697d33979f06f38d2ed2574adf1" - integrity sha512-2PfRGymdBypqRes4Xelu0BAZZRCV/Qg0xgo8UB10UKoghCM+zg640+T5WkRsRD0edwfLBPP3VsJgDyDTG4EIYg== +"@octokit/plugin-paginate-rest@^2.16.8": + version "2.17.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7" + integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== dependencies: - "@octokit/types" "^6.31.0" + "@octokit/types" "^6.34.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@5.11.2": - version "5.11.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.11.2.tgz#f3c374cdf4197b25ee62d8e132538115039fb4cc" - integrity sha512-oOJ/gC3e6XS5OyvLhS32BslGkKAyt/tgbLJUH1PKfIyDiRm4c6lSm+NHpy/L9WcdiCQji0RPglXTIH+8degjBg== +"@octokit/plugin-rest-endpoint-methods@^5.12.0": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba" + integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== dependencies: - "@octokit/types" "^6.31.0" + "@octokit/types" "^6.34.0" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -2087,9 +2120,9 @@ once "^1.4.0" "@octokit/request@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.1.tgz#f97aff075c37ab1d427c49082fefeef0dba2d8ce" - integrity sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ== + version "5.6.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.2.tgz#1aa74d5da7b9e04ac60ef232edd9a7438dcf32d8" + integrity sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.1.0" @@ -2099,23 +2132,79 @@ universal-user-agent "^6.0.0" "@octokit/rest@^18.1.0": - version "18.11.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.11.1.tgz#6baa998fcb6ede938e4df6e2567846bc7cb50b72" - integrity sha512-UadwFo10+5TQ/gm/E1r1M3Wkz8WUNyX3TLBO64YmlyZFoCPPLwdhVDHFJ+XGL/+sErPiyps3drvx1I9vMncunA== + version "18.12.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" + integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== dependencies: "@octokit/core" "^3.5.1" - "@octokit/plugin-paginate-rest" "^2.16.0" + "@octokit/plugin-paginate-rest" "^2.16.8" "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "5.11.2" + "@octokit/plugin-rest-endpoint-methods" "^5.12.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": + version "6.34.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" + integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== + dependencies: + "@octokit/openapi-types" "^11.2.0" + +"@rollup/plugin-alias@^3.1.1": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.8.tgz#645fd84659e08d3d1b059408fcdf69c1dd435a6b" + integrity sha512-tf7HeSs/06wO2LPqKNY3Ckbvy0JRe7Jyn98bXnt/gfrxbe+AJucoNJlsEVi9sdgbQtXemjbakCpO/76JVgnHpA== + dependencies: + slash "^3.0.0" + +"@rollup/plugin-babel@^5.2.2": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz#9cb1c5146ddd6a4968ad96f209c50c62f92f9879" + integrity sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-commonjs@^17.0.0": + version "17.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz#757ec88737dffa8aa913eb392fade2e45aef2a2d" + integrity sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-json@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^11.0.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.31.0": - version "6.31.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.31.0.tgz#b444852100090d1c5d0015614860c6131dc217e8" - integrity sha512-xobpvYmMYoFSxZB6jL1TPTMMZkxZIBlY145ZKibBJDKCczP1FrLLougtuVOZywGVZdcYs8oq2Bxb3aMjqIFeiw== +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== dependencies: - "@octokit/openapi-types" "^10.5.0" + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" -"@rollup/pluginutils@^4.1.0": +"@rollup/pluginutils@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec" integrity sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ== @@ -2130,18 +2219,51 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^7.0.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== dependencies: "@sinonjs/commons" "^1.7.0" +"@surma/rollup-plugin-off-main-thread@^2.2.2": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@testing-library/react-hooks@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz#3388d07f562d91e7f2431a4a21b5186062ecfee0" + integrity sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg== + dependencies: + "@babel/runtime" "^7.12.5" + "@types/react" ">=16.9.0" + "@types/react-dom" ">=16.9.0" + "@types/react-test-renderer" ">=16.9.0" + react-error-boundary "^3.1.0" + "@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== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/babel-plugin-macros@^2.8.5": + version "2.8.5" + resolved "https://registry.yarnpkg.com/@types/babel-plugin-macros/-/babel-plugin-macros-2.8.5.tgz#04474f9898aa9112afc22fa0e7e53a898fcaba4c" + integrity sha512-+NcIm/VBaSb4xaycov9f4Vmk4hMVPrgISoHEk+kalgVK6BlkwDZbXkW9kt1jCXVczTKXldL5RHIacExaWzxAkA== + dependencies: + "@types/babel__core" "*" + "@types/babel-plugin-tester@^9.0.0": version "9.0.4" resolved "https://registry.yarnpkg.com/@types/babel-plugin-tester/-/babel-plugin-tester-9.0.4.tgz#f5f9274149c6c789984f69ae4edbc383e33f679c" @@ -2183,6 +2305,21 @@ dependencies: "@babel/types" "^7.3.0" +"@types/crypto-js@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.0.2.tgz#4524325a175bf819fec6e42560c389ce1fb92c97" + integrity sha512-sCVniU+h3GcGqxOmng11BRvf9TfN9yIs8KKjB8C8d75W69cpTfZG80gau9yTx5SxF3gvHGbJhdESzzvnjtf3Og== + +"@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/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + "@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" @@ -2209,19 +2346,14 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^27.0.2": - version "27.0.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.2.tgz#ac383c4d4aaddd29bbf2b916d8d105c304a5fcd7" - integrity sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA== +"@types/jest@^27.0.2", "@types/jest@^27.0.3": + version "27.0.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.3.tgz#0cf9dfe9009e467f70a342f0f94ead19842a783a" + integrity sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg== dependencies: jest-diff "^27.0.0" pretty-format "^27.0.0" -"@types/json-schema@^7.0.7": - 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/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" @@ -2232,10 +2364,10 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/node@*", "@types/node@^16.10.1": - version "16.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.1.tgz#f3647623199ca920960006b3dccf633ea905f243" - integrity sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w== +"@types/node@*", "@types/node@^16.11.11", "@types/node@^16.11.7": + version "16.11.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" + integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2248,35 +2380,42 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@*", "@types/prettier@^2.1.5": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.0.tgz#900b13362610ccd3570fb6eefb911a6732973d00" - integrity sha512-WHRsy5nMpjXfU9B0LqOqPT06EI2+8Xv5NERy0pLxJLbU98q7uhcGogQzfX+rXpU7S5mgHsLxHrLCufZcV/P8TQ== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" + integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA== "@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-test-renderer@^17.0.1": +"@types/react-dom@>=16.9.0": + version "17.0.11" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466" + integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q== + dependencies: + "@types/react" "*" + +"@types/react-test-renderer@>=16.9.0": version "17.0.1" resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3120f7d1c157fba9df0118dae20cb0297ee0e06b" integrity sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^17.0.24": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.24.tgz#7e1b3f78d0fc53782543f9bce6d949959a5880bd" - integrity sha512-eIpyco99gTH+FTI3J7Oi/OH8MZoFMJuztNRimDOJwH4iGIsKV2qkGnk4M9VzlaVWeEEWLWSQRy0FEA0Kz218cg== +"@types/react@*", "@types/react@>=16.9.0", "@types/react@^17.0.34", "@types/react@^17.0.37": + version "17.0.37" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959" + integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/resolve@0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== dependencies: "@types/node" "*" @@ -2290,15 +2429,15 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@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/uuid@^8.3.1", "@types/uuid@^8.3.3": + version "8.3.3" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.3.tgz#c6a60686d953dbd1b1d45e66f4ecdbd5d471b4d0" + integrity sha512-0LbEEx1zxrYB3pgpd1M5lEhLcXjKJnYghvhTRgaBeUivLHMDM1TzF3IJ6hXU2+8uA4Xz+5BA63mtZo5DjVT8iA== -"@types/ws@^8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.0.tgz#75faefbe2328f3b833cb8dc640658328990d04f3" - integrity sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg== +"@types/ws@^8.2.0", "@types/ws@^8.2.1": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.1.tgz#7bdf6b12869726c9f3cc3c48485efea5d4505274" + integrity sha512-SqQ+LhVZaJi7c7sYVkjWALDigi/Wy7h7Iu72gkQp8Y8OWw/DddEVBrTSKu86pQftV2+Gm8lYM61hadPKqyaIeg== dependencies: "@types/node" "*" @@ -2314,74 +2453,49 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.9.1": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz#9f41efaee32cdab7ace94b15bd19b756dd099b0a" - integrity sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA== - dependencies: - "@typescript-eslint/experimental-utils" "4.31.2" - "@typescript-eslint/scope-manager" "4.31.2" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz#98727a9c1e977dd5d20c8705e69cd3c2a86553fa" - integrity sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.31.2" - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/typescript-estree" "4.31.2" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/parser@^4.9.1": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" - integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== +"@typescript-eslint/parser@^5.3.1": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.5.0.tgz#a38070e225330b771074daa659118238793f7fcd" + integrity sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg== dependencies: - "@typescript-eslint/scope-manager" "4.31.2" - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/typescript-estree" "4.31.2" - debug "^4.3.1" + "@typescript-eslint/scope-manager" "5.5.0" + "@typescript-eslint/types" "5.5.0" + "@typescript-eslint/typescript-estree" "5.5.0" + debug "^4.3.2" -"@typescript-eslint/scope-manager@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" - integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== +"@typescript-eslint/scope-manager@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz#2b9f3672fa6cddcb4160e7e8b49ef1fd00f83c09" + integrity sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg== dependencies: - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/visitor-keys" "4.31.2" + "@typescript-eslint/types" "5.5.0" + "@typescript-eslint/visitor-keys" "5.5.0" -"@typescript-eslint/types@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" - integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== +"@typescript-eslint/types@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.5.0.tgz#fee61ae510e84ed950a53937a2b443e078107003" + integrity sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg== -"@typescript-eslint/typescript-estree@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" - integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== - dependencies: - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/visitor-keys" "4.31.2" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" +"@typescript-eslint/typescript-estree@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz#12f422698c1636bd0206086bbec9844c54625ebc" + integrity sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ== + dependencies: + "@typescript-eslint/types" "5.5.0" + "@typescript-eslint/visitor-keys" "5.5.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" - integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== +"@typescript-eslint/visitor-keys@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz#4787586897b61f26068a3db5c50b3f5d254f9083" + integrity sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw== dependencies: - "@typescript-eslint/types" "4.31.2" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.5.0" + eslint-visitor-keys "^3.0.0" JSONStream@^1.0.4: version "1.3.5" @@ -2401,11 +2515,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -2414,7 +2523,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.0.1, acorn-jsx@^5.3.1: +acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -2424,20 +2533,15 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^6.1.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== +acorn@^8.2.4, acorn@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== add-stream@^1.0.0: version "1.0.0" @@ -2478,22 +2582,10 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.6.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" - integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" +alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= ansi-colors@^4.1.1: version "4.1.1" @@ -2512,21 +2604,16 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - 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 sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2579,6 +2666,11 @@ argparse@^1.0.7: 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== + argv@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" @@ -2615,9 +2707,9 @@ asap@^2.0.0: integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" @@ -2631,16 +2723,38 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +asyncro@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/asyncro/-/asyncro-3.0.0.tgz#3c7a732e263bc4a42499042f48d7d858e9c0134e" + integrity sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +autoprefixer@^10.1.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" + integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== + dependencies: + browserslist "^4.17.5" + caniuse-lite "^1.0.30001272" + fraction.js "^4.1.1" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.1.0" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -2651,29 +2765,20 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -babel-jest@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.2.2.tgz#d7e96f3f6f56be692de948092697e1bfea7f1184" - integrity sha512-XNFNNfGKnZXzhej7TleVP4s9ktH5JjRW8Rmcbb223JJwKB/gmTyeWN0JfiPtSgnjIjDXtKNoixiy0QUHtv3vFA== +babel-jest@^27.3.1, babel-jest@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.2.tgz#6edf80971045cfd44f3f10b6eda6007d95f62742" + integrity sha512-MADrjb3KBO2eyZCAc6QaJg6RT5u+6oEdDyHO5HEalnpwQ6LrhTsQF2Kj1Wnz2t6UPXIXPk18dSXXOT0wF5yTxA== dependencies: - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/transform" "^27.4.2" + "@jest/types" "^27.4.2" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^27.2.0" + babel-preset-jest "^27.4.0" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" -babel-literal-to-ast@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/babel-literal-to-ast/-/babel-literal-to-ast-2.1.0.tgz#c8b12f9c36a8cee13572d65aabf6cff8adb1e8b3" - integrity sha512-CxfpQ0ysQ0bZOhlaPgcWjl79Em16Rhqc6++UAFn0A3duiXmuyhhj8yyl9PYbj0I0CyjrHovdDbp2QEKT7uIMxw== - dependencies: - "@babel/parser" "^7.1.6" - "@babel/traverse" "^7.1.6" - "@babel/types" "^7.1.6" - 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" @@ -2682,20 +2787,20 @@ babel-plugin-dynamic-import-node@^2.3.3: object.assign "^4.1.0" babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + 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 "^4.0.0" + 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== +babel-plugin-jest-hoist@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz#d7831fc0f93573788d80dee7e682482da4c730d6" + integrity sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2709,29 +2814,38 @@ babel-plugin-jsx-pragmatic@^1.0.2: dependencies: babel-plugin-syntax-jsx "^6.0.0" -babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== +babel-plugin-macros@^3.0.1, babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.3.0" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" - integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.16.2" + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.18.0" -babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.3.0" babel-plugin-syntax-jsx@^6.0.0: version "6.18.0" @@ -2748,6 +2862,18 @@ babel-plugin-tester@^10.0.0: prettier "^2.0.1" strip-indent "^3.0.0" +babel-plugin-transform-async-to-promises@^0.8.15: + version "0.8.16" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.16.tgz#e7392100cd44f6a56d043c7efd383ffbee1c44a9" + integrity sha512-mm0UMekJVOTuIlkGIEH1fpnExyTIIJ2/L5ixTTI1zAVdMpbG7Em3LiS92p0TCWKiMkHhYYinz/zn2D/BPPJaxA== + +babel-plugin-transform-replace-expressions@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-replace-expressions/-/babel-plugin-transform-replace-expressions-0.2.0.tgz#59cba8df4b4a675e7c78cd21548f8e7685bbc30d" + integrity sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA== + dependencies: + "@babel/parser" "^7.3.3" + 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" @@ -2766,12 +2892,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^27.2.0: - 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== +babel-preset-jest@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz#70d0e676a282ccb200fbabd7f415db5fdf393bca" + integrity sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg== dependencies: - babel-plugin-jest-hoist "^27.2.0" + babel-plugin-jest-hoist "^27.4.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -2791,24 +2917,20 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== +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@^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== -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.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" @@ -2825,7 +2947,7 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brotli-size@4.0.0: +brotli-size@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/brotli-size/-/brotli-size-4.0.0.tgz#a05ee3faad3c0e700a2f2da826ba6b4d76e69e5e" integrity sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA== @@ -2837,16 +2959,16 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.16.6, browserslist@^4.17.0: - version "4.17.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.1.tgz#a98d104f54af441290b7d592626dd541fa642eb9" - integrity sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ== +browserslist@^4.0.0, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== dependencies: - caniuse-lite "^1.0.30001259" - electron-to-chromium "^1.3.846" + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" escalade "^3.1.1" - nanocolors "^0.1.5" - node-releases "^1.1.76" + node-releases "^2.0.1" + picocolors "^1.0.0" bser@2.1.1: version "2.1.1" @@ -2855,20 +2977,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buble@^0.19.8: - version "0.19.8" - resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.8.tgz#d642f0081afab66dccd897d7b6360d94030b9d3d" - integrity sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA== - dependencies: - acorn "^6.1.1" - acorn-dynamic-import "^4.0.0" - acorn-jsx "^5.0.1" - chalk "^2.4.2" - magic-string "^0.25.3" - minimist "^1.2.0" - os-homedir "^2.0.0" - regexpu-core "^4.5.4" - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2946,16 +3054,24 @@ camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + version "6.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" + integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== -caniuse-lite@^1.0.30001259: - version "1.0.30001260" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001260.tgz#e3be3f34ddad735ca4a2736fa9e768ef34316270" - integrity sha512-Fhjc/k8725ItmrvW5QomzxLeojewxvqiYCKeFcfFEhut28IVLdpHU19dneOmltZQIE5HNbawj1HYD+1f2bM1Dg== +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: - nanocolors "^0.1.0" + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001280: + version "1.0.30001283" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" + integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== caseless@~0.12.0: version "0.12.0" @@ -2970,6 +3086,17 @@ casual@^1.5.19: mersenne-twister "^1.0.1" moment "^2.15.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 sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + 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.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2979,7 +3106,7 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3027,10 +3154,10 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -3042,11 +3169,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -3054,7 +3176,7 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-truncate@^2.1.0: +cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== @@ -3147,15 +3269,20 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colord@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e" + integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw== + colorette@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -colors@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +colorette@^2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== columnify@^1.5.4: version "1.5.4" @@ -3187,6 +3314,11 @@ commander@^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.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -3215,6 +3347,13 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" +concat-with-sourcemaps@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" + integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== + dependencies: + source-map "^0.6.1" + config-chain@^1.1.12: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -3285,9 +3424,9 @@ conventional-commits-filter@^2.0.7: modify-values "^1.0.0" conventional-commits-parser@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.2.tgz#190fb9900c6e02be0c0bca9b03d57e24982639fd" - integrity sha512-Jr9KAKgqAkwXMRHjxDwO/zOCDKod1XdAESHAGuJX38iZ7ZzVti/tvVoysO0suMsdAObp9NQ2rHSsSbnAqZ5f5g== + version "3.2.3" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz#fc43704698239451e3ef35fd1d8ed644f46bd86e" + integrity sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" @@ -3317,18 +3456,18 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, dependencies: safe-buffer "~5.1.1" -core-js-compat@^3.16.0, core-js-compat@^3.16.2: - version "3.18.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.0.tgz#fb360652201e8ac8da812718c008cd0482ed9b42" - integrity sha512-tRVjOJu4PxdXjRMEgbP7lqWy1TWJu9a01oBkn8d+dNrhgmBwdTkzhHZpVJnEmhISLdoJI1lX08rcBcHi3TZIWg== +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.19.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.2.tgz#18066a3404a302433cb0aa8be82dd3d75c76e5c4" + integrity sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ== dependencies: - browserslist "^4.17.0" + browserslist "^4.18.1" semver "7.0.0" core-js@^3.0.0: - version "3.18.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.18.0.tgz#9af3f4a6df9ba3428a3fb1b171f1503b3f40cc49" - integrity sha512-WJeQqq6jOYgVgg4NrXKL0KLQhi0CT4ZOCvFL+3CQ5o7I6J8HkT5wd53EadMfqTDp1so/MT1J+w2ujhWcCJtN7w== + version "3.19.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.2.tgz#ae216d7f4f7e924d9a2e3ff1e4b1940220f9157b" + integrity sha512-ciYCResnLIATSsXuXnIOH4CbdfgV+H1Ltg16hJFN7/v6OxqnFr/IFGeLacaZ+fHLAm0TBbXwNK9/DNBzBUrO/g== core-util-is@1.0.2: version "1.0.2" @@ -3340,7 +3479,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^7.0.0: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== @@ -3365,6 +3504,99 @@ crypto-js@^4.0.0: resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== +css-declaration-sorter@^6.0.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" + integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA== + dependencies: + timsort "^0.3.0" + +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-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.8.tgz#7525feb1b72f7b06e57f55064cbdae341d79dea2" + integrity sha512-zWMlP0+AMPBVE852SqTrP0DnhTcTA2C1wAF92TKZ3Va+aUVqLIhkqKlnJIXXdqXD7RN+S1ujuWmNpvrJBiM/vg== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^2.0.1" + postcss-calc "^8.0.0" + postcss-colormin "^5.2.1" + postcss-convert-values "^5.0.2" + postcss-discard-comments "^5.0.1" + postcss-discard-duplicates "^5.0.1" + postcss-discard-empty "^5.0.1" + postcss-discard-overridden "^5.0.1" + postcss-merge-longhand "^5.0.4" + postcss-merge-rules "^5.0.3" + postcss-minify-font-values "^5.0.1" + postcss-minify-gradients "^5.0.3" + postcss-minify-params "^5.0.2" + postcss-minify-selectors "^5.1.0" + postcss-normalize-charset "^5.0.1" + postcss-normalize-display-values "^5.0.1" + postcss-normalize-positions "^5.0.1" + postcss-normalize-repeat-style "^5.0.1" + postcss-normalize-string "^5.0.1" + postcss-normalize-timing-functions "^5.0.1" + postcss-normalize-unicode "^5.0.1" + postcss-normalize-url "^5.0.3" + postcss-normalize-whitespace "^5.0.1" + postcss-ordered-values "^5.0.2" + postcss-reduce-initial "^5.0.2" + postcss-reduce-transforms "^5.0.1" + postcss-svgo "^5.0.3" + postcss-unique-selectors "^5.0.2" + +cssnano-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" + integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== + +cssnano@^5.0.1: + version "5.0.12" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.12.tgz#2c083a1c786fc9dc2d5522bd3c0e331b7cd302ab" + integrity sha512-U38V4x2iJ3ijPdeWqUrEr4eKBB5PbEKsNP5T8xcik2Au3LeMtiMHX0i2Hu9k51FcKofNZumbrcdC6+a521IUHg== + dependencies: + cssnano-preset-default "^5.1.8" + is-resolvable "^1.1.0" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -3383,9 +3615,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" - integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== dargs@^7.0.0: version "7.0.0" @@ -3399,10 +3631,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-uri-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" + integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== data-urls@^2.0.0: version "2.0.0" @@ -3418,10 +3650,10 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@^4.0.1, 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== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" @@ -3525,10 +3757,10 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" - integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== +diff-sequences@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" + integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== dir-glob@^3.0.1: version "3.0.1" @@ -3544,6 +3776,20 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +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== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -3551,6 +3797,22 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" +domhandler@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + +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-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -3583,26 +3845,33 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.846: - version "1.3.850" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.850.tgz#c56c72abfeab051b4b328beb894461c5912d0456" - integrity sha512-ZzkDcdzePeF4dhoGZQT77V2CyJOpwfTZEOg4h0x6R/jQhGt/rIRpbRyVreWLtD7B/WsVxo91URm2WxMKR9JQZA== +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +electron-to-chromium@^1.3.896: + version "1.4.8" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.8.tgz#e1b7752ac1a75e39b5dd90cc7e29ea08b351c484" + integrity sha512-Cu5+dbg55+1E3ohlsa8HT0s4b8D0gBewXEGG8s5wBl8ynWv60VuvYW25GpsOeTVXpulhyU/U8JYZH+yxASSJBQ== emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== -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== + encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -3617,6 +3886,11 @@ enquirer@^2.3.5, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -3639,10 +3913,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: - version "1.18.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" - integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== +es-abstract@^1.19.1: + 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" @@ -3655,7 +3929,9 @@ es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: 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" @@ -3677,7 +3953,7 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@^1.0.5: +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= @@ -3704,27 +3980,20 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-plugin-prefer-let@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-let/-/eslint-plugin-prefer-let-1.1.0.tgz#a5eb401a5f6b6995883bac7ebafb7fe5d6e9bedb" - integrity sha512-d7IhB8FZCtnCNQ20e4UTETPJNF3mIES3ZYan9RK/K3sIkEfuL3NfF9t5gxoNRFjeSkhlGpJmZdLGLRGPmKgVfQ== +eslint-plugin-prefer-let@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-let/-/eslint-plugin-prefer-let-3.0.1.tgz#bb9e3af2c3df2df5d7334f35ac7478d794d97215" + integrity sha512-vbznkkBSXB63d4o1o0NIm5C2ey3V5wKr/25dAvPdydQXdowAcnr69cbLgxd2YAG81IV5eddCO55Lp6gL7wSE4w== dependencies: requireindex "~1.2.0" -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== +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== dependencies: esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" + estraverse "^5.2.0" eslint-utils@^3.0.0: version "3.0.0" @@ -3733,47 +4002,46 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.15.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" + integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== + +eslint@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.3.0.tgz#a3c2409507403c1c7f6c42926111d6cbefbc3e85" + integrity sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" + "@eslint/eslintrc" "^1.0.4" + "@humanwhocodes/config-array" "^0.6.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.1.0" + espree "^9.1.0" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" + glob-parent "^6.0.1" globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" @@ -3781,22 +4049,21 @@ eslint@^7.15.0: natural-compare "^1.4.0" optionator "^0.9.1" progress "^2.0.0" - regexpp "^3.1.0" + regexpp "^3.2.0" semver "^7.2.1" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.0.0, espree@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.1.0.tgz#ba9d3c9b34eeae205724124e31de4543d59fbf74" + integrity sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ== dependencies: - acorn "^7.4.0" + acorn "^8.6.0" acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + eslint-visitor-keys "^3.1.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -3817,21 +4084,21 @@ esrecurse@^4.3.0: 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.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + estree-walker@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -3847,7 +4114,7 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -execa@^5.0.0: +execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -3867,17 +4134,17 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.2.2.tgz#65c414697415c0867ef588813e9c729ebab8a9a9" - integrity sha512-sjHBeEk47/eshN9oLbvPJZMgHQihOXXQzSMPCJ4MqKShbU9HOVFSNHEEU4dp4ujzxFSiNvPFzB2AMOFmkizhvA== +expect@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.4.2.tgz#4429b0f7e307771d176de9bdf23229b101db6ef6" + integrity sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" ansi-styles "^5.0.0" - jest-get-type "^27.0.6" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-regex-util "^27.0.6" + jest-get-type "^27.4.0" + jest-matcher-utils "^27.4.2" + jest-message-util "^27.4.2" + jest-regex-util "^27.4.0" extend@~3.0.2: version "3.0.2" @@ -3899,9 +4166,9 @@ extsprintf@1.3.0: integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -3951,9 +4218,9 @@ fb-watchman@^2.0.0: bser "2.1.1" fetch-blob@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.2.tgz#6bc438675f3851ecea51758ac91f6a1cd1bacabd" - integrity sha512-hunJbvy/6OLjCD0uuhLdp0mMPzP/yd2ssd1t2FCJsaA7wkWhpbp9xfuNVpv7Ll4jFhzp6T4LAupSiV9uOeg0VQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.3.tgz#a7dca4855e39d3e3c5a1da62d4ee335c37d26012" + integrity sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ== dependencies: web-streams-polyfill "^3.0.3" @@ -3973,6 +4240,14 @@ fetch-mock@^9.11.0: querystring "^0.2.0" whatwg-url "^6.5.0" +figures@^1.0.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -3987,6 +4262,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + filesize@^6.1.0: version "6.4.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" @@ -4053,9 +4335,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== forever-agent@~0.6.1: version "0.6.1" @@ -4080,6 +4362,18 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +fraction.js@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== + fs-extra@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -4152,6 +4446,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +generic-names@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" + integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== + dependencies: + loader-utils "^1.1.0" + 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" @@ -4272,6 +4573,13 @@ glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.1: + 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.0: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -4295,13 +4603,18 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" - integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: type-fest "^0.20.2" -globby@^11.0.2, globby@^11.0.3: +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + +globby@^11.0.2, 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== @@ -4313,6 +4626,11 @@ globby@^11.0.2, globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" @@ -4325,10 +4643,22 @@ graphql-query-compress@^1.0.0: dependencies: tokenizr "1.5.7" -graphql@^15.4.0: - version "15.6.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.0.tgz#e69323c6a9780a1a4b9ddf7e35ca8904bb04df02" - integrity sha512-WJR872Zlc9hckiEPhXgyUftXH48jp2EjO5tgBBOyNMRJZ9fviL2mJBD6CAysk6N5S0r9BTs09Qk39nnJBkvOXQ== +graphql-relay@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/graphql-relay/-/graphql-relay-0.9.0.tgz#d96f19d38b742a390acf10056ddd136034b3e1b4" + integrity sha512-yNJLCqcjz0XpzpmmckRJCSK8a2ZLwTurwrQ09UyGftONh52PbrGpK1UO4yspvj0c7pC+jkN4ZUqVXG3LRrWkXQ== + +graphql@^15.6.1: + version "15.7.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.7.2.tgz#85ab0eeb83722977151b3feb4d631b5f2ab287ef" + integrity sha512-AnnKk7hFQFmU/2I9YSQf3xw44ctnSFCfp3zE0N6W174gqe9fWG/2rKaKxROK7CcI3XtERpjEKFqts8o319Kf7A== + +gzip-size@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + integrity sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA= + dependencies: + duplexer "^0.1.1" gzip-size@^6.0.0: version "6.0.0" @@ -4367,6 +4697,13 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + 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" @@ -4473,10 +4810,10 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -husky@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.2.tgz#21900da0f30199acca43a46c043c4ad84ae88dff" - integrity sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg== +husky@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -4492,6 +4829,16 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + ignore-walk@3.0.4, ignore-walk@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" @@ -4505,9 +4852,16 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 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== + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + +import-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" + integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + dependencies: + import-from "^3.0.0" import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -4517,10 +4871,17 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: 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-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== + version "3.0.3" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" + integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -4604,6 +4965,11 @@ ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +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-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -4643,17 +5009,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-ci@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" - integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== - dependencies: - ci-info "^3.1.1" - is-core-module@^2.2.0, is-core-module@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== dependencies: has "^1.0.3" @@ -4676,11 +5035,6 @@ is-fullwidth-code-point@^1.0.0: 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" @@ -4691,10 +5045,10 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, 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" @@ -4762,6 +5116,13 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4775,6 +5136,16 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +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-ssh@^1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" @@ -4818,10 +5189,12 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -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-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" isarray@~1.0.0: version "1.0.0" @@ -4843,12 +5216,12 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz#e8900b3ed6069759229cf30f7067388d148aeb5e" - integrity sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ== +istanbul-lib-coverage@^3.0.0, 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@^4.0.0, istanbul-lib-instrument@^4.0.3: +istanbul-lib-instrument@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== @@ -4858,6 +5231,17 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +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" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -4868,242 +5252,253 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.1.tgz#7085857f17d2441053c6ce5c3b8fdf6882289397" + integrity sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.1.1.tgz#9b3f67a34cc58e3e811e2e1e21529837653e4200" - integrity sha512-5TV9+fYlC2A6hu3qtoyGHprBwCAn0AuGA77bZdUgYvVlRMjHXo063VcWTEAyx6XAZ85DYHqp0+aHKbPlfRDRvA== +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== dependencies: - "@jest/types" "^27.1.1" + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jest-changed-files@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.4.2.tgz#da2547ea47c6e6a5f6ed336151bd2075736eb4a5" + integrity sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A== + dependencies: + "@jest/types" "^27.4.2" execa "^5.0.0" throat "^6.0.1" -jest-circus@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.2.2.tgz#a3647082f3eba1226f7664a36a2b7ebf45ceaf7b" - integrity sha512-8txlqs0EDrvPasCgwfLMkG0l3F4FxqQa6lxOsvYfOl04eSJjRw3F4gk9shakuC00nMD+VT+SMtFYXxe64f0VZw== +jest-circus@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.2.tgz#466f482207ca9f323b78416c28f4d1fa7588159a" + integrity sha512-2ePUSru1BGMyzxsMvRfu+tNb+PW60rUyMLJBfw1Nrh5zC8RoTPfF+zbE0JToU31a6ZVe4nnrNKWYRzlghAbL0A== dependencies: - "@jest/environment" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/environment" "^27.4.2" + "@jest/test-result" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^27.2.2" + expect "^27.4.2" is-generator-fn "^2.0.0" - jest-each "^27.2.2" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-runtime "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - pretty-format "^27.2.2" + jest-each "^27.4.2" + jest-matcher-utils "^27.4.2" + jest-message-util "^27.4.2" + jest-runtime "^27.4.2" + jest-snapshot "^27.4.2" + jest-util "^27.4.2" + pretty-format "^27.4.2" slash "^3.0.0" stack-utils "^2.0.3" throat "^6.0.1" -jest-cli@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.2.2.tgz#0973a717c109f23de642b63486f3cb71c5a971be" - integrity sha512-jbEythw22LR/IHYgNrjWdO74wO9wyujCxTMjbky0GLav4rC4y6qDQr4TqQ2JPP51eDYJ2awVn83advEVSs5Brg== +jest-cli@^27.4.3: + version "27.4.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.3.tgz#89acba683b9f91c7a5e342e2ea13aa5414836a0d" + integrity sha512-zZSJBXNC/i8UnJPwcKWsqnhGgIF3uoTYP7th32Zej7KNQJdxzOMj+wCfy2Ox3kU7nXErJ36DtYyXDhfiqaiDRw== dependencies: - "@jest/core" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/core" "^27.4.3" + "@jest/test-result" "^27.4.2" + "@jest/types" "^27.4.2" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" - jest-config "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + jest-config "^27.4.3" + jest-util "^27.4.2" + jest-validate "^27.4.2" prompts "^2.0.1" - yargs "^16.0.3" + yargs "^16.2.0" -jest-config@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.2.2.tgz#970d8466c60ac106ac9d7d0b8dcf3ff150fa713a" - integrity sha512-2nhms3lp52ZpU0636bB6zIFHjDVtYxzFQIOHZjBFUeXcb6b41sEkWojbHaJ4FEIO44UbccTLa7tvNpiFCgPE7w== +jest-config@^27.4.3: + version "27.4.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.3.tgz#7820e08f7526fa3f725423e2f0fa7888ee0ef9c9" + integrity sha512-DQ10HTSqYtC2pO7s9j2jw+li4xUnm2wLYWH2o7K1ftB8NyvToHsXoLlXxtsGh3AW9gUQR6KY/4B7G+T/NswJBw== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^27.2.2" - "@jest/types" "^27.1.1" - babel-jest "^27.2.2" + "@jest/test-sequencer" "^27.4.2" + "@jest/types" "^27.4.2" + babel-jest "^27.4.2" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - is-ci "^3.0.0" - jest-circus "^27.2.2" - jest-environment-jsdom "^27.2.2" - jest-environment-node "^27.2.2" - jest-get-type "^27.0.6" - jest-jasmine2 "^27.2.2" - jest-regex-util "^27.0.6" - jest-resolve "^27.2.2" - jest-runner "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + jest-circus "^27.4.2" + jest-environment-jsdom "^27.4.3" + jest-environment-node "^27.4.2" + jest-get-type "^27.4.0" + jest-jasmine2 "^27.4.2" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.2" + jest-runner "^27.4.3" + jest-util "^27.4.2" + jest-validate "^27.4.2" micromatch "^4.0.4" - pretty-format "^27.2.2" + pretty-format "^27.4.2" + slash "^3.0.0" -jest-diff@^27.0.0, jest-diff@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.2.2.tgz#3992fe5f55f209676c5d3fd956e3f3d4145f76b8" - integrity sha512-o3LaDbQDSaMJif4yztJAULI4xVatxbBasbKLbEw3K8CiRdDdbxMrLArS9EKDHQFYh6Tgfrm1PC2mIYR1xhu0hQ== +jest-diff@^27.0.0, jest-diff@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.2.tgz#786b2a5211d854f848e2dcc1e324448e9481f36f" + integrity sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q== dependencies: chalk "^4.0.0" - diff-sequences "^27.0.6" - jest-get-type "^27.0.6" - pretty-format "^27.2.2" + diff-sequences "^27.4.0" + jest-get-type "^27.4.0" + pretty-format "^27.4.2" -jest-docblock@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" - integrity sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA== +jest-docblock@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.4.0.tgz#06c78035ca93cbbb84faf8fce64deae79a59f69f" + integrity sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg== dependencies: detect-newline "^3.0.0" -jest-each@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.2.2.tgz#62da8dd68b9fc61ab6e9e344692eeb1251f8c91d" - integrity sha512-ZCDhkvwHeXHsxoFxvW43fabL18iLiVDxaipG5XWG7dSd+XWXXpzMQvBWYT9Wvzhg5x4hvrLQ24LtiOKw3I09xA== +jest-each@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.4.2.tgz#19364c82a692d0d26557642098d1f4619c9ee7d3" + integrity sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" chalk "^4.0.0" - jest-get-type "^27.0.6" - jest-util "^27.2.0" - pretty-format "^27.2.2" - -jest-environment-jsdom@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.2.2.tgz#fb3075b4be6289961dcc4942e98f1862b3a8c4cb" - integrity sha512-mzCLEdnpGWDJmNB6WIPLlZM+hpXdeiya9TryiByqcUdpliNV1O+LGC2SewzjmB4IblabGfvr3KcPN0Nme2wnDw== - dependencies: - "@jest/environment" "^27.2.2" - "@jest/fake-timers" "^27.2.2" - "@jest/types" "^27.1.1" + jest-get-type "^27.4.0" + jest-util "^27.4.2" + pretty-format "^27.4.2" + +jest-environment-jsdom@^27.4.3: + version "27.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.4.3.tgz#74198285f6284888ca9c7486c4e5e67add75aa53" + integrity sha512-x1AUVz3G14LpEJs7KIFUaTINT2n0unOUmvdAby3s/sldUpJJetOJifHo1O/EUQC5fNBowggwJbVulko18y6OWw== + dependencies: + "@jest/environment" "^27.4.2" + "@jest/fake-timers" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^27.1.1" - jest-util "^27.2.0" + jest-mock "^27.4.2" + jest-util "^27.4.2" jsdom "^16.6.0" -jest-environment-node@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.2.2.tgz#60ba7d7fee956f68964d47a785d0195ce125aaa3" - integrity sha512-XgUscWs6H6UNqC96/QJjmUGZzzpql/JyprLSXVu7wkgM8tjbJdEkSqwrVAvJPm1yu526ImrmsIoh2BTHxkwL/g== +jest-environment-node@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.4.2.tgz#bf5586a0924a8d21c13838121ac0941638c7d15e" + integrity sha512-nzTZ5nJ+FabuZPH2YVci7SZIHpvtNRHPt8+vipLkCnAgXGjVzHm7XJWdnNqXbAkExIgiKeVEkVMNZOZE/LeiIg== dependencies: - "@jest/environment" "^27.2.2" - "@jest/fake-timers" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/environment" "^27.4.2" + "@jest/fake-timers" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^27.1.1" - jest-util "^27.2.0" + jest-mock "^27.4.2" + jest-util "^27.4.2" -jest-get-type@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" - integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== +jest-get-type@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" + integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== -jest-haste-map@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.2.2.tgz#81ccb57b1e1cd513aaaadf5016aad5dab0ede552" - integrity sha512-kaKiq+GbAvk6/sq++Ymor4Vzk6+lr0vbKs2HDVPdkKsHX2lIJRyvhypZG/QsNfQnROKWIZSpUpGuv2HySSosvA== +jest-haste-map@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.2.tgz#7fc7d5e568cca704284f4850885b74a0b8b87587" + integrity sha512-foiyAEePORUN2eeJnOtcM1y8qW0ShEd9kTjWVL4sVaMcuCJM6gtHegvYPBRT0mpI/bs4ueThM90+Eoj2ncoNsA== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" "@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.2.0" - jest-worker "^27.2.2" + jest-regex-util "^27.4.0" + jest-serializer "^27.4.0" + jest-util "^27.4.2" + jest-worker "^27.4.2" micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: fsevents "^2.3.2" -jest-jasmine2@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.2.2.tgz#bf87c8820a192c86b65a7c4c1a54caae52124f04" - integrity sha512-SczhZNfmZID9HbJ1GHhO4EzeL/PMRGeAUw23ddPUdd6kFijEZpT2yOxyNCBUKAsVQ/14OB60kjgnbuFOboZUNg== +jest-jasmine2@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.2.tgz#c956c88b9c05ca22afdc779deebc2890cb891797" + integrity sha512-VO/fyAJSH9u0THjbteFiL8qc93ufU+yW+bdieDc8tzTCWwlWzO53UHS5nFK1qmE8izb5Smkn+XHlVt6/l06MKQ== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^27.2.2" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/environment" "^27.4.2" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^27.2.2" + expect "^27.4.2" is-generator-fn "^2.0.0" - jest-each "^27.2.2" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-runtime "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - pretty-format "^27.2.2" + jest-each "^27.4.2" + jest-matcher-utils "^27.4.2" + jest-message-util "^27.4.2" + jest-runtime "^27.4.2" + jest-snapshot "^27.4.2" + jest-util "^27.4.2" + pretty-format "^27.4.2" throat "^6.0.1" -jest-leak-detector@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.2.2.tgz#5af54273efcf5114ad406f4448860c2396319e12" - integrity sha512-fQIYKkhXUs/4EpE4wO1AVsv7aNH3o0km1BGq3vxvSfYdwG9GLMf+b0z/ghLmBYNxb+tVpm/zv2caoKm3GfTazg== +jest-leak-detector@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz#7fc3120893a7a911c553f3f2bdff9faa4454abbb" + integrity sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw== dependencies: - jest-get-type "^27.0.6" - pretty-format "^27.2.2" + jest-get-type "^27.4.0" + pretty-format "^27.4.2" -jest-matcher-utils@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.2.2.tgz#a6c0a10dce6bfe8250bbed3e2f1b206568d73bde" - integrity sha512-xN3wT4p2i9DGB6zmL3XxYp5lJmq9Q6ff8XKlMtVVBS2SAshmgsPBALJFQ8dWRd2G/xf5q/N0SD0Mipt8QBA26A== +jest-matcher-utils@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz#d17c5038607978a255e0a9a5c32c24e984b6c60b" + integrity sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ== dependencies: chalk "^4.0.0" - jest-diff "^27.2.2" - jest-get-type "^27.0.6" - pretty-format "^27.2.2" + jest-diff "^27.4.2" + jest-get-type "^27.4.0" + pretty-format "^27.4.2" -jest-message-util@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.2.2.tgz#cdbb1b82dfe5f601ae35f5c6a28bf7823e6bcf99" - integrity sha512-/iS5/m2FSF7Nn6APFoxFymJpyhB/gPf0CJa7uFSkbYaWvrADUfQ9NTsuyjpszKErOS2/huFs44ysWhlQTKvL8Q== +jest-message-util@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.2.tgz#07f3f1bf207d69cf798ce830cc57f1a849f99388" + integrity sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.4" micromatch "^4.0.4" - pretty-format "^27.2.2" + pretty-format "^27.4.2" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.1.1.tgz#c7a2e81301fdcf3dab114931d23d89ec9d0c3a82" - integrity sha512-SClsFKuYBf+6SSi8jtAYOuPw8DDMsTElUWEae3zq7vDhH01ayVSIHUSIa8UgbDOUalCFp6gNsaikN0rbxN4dbw== +jest-mock@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.4.2.tgz#184ff197a25491bfe4570c286daa5d62eb760b88" + integrity sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -5111,77 +5506,76 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -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-regex-util@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca" + integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== -jest-resolve-dependencies@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.2.tgz#7467c67cb8b5630ec28e2f0c72a0b62e56668083" - integrity sha512-nvJS+DyY51HHdZnMIwXg7fimQ5ylFx4+quQXspQXde2rXYy+4v75UYoX/J65Ln8mKCNc6YF8HEhfGaRBOrxxHg== +jest-resolve-dependencies@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.2.tgz#2f4f363cca26f75a22aefd496f9c7ae65b3de37f" + integrity sha512-hb++cTpqvOWfU49MCP/JQkxmnrhKoAVqXWFjgYXswRSVGk8Q6bDTSvhbCeYXDtXaymY0y7WrrSIlKogClcKJuw== dependencies: - "@jest/types" "^27.1.1" - jest-regex-util "^27.0.6" - jest-snapshot "^27.2.2" + "@jest/types" "^27.4.2" + jest-regex-util "^27.4.0" + jest-snapshot "^27.4.2" -jest-resolve@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.2.2.tgz#1bad93dbc6c20edb874e6720e82e4e48900b120b" - integrity sha512-tfbHcBs/hJTb3fPQ/3hLWR+TsLNTzzK98TU+zIAsrL9nNzWfWROwopUOmiSUqmHMZW5t9au/433kSF2/Af+tTw== +jest-resolve@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.2.tgz#d3e4cbee7acb4a4f8c8bfc270767bec34d2aefaf" + integrity sha512-d/zqPjxCzMqHlOdRTg8cTpO9jY+1/T74KazT8Ws/LwmwxV5sRMWOkiLjmzUCDj/5IqA5XHNK4Hkmlq9Kdpb9Sg== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" chalk "^4.0.0" - escalade "^3.1.1" graceful-fs "^4.2.4" - jest-haste-map "^27.2.2" + jest-haste-map "^27.4.2" jest-pnp-resolver "^1.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + jest-util "^27.4.2" + jest-validate "^27.4.2" resolve "^1.20.0" + resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.2.2.tgz#e719a8ce2a16575677105f692fdff7cd00602325" - integrity sha512-+bUFwBq+yTnvsOFuxetoQtkuOnqdAk2YuIGjlLmc7xLAXn/V1vjhXrLencgij0BUTTUvG9Aul3+5XDss4Wa8Eg== +jest-runner@^27.4.3: + version "27.4.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.3.tgz#9f05d4733829787778e8a143ade913834d0828dc" + integrity sha512-JgR6Om/j22Fd6ZUUIGTWNcCtuZVYbNrecb4k89W4UyFJoRtHpo2zMKWkmFFFJoqwWGrfrcPLnVBIgkJiTV3cyA== dependencies: - "@jest/console" "^27.2.2" - "@jest/environment" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^27.4.2" + "@jest/environment" "^27.4.2" + "@jest/test-result" "^27.4.2" + "@jest/transform" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" emittery "^0.8.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-docblock "^27.0.6" - jest-environment-jsdom "^27.2.2" - jest-environment-node "^27.2.2" - jest-haste-map "^27.2.2" - jest-leak-detector "^27.2.2" - jest-message-util "^27.2.2" - jest-resolve "^27.2.2" - jest-runtime "^27.2.2" - jest-util "^27.2.0" - jest-worker "^27.2.2" + jest-docblock "^27.4.0" + jest-environment-jsdom "^27.4.3" + jest-environment-node "^27.4.2" + jest-haste-map "^27.4.2" + jest-leak-detector "^27.4.2" + jest-message-util "^27.4.2" + jest-resolve "^27.4.2" + jest-runtime "^27.4.2" + jest-util "^27.4.2" + jest-worker "^27.4.2" source-map-support "^0.5.6" throat "^6.0.1" -jest-runtime@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.2.2.tgz#cc29d3adde948d531657a67d33c9f8d9bb58a6fc" - integrity sha512-PtTHCK5jT+KrIpKpjJsltu/dK5uGhBtTNLOk1Z+ZD2Jrxam2qQsOqDFYLszcK0jc2TLTNsrVpclqSftn7y3aXA== - dependencies: - "@jest/console" "^27.2.2" - "@jest/environment" "^27.2.2" - "@jest/fake-timers" "^27.2.2" - "@jest/globals" "^27.2.2" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" +jest-runtime@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.2.tgz#d72da8a0e97366c16ad515a2c437191a72600d38" + integrity sha512-eqPgcBaUNaw6j8T5M+dnfAEh6MIrh2YmtskCr9sl50QYpD22Sg+QqHw3J3nmaLzVMbBtOMHFFxLF0Qx8MsZVFQ== + dependencies: + "@jest/console" "^27.4.2" + "@jest/environment" "^27.4.2" + "@jest/globals" "^27.4.2" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.2" + "@jest/transform" "^27.4.2" + "@jest/types" "^27.4.2" "@types/yargs" "^16.0.0" chalk "^4.0.0" cjs-module-lexer "^1.0.0" @@ -5190,30 +5584,30 @@ jest-runtime@^27.2.2: exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-haste-map "^27.2.2" - jest-message-util "^27.2.2" - jest-mock "^27.1.1" - jest-regex-util "^27.0.6" - jest-resolve "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + jest-haste-map "^27.4.2" + jest-message-util "^27.4.2" + jest-mock "^27.4.2" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.2" + jest-snapshot "^27.4.2" + jest-util "^27.4.2" + jest-validate "^27.4.2" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^16.0.3" + yargs "^16.2.0" -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== +jest-serializer@^27.4.0: + version "27.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.4.0.tgz#34866586e1cae2388b7d12ffa2c7819edef5958a" + integrity sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ== dependencies: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.2.2.tgz#898f0eedde658e723461d3cdcaedb404e716fa01" - integrity sha512-7ODSvULMiiOVuuLvLZpDlpqqTqX9hDfdmijho5auVu9qRYREolvrvgH4kSNOKfcqV3EZOTuLKNdqsz1PM20PQA== +jest-snapshot@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.2.tgz#bd1ea04a8fab402e5ab18b788809fa597ddff532" + integrity sha512-DI7lJlNIu6WSQ+esqhnJzEzU70+dV+cNjoF1c+j5FagWEd3KtOyZvVliAH0RWNQ6KSnAAnKSU0qxJ8UXOOhuUQ== dependencies: "@babel/core" "^7.7.2" "@babel/generator" "^7.7.2" @@ -5221,60 +5615,60 @@ jest-snapshot@^27.2.2: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/transform" "^27.4.2" + "@jest/types" "^27.4.2" "@types/babel__traverse" "^7.0.4" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.2.2" + expect "^27.4.2" graceful-fs "^4.2.4" - jest-diff "^27.2.2" - jest-get-type "^27.0.6" - jest-haste-map "^27.2.2" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-resolve "^27.2.2" - jest-util "^27.2.0" + jest-diff "^27.4.2" + jest-get-type "^27.4.0" + jest-haste-map "^27.4.2" + jest-matcher-utils "^27.4.2" + jest-message-util "^27.4.2" + jest-resolve "^27.4.2" + jest-util "^27.4.2" natural-compare "^1.4.0" - pretty-format "^27.2.2" + pretty-format "^27.4.2" semver "^7.3.2" -jest-util@^27.2.0: - version "27.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.2.0.tgz#bfccb85cfafae752257319e825a5b8d4ada470dc" - integrity sha512-T5ZJCNeFpqcLBpx+Hl9r9KoxBCUqeWlJ1Htli+vryigZVJ1vuLB9j35grEBASp4R13KFkV7jM52bBGnArpJN6A== +jest-util@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.4.2.tgz#ed95b05b1adfd761e2cda47e0144c6a58e05a621" + integrity sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" + ci-info "^3.2.0" graceful-fs "^4.2.4" - is-ci "^3.0.0" picomatch "^2.2.3" -jest-validate@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.2.2.tgz#e672118f1d9aa57b25b4c7998edc101dabd7020b" - integrity sha512-01mwTAs2kgDuX98Ua3Xhdhp5lXsLU4eyg6k56adTtrXnU/GbLd9uAsh5nc4MWVtUXMeNmHUyEiD4ibLqE8MuNw== +jest-validate@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.4.2.tgz#eecfcc1b1c9429aa007da08a2bae4e32a81bbbc3" + integrity sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.0.6" + jest-get-type "^27.4.0" leven "^3.1.0" - pretty-format "^27.2.2" + pretty-format "^27.4.2" -jest-watcher@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.2.2.tgz#8b00253d7e880c6637b402228a76f2fe5ea08132" - integrity sha512-7HJwZq06BCfM99RacCVzXO90B20/dNJvq+Ouiu/VrFdFRCpbnnqlQUEk4KAhBSllgDrTPgKu422SCF5KKBHDRA== +jest-watcher@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.4.2.tgz#c9037edfd80354c9fe90de4b6f8b6e2b8e736744" + integrity sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg== dependencies: - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/test-result" "^27.4.2" + "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.2.0" + jest-util "^27.4.2" string-length "^4.0.1" jest-worker@^26.2.1: @@ -5286,23 +5680,23 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.2.tgz#636deeae8068abbf2b34b4eb9505f8d4e5bd625c" - integrity sha512-aG1xq9KgWB2CPC8YdMIlI8uZgga2LFNcGbHJxO8ctfXAydSaThR4EewKQGg3tBOC+kS3vhPGgymsBdi9VINjPw== +jest-worker@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.2.tgz#0fb123d50955af1a450267787f340a1bf7e12bc4" + integrity sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.2.2.tgz#445a4c16aa4c4ae6e512d62fb6f8b2624cbd6c26" - integrity sha512-XAB/9akDTe3/V0wPNKWfP9Y/NT1QPiCqyRBYGbC66EA9EvgAzdaFEqhFGLaDJ5UP2yIyXUMtju9a9IMrlYbZTQ== +jest@^27.3.1: + version "27.4.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.4.3.tgz#cf7d1876a84c70efece2e01e4f9dfc2e464d9cbb" + integrity sha512-jwsfVABBzuN3Atm+6h6vIEpTs9+VApODLt4dk2qv1WMOpb1weI1IIZfuwpMiWZ62qvWj78MvdvMHIYdUfqrFaA== dependencies: - "@jest/core" "^27.2.2" + "@jest/core" "^27.4.3" import-local "^3.0.2" - jest-cli "^27.2.2" + jest-cli "^27.4.3" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -5317,6 +5711,13 @@ js-yaml@3.14.1, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.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" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -5380,15 +5781,10 @@ json-schema-traverse@^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-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" @@ -5400,7 +5796,14 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^2.1.2: +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, json5@^2.2.0: 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== @@ -5429,13 +5832,13 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" extsprintf "1.3.0" - json-schema "0.2.3" + json-schema "0.4.0" verror "1.10.0" kind-of@^6.0.2, kind-of@^6.0.3: @@ -5448,6 +5851,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kleur@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" + integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== + lerna@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/lerna/-/lerna-4.0.0.tgz#b139d685d50ea0ca1be87713a7c2f44a5b678e9e" @@ -5514,41 +5922,47 @@ libnpmpublish@^4.0.0: semver "^7.1.3" ssri "^8.0.1" +lilconfig@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + 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= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^11.1.2: - version "11.1.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.1.2.tgz#4dd78782ae43ee6ebf2969cad9af67a46b33cd90" - integrity sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w== +lint-staged@^11.2.6: + version "11.2.6" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.2.6.tgz#f477b1af0294db054e5937f171679df63baa4c43" + integrity sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg== dependencies: - chalk "^4.1.1" - cli-truncate "^2.1.0" - commander "^7.2.0" - cosmiconfig "^7.0.0" - debug "^4.3.1" + cli-truncate "2.1.0" + colorette "^1.4.0" + commander "^8.2.0" + cosmiconfig "^7.0.1" + debug "^4.3.2" enquirer "^2.3.6" - execa "^5.0.0" - listr2 "^3.8.2" - log-symbols "^4.1.0" + execa "^5.1.1" + listr2 "^3.12.2" micromatch "^4.0.4" normalize-path "^3.0.0" please-upgrade-node "^3.2.0" string-argv "0.3.1" - stringify-object "^3.3.0" + stringify-object "3.3.0" + supports-color "8.1.1" -listr2@^3.8.2: - version "3.12.2" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.12.2.tgz#2d55cc627111603ad4768a9e87c9c7bb9b49997e" - integrity sha512-64xC2CJ/As/xgVI3wbhlPWVPx0wfTqbUAkpb7bjDi0thSWMqrf07UFhrfsGoo8YSXmF049Rp9C0cjLC8rZxK9A== +listr2@^3.12.2: + version "3.13.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.13.5.tgz#105a813f2eb2329c4aae27373a281d610ee4985f" + integrity sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA== dependencies: cli-truncate "^2.1.0" - colorette "^1.4.0" + colorette "^2.0.16" log-update "^4.0.0" p-map "^4.0.0" - rxjs "^6.6.7" + rfdc "^1.3.0" + rxjs "^7.4.0" through "^2.3.8" wrap-ansi "^7.0.0" @@ -5572,6 +5986,15 @@ load-json-file@^6.2.0: strip-bom "^4.0.0" type-fest "^0.6.0" +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" @@ -5600,10 +6023,10 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= lodash.debounce@^4.0.8: version "4.0.8" @@ -5620,6 +6043,11 @@ lodash.ismatch@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -5650,24 +6078,16 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.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" @@ -5678,7 +6098,7 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.1.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== @@ -5699,7 +6119,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -magic-string@^0.25.3: +magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== @@ -5764,12 +6184,12 @@ make-fetch-happen@^9.0.1: socks-proxy-agent "^6.0.0" ssri "^8.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +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.x" + tmpl "1.0.5" map-obj@^1.0.0: version "1.0.1" @@ -5781,6 +6201,21 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +maxmin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-2.1.0.tgz#4d3b220903d95eee7eb7ac7fa864e72dc09a3166" + integrity sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY= + dependencies: + chalk "^1.0.0" + figures "^1.0.1" + gzip-size "^3.0.0" + pretty-bytes "^3.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -5813,6 +6248,53 @@ mersenne-twister@^1.0.1: resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" integrity sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o= +microbundle@^0.14.1: + version "0.14.2" + resolved "https://registry.yarnpkg.com/microbundle/-/microbundle-0.14.2.tgz#2db869c8145bd159aa55058ead47223f58f93bf2" + integrity sha512-jODALfU3w7jnJAqw7Tou9uU8e8zH0GRVWzOd/V7eAvD1fsfb9pyMbmzhFZqnX6SCb54eP1EF5oRyNlSxBAxoag== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-proposal-class-properties" "7.12.1" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/plugin-transform-flow-strip-types" "^7.12.10" + "@babel/plugin-transform-react-jsx" "^7.12.11" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/preset-env" "^7.12.11" + "@babel/preset-flow" "^7.12.1" + "@babel/preset-react" "^7.12.10" + "@rollup/plugin-alias" "^3.1.1" + "@rollup/plugin-babel" "^5.2.2" + "@rollup/plugin-commonjs" "^17.0.0" + "@rollup/plugin-json" "^4.1.0" + "@rollup/plugin-node-resolve" "^11.0.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.2" + asyncro "^3.0.0" + autoprefixer "^10.1.0" + babel-plugin-macros "^3.0.1" + babel-plugin-transform-async-to-promises "^0.8.15" + babel-plugin-transform-replace-expressions "^0.2.0" + brotli-size "^4.0.0" + builtin-modules "^3.1.0" + camelcase "^6.2.0" + escape-string-regexp "^4.0.0" + filesize "^6.1.0" + gzip-size "^6.0.0" + kleur "^4.1.3" + lodash.merge "^4.6.2" + postcss "^8.2.1" + pretty-bytes "^5.4.1" + rollup "^2.35.1" + rollup-plugin-bundle-size "^1.0.3" + rollup-plugin-postcss "^4.0.0" + rollup-plugin-terser "^7.0.2" + rollup-plugin-typescript2 "^0.29.0" + sade "^1.7.4" + terser "^5.7.0" + tiny-glob "^0.2.8" + tslib "^2.0.3" + typescript "^4.1.3" + micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" @@ -5821,17 +6303,17 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.49.0: - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.49.0" + mime-db "1.51.0" mimic-fn@^2.1.0: version "2.1.0" @@ -5972,7 +6454,7 @@ moment@^2.15.2: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== -mri@^1.1.1: +mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== @@ -6003,10 +6485,10 @@ mute-stream@0.0.8, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nanocolors@^0.1.0, nanocolors@^0.1.5: - version "0.1.12" - resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.1.12.tgz#8577482c58cbd7b5bb1681db4cf48f11a87fd5f6" - integrity sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ== +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== natural-compare@^1.4.0: version "1.4.0" @@ -6024,19 +6506,20 @@ neo-async@^2.6.0: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-fetch@^2.6.1: - version "2.6.5" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== dependencies: whatwg-url "^5.0.0" -node-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.0.0.tgz#79da7146a520036f2c5f644e4a26095f17e411ea" - integrity sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q== +node-fetch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.1.0.tgz#714f4922dc270239487654eaeeab86b8206cb52e" + integrity sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw== dependencies: - data-uri-to-buffer "^3.0.1" + data-uri-to-buffer "^4.0.0" fetch-blob "^3.1.2" + formdata-polyfill "^4.0.10" node-gyp@^5.0.2: version "5.1.1" @@ -6081,10 +6564,10 @@ node-modules-regexp@^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.76: - version "1.1.76" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e" - integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA== +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== nopt@^4.0.1: version "4.0.3" @@ -6126,7 +6609,12 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^6.1.0: +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^6.0.1, normalize-url@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== @@ -6236,6 +6724,13 @@ npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.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" + 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" @@ -6276,23 +6771,14 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.0.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" - integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.2" - object.getownpropertydescriptors@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.19.1" once@^1.3.0, once@^1.4.0: version "1.4.0" @@ -6337,11 +6823,6 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-homedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-2.0.0.tgz#a0c76bb001a8392a503cbd46e7e650b3423a923c" - integrity sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q== - os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -6355,11 +6836,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -6454,7 +6930,7 @@ p-waterfall@^2.1.1: dependencies: p-reduce "^2.0.0" -pacote@^11.2.6, pacote@^11.2.7: +pacote@^11.2.6: version "11.3.5" resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== @@ -6576,6 +7052,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +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.2, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -6629,26 +7110,282 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" -preact-render-spy@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/preact-render-spy/-/preact-render-spy-1.3.0.tgz#f64b83f4de33d9696e69e5b08c4ae5e29decd6d1" - integrity sha512-6gdi9mCMlhNPv4JRoQNSKu2kEbhStfJT/bN+n3gb/NwGKNmFg9q8eac9qFTSCswsOWmkdDk2WJiUoHZImIPSyA== +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== dependencies: - lodash.isequal "^4.5.0" - object.entries "^1.0.4" - preact-render-to-string "^3.6.3" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" -preact-render-to-string@^3.6.3: - version "3.8.2" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-3.8.2.tgz#bd72964d705a57da3a9e72098acaa073dd3ceff9" - integrity sha512-przuZPajiurStGgxMoJP0EJeC4xj5CgHv+M7GfF3YxAdhGgEWAkhOSE0xympAFN20uMayntBZpttIZqqLl77fw== +postcss-colormin@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.1.tgz#6e444a806fd3c578827dbad022762df19334414d" + integrity sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA== dependencies: - pretty-format "^3.5.1" + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.1.0" -preact@^8.3.0: - version "8.5.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-8.5.3.tgz#78c2a5562fcecb1fed1d0055fa4ac1e27bde17c1" - integrity sha512-O3kKP+1YdgqHOFsZF2a9JVdtqD+RPzCQc3rP+Ualf7V6rmRDchZ9MJbiGTT7LuyqFKZqlHSOyO/oMFmI2lVTsw== +postcss-convert-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz#879b849dc3677c7d6bc94b6a2c1a3f0808798059" + integrity sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-discard-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" + integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== + +postcss-discard-duplicates@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" + integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== + +postcss-discard-empty@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" + integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== + +postcss-discard-overridden@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" + integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== + +postcss-load-config@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.0.tgz#d39c47091c4aec37f50272373a6a648ef5e97829" + integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g== + dependencies: + import-cwd "^3.0.0" + lilconfig "^2.0.3" + yaml "^1.10.2" + +postcss-merge-longhand@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz#41f4f3270282ea1a145ece078b7679f0cef21c32" + integrity sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw== + dependencies: + postcss-value-parser "^4.1.0" + stylehacks "^5.0.1" + +postcss-merge-rules@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.3.tgz#b5cae31f53129812a77e3eb1eeee448f8cf1a1db" + integrity sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^2.0.1" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" + integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-minify-gradients@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz#f970a11cc71e08e9095e78ec3a6b34b91c19550e" + integrity sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q== + dependencies: + colord "^2.9.1" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-params@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.2.tgz#1b644da903473fbbb18fbe07b8e239883684b85c" + integrity sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg== + dependencies: + alphanum-sort "^1.0.2" + browserslist "^4.16.6" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-selectors@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" + integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-modules@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.2.2.tgz#5e7777c5a8964ea176919d90b2e54ef891321ce5" + integrity sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg== + dependencies: + generic-names "^2.0.1" + icss-replace-symbols "^1.1.0" + lodash.camelcase "^4.3.0" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + string-hash "^1.1.1" + +postcss-normalize-charset@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" + integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== + +postcss-normalize-display-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" + integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-positions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" + integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-repeat-style@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" + integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-string@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-timing-functions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" + integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-unicode@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" + integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== + dependencies: + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" + +postcss-normalize-url@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.3.tgz#42eca6ede57fe69075fab0f88ac8e48916ef931c" + integrity sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg== + dependencies: + is-absolute-url "^3.0.3" + normalize-url "^6.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-whitespace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" + integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-ordered-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" + integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-reduce-initial@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz#fa424ce8aa88a89bc0b6d0f94871b24abe94c048" + integrity sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" + integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30" + integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA== + dependencies: + postcss-value-parser "^4.1.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz#5d6893daf534ae52626708e0d62250890108c0c1" + integrity sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.2.1: + version "8.4.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" + integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" prelude-ls@^1.2.1: version "1.2.1" @@ -6661,25 +7398,32 @@ prelude-ls@~1.1.2: integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prettier@^2.0.1, prettier@^2.2.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.0.tgz#a6370e2d4594e093270419d9cc47f7670488f893" + integrity sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg== + +pretty-bytes@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf" + integrity sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8= + dependencies: + number-is-nan "^1.0.0" + +pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^27.0.0, pretty-format@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.2.2.tgz#c080f1ab7ac64302e4d438f208596fc649dbeeb3" - integrity sha512-+DdLh+rtaElc2SQOE/YPH8k2g3Rf2OXWEpy06p8Szs3hdVSYD87QOOlYRHWAeb/59XTmeVmRKvDD0svHqf6ycA== +pretty-format@^27.0.0, pretty-format@^27.4.2: + version "27.4.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.2.tgz#e4ce92ad66c3888423d332b40477c87d1dac1fb8" + integrity sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^27.4.2" ansi-regex "^5.0.1" ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^3.5.1: - version "3.8.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" - integrity sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U= - 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" @@ -6703,10 +7447,15 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +promise.series@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" + integrity sha1-LMfr6Vn8OmYZwEq029yeRS2GS70= + prompts@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" @@ -6718,15 +7467,6 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.6.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" - proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -6801,34 +7541,43 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -react-is@^16.8.1, react-is@^16.8.6: - 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-error-boundary@^3.1.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" + integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== + dependencies: + "@babel/runtime" "^7.12.5" -react-is@^17.0.1: +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-test-renderer@^16.8.2: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.14.0.tgz#e98360087348e260c56d4fe2315e970480c228ae" - integrity sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg== +react-shallow-renderer@^16.13.1: + version "16.14.1" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" + integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0" + +react-test-renderer@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.2.tgz#4cd4ae5ef1ad5670fc0ef776e8cc7e1231d9866c" + integrity sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ== dependencies: object-assign "^4.1.1" - prop-types "^15.6.2" - react-is "^16.8.6" - scheduler "^0.19.1" + react-is "^17.0.2" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.2" -react@^16.8.2: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== +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" - prop-types "^15.6.2" read-cmd-shim@^2.0.0: version "2.0.0" @@ -6996,12 +7745,20 @@ regenerator-transform@^0.14.2: dependencies: "@babel/runtime" "^7.8.4" -regexpp@^3.1.0: +regexp.prototype.flags@^1.3.1: + 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" + +regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^4.5.4, regexpu-core@^4.7.1: +regexpu-core@^4.7.1: version "4.8.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== @@ -7056,11 +7813,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.2: - version "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== - requireindex@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" @@ -7083,12 +7835,19 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.0.2.tgz#98c82ba8a4d3f9fcc32cbfa6f950b803d77b6c21" - integrity sha512-1+PDdTR3xrGWB/NzXLkzS1+PQlJ+BOR2baBGJSVat4HasiY1mnkyAQws3FUTmBDB79oK54QFaDM8Ig9nUtJwvQ== +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@1.20.0, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.14.2, resolve@^1.20.0: +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -7114,6 +7873,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -7128,38 +7892,32 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup-plugin-buble@^0.19.2: - version "0.19.8" - resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.19.8.tgz#f9232e2bb62a7573d04f9705c1bd6f02c2a02c6a" - integrity sha512-8J4zPk2DQdk3rxeZvxgzhHh/rm5nJkjwgcsUYisCQg1QbT5yagW+hehYEW7ZNns/NVbDCTv4JQ7h4fC8qKGOKw== - dependencies: - buble "^0.19.8" - rollup-pluginutils "^2.3.3" - -rollup-plugin-filesize@^9.1.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-filesize/-/rollup-plugin-filesize-9.1.1.tgz#31a6b02b27ce08082ef0970cfe4c451714ff91c4" - integrity sha512-x0r2A85TCEdRwF3rm+bcN4eAmbER8tt+YVf88gBQ6sLyH4oGcnNLPQqAUX+v7mIvHC/y59QwZvo6vxaC2ias6Q== +rollup-plugin-bundle-size@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-bundle-size/-/rollup-plugin-bundle-size-1.0.3.tgz#d245cd988486b4040279f9fd33f357f61673e90f" + integrity sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ== dependencies: - "@babel/runtime" "^7.13.8" - boxen "^5.0.0" - brotli-size "4.0.0" - colors "^1.4.0" - filesize "^6.1.0" - gzip-size "^6.0.0" - pacote "^11.2.7" - terser "^5.6.0" + chalk "^1.1.3" + maxmin "^2.1.0" -rollup-plugin-node-resolve@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" - integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== +rollup-plugin-postcss@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz#15e9462f39475059b368ce0e49c800fa4b1f7050" + integrity sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w== dependencies: - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.11.1" - rollup-pluginutils "^2.8.1" + chalk "^4.1.0" + concat-with-sourcemaps "^1.1.0" + cssnano "^5.0.1" + import-cwd "^3.0.0" + p-queue "^6.6.2" + pify "^5.0.0" + postcss-load-config "^3.0.0" + postcss-modules "^4.0.0" + promise.series "^0.2.0" + resolve "^1.19.0" + rollup-pluginutils "^2.8.2" + safe-identifier "^0.4.2" + style-inject "^0.3.0" rollup-plugin-terser@^7.0.2: version "7.0.2" @@ -7171,28 +7929,28 @@ rollup-plugin-terser@^7.0.2: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup-plugin-typescript2@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz#1cc99ac2309bf4b9d0a3ebdbc2002aecd56083d3" - integrity sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ== +rollup-plugin-typescript2@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.29.0.tgz#b7ad83f5241dbc5bdf1e98d9c3fca005ffe39e1a" + integrity sha512-YytahBSZCIjn/elFugEGQR5qTsVhxhUwGZIsA9TmrSsC88qroGo65O5HZP/TTArH2dm0vUmYWhKchhwi2wL9bw== dependencies: - "@rollup/pluginutils" "^4.1.0" + "@rollup/pluginutils" "^3.1.0" find-cache-dir "^3.3.1" fs-extra "8.1.0" - resolve "1.20.0" - tslib "2.1.0" + resolve "1.17.0" + tslib "2.0.1" -rollup-pluginutils@^2.3.3, rollup-pluginutils@^2.8.1: +rollup-pluginutils@^2.8.2: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== dependencies: estree-walker "^0.6.1" -rollup@^2.34.2: - version "2.57.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.57.0.tgz#c1694475eb22e1022477c0f4635fd0ac80713173" - integrity sha512-bKQIh1rWKofRee6mv8SrF2HdP6pea5QkwBZSMImJysFj39gQuiV8MEPBjXOCpzk3wSYp63M2v2wkWBmFC8O/rg== +rollup@^2.35.1, rollup@^2.60.2: + version "2.60.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.60.2.tgz#3f45ace36a9b10b4297181831ea0719922513463" + integrity sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw== optionalDependencies: fsevents "~2.3.2" @@ -7208,13 +7966,27 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.0, rxjs@^6.6.7: +rxjs@^6.6.0: 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" +rxjs@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" + integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== + dependencies: + tslib "~2.1.0" + +sade@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.4.tgz#ea681e0c65d248d2095c90578c03ca0bb1b54691" + integrity sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA== + dependencies: + mri "^1.1.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -7225,6 +7997,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-identifier@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" + integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -7237,10 +8014,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +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" @@ -7313,9 +8090,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" - integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== sisteransi@^1.0.5: version "1.0.5" @@ -7370,9 +8147,9 @@ socks-proxy-agent@^5.0.0: socks "^2.3.3" socks-proxy-agent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3" - integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87" + integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew== dependencies: agent-base "^6.0.2" debug "^4.3.1" @@ -7400,10 +8177,15 @@ sort-keys@^4.0.0: dependencies: is-plain-obj "^2.0.0" +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.20: - 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== + 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" @@ -7450,9 +8232,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.10" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" - integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== split-on-first@^1.0.0: version "1.1.0" @@ -7500,6 +8282,11 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-utils@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" @@ -7529,6 +8316,11 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -7546,24 +8338,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2": - 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: - 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.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: +"string-width@^1.0.2 || 2 || 3 || 4", 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== @@ -7572,6 +8347,20 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.matchall@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + 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" @@ -7602,7 +8391,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-object@^3.3.0: +stringify-object@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== @@ -7618,20 +8407,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: 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.1.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" @@ -7680,6 +8455,31 @@ stubs@^3.0.0: resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= +style-inject@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" + integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== + +stylehacks@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" + integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== + dependencies: + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" + +supports-color@8.1.1, supports-color@^8.0.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" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -7694,13 +8494,6 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.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" - supports-hyperlinks@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -7709,23 +8502,24 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" - tar@^4.4.12: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" @@ -7786,10 +8580,10 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser@^5.0.0, terser@^5.6.0: - version "5.9.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" - integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== +terser@^5.0.0, terser@^5.7.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -7839,6 +8633,19 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-glob@^0.2.8: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -7846,7 +8653,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmpl@1.0.x: +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== @@ -7909,21 +8716,26 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -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.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== tslib@^1.8.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.3.0: +tslib@^2.0.3, 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.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -8004,15 +8816,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.2: - 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.1.3, typescript@^4.4.4: + version "4.5.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" + integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== uglify-js@^3.1.4: - version "3.14.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" - integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A== + version "3.14.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.4.tgz#68756f17d1b90b9d289341736cb9a567d6882f90" + integrity sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA== uid-number@0.0.6: version "0.0.6" @@ -8105,7 +8917,7 @@ urlgrey@1.0.0: dependencies: fast-url-parser "^1.1.3" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -8132,10 +8944,10 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz#4229f2a99e367f3f018fa1d5c2b8ec684667c69c" - integrity sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg== +v8-to-istanbul@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" + integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -8156,10 +8968,10 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -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== verror@1.10.0: version "1.10.0" @@ -8185,11 +8997,11 @@ w3c-xmlserializer@^2.0.0: xml-name-validator "^3.0.0" walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + 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.x" + makeerror "1.0.12" wcwidth@^1.0.0: version "1.0.1" @@ -8199,9 +9011,9 @@ wcwidth@^1.0.0: defaults "^1.0.3" web-streams-polyfill@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz#1516f2d4ea8f1bdbfed15eb65cb2df87098c8364" - integrity sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" + integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== webidl-conversions@^3.0.0: version "3.0.1" @@ -8287,18 +9099,11 @@ which@^2.0.1, which@^2.0.2: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: - string-width "^4.0.0" + string-width "^1.0.2 || 2 || 3 || 4" word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" @@ -8386,9 +9191,9 @@ write-pkg@^4.0.0: write-json-file "^3.2.0" ws@^7.4.6: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== xml-name-validator@^3.0.0: version "3.0.0" @@ -8420,7 +9225,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== @@ -8435,7 +9240,7 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^16.0.3, yargs@^16.2.0: +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==